2012.01.06_lofullen_safengine(or shielden) 2.x IAT 修复脚本
生活随笔
收集整理的這篇文章主要介紹了
2012.01.06_lofullen_safengine(or shielden) 2.x IAT 修复脚本
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
http://bbs.pediy.com/showthread.php?t=145226&highlight=Safengine
近段時間一直在研究這個傳說中的猛殼,確實對于我們這種小菜鳥來說,真的好猛,入口點知道在哪里,可就是斷不下來,斷下后可惡的輸入表不好修復(fù),對我而言能分析代碼其實就足夠了,徹底脫殼對我來說也沒什么實際意義,當(dāng)然有哪位大牛有OEP的短法也請賜教。
但是這該死的?IAT?修復(fù)起來真要命,一直在? safengine?段中跟了好久也要不就是跟丟要不就是跟過。。這個?Nooby?這可恨!我恨死他了~但是說回來, safengine?VM?的功底肯定沒?VMP?TMD?之類的強,畢竟他們靠這個吃飯的, safengine?做足了反調(diào)試、反DUMP、antiAnything的功夫,但是要想在?VM?界立足一個?nooby?大牛還是不夠的。
最后希望廣大殼友不要氣餒,矛與盾總是步步緊逼的,越是有挑戰(zhàn)性的殼,越是號稱“最強”的殼,崩潰的速度越快。 safengine?這個殼做了很多宣傳,用?10?萬塊來吸引眼球,并不是想證明他的殼有多強,只是一種炒作手段,最簡單不過的手段,他一個?nooby?能抵抗千千萬萬的大牛嗎?答案是肯定的,那就是“NO”!
=======================================================
求人不如求己是我一貫的作風(fēng)。再也不做標(biāo)題黨!
經(jīng)過仔細分析后,簡單的寫了中低復(fù)雜度的?IAT?修復(fù)腳本。
這種?復(fù)雜度的在SE殼中的?CALL?大概會占到?60%?左右,以下是?代碼。
101A4AC9????50??????????????PUSH?EAX
101A4ACA????60??????????????PUSHAD
101A4ACB????9C??????????????PUSHFD
101A4ACC????B8?879A950B?????MOV?EAX,0B959A87
101A4AD1????BB?B15F8304?????MOV?EBX,4835FB1
101A4AD6????03C3????????????ADD?EAX,EBX
101A4AD8????8B00????????????MOV?EAX,DWORD?PTR?DS:[EAX]
101A4ADA????33C3????????????XOR?EAX,EBX
101A4ADC????874424?24???????XCHG?DWORD?PTR?SS:[ESP+24],EAX
101A4AE0????FF4424?28???????INC?DWORD?PTR?SS:[ESP+28]
101A4AE4????9D??????????????POPFD
101A4AE5????61??????????????POPAD
101A4AE6????C3??????????????RETN?<---?難度最低的時候?EIP?到這里的時候?ESP?就是?API。
稍微再高一個級別的在?C3?處不返回?API,而是返回后到下面這里:
0944068B????68?F1893564?????PUSH?643589F1
09440690????F71424??????????NOT?DWORD?PTR?SS:[ESP]
09440693????813424?CA7659E7?XOR?DWORD?PTR?SS:[ESP],E75976CA
0944069A????C3??????????????RETN
也有可能是?RETN?4?的比如以下代碼:
09440663????68?E03659E7?????PUSH?E75936E0
09440668????68?10718F6D?????PUSH?6D8F7110
0944066D????F71424??????????NOT?DWORD?PTR?SS:[ESP]
09440670????C10C24?05???????ROR?DWORD?PTR?SS:[ESP],5
09440674????C2?0400?????????RETN?4
所以腳本如下:?這是第一版,沒有對?RETN?進行判斷,隨后會發(fā)一個完善一些的腳本,并且不再需要UIF修復(fù),供菜鳥們學(xué)習(xí)。
代碼: var?codebase var?secode1 var?secode2 var?apiaddr var?calladdr var?fixaddr var?retaddr var?temaddrvar?oep var?temeax var?temebx var?temecx var?temedx var?temebp var?temesp var?temesi var?temedimov?codebase,10001000 mov?secode1,1018d000 mov?secode2,10317000 mov?oep,eip mov?temeax,eax mov?temebx,ebx mov?temecx,ecx mov?temedx,edx mov?temebp,ebp mov?temesp,esp mov?temesi,esi mov?temedi,edimov?eip,codebasefindcall: find?eip,#E8??????00# cmp?$RESULT,0 je?exit mov?calladdr,$RESULT GCI?calladdr,DESTINATION mov?fixaddr,$RESULT find?fixaddr,#50609cb8????????#,8 cmp?$RESULT,0 jne?startfix?//這里發(fā)現(xiàn)低復(fù)雜度?CALL,直接開始處理了 find?fixaddr,#e9??????00#,5 cmp?$RESULT,0 je?nextcall mov?sejmp,$RESULT GCI?sejmp,DESTINATION mov?fixaddr,$RESULT find?fixaddr,#68????????9c81442404????????9d#,0f cmp?$RESULT,0 jne?next?//?高復(fù)雜度的暫時忽略nextcall: add?calladdr,1 mov?eip,calladdr jmp?findcallstartfix: mov?esp,temesp mov?eip,calladdrfindret: sti find?eip,#C3#,?1??//第一階段直接查找?RETN cmp?$RESULT,0 mov?retaddr,$RESULT je?findret gn?[esp]?//?如果有返回但是ESP?又不是?API的則進入第二階段 cmp?$RESULT,0 jne?fixretfindret2: sti find?eip,#C3#,1 cmp?$RESULT,0 mov?retaddr,$RESULT jne?findiat find?eip,#C2??00#,3?//?這里查?RETN?4\8\C\10?之類,第二版中會做判斷,根據(jù)他來讀取寄存器里的返回地址,并作為下一個?EIP mov?retaddr,$RESULT cmp?$RESULT,0 je?findret2findiat: gn?[esp]?//分析?APIname cmp?$RESULT,0 je?findret2fixret: mov?apiaddr,[esp]?//?直接?asm?call?APIAddress,用?UIF?修復(fù)就可以了 eval?"call?{apiaddr}" asm?calladdr,$RESULTnext: add?calladdr,1 mov?eip,calladdr mov?esp,temesp mov?eax,?0 mov?ebx,?0 mov?ecx,?0 mov?edx,?0 mov?esi,?0 mov?edi,?0 mov?ebp,?0 jmp?findcallexit: mov?eip,oep mov?esp,temesp mov?edi,temedi mov?esi,temesi mov?ebp,temebp mov?eax,temeax mov?ebx,temebx mov?ecx,temecx mov?edx,temedx ret 以下是復(fù)雜度高的:
10193E8A???/E9?08770400?????JMP?ms.101DB597
跳過來以后,會反復(fù)執(zhí)行以下代碼,聽說有特征碼,可我還沒能找到。因為我的SE?是?2090?的
101DB597????68?D6339FA0?????PUSH?A09F33D6
101DB59C????9C??????????????PUSHFD
101DB59D????814424?04?61137>ADD?DWORD?PTR?SS:[ESP+4],6F7F1361
101DB5A5????9D??????????????POPFD
101DB5A6????C3??????????????RETN
再比這個高的復(fù)雜度最后加這種結(jié)構(gòu),其實說回來復(fù)雜度不同就是結(jié)合的問題而已。
0944068B????68?F1893564?????PUSH?643589F1
09440690????F71424??????????NOT?DWORD?PTR?SS:[ESP]
09440693????813424?CA7659E7?XOR?DWORD?PTR?SS:[ESP],E75976CA
0944069A????C3??????????????RETN
其實復(fù)雜度高度都可以用我的腳本跑起來的,但是不保證完全正確,有時會跟丟的。
另外提示下,其實SE?的反調(diào)試并不是想象的那么恐怖,用strongOD?v0.4.5.810?輕松忽悠SE。如果被發(fā)現(xiàn),Ctrl+F2?幾次就可以。
本腳本只適合菜鳥使用~~~呵呵?只是娛樂而已
總結(jié)
以上是生活随笔為你收集整理的2012.01.06_lofullen_safengine(or shielden) 2.x IAT 修复脚本的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android手机IMEI码结构说明
- 下一篇: Python工具箱系列(八)