首页
社区
课程
招聘
[求助]我想练习HOOKmessagebox,但是vc6.0下通过,vs2008就hook不到,为什么?
发表于: 2009-9-3 23:02 6393

[求助]我想练习HOOKmessagebox,但是vc6.0下通过,vs2008就hook不到,为什么?

2009-9-3 23:02
6393
【求助】我想练习HOOKmessagebox,但是vc6.0下通过,vs2008就hook不到,为什么?
代码太长,附件中~~~其实不长就是贴出来看起来就多了~~~
一些如下:
   if(*lpAddr == (DWORD)g_orgProc)
   {
    // 修改IAT表项,使其指向我们自定义的函数,相当于“*lpAddr = (DWORD)MyMessageBoxA;”
    DWORD* lpNewProc = (DWORD*)MyMessageBoxA;
    ::WriteProcessMemory(::GetCurrentProcess(),
      lpAddr, &lpNewProc, sizeof(DWORD), NULL);
    return TRUE;
   }

我想知道原因,请大虾帮忙解决了,顺便能说明下为什么~~~
补充以下,我发现在WriteProcessMemory的时候,返回了false~~·不知道什么原因

再补充,我在writeprocessmemory返回失败后,调用getlasterror返回998,查看MSDN,发现错误信息为:
ERROR_NOACCESS:998           Invalid access to memory location
既然没有noaccess,为什么vc6.0又可以?

补充,问题,已解决~~感谢(Fypher,leftup)
最简单,在writeprocessmemory之前加函数:
DWORD dwOld;
VirtualProtect(lpAddr,4,PAGE_READWRITE,&dwOld);
谢谢~~~

[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 251
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
2008新建的工程默认是unicode吧
2009-9-3 23:17
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
跟这个没关系吧?我改成多字符的也不可以~~~
2009-9-4 08:51
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
4
帮你测试了,你的代码在VS 2008下能成功HOOK MessageBox
在你的机器上不行,可能是页保护的问题。
2009-9-4 09:22
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
5
在WriteProcessMemory之前:
VirtualProtect(lpAddr,4,PAGE_READWRITE,NULL);
2009-9-4 09:25
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
Fypher,调用了virtualprotest,还是不可以,我想应该不是这个问题,为什么在我同一个电脑上VC6.0就可以调试通过,vs2008不可以,说明不是页保护问题吧?
2009-9-4 10:35
0
雪    币: 251
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我用2008编译试了试,idata节Debug版本可写,Release版本不可写
而且因为idata只读,所以只要读一次就够了,编译器把它优化成只在第一次用MessageBox的时候读了导入项,存在寄存器里,后面调用时直接用前面读到的,所以即使改了它也不会再去读了 你可以试试 在第一个MessageBox后面加一点复杂点的垃圾代码,比如说
GetProcessHeap();GetCurrentProcess();GetCurrentThread();GetThreadLocale();
GetProcessHeap();GetCurrentProcess();GetCurrentThread();GetThreadLocale();

,让它寄存器不够用,迫使它回去读导入项
另外VirtualProtect 最后一个参数貌似不能为NULL
2009-9-4 13:24
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
8
vs2008生成release版的exe时会给导入表加页属性的保护。

DWORD dwOld;
VirtualProtect(lpAddr,4,PAGE_READWRITE,&dwOld);
*lpAddr = (DWORD)MyMessageBoxA;

这样就不会访问违规了。

如楼上leftup同学所说,Release版做了代码优化(VS2008的优化效果当然比VC6.0强悍),第一次调用时直接把MessageBox存到了ESI里,以后调用就直接call esi。见main反汇编:

00401001 8B 35 B0 20 40 00 mov         esi,dword ptr [__imp__MessageBoxA@16 (4020B0h)]
00401007 57               push        edi  
00401008 6A 00            push        0   
0040100A 68 04 21 40 00   push        offset string "09HookDemo" (402104h)
0040100F 68 10 21 40 00   push        offset string "\xd4\xad\xba\xaf\xca\xfd" (402110h)
00401014 6A 00            push        0   
00401016 FF D6            call        esi //第一次

00401018 6A 00            push        0   
0040101A FF 15 0C 20 40 00 call        dword ptr [__imp__GetModuleHandleA@4 (40200Ch)]
00401020 8B F8            mov         edi,eax
00401022 E8 49 00 00 00   call        SetHook (401070h)

00401027 6A 00            push        0   
00401029 68 04 21 40 00   push        offset string "09HookDemo" (402104h)
0040102E 85 C0            test        eax,eax
00401030 74 0E            je          main+40h (401040h)
00401032 68 10 21 40 00   push        offset string "\xd4\xad\xba\xaf\xca\xfd" (402110h)

00401037 6A 00            push        0   
00401039 FF D6            call        esi //第二、三次  
0040103B 5F               pop         edi
2009-9-4 13:59
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
加那些:
引用:
GetProcessHeap();GetCurrentProcess();GetCurrentThread();GetThreadLocale();
GetProcessHeap();GetCurrentProcess();GetCurrentThread();GetThreadLocale();
基本没效果,但是根据Fypher最后所说的把virtualprotect的最后一个参数改下,在DEBUG和release下都通了~~~

谢谢你们~~(Fypher,leftup)
2009-9-4 14:30
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
10
Tag: VC6 VS2008 Debug Release HOOK
2009-9-4 16:58
0
游客
登录 | 注册 方可回帖
返回
//