Keep on going, never give up.

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、完毕,就看大家自由发挥了。

 

更多文章:

BMP位图文件格式详解及编程建议

利用Ajax无刷新验证用户名、密码和邮箱等输入信息

相关评论(0):  

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

订阅博客

最新文章

本站采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载也必须遵循“署名-非商业用途-保持一致”的创作共用协议. 返回顶部
Copyright@2005-2016 Metsky.com, All rights Reserved.