mov eax, 0x400000;
jmp eax;
这里的0x400000就是新的函数的地址,比如new_recv/new_send/new_GetMessage,此时,偷梁换柱已经完成 。再看看我们的函数中都干了些什么 。以GetMessageA为例:;
BOOL _stdcall new_GetMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax );
{;
DWORD dwSize
char szTemp[256]
BOOL r = false
//Watch here before it"s executed.;
printf( szTemp, "Before GetMessage : HWND 0x%8.8X, msgMin 0x%8.8X, msgMax 0x%8.8x , hWnd, wMsgFilterMin, wMsgFilterMax )
::WriteFile( hDebug, szTemp, strlen(szTemp), &dwSize, 0 )
//Watch over;
// restore it at first;
::WriteProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)dwOldBytes[2], sizeof(DWORD)*2, &dwSize )
// execute it;
r = pGetMessage( lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax )
// hook it again;
*(DWORD *)( btNewBytes1 ) = (DWORD)new_GetMessage
::WriteProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize )
//Watch here after it"s executed;
printf( szTemp, "Result of GetMessage is %d., r )
::WriteFile( hDebug, szTemp, strlen( szTemp ), &dwSize, 0 )
if( r );
{;
printf( szTemp, "Msg : HWND 0x%8.8X, MSG 0x%8.8x, wParam 0x%8.8X, lParam 0x%8.8XTime 0x%8.8X, X %d, Y %d,;
lpMsg->hwnd, lpMsg->message,;
lpMsg->wParam, lpMsg->lParam, lpMsg->time,;
lpMsg->pt.x, lpMsg->pt.y )
::WriteFile( hDebug, szTemp, strlen( szTemp ), &dwSize, 0 )
};
trcpy( szTemp, " )
::WriteFile( hDebug, szTemp, strlen( szTemp ), &dwSize, 0 )
//Watch over;
return r
};
先将截获下来的参数,写入到一个log文件中,以便分析 。然后恢复原先保留下来的GetMessageA的首8字节,然后执行真正的GetMessageA调用,完毕后再将执行结果也写入log文件,然后将GetMessageA的执行结果返回给调用者 。;
整个截获的过程就是这样 。你可以把其中的写log部分改成你自己想要的操作 。这里有个不足的地方是,截获动作是不能够并发进行的,如果目标进程是多线程的,就会有问题 。解决办法是,可以在每次new_GetMessage中加入一个CriticalSection的锁和解锁,以使调用变为串行进行,但这个我没有试验过 。
推荐阅读
- 买东西送的冰袋还可以利用吗
- hook部分什么意思
- 核桃树五月病虫害防治
- 身份证的电子版怎么弄
- 荣耀v30怎么拦截骚扰电话
- 农膜如何多次利用
- 世界十大名枪
- 利用Windows自带工具与命令修复IE浏览器
- hooked app是什么软件?hooked是什么?
- phpwind漏洞利用终结篇
