日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

利用HOOK攔截封包原理( 二 )


mov eax, 0x400000;
jmp eax;
這里的0x400000就是新的函數(shù)的地址,比如new_recv/new_send/new_GetMessage,此時,偷梁換柱已經(jīng)完成 。再看看我們的函數(shù)中都干了些什么 。以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
};

先將截獲下來的參數(shù),寫入到一個log文件中,以便分析 。然后恢復(fù)原先保留下來的GetMessageA的首8字節(jié),然后執(zhí)行真正的GetMessageA調(diào)用,完畢后再將執(zhí)行結(jié)果也寫入log文件,然后將GetMessageA的執(zhí)行結(jié)果返回給調(diào)用者 。;
整個截獲的過程就是這樣 。你可以把其中的寫log部分改成你自己想要的操作 。這里有個不足的地方是,截獲動作是不能夠并發(fā)進(jìn)行的,如果目標(biāo)進(jìn)程是多線程的,就會有問題 。解決辦法是,可以在每次new_GetMessage中加入一個CriticalSection的鎖和解鎖,以使調(diào)用變?yōu)榇羞M(jìn)行,但這個我沒有試驗過 。

推薦閱讀