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

利用HOOK攔截封包原理

;;;;;截獲API是個很有用的東西,比如你想分析一下別人的程序是怎樣工作的 。這里我介紹一下一種我自己試驗通過的方法 。;
首先,我們必須設法把自己的代碼放到目標程序的進程空間里去 。Windows Hook可以幫我們實現(xiàn)這一點 。SetWindowsHookEx的聲明如下:;
HHOOK SetWindowsHookEx(;
int idHook, // hook type;
HOOKPROC lpfn, // hook procedure;
HINSTANCE hMod, // handle to application instance;
DWORD dwThreadId // thread identifier;
)
具體的參數(shù)含義可以翻閱msdn,沒有msdn可謂寸步難行 。;
這里Hook本身的功能并不重要,我們使用它的目的僅僅只是為了能夠讓Windows把我們的代碼植入別的進程里去 。hook Type我們任選一種即可,只要保證是目標程序肯定會調用到就行,這里我用的是WH_CALLWNDPROC 。lpfn和hMod分別指向我們的鉤子代碼及其所在的dll,dwThreadId設為0,表示對所有系統(tǒng)內的線程都掛上這樣一個hook,這樣我們才能把代碼放到別的進程里去 。;;
之后,我們的代碼就已經進入了系統(tǒng)內的所有進程空間了 。必須注意的是,我們只需要截獲我們所關心的目標程序的調用,因此還必須區(qū)分一下進程號 。我們自己的鉤子函數(shù)中,第一次運行將進行最重要的API重定向的工作 。也就是通過將所需要截獲的API的開頭幾個字節(jié)改為一個跳轉指令,使其跳轉到我們的API中來 。這是最關鍵的部分 。這里我想截三個調用,ws2_32.dll中的send和recv、user32.dll中的GetMessageA 。;

DWORD dwCurrentPID = 0
HHOOK hOldHook = NULL
DWORD pSend = 0
DWORD pRecv = 0
GETMESSAGE pGetMessage = NULL

BYTE btNewBytes[8] = { 0x0B8, 0x0, 0x0, 0x40, 0x0, 0x0FF, 0x0E0, 0 }
DWORD dwOldBytes[3][2]

HANDLE hDebug = INVALID_HANDLE_value

LRESULT CALLBACK CallWndProc( int nCode, WPARAM wParam, LPARAM lParam );
{;
DWORD dwSize
DWORD dwPIDWatched
HMODULE hLib

if( dwCurrentPID == 0 );
{;
dwCurrentPID = GetCurrentProcessId()
HWND hwndMainHook
wndMainHook = ::FindWindow( 0, "MainHook )
dwPIDWatched = ::SendMessage( hwndMainHook, (WM_USER 100), 0, 0 )
hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER 101), 0, 0 )

if( dwCurrentPID == dwPIDWatched );
{;
Lib = LoadLibrary( "ws2_32.dll )
Send = (DWORD)GetProcAddress( hLib, "send )
Recv = (DWORD)GetProcAddress( hLib, "recv )

::ReadProcessMemory( INVALID_HANDLE_value, (void *)pSend, (void *)dwOldBytes[0], sizeof(DWORD)*2, &dwSize )
*(DWORD *)( btNewBytes1 ) = (DWORD)new_send
::WriteProcessMemory( INVALID_HANDLE_value, (void *)pSend, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize )

::ReadProcessMemory( INVALID_HANDLE_value, (void *)pRecv, (void *)dwOldBytes[1], sizeof(DWORD)*2, &dwSize )
*(DWORD *)( btNewBytes1 ) = (DWORD)new_recv
::WriteProcessMemory( INVALID_HANDLE_value, (void *)pRecv, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize )

Lib = LoadLibrary( "user32.dll )
GetMessage = (GETMESSAGE)GetProcAddress( hLib, "GetMessageA )
::ReadProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)dwOldBytes[2], sizeof(DWORD)*2, &dwSize )
*(DWORD *)( btNewBytes1 ) = (DWORD)new_GetMessage
::WriteProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize )

Debug = ::CreateFile( "C:Trace.log, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 )
};
};

if( hOldHook != NULL );
{;
return CallNextHookEx( hOldHook, nCode, wParam, lParam )
};

return 0
};

上面的鉤子函數(shù),只有第一次運行時有用,就是把三個函數(shù)的首8字節(jié)修改一下(實際上只需要7個) 。btNewBytes中的指令實際就是;

推薦閱讀