能力值:
( LV8,RANK:130 )
2 楼
来帮帮忙吧~OK?
能力值:
( LV2,RANK:10 )
3 楼
简单地拷贝MessageBoxA的头5个字节是会出问题的。
你应该用反汇编函数分析MessageBoxA的入口代码,确保将受影响的指令完整复制到ExecOrig。
能力值:
( LV8,RANK:130 )
4 楼
看过了
不会出现指令碎屑。
能力值:
( LV7,RANK:100 )
5 楼
今天看到好多Inline Hook;
云舒的<<简单说说SSDT>>
http://www.icylife.net/yunshu/index.php?sortid=2
能力值:
( LV8,RANK:130 )
6 楼
和SSDT有什么关系?
看SSDT Hook还是Rootkit:《Subveting the windows kernel》不错
能力值:
( LV2,RANK:10 )
7 楼
MessageBoxA要复制11字节的代码才完整。我改了改,在VC6下能通过。
#include <windows.h>
#include <stdio.h>
_declspec(naked) int ExecOrig(HWND hWnd,
LPCTSTR lpText,
LPCTSTR lpCaption,
UINT uType)
{
__asm
{
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
}
}
int HookFunc(
HWND hWnd,
LPCTSTR lpText,
LPCTSTR lpCaption,
UINT uType)
{
DWORD OrigESP;
int bRet;
__asm
{
mov OrigESP,esp
}
printf("In MyMsgBox,the params:\n%s\n%s\n",lpText,lpCaption);
bRet = ExecOrig(hWnd,lpText,lpCaption,uType);
printf("\nIn MyMsgBox,the return Value:\n%d\n",bRet);
__asm
{
mov esp,OrigESP
}
return bRet;
} int main()
{
int nRet;
int i = 0;
BYTE jmp[5];
BYTE Old[5];
BYTE JmptoOrig[5];
DWORD dwOld;
jmp[0] = 0xE9;
*((DWORD *)(jmp + 1)) = (DWORD) ((DWORD)HookFunc - (DWORD)MessageBoxA - 5);
memcpy( Old,MessageBoxA,5);
JmptoOrig[0] = 0xE9;
*((DWORD *)(JmptoOrig + 1)) = (DWORD)MessageBoxA - (DWORD)ExecOrig - 5;
::VirtualProtectEx(::GetCurrentProcess(),
ExecOrig,
10,
PAGE_READWRITE,
&dwOld);
memcpy( ExecOrig,Old,5 );
memcpy( (void *)((DWORD)ExecOrig + 5),JmptoOrig,5 );
::VirtualProtectEx(::GetCurrentProcess(),
ExecOrig,
10,
dwOld,
&dwOld);
::VirtualProtectEx(::GetCurrentProcess(),
MessageBoxA,
5,
PAGE_READWRITE,
&dwOld);
memcpy( MessageBoxA,jmp,5);
::VirtualProtectEx(::GetCurrentProcess(),
MessageBoxA,
5,
dwOld,
&dwOld);
nRet = ::MessageBox(0,"Test","Test",0);
printf("\nIn Main,the return:\n%d",nRet);
return 0;
}
能力值:
( LV3,RANK:20 )
8 楼
看了看MessageBoxA前5字节刚好合适,不知道楼上的为什么说要取11个才完整
个人估计是堆栈平衡得有问题......
我还没有遇到过这样的情况,实现方法有点不大一样
能力值:
( LV2,RANK:10 )
9 楼
这是我机器上MessageBoxA的前部分代码。
77E13259 55 push ebp
77E1325A 8B EC mov ebp,esp
77E1325C 51 push ecx
77E1325D 83 3D 58 3B E4 77 00 cmp dword ptr ds:[77E43B58h],0
能力值:
( LV12,RANK:530 )
10 楼
我来调试看看
能力值:
( LV12,RANK:530 )
11 楼
nRet = ::MessageBox(0,"Test","Test",0);
__asm
{
add esp,4
}
这样就可以了,估计是参数传递了2次缘故.