在一个程序中控制另一个程序的函数调用
作者: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 下 调试通过