VC++通过进程注入读取其它程序列表数据演示
很多偷密码的木马程序大都使用进程注入或钩子方式来获取用户的密码或账号信息,每种实现方式都各有优缺点,看个人爱好和熟练程度了,天缘本文演示一下使用进程注入来提取其它程序的数据,不过为了安全起见,天缘把部分源程序改掉精简了,只注入系统进程提取一个列表目录,当然大家可以自己发挥到QQ、迅雷等上面去,技术是把双刃剑,仅供研究和学习使用,请勿用于非法用途。
开发环境:VC++ 6.0
程序目标:进程注入读取C盘列表文件目录(通过窗口进程内存读取),由于代码很少,所以不再做详细介绍,天缘博客后续会有一些专题介绍注入技术、HOOK技术文章发表。
测试系统:Windows XP,测试通过。
程序的整体分成两个部分:
1、主体函数部分,功能是负责查找目标程序窗口,初始化句柄和目标进程ID,然后枚举子窗体控件,初始化目标控件句柄,注入进程并提取有用信息。
void CQQDlg::OnOK()
{
HWND hQQSearchWnd= NULL;//窗口句柄
hQQSearchWnd = ::FindWindow(NULL,"SYS (C:)");//找到查找目标窗口句柄
if(NULL==hQQSearchWnd)
{
m_Edt_str="未找到指定标题窗口";
}
else
{
EnumChildWindows(hQQSearchWnd,EnumFunc,0);//枚举子窗口,初始化g_hListCtrl
//hQQSearchWnd=::FindWindowEx(hQQSearchWnd,0,"SysListView32",0);
if (NULL == g_hListCtrl)
{
MessageBox("列表控件查询失败,请检查回调函数","错误!",NULL);
}
else//------
{
DWORD PID = 0; //进程ID
HANDLE hProcess = NULL; //进程句柄
GetWindowThreadProcessId(g_hListCtrl, &PID);//读进程ID
hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);//获取对方进程句柄
if (NULL == hProcess)
{
MessageBox("获取进程句柄操作失败!","错误!",NULL);
return;
}
else
{
LVITEM lvitem, *plvitem;
TCHAR ItemBuf[512];
TCHAR *pItem;
plvitem = NULL;
pItem = NULL;
plvitem=(LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);
pItem=(char*)VirtualAllocEx(hProcess, NULL, 512, MEM_COMMIT, PAGE_READWRITE);//分配虚拟内存
if ((!plvitem)||(!pItem))
{
MessageBox("无法分配内存!","错误!",NULL);
}
else
{
lvitem.cchTextMax=512;
lvitem.iSubItem=0; //条目ID编号
lvitem.pszText=pItem; //注意,这里赋值
WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM), NULL);
for(int i=0;i<g_iRecords;i++)//循环读在线QQ号
{
::SendMessage(g_hListCtrl, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)plvitem);
ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);
m_Edt_str += ItemBuf;
m_Edt_str +="rn";
Sleep(100);
}
}
VirtualFreeEx(hProcess, plvitem, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);
//CloseHandle(hProcess);
}
}//------
CloseHandle(g_hListCtrl);
CloseHandle(hQQSearchWnd);
}
UpdateData(false);
//CDialog::OnOK();
}
2、回调函数部分:功能是循环回调判断是否为目标控件,常见的判断方法有窗口标题、窗口类名、窗口类等等。
int g_iRecords = NULL;
HWND g_hListCtrl = NULL;
BOOL CALLBACK EnumFunc(
HWND hwnd, //handle to child window
LPARAM lParam //application-defined value
)
{
TCHAR chBuf[255];
CString cstr;
//-----------------------------------------
//GetWindowText(hwnd,chBuf,255); //读标题
int iCName=GetClassName(hwnd,chBuf,255);//读窗口类
//-----------------------------------------
cstr=chBuf;
//cstr.Format("获取窗口类名=%dn",iCName);
if(0==cstr.Compare("SysListView32"))//比较窗口类
{
CListCtrl* p = (CListCtrl*)(CListCtrl::FromHandle(hwnd));
int iNum = p->GetItemCount();//记录数
if(iNum>0)//说明有记录
{
// CString cstmp;
// cstmp += p->GetItemText(1,1);
// for(int i=0;i<iNum;i++)
// {
// cstmp += p->GetItemText(i,1);//+"rn";
// }
g_iRecords = iNum;
g_hListCtrl = hwnd;
return FALSE;
}
}
return TRUE;
}
程序的运行结果:
1、运行界面如下图

2、使用Spy ++ Lite查看一下目标控件的标题信息方法,如下图:

3、运行程序,点击查找并读取全部的列表内容。

4、完毕,就看大家自由发挥了。
更多文章:
