HyperSnap-DX 5.60脫殼(Arm3.70a with IAT Elimination)
好久沒怎麼脫過殼,最近碰到一個軟體是用arm加的殼,用到了arm的輸入表亂序和遠地址跳轉,只有找些資料來補課,略有些心得,還望指正。
下面以HyperSnap-DX 5.60為例,這個是arm3.70a加的殼,單程式,用了輸入表亂序和遠地址跳轉。HyperSnap-DX 5.61已經是雙程式CC殼了,還不敢碰,:(
第1部分:準備工作&抵達OEP
先需要找到一些基本資料
1. OEP
設斷點he SetProcessWorkingSetSize斷下後再設斷點he GetCurrentThreadId
斷下後,Ctrl+F9返回,去除這兩個斷點,向下看,看到那個call edi了沒,在按F2那裡設個斷點
斷下後,F7跟入,就來到OEP了
記住: OEP=004E8850
2. magicjump
好幾個地方修改跳轉都可以放置arm破壞輸入表的,都可以稱之為magicjump
來看arm處理輸入表的流程
先將一些預設的api經過處理
然後在讀入輸入表時候,比較api名稱是否為殼中處理過的api名稱
如果相同則將該地址指向殼中的函式地址,程式所得到的地址就指向殼裡了,importRec就識別不出該
api了
這個雖然程式碼比較長,不過流程還算清楚,可以跟上幾遍就大概知道是怎麼回事了
因為相關文章比較多,這裡簡單看一下
00DC96FD 8D85 B4FEFFFF LEA EAX,DWORD PTR SS:[EBP-14C]
00DC9703 50 PUSH EAX
00DC9704 FF15 C8B0DE00 CALL DWORD PTR DS:[DEB0C8] ;
kernel32.GetModuleHandleA
00DC970A 8B0D C04CDF00 MOV ECX,DWORD PTR DS:[DF4CC0]
00DC9710 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
00DC9713 A1 C04CDF00 MOV EAX,DWORD PTR DS:[DF4CC0]
00DC9718 393C06 CMP DWORD PTR DS:[ESI+EAX],EDI
00DC971B 75 16 JNZ SHORT 00DC9733
00DC971D 8D85 B4FEFFFF LEA EAX,DWORD PTR SS:[EBP-14C]
00DC9723 50 PUSH EAX
00DC9724 FF15 D0B0DE00 CALL DWORD PTR DS:[DEB0D0] ;
kernel32.LoadLibraryA
00DC972A 8B0D C04CDF00 MOV ECX,DWORD PTR DS:[DF4CC0]
00DC9730 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
00DC9733 A1 C04CDF00 MOV EAX,DWORD PTR DS:[DF4CC0]
00DC9738 393C06 CMP DWORD PTR DS:[ESI+EAX],EDI
00DC973B 0F84 AD000000 JE 00DC97EE //magicjump 記錄該地址
值
00DC9741 33C9 XOR ECX,ECX
如果是dll可能還需要更改這個地址,od載入dll基地址為10000000,而輸入表在該地址以下
造成在ImportRec設不了IAT RVA地址
00DE489D 8B85 1CE8FFFF MOV EAX,DWORD PTR SS:[EBP-17E4] //儲存當前IAT指標
00DE48A3 8B8D 80E2FFFF MOV ECX,DWORD PTR SS:[EBP-1D80]
00DE48A9 8908 MOV DWORD PTR DS:[EAX],ECX //一個api地址寫入IAT
00DE48AB 8B85 1CE8FFFF MOV EAX,DWORD PTR SS:[EBP-17E4]
00DE48B1 83C0 04 ADD EAX,4
00DE48B4 8985 1CE8FFFF MOV DWORD PTR SS:[EBP-17E4],EAX
對[EBP-17E4]來設記憶體寫斷點,可以找到這裡
00DE453B 8B8D F0E6FFFF MOV ECX,DWORD PTR SS:[EBP-1910] //儲存IAT的首地址,記錄
該地址值00E9A880
00DE4541 8D0481 LEA EAX,DWORD PTR DS:[ECX+EAX*4]
00DE4544 8985 1CE8FFFF MOV DWORD PTR SS:[EBP-17E4],EAX //載入下一個dll的IAT中
首地址
3.antidump
OD把原始碼中一些程式碼,jmp較高的地址了 如jmp 03171000,造成lordpe dump檔案時候,這段程式碼丟
失,
該地址是不是固定的。
可以直接下斷VirtualAlloc,檢視申請地址值,如果比較大就需要注意了,返回後程式碼類似下面
00DE2612 6A 40 PUSH 40
00DE2614 68 00200000 PUSH 2000
00DE2619 FFB5 70E6FFFF PUSH DWORD PTR SS:[EBP-1990]
00DE261F FF35 3092DF00 PUSH DWORD PTR DS:[DF9230]
00DE2625 FF15 A0B1DE00 CALL DWORD PTR DS:[DEB1A0] ;
kernel32.VirtualAlloc
00DE262B 8985 78E6FFFF MOV DWORD PTR SS:[EBP-1988],EAX
00DE2631 83BD 78E6FFFF 0>CMP DWORD PTR SS:[EBP-1988],0
00DE2638 74 33 JE SHORT 00DE266D
00DE263A 6A 40 PUSH 40
00DE263C 68 00100000 PUSH 1000
00DE2641 FFB5 70E6FFFF PUSH DWORD PTR SS:[EBP-1990]
00DE2647 FF35 3092DF00 PUSH DWORD PTR DS:[DF9230]
00DE264D FF15 A0B1DE00 CALL DWORD PTR DS:[DEB1A0] ;
kernel32.VirtualAlloc
00DE2653 8985 78E6FFFF MOV DWORD PTR SS:[EBP-1988],EAX //儲存codesplit 首地
址 在這裡斷下修改eax值到一較低地址我選擇寫到arm的adata節
00DE2659 83BD 78E6FFFF 0>CMP DWORD PTR SS:[EBP-1988],0
00DE2660 74 0B JE SHORT 00DE266D
記錄CodeSplit addr=00DE2653
4. 用指令碼來走到OEP
因為要修改的地方比較多,而且後面我們除錯指令碼難免要重複工作,所以還是寫個od指令碼吧,可以節省點體力 :)
因為要向rdata段寫IAT資料,所以先將該段記憶體設為可寫
Memory視窗選中該段,右鍵set access ->full access
程式碼:
//指令碼1,直達OEP,順便處理magicjump和antidump var NewIatHead var NewSplitCodeHead var SetIatHead var SetSplitCodeHead var IatOver var MagicJmp var OEP var bSplitCodeOver var bIatOver var pTempAddr var VirtualAlloc //需要填入的資訊內容 mov NewIatHead, 5CA000 mov NewSplitCodeHead, 674000 mov MagicJmp, 00DC973B mov SetIatHead, 00DE453B mov IatOver, 00DE498E mov SetSplitCodeHead, 00DE2653 mov OEP, 004E8850 //變數初始化 mov bIatOver, 0 mov bSplitCodeOver, 0 //獲得VirtualAlloc首地址 gpa "VirtualAlloc", "kernel32.dll" mov VirtualAlloc, $RESULT BPHWS VirtualAlloc, "x" run BPHWC VirtualAlloc //此時,殼記憶體程式碼已分配 //開始設斷點 BPHWS MagicJmp, "x" //magicjump之處 //BPHWS 00994704, "x" 寫入記憶體時 BPHWS SetIatHead, "x" //載入輸入表首地址時候 BPHWS IatOver, "x" //處理完所有dll BPHWS SetSplitCodeHead, "x" //申請高位記憶體處,需更改返回eax為一段低位記憶體 eoe _Exception eob _Break run //遇例外繼續執行 _Exception: esto //處理斷點中斷 _Break: cmp eip, SetIatHead je _SetIatHead cmp eip, MagicJmp je _MagicJmp cmp eip, IatOver je _IATOver cmp eip, SetSplitCodeHead je _SetSplitCodeHead jmp _InvalidBreak //設定新的IAT首地址 /* 00DE453B 8B8D F0E6FFFF MOV ECX,DWORD PTR SS:[EBP-1910] //儲存IAT的首地址 00DE4541 8D0481 LEA EAX,DWORD PTR DS:[ECX+EAX*4] 00DE4544 8985 1CE8FFFF MOV DWORD PTR SS:[EBP-17E4],EAX //當前IAT指標 */ _SetIatHead: mov pTempAddr, ebp sub pTempAddr, 1910 //看上面資料 mov [pTempAddr], NewIatHead log NewIatHead BPHWC SetIatHead run //修改magicjump, 來得到原始的IAT _MagicJmp: mov !ZF, 1 //修改magicjump run //maigcjump處理完畢 _IATOver: BPHWC MagicJmp BPHWC IatOver mov bIatOver, 1 cmp bSplitCodeOver,1 je _FixOver run //設定新的儲存CodeSplit程式碼的首地址 /* 00DE263A 6A 40 PUSH 40 00DE263C 68 00100000 PUSH 1000 00DE2641 FFB5 70E6FFFF PUSH DWORD PTR SS:[EBP-1990] 00DE2647 FF35 3092DF00 PUSH DWORD PTR DS:[DF9230] 00DE264D FF15 A0B1DE00 CALL DWORD PTR DS:[DEB1A0] ; kernel32.VirtualAlloc 00DE2653 8985 78E6FFFF MOV DWORD PTR SS:[EBP-1988],EAX //儲存antidump首地址 00DE2659 83BD 78E6FFFF 0>CMP DWORD PTR SS:[EBP-1988],0 00DE2660 74 0B JE SHORT 00DE266D */ _SetSplitCodeHead: mov eax, NewSplitCodeHead mov bSplitCodeOver, 1 BPHWC SetSplitCodeHead cmp bIatOver,1 je _FixOver run //其它未處理的斷點 _InvalidBreak: log eip msg "Invalid Break" ret //IAT,AntiDump處理完畢 //準備跳往OEP _FixOver: eoe _Continue eob _End BPHWS OEP, "x" run _Continue: esto _End: BPHWC OEP msg "Success!" ret
第2部分. 修復IAT亂序
1, 關於IAT亂序
arm從3.60開始新增了新的功能輸入表亂序(ImportTable Elimination)
再我們修改了magicjmp後得到漂亮的IAT, 可惜馬上就被arm給破壞了,將順序打亂,而且演算法有些復
雜,不好反求。
00DE498E 8B85 FCE6FFFF MOV EAX,DWORD PTR SS:[EBP-1904] //上面的指令碼中IatOver
地址
00DE4994 8985 F4CFFFFF MOV DWORD PTR SS:[EBP-300C],EAX
00DE499A FFB5 F4CFFFFF PUSH DWORD PTR SS:[EBP-300C]
00DE49A0 E8 855E0000 CALL 00DEA82A ; JMP to msvcrt.??
3@YAXPAX@Z
00DE49A5 59 POP ECX
00DE49A6 83BD F0E6FFFF 0>CMP DWORD PTR SS:[EBP-1910],0
...
00DE4AA2 8985 64E1FFFF MOV DWORD PTR SS:[EBP-1E9C],EAX
00DE4AA8 8B85 60E1FFFF MOV EAX,DWORD PTR SS:[EBP-1EA0]
00DE4AAE 8D0485 04000000 LEA EAX,DWORD PTR DS:[EAX*4+4]
00DE4AB5 50 PUSH EAX
00DE4AB6 8B85 F0E6FFFF MOV EAX,DWORD PTR SS:[EBP-1910]
00DE4ABC 83C0 04 ADD EAX,4
00DE4ABF 50 PUSH EAX
00DE4AC0 FFB5 F0E6FFFF PUSH DWORD PTR SS:[EBP-1910]
00DE4AC6 FF15 D4B2DE00 CALL DWORD PTR DS:[DEB2D4] ; msvcrt.memmove //
將IAT向前迴圈移動2個DWORD,打亂IAT
00DE4ACC 83C4 0C ADD ESP,0C
00DE4ACF 8B85 60E1FFFF MOV EAX,DWORD PTR SS:[EBP-1EA0]
00DE4AD5 8B8D F0E6FFFF MOV ECX,DWORD PTR SS:[EBP-1910]
00DE4ADB 8B95 64E1FFFF MOV EDX,DWORD PTR SS:[EBP-1E9C]
00DE4AE1 891481 MOV DWORD PTR DS:[ECX+EAX*4],EDX
00DE4AE4 ^ E9 47FFFFFF JMP 00DE4A30
使得我們在ImportRec中看到這樣排列的IAT,從而無法生成新的輸入表
1 001CA0D0 kernel32.dll 01A7 GetProfileIntA
1 001CA0D4 comctl32.dll 002B ImageList_AddMasked
1 001CA0D8 user32.dll 005B CreateIconIndirect
1 001CA0DC user32.dll 00F7 GetClassInfoA
1 001CA0E0 gdi32.dll 01CE LineTo
1 001CA0E4 user32.dll 008F DefWindowProcA
1 001CA0E8 kernel32.dll 015C GetFileSize
1 001CA0EC gdi32.dll 01BA GetTextFaceA
1 001CA0F0 gdi32.dll 01C3 GetWindowExtEx
2. 整理IAT
在Ricardo Narvaja的203-208教程中給出了一個很指令碼,用來整理IAT,生成一個新的排列整齊的IAT,
原來的IAT中的地址值則改為指標指向這個新IAT表中的項,這個腳指令碼說明參見Ricardo的207教程。裡面跳轉有點多,我估摸著加了點註釋。
舉例
原先IAT中一項為
005CA000 45 2D E1 77 E-w今
在執行指令碼後
005CA000 D0 AD 5C 00 協\.
005CADD0 45 2D E1 77 E-wp
當然這樣做以後,call所呼叫的地址就不對了
call [005CA000] // 77E12D45call Kernel32.SetUnhandledExceptionFilter
故而Ricardo 在OEP處插入了一段程式來,將排列好的IAT,再次還原到原先打亂的狀態,不過這樣出
來的程式在靜態反編譯時,函式會識別不出,不便於分析。
在下面1節將會採用一段指令碼來處理這個問題
在OEP處執行
程式碼:
//指令碼2,將ARM混亂的IAT重新整理 //來自Ricardo Narvaja的207號教程,略做修改 var it var it2 var x var y var pit var pit2 var dll var dll1 var pitt var it1_end var base var savecode //需要設定的內容 mov it,5CA000 //混亂IAT首址 mov it1_end,5CAD90 //混亂IAT末址 mov it2,5CADD0 //待存放整理後的IAT首址 // mov savecode,[eip] //儲存當前eip指向內容 mov [eip], #EBFE# //jmp eip,由於整理IAT比較慢,用於待會重新整理介面,防介面假死 gmi eip, MODULEBASE //取主檔案的基址 log $RESULT mov base,$RESULT INICIO: //初始化 mov pitt,it //pitt指向當前正在處理api地址,其前所有api均被處理完畢 //pitt每一輪增加4,當其等於混亂後IAT末址時,則該指令碼執行結束 COMIENZO: add pit,it add pit2,it2 SEGUIMOS: //WE FOLLOWED 新的迴圈開始 add pit,x add pit2,y cmp pit,it1_end log pit log x log y je FIN cmp pit,it1_end ja FIN gmi [pit], MODULEBASE //取該api對應的模組基址 log $RESULT log dll1 cmp pit,pitt jne NOPRIMERA cmp $RESULT,base //該地址處api,是否已被處理過,若被處理過則其基址為主檔案基址base je PIRULO //處理過則跳轉到下一輪 cmp $RESULT,dll1 //這兩句好像沒用,如果前1個dll已被處理過,這裡根本不會跳轉 je IGUALES mov dll, $RESULT log dll jmp NOPRIMERA NOPRIMERA: //not first cmp $RESULT,dll jne NOGUARDO //該地址處api,是否已被處理過,若被處理過則其基址 //例如,處理後該005CA000處內容為005CADD0,取其對應模組基址為為主檔案基址base cmp $RESULT,base je NOGUARDO //處理過則跳轉到下一輪 mov [pit2], [pit] //將混亂後IAT儲存api移入新地址,原地址存放指標指向新地址 mov [pit], pit2 mov x,4 mov y,4 jmp FINLOOP NOGUARDO: //I do not keep mov x,4 mov y,0 jmp FINLOOP FINLOOP: //1輪小迴圈結束 log pit log pit2 jmp SEGUIMOS IGUALES: //EQUAL 沒啥用? mov x,4 mov y,0 jmp FINLOOP FIN: //1個dll處理完畢 mov [pit2],0 mov dll1,dll sto //防介面假死,重新整理od介面 xor x,x xor y,y add pitt,4 cmp dll,base je SALTO add pit2,4 SALTO: //JUMP mov pit,pitt cmp pitt,it1_end je FINISH cmp pitt,it1_end ja FINISH log pit log pit2 log pitt jmp SEGUIMOS FINISH: //所有dll都已被處理完畢 mov [eip],savecode //儲存當前eip指向內容 MSG "TERMINAMOS" log pitt ret PIRULO: //該地址api所在dll已被處理過,故跳過該地址,重新開始一輪 add pitt,4 jmp NOPRIMERA
3. 修復程式碼段呼叫
在Ricardo的教程中在OEP處插入了一段程式來,將排列好的IAT,再次還原到原先打亂的狀態,不過這
樣出來的程式在反編譯時,不能自動識別出呼叫的函式,頗為不爽。
我們來想辦法來解決這個問題。
我們在程式中隨便找一個api呼叫,比如這個
004E8873 8965 E8 MOV DWORD PTR SS:[EBP-18],ESP
004E8876 FF15 E4AC5C00 CALL DWORD PTR DS:[5CACE4] ;
kernel32.GetVersion
004E8876 FF 15 64 B5 E9 00 d甸.3
設硬體寫DWORD斷點004E8878,來看看殼是什麼時候在程式碼段寫入的該api地址
重新執行程式,第1次斷下時是程式碼段解壓,在第二次斷下時候
00DE553A 8B85 E4D0FFFF MOV EAX,DWORD PTR SS:[EBP-2F1C]
00DE5540 40 INC EAX
00DE5541 8985 E4D0FFFF MOV DWORD PTR SS:[EBP-2F1C],EAX
00DE5547 8B85 E4D0FFFF MOV EAX,DWORD PTR SS:[EBP-2F1C]
00DE554D 8B8D 30E8FFFF MOV ECX,DWORD PTR SS:[EBP-17D0] //儲存call呼叫表首地址
00E9B628 在這裡檢視錶格首地址
00DE5553 833C81 00 CMP DWORD PTR DS:[ECX+EAX*4],0 //取表中1項
00DE5557 0F84 90000000 JE 00DE55ED
00DE555D 8B85 E4D0FFFF MOV EAX,DWORD PTR SS:[EBP-2F1C]
00DE5563 8B8D 30E8FFFF MOV ECX,DWORD PTR SS:[EBP-17D0]
00DE5569 8B95 18E7FFFF MOV EDX,DWORD PTR SS:[EBP-18E8]
00DE556F 031481 ADD EDX,DWORD PTR DS:[ECX+EAX*4]
00DE5572 8995 D4D0FFFF MOV DWORD PTR SS:[EBP-2F2C],EDX
00DE5578 8B85 D4D0FFFF MOV EAX,DWORD PTR SS:[EBP-2F2C]
00DE557E 8B00 MOV EAX,DWORD PTR DS:[EAX]
00DE5580 8985 D0D0FFFF MOV DWORD PTR SS:[EBP-2F30],EAX
00DE5586 81BD D0D0FFFF 9>CMP DWORD PTR SS:[EBP-2F30],90909090
00DE5590 74 56 JE SHORT 00DE55E8
00DE5592 8B85 D0D0FFFF MOV EAX,DWORD PTR SS:[EBP-2F30]
00DE5598 2B85 E0D0FFFF SUB EAX,DWORD PTR SS:[EBP-2F20]
00DE559E 8985 D0D0FFFF MOV DWORD PTR SS:[EBP-2F30],EAX
00DE55A4 FFB5 D0D0FFFF PUSH DWORD PTR SS:[EBP-2F30]
00DE55AA 8B85 E4D0FFFF MOV EAX,DWORD PTR SS:[EBP-2F1C]
00DE55B0 33D2 XOR EDX,EDX
00DE55B2 6A 10 PUSH 10
00DE55B4 59 POP ECX
00DE55B5 F7F1 DIV ECX
00DE55B7 FF1495 48B7DE00 CALL DWORD PTR DS:[EDX*4+DEB748] //計算該api在IAT中的索引
00DE55BE 59 POP ECX
00DE55BF 8985 D0D0FFFF MOV DWORD PTR SS:[EBP-2F30],EAX
00DE55C5 8B85 D0D0FFFF MOV EAX,DWORD PTR SS:[EBP-2F30]
00DE55CB 8B8D F0E6FFFF MOV ECX,DWORD PTR SS:[EBP-1910]
00DE55D1 8D0481 LEA EAX,DWORD PTR DS:[ECX+EAX*4] //得到該api在IAT中地址
00DE55D4 8985 D0D0FFFF MOV DWORD PTR SS:[EBP-2F30],EAX
00DE55DA 8B85 D4D0FFFF MOV EAX,DWORD PTR SS:[EBP-2F2C]
00DE55E0 8B8D D0D0FFFF MOV ECX,DWORD PTR SS:[EBP-2F30]
00DE55E6 8908 MOV DWORD PTR DS:[EAX],ECX //寫入call [XXX] 的呼叫地
址
00DE55E8 ^ E9 4DFFFFFF JMP 00DE553A //斷在這裡
走到這裡,看看[EBP-17D0]所指向的記憶體
00DE554D 8B8D 30E8FFFF MOV ECX,DWORD PTR SS:[EBP-17D0] //00E9B628 儲存call呼叫表首
地址
00E9B628 4B 10 00 00 92 10 00 00 A7 10 00 00 B8 10 00 00 K..?..?..?..
00E9B638 EA 10 00 00 14 11 00 00 64 11 00 00 75 11 00 00 ?....d..u..
00E9B648 88 11 00 00 AB 11 00 00 0C 12 00 00 30 12 00 00 ?..?.....0..
00E9B658 B8 12 00 00 CB 12 00 00 E8 12 00 00 37 13 00 00 ?..?..?..7..
00E9B668 AC 13 00 00 B8 14 00 00 C0 14 00 00 D6 14 00 00 ?..?..?..?..
......
00EA2B88 9B 77 1B 00 A8 77 1B 00 06 78 1B 00 79 78 1B 00 w.w.x.yx.
00EA2B98 EB 78 1B 00 E0 79 1B 00 20 7A 1B 00 7F 7A 1B 00 x.y. z.z.
00EA2BA8 00 00 00 00 ....
^_^,call呼叫所在地址表,這正是我們需要的,call所在的RAV地址,這樣就可以用這張表來修復
call[XXX]的地址值了,使之直接指向我們的整理後的IAT,不需要原先的IAT做跳板。
複製該表格到WinHex中,待會好再貼上回來,執行指令碼
現在再次來到執行前面的指令碼到達OEP之處,
然後執行Ricardo的指令碼,整理打亂的IAT,然後隨便找個空地將剛才得到的call呼叫地址表binary
paste,
比如我貼上到00E92000開始的記憶體裡
然後再執行一個小指令碼
程式碼:
//指令碼3,修改程式碼段call [XXX],到整理後的IAT var pCallTable //存放call呼叫所在之處的RVA地址表 var calladdr var base var iataddr var goodiat //設定Call RVA 地址表所在位置 mov pCallTable ,0E92000 //獲取當前模組基地址 gmi eip, MODULEBASE log $RESULT mov base, $RESULT NEXT: mov calladdr, [pCallTable] cmp calladdr, 0 je FIN add calladdr, base //RVA+base=VA mov iataddr, [calladdr] //得到原始IAT表中地址(間接指標,指向整理後得IAT中的地址) log calladdr mov goodiat, [iataddr] //得到整理後得IAT中該api地址 mov [calladdr], goodiat //修改原始程式碼中call XXXX中XXXX的地址,指向整理後的IAT add pCallTable,4 JMP NEXT FIN: MSG "Success!" ret
OK,再看看剛才的那個api呼叫已經直接指向那個整理後的IAT中了
004E8873 8965 E8 MOV DWORD PTR SS:[EBP-18],ESP
004E8876 FF15 68B05C00 CALL DWORD PTR DS:[5CB068] ;
kernel32.GetVersion
4. dump&fix
現在用LordPE dump下來,然後用ImportRec修復,填入OEP,RVA及RVASIZE
OEP=00E8850 IATRVA=1CADD0 大小0D90,將Invalid的全部cut。
修復以後執行一下看看,ok了,累 :)
感謝Ricardo,Eggi的教程。已上傳至http://bbs.pediy.com/showthread.php?s=&threadid=5962
相關文章
- 用Arm3.75加殼的cc
版+iat亂序主程式的脫殼 (1)2004-10-02
- HyperSnap-DX
5.61 漢化版主程式脫殼--第一部分2004-11-12
- 加殼技術探討-加殼時處理IAT2015-11-15
- 殼的工作原理脫殼2013-04-10
- 壹次脫殼法――Armadillo 雙程式標準殼 快速脫殼2015-11-15
- VBExplorer.exe脫殼教程
附脫殼指令碼2015-11-15指令碼
- ExeStealth 常用脫殼方法 + ExeStealth V2.72主程式脫殼2015-11-15
- 以殼解殼--SourceRescuer脫殼手記破解分析2004-11-16
- 用dillodumper2.5脫armdillo加殼的XX軟體在xp下的IAT修復
(7千字)2015-11-15
- 脫殼基本知識2015-11-15
- SoftDefender主程式脫殼2015-11-15
- International CueClub主程式脫殼(Softwrap殼)2004-09-12
- 脫殼----對用pecompact加殼的程式進行手動脫殼
(1千字)2000-07-30
- iOS逆向學習之五(加殼?脫殼?)2019-10-10iOS
- 先分析,再脫殼(一)2003-09-04
- IconEdit2
脫殼2002-03-28
- 十、iOS逆向之《越獄砸殼/ipa脫殼》2021-03-18iOS
- C32Asm外殼脫殼分析筆記2015-11-15ASM筆記
- “愛加密” 動態脫殼法2014-11-21加密
- 360加固保動態脫殼2014-11-17
- EasyBoot5.03脫殼+暴破2004-11-17boot
- Armadillo 3.6主程式脫殼2015-11-15
- 脫殼----對用Petite2.2加殼的程式進行手動脫殼的一點分析
(5千字)2000-07-27
- 教你如何寫UPX脫殼指令碼2019-05-11指令碼
- ☆Steel
Box☆脫殼――taos的New Protection2004-12-13
- 寫給新手
- 淺談脫殼方法2004-12-18
- EmbedPE
1.13 詳細分析和脫殼2005-01-03
- [翻譯]利用程式碼注入脫殼2015-11-15
- 脫殼後軟體減肥大法2015-11-15
- 一次簡單的脫殼2024-08-30
- Krypton
0.5加殼程式脫殼及輸入表修復記2004-10-06
- Armadillo V3.6雙程式標準殼 ------神速脫殼大法2015-11-15
- IAT Hook2019-06-04Hook
- 【原創】一個dex脫殼指令碼2017-01-03指令碼
- 【分享】MEW1.1脫殼指令碼
For OM2004-12-01指令碼
- FTPrint的脫殼(asprotect) (2千字)2001-02-05FTP
- telock脫殼總結 (12千字)2001-09-27
- ACProtect 1.21專業版主程式的脫殼2015-11-15