2024年3月27日發(作者:給兒子的生日祝福語)
ZProtect IAT修復分析
手上也有正版的ZProtect了,就加了幾個樣本玩兒了一下,總結出了一些小方法,分享給大
家。
本文的目的旨在討論如何去除ZP保護的程序(不帶SDK)。主要討論一下如何修復IAT。
第一個樣品是個VB程序,按默認保護了輸入表。
ZP中的輸入表的保護方式有三種:
1,加密等級1
2,加密等級2
3,模擬
還有一個額外的輸入表保護方式---Anti-Hook,這里不討論修復這種保護。
默認保護下,IAT中的一部分函數使用的是等級1,剩下的使用的是等級2。至于模擬這種保
護,貌似在ZP1.44中是被動選擇。只能對GetModuleHandleA這個函數使用。知道了這個,
修復這個函數也就不在話下。
閑話少說,OD載入,配置好StrongOD,確保程序能在OD中運行,這樣會減少我們不少麻
煩~
F7單步走幾步,探索一下殼的代碼。
走了一段時間就會看清楚ZP的代碼變形引擎的本質:
ZP殼會把程序的代碼按指令分割起來,然后用Jmp連接起來。
當然如果僅僅是這樣的話,反跟蹤的難度絕對不夠的。還要對Jmp進行變形。
這里用下面的例子說明一下:
006E1ACF E8 02000000 call Farsight.006E1AD6
006E1AD4 6C ins byte ptr es:[edi],dx---這兩個是花指令
006E1AD5 19 ---
006E1AD6 872C24 xchg dword ptr ss:[esp],ebp
006E1AD9 8DAD B0F9FFFF lea ebp,dword ptr ss:[ebp-650]
006E1ADF 872C24 xchg dword ptr ss:[esp],ebp
006E1AE2 C3 retn
上面的代碼就相當于Jmp 006E1A6F
原理是這樣:
call Farsight.006E1AD6這條指令指令完以后會把它下面指令的地址壓入堆棧,所以現在
[ESP]=006E1AD4。
然后xchg dword ptr ss:[esp],ebp 把006E1AD4傳遞給ebp。
接著lea ebp,dword ptr ss:[ebp-650] 把ebp-650=006E1A6F
在賦值給esp,最后retn返回就返回到006E1A6F了。
這段代碼的二進制是E8 02 00 00 00 27 EB 87 0C 24 8D 89 63 01 00 00 87 0C 24 C3
E8 02 00 00 00 這個是call 87 0C 24 8D 89 63 01 00 00 87 0C 24 C3
27 EB 是花指令,個數不確定,一般是0-2個
87 0C 24 其中的0C決定使用的寄存器。
8D 89 63 01 00 00 其中89表示寄存器,后面的四個字節就是相應的差。
有一定編程能力的人,相信應該能寫出去掉代碼變形的工具。
弄清楚代碼變形的過程 就不看在代碼里面晃了,實在很痛苦。下面說一個通用的到達OEP
的方法:
重新載入程序,然后F7走,一直看到Pushad這條指令以后,走過去,使用ESP定律,運行,
停下來以后,走幾步就到OEP了!
這個方法通用1.3x-1.4x保護的程序。其他版本沒驗證過?? 從這點來看,ZP在技術上還只
算一個壓縮殼??
好了,到了OEP,下面開始修復IAT。
00412940 - E9 DBB73300 jmp manager.0074E120
00412945 90 nop
00412946 - E9 11BB3300 jmp manager.0074E45C
0041294B 90 nop
0041294C - E9 FFBD3300 jmp manager.0074E750
00412951 90 nop
00412952 - E9 65B83300 jmp manager.0074E1BC
00412957 90 nop
00412958 - E9 7FB93300 jmp manager.0074E2DC
0041295D 90 nop
0041295E - E9 D9B63300 jmp manager.0074E03C
00412963 90 nop
00412964 - E9 27B73300 jmp manager.0074E090
00412F0A - E9 F5B83300 jmp manager.0074E804
00412F0F 90 nop
00412F10 68 7C5B4100 push manager.00415B7C ; <---OEP
00412F15 E8 F0FFFFFF call manager.00412F0A VB的程序這個call應該是
jmp.&Main 這個函數。
看來這處IAT調用00412F0A - E9 F5B83300 jmp manager.0074E804應該是跳轉到
ThunRTMain這個函數的
我們來仔細跟蹤到這里看一下,下面是去掉了jmp和變型以后的代碼
0074E804 68 14E693AD push AD93E614 《---注意這個值,這就是IAT調用的jmp執
行以后的第一條指令
01504660 68 F9E1932D push 2D93E1F9
01526465 9C pushfd
01526466 E8 01000000 call 0152646C
0152646B 97 xchg eax,edi
0152646C 871424 xchg dword ptr ss:[esp],edx
0152646F 8D92 3AD3FFFF lea edx,dword ptr ds:[edx-2CC6] === jmp 0015237A5
01526475 871424 xchg dword ptr ss:[esp],edx
01526478 C3 retn
015237A5 83EC 3E sub esp,3E
0151D99C 896424 2C mov dword ptr ss:[esp+2C],esp
01521064 894424 28 mov dword ptr ss:[esp+28],eax
0151BDBC 8B4424 42 mov eax,dword ptr ss:[esp+42]
0151CBF6 894424 36 mov dword ptr ss:[esp+36],eax
015212DE 8B4424 3E mov eax,dword ptr ss:[esp+3E]
本文發布于:2024-03-27 08:30:09,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/88/60846.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:ZProtectIAT修復分析.doc
本文 PDF 下載地址:ZProtectIAT修復分析.pdf
| 留言與評論(共有 0 條評論) |