在一个程序中控制另一个程序的函数调用

    技术2022-05-20  64

    在一个程序中控制另一个程序的函数调用

     

    作者:flyfish 2011-02-27 星期日

    一 被控制程序

    1 新建一个基于对话框的程序 名称为Main 这是被控制程序

    2 首先编写一个函数 该函数的功能是每次点击按钮编辑框中的数值加2

    int g_nContent;

    HWND g_hWnd;

    void SubCall()

    {

         g_nContent=g_nContent+2;

         CString strTemp=L"";

         strTemp.Format(_T("%d"),g_nContent);

         ::SetWindowText(g_hWnd,strTemp);

     

    }

    在对话框中添加一个编辑框和一个按钮

    编辑框变量为CEdit m_Edit_ctlContent;

     

    3 在对话框初始化时,加入

    g_nContent=0;

    g_hWnd=m_Edit_ctlContent.m_hWnd;

    在按钮事件中并调用SubCall()这个函数

     

    4 Main程序编写完毕

     

    控制程序

     

    我们要在另一个程序中控制Main程序的函数,达到在Main程序中点击按钮的效果

    这个并不是模拟按键,而是注入到Main进程中直接调用

    新建一个基于对话框的程序 名称为Control

    建立一个按钮 调用一下代码

    HWND hWnd = ::FindWindow(NULL,_T("Main")); 

    if(hWnd)  

    {

         DWORD dwID;

         LPDWORD lpID=&dwID;

         ::GetWindowThreadProcessId(hWnd,lpID);

         HANDLE hPrecess=::OpenProcess(PROCESS_ALL_ACCESS,false,dwID);

         DWORD dwTID;

         CreateRemoteThread(hPrecess,NULL,0,(LPTHREAD_START_ROUTINE(0x004ED0B0)),NULL,0,&dwTID);

    }

     

    0x004ED0B0 这个地址的由来

     

    使用CE 扫描Main进程中的数据,该数据是点击按钮之后编辑框显示的数字相同,多找几次之后只剩下 唯一的一个地址 0x00780EC8

     

    OD中 对0x00780EC8进行硬件断点 命令是hw 00780EC8 在执行Main程序中的按钮,这时候程序断下来,向上找到函数的开头,这个地址就是0x004ED0B0

     

    以上程序在VC2005 下 调试通过

     

     

     


    最新回复(0)