首页
社区
课程
招聘
[求助]为何我HOOK其他程序的MessageBox老崩?
发表于: 2009-5-10 22:16 7629

[求助]为何我HOOK其他程序的MessageBox老崩?

2009-5-10 22:16
7629
代码很简单。
首先 调整权限,获得目标程序的HANDLE(已执行成功)
(假设为函数  hMyHandle = GetTargetHandle(_T("目标窗口名"));)
然后
VirtualQuery(lpAddr, &mb, sizeof(mb));
VirtualProtectEx(hMyHandle,lpAddr, sizeof(DWORD), PAGE_READWRITE, &dwOldProtect);
DWORD* lpNewProc = (DWORD*)MyMessageBox;
if(::WriteProcessMemory(hMyHandle,
    (LPVOID)lpAddr, &lpNewProc, sizeof(DWORD), NULL))
{
cout<<"WriteProcessMemory ok"<<endl;
}
else
{
         ShowError();
}
  VirtualProtectEx(hMyHandle,lpAddr, sizeof(DWORD), dwOldProtect, 0);

其中MyMessageBox代码页很简单
int WINAPI MyMessageBox(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)
{
  return ((PFNMESSAGEBOX)g_orgProc)(hWnd, _T("New func"), _T("HookDemo"), uType);
}
为确保程序正确执行。我特意强写了由目标文件自己输出的地址,即  DWORD *lpAddr ;
  lpAddr =(DWORD *) 0x004032F0;(这是我电脑中MessageBoxW的地址,似乎DEBUG模式和RELEASE模式不同)

即目标文件中添加个按钮,直接 在导入表中查找user32.dll模块。寻找MessageBoxW函数的地址并输出到界面;

但是,目标程序执行到MessageBoxW直接崩溃。。为什么呢??真奇怪!!我直接改变程序本身倒是可以正确HOOK掉MessageBoxW,,怎么HOOK 目标程序不行呢??前面获得目标程序句柄的代码已经在别的程序中得到验证。。没有问题的。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
还是我的理解有问题???HOOK程序自身倒是可以的。(这似乎意义不大) 为什么HOOK另外一个程序就崩溃掉了呢??代码几乎完全一样啊!!!请高手指点下。。或者是我哪里理解不对??
解决这问题后就放全部代码
2009-5-10 22:19
0
雪    币: 360
活跃值: (77)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
3
用DLL实现
2009-5-10 23:33
0
雪    币: 336
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
return ((PFNMESSAGEBOX)g_orgProc)(hWnd, _T("New func"), _T("HookDemo"), uType);
中的g_orgProc未看见其定义
2009-5-11 10:20
0
雪    币: 146
活跃值: (33)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
LZ,最近我也在学习hook api,你这是IAT hook吧,要想hook其他进程的MessageBox,必须将函数放入DLL并载入其他进程,这样才不会出现进程空间的边界问题吧
2009-5-11 13:03
0
雪    币: 146
活跃值: (33)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
        为什么HOOK其他程序就会出错呢?
  答:因为你给定的MyMessageBox地址是属于本程序进程的地址空间,而在其他进程的地址空间里该位置数据未知,故而可能导致程序崩溃啊
2009-5-11 13:06
0
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
6楼,我的目标程序也是我写的。。。该位置数据我是直接输出的,,换言之,地址是不太可能有问题的。。。
给定的地址当然是目标程序的地址,,
2009-5-11 19:09
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
8
能否把你的两个程序发上来瞧瞧
2009-5-11 19:39
0
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
刚发现个BUG,,我再调下看看。。
2009-5-11 21:14
0
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我贴下完整的代码吧。。
目标程序代码如下
如果执行BUTTON3 则可以成功HOOK掉Button1,但是如果用其他程序就不行。
void Cdlg1Dlg::OnBnClickedButton1()
{
        // TODO: 在此添加控件通知处理程序代码
        ::MessageBoxW(NULL, _T("I am dlg1"), _T("hello"), 0);
}
PROC g_orgProc = (PROC)MessageBoxW;
typedef int (WINAPI *PFNMESSAGEBOX)(HWND, LPCWSTR, LPCWSTR, UINT uType);
int WINAPI MyMessageBox(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)
{
  return ((PFNMESSAGEBOX)g_orgProc)(hWnd, _T("New func dlg1"), _T("HookDemo dlg1"), uType);
}
void ShowError()
{
        DWORD dwError = GetLastError();
        LPVOID lpMsgBuf;

        BOOL fOk = FormatMessage(
      FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
      NULL, dwError, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
      (LPTSTR) &lpMsgBuf, 0, NULL);
        MessageBox( NULL, (LPCTSTR)lpMsgBuf, _T("Error"), MB_OK | MB_ICONINFORMATION );
        LocalFree( lpMsgBuf );
}
void Cdlg1Dlg::OnBnClickedButton3()
{
                DWORD *lpAddr ;
                lpAddr =(DWORD *) 0x00421BD0;
            DWORD dwOldProtect;
        VirtualProtect(lpAddr, sizeof(DWORD), PAGE_READWRITE, &dwOldProtect);
        DWORD* lpNewProc = (DWORD*)MyMessageBox;
                if(::WriteProcessMemory(::GetCurrentProcess(),
            lpAddr, &lpNewProc, sizeof(DWORD), NULL))
                {
                }
                else
                {
                          ShowError();
                }
        VirtualProtect(lpAddr, sizeof(DWORD), dwOldProtect, 0);
}

HOOK程序代码如下。
        hMyHandle = GetSpecialWindow(_T("dlg1"));//此函数获取目标程序句柄,(确保正确的)
        ShowError();
        DWORD *lpAddr ;
        lpAddr =(DWORD *) 0x00421BD0;
        DWORD dwOldProtect;
        VirtualProtectEx(hMyHandle,lpAddr, sizeof(DWORD), PAGE_READWRITE, &dwOldProtect);

        DWORD* lpNewProc = (DWORD*)MyMessageBox;
    if(::WriteProcessMemory(hMyHandle,
        (LPVOID)lpAddr, &lpNewProc, sizeof(DWORD), NULL))
        {
                cout<<"WriteProcessMemory ok"<<endl;
        }
        else
        {
                  ShowError();
        }
         VirtualProtectEx(hMyHandle,lpAddr, sizeof(DWORD), dwOldProtect, 0);
  cout<<"Set Hook Over"<<endl;
但是此时再按BUTTON1就崩掉啦!!!!
2009-5-11 21:45
0
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
哪位高人稍微指点下原理??
2009-5-11 21:47
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
12
HOOK中 lpNewProc 你是如何取得的?
2009-5-11 22:54
0
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
多谢老大提点。。。应该就是那个问题。。地址空间应该放在目标程序内。
2009-5-12 08:50
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
14
进程空间,基础啊基础~
2009-5-12 11:20
0
雪    币: 146
活跃值: (33)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
15
我汗,我不是说了你的那个函数的地址是有问题的吗,为什么我说的不信,人家高级会员说的你就信,不能这样啊


  为什么HOOK其他程序就会出错呢?
  答:因为你给定的MyMessageBox地址是属于本程序进程的地址空间,而在其他进程的地址空间里该位置数据未知,故而可能导致程序崩溃啊
2009-5-13 00:35
0
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
呵呵。。我已经知道啦。。。呵呵。。也谢谢你拉。。。现在开始准备研究下一种HOOK了
2009-5-13 20:44
0
游客
登录 | 注册 方可回帖
返回
//