抓封包程式 - 第二彈, 使用替換 API 開頭方式 |
|
Skyer
高階會員 發表:43 回覆:111 積分:120 註冊:2002-04-04 發送簡訊給我 |
我前一篇發的抓封包程式,在 Hook API 上,如果目標程式有被加殼,就無法抓封包了. 後來在網路上,找到一個 Length Disassembler Engine, 可以完整的備分原 API 的指令.. 此範例不是以 Delphi 完成,而是 MASM @@
因為覺得 Delphi 編出來的執行檔好大喔 5xx kb, 雖然用 UPX 壓一下可到 2xx kb, 還是有點大..
用 MFC 的話,因為不熟底層運作.. 寫出來的程式, 動不動就 Access Violation
用 KOL 的話.. 也是麻煩..
所以最後就用 ASM 來寫了.. 小巧可愛 XD
執行檔 5120 bytes, dll 7680 bytes 我有附上 source code, 有興趣的朋友可以玩玩.. 沒興趣看 source code
也可以抓下來玩玩執行檔.. 此版改進地方.
1. 只要有用網路,就可以抓 TCP 封包
2. hook 了, connect, WSAConnect, send, WSASend, recv, WSARecv, closesocket (前一版只 Hook connect, send, recv) 大概說一下流程:
1. 取得 API 開頭位置 (GetProcAddress)
2. 使用 Length Disassembler Engine 算出至少 5 bytes (放一個 Long Jmp 到我們的 function 來達到 hook)
3. 備分原 API 開頭指令到 buf 去
4. 在 buf 後加上long jmp 回原本 api 接續的地方
5. 在自定的function, 處理完後,jmp 到 buf 去..
簡易圖示
軟體快照兩張
--
Regards,
Skyer
------
-- Regards, Skyer
附加檔案:76328_Sniff.zip
|
webchia
一般會員 發表:6 回覆:5 積分:2 註冊:2003-03-07 發送簡訊給我 |
|
Skyer
高階會員 發表:43 回覆:111 積分:120 註冊:2002-04-04 發送簡訊給我 |
|
jimyho
一般會員 發表:0 回覆:2 積分:0 註冊:2002-04-16 發送簡訊給我 |
|
jimyho
一般會員 發表:0 回覆:2 積分:0 註冊:2002-04-16 發送簡訊給我 |
|
Skyer
高階會員 發表:43 回覆:111 積分:120 註冊:2002-04-04 發送簡訊給我 |
抱歉,這程式沒有 Delphi 版本喔。不過我有開發 for Delphi 的 HookAPI library http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=76621 可以給您參考,抓封包其實就是 hook WS2_32.dll 內幾個 api 而以。
此外,您提到殼的程式無法抓取到封包,這個可能有很多原因。也許是那殼對別人的侵入有特別的處理;或是我程式有 bug XD 原則上,只要程式有使用 ws2_32.dll or wsock32.dll,無論是靜態或動態載入,此抓封包程式應都能抓的到。
ps:
------
-- Regards, Skyer |
Skyer
高階會員 發表:43 回覆:111 積分:120 註冊:2002-04-04 發送簡訊給我 |
仔細看了下我的文章(年代久遠了 @@)和您的回文 這裡說的無法使用,指的是我前一篇(年代可能更久遠 @@)的文章,那時,我想我可能是用 IAT 替換方式去 hook api,這方法對有些殼來說就是無用的,因為在執行前,程式的 IAT 已被殼藏起來,程式的 IAT 是殼本身使用的,程式執行後,實際的 IAT 將會被破壞掉,所以使用 IAT hook 實用有限。 也因為才會使用 API 替換方式,此方法較好。更好的還可以 hook api 開頭後面一點位置,這樣會被發現的可能性會再低一點。
------
-- Regards, Skyer |
h774211_60953
一般會員 發表:0 回覆:1 積分:0 註冊:2006-08-16 發送簡訊給我 |
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
|
gavinj123
初階會員 發表:88 回覆:48 積分:27 註冊:2002-10-15 發送簡訊給我 |
|
Skyer
高階會員 發表:43 回覆:111 積分:120 註冊:2002-04-04 發送簡訊給我 |
查一下 MSDN 有關 MessageBox 的 help, 你會發現 myMsg1 剛好跟 MessageBox function 的宣告一樣..
同理可證, connect & send 的話,就查一下 help 囉.. Delphi 很久沒用了,我試著翻一下.. connect function myConnect(s: SOCKET, name: PSOCK_ADDR, namelen: Integer): Integer; stdcall; function mySend(s: SOCKET, buf: PByte, len: Integer, flags: Integer): Integer; stdcall; 大概類似這樣吧... ===================引 用 gavinj123 文 章=================== 請問一下,我用您PO的DELPHI的程式(HOOK MessageBoxA那個)改寫成HOOK ws2_32.dll,已經可以成功HOOK到connect跟SEND二個涵式。但要作麼用您寫的這個 function myMsg1(hwnd:DWORD; text, title:PChar; flag:DWORD):DWORD; stdcall; 來抓拿它的IP,PORT,SEND的資料等等的呢?可以請大師指點一下嗎?
------
-- Regards, Skyer |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |