// jmp eax == 0xFF, 0xE0
// 生成新的执行代码
BYTE btNewBytes[8] = { 0xB8, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xE0, 0x00 }; 这个是什么意思啊,尤其是第一句注释!!!! 再就是赋值为何赋那些数字啊下面的代码页是没明白最后一句注释
PBYTE pMessageBox= (PBYTE)GetProcAddress(GetModuleHandle("user32"),"MessageBoxA");
*pMessageBox = 0xC2;
*(PWORD)(pMessageBox+1) = 0x10;MessageBoxA(...);C2 10 00 汇编是ret 10h附完整代码
// jmp eax == 0xFF, 0xE0
// 生成新的执行代码
BYTE btNewBytes[8] = { 0xB8, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xE0, 0x00 }; 
memcpy(m_btNewBytes, btNewBytes, 8);
*(DWORD *)(m_btNewBytes + 1) = (DWORD)pfnHook;  // 加载指定模块,取得API函数地址
m_hModule = ::LoadLibrary(pszModName);
if(m_hModule == NULL)
{
m_pfnOrig = NULL;
return;
}
m_pfnOrig = ::GetProcAddress(m_hModule, pszFuncName);
// 修改原API函数执行代码的前8个字节,使它跳向我们的函数
if(m_pfnOrig != NULL)
{
DWORD dwOldProtect;
MEMORY_BASIC_INFORMATION    mbi;
::VirtualQuery( m_pfnOrig, &mbi, sizeof(mbi) );
::VirtualProtect(m_pfnOrig, 8, PAGE_READWRITE, &dwOldProtect); // 保存原来的执行代码
memcpy(m_btOldBytes, m_pfnOrig, 8);
// 写入新的执行代码
::WriteProcessMemory(::GetCurrentProcess(), (void *)m_pfnOrig, 
m_btNewBytes, sizeof(DWORD)*2, NULL); 

::VirtualProtect(m_pfnOrig, 8, mbi.Protect, 0);
}

解决方案 »

  1.   

    看一下MessageBoxA函数原型:int __stdcall MessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)既然C2 10 00 汇编是ret 10hret 10h是什么意思?返回,并配平stack。10h就是十进制的16,MessageBox有4个参数,并且是__stdcall。所以这段代码的意思就是:废掉MessageBoxA。
      

  2.   

    // jmp eax == 0xFF, 0xE0jmp eax指令对应的机器码
      

  3.   

    BYTE btNewBytes[8] = { 0xB8, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xE0, 0x00 };  借助windbg汇编/反汇编功能,可以得到这8byte对应的(类似)汇编代码为:0012fb10 b800004000      mov     eax,offset exe_name!IID_IPersist (00400000)
    0012fb15 ffe0            jmp     eaxb8对应mov,00004000对应函数地址(00400000),所以*(DWORD *)(m_btNewBytes + 1) = (DWORD)pfnHook; 实现了跳到自己代码的目的;
      

  4.   

    废掉就是修改MessageBoxA代码,一执行就直接ret 10h返回了。你说的跳回去什么意思?
      

  5.   


    当执行我自己的函数后,如何跳转回去执行原来的函数我目前是想 钩recv 统计流量另外,那些汇编 我还是不很明白,能再详细点吗
    比如C2 10 00 汇编是ret 10h
    那C2 10 00 又是什么呢?我觉得我思维不清晰
      

  6.   

    ret 10h对应的机器码就是C2 10 00啊,这个你用反汇编工具都很容易看出来的,比如ida。
      

  7.   

    配平是什么意思啊,我汇编不太好,另外借助windbg汇编/反汇编功能,可以得到这8byte对应的(类似)汇编代码为:0012fb10 b800004000 mov eax,offset exe_name!IID_IPersist (00400000)
    0012fb15 ffe0 jmp eax这一长串 数字 真头疼 能说说吗?我Q 895000080 怎么谢都行