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

时间:2022-04-01 03:38:23

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

 

作者: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 下 调试通过