|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2003-12-21, 12:05 AM | #1 |
榮譽會員
|
JDpack的脫殼
JDpack的脫殼
Fpc/CCG using TRW2000 only 軟體名自己想~~~ 一開始是smc解碼 0167:005E2000 60 PUSHA 0167:005E2001 E800000000 CALL 005E2006 0167:005E2006 5D POP EBP 0167:005E2007 8BD5 MOV EDX,EBP 0167:005E2009 81EDC62B4000 SUB EBP,00402BC6 0167:005E200F 2B9561344000 SUB EDX,[EBP+00403461] 0167:005E2015 81EA06000000 SUB EDX,06 0167:005E201B 899565344000 MOV [EBP+00403465],EDX 0167:005E2021 83BD6934400000 CMP DWORD [EBP+00403469],BYTE +00 0167:005E2028 0F85BC030000 JNZ NEAR 005E23EA 0167:005E202E C785693440000100+MOV DWORD [EBP+00403469],01 0167:005E2038 B988070000 MOV ECX,0788 0167:005E203D 8DB5182C4000 LEA ESI,[EBP+00402C18] 0167:005E2043 8A8560344000 MOV AL,[EBP+00403460] 0167:005E2049 8A1E MOV BL,[ESI] 0167:005E204B 32C3 XOR AL,BL 0167:005E204D 8806 MOV [ESI],AL 0167:005E204F 889D60344000 MOV [EBP+00403460],BL 0167:005E2055 46 INC ESI 0167:005E2056 E2EB LOOP 005E2043 到這: 0167:005E2058 9C PUSHF 0167:005E2059 58 POP EAX 0167:005E205A F6C401 TEST AH,01 <- 是否單步跟蹤 0167:005E205D 7407 JZ 005E2066 <- 這裡得跳 0167:005E205F 80B5D72F4000FF XOR BYTE [EBP+00402FD7],FF 0167:005E2066 8BB501324000 MOV ESI,[EBP+00403201] 0167:005E206C 8BC5 MOV EAX,EBP ..... 注意這個call,跟進: 0167:005E2276 E89D010000 CALL 005E2418 <- F8 0167:005E227B 83F8FF CMP EAX,BYTE -01 0167:005E227E 7504 JNZ 005E2284 0167:005E2280 61 POPA 0167:005E2281 33C0 XOR EAX,EAX 0167:005E2283 C3 RET 0167:005E2284 8B9565344000 MOV EDX,[EBP+00403465] 0167:005E228A 8BB5F1314000 MOV ESI,[EBP+004031F1] 進來後F10次: 0167:005E241D 8CC8 MOV EAX,CS 0167:005E241F 50 PUSH EAX 0167:005E2420 0F014C24FE SIDT [ESP-02] 0167:005E2425 5E POP ESI 0167:005E2426 83C618 ADD ESI,BYTE +18 0167:005E2429 8B4E04 MOV ECX,[ESI+04] 0167:005E242C 668B0E MOV CX,[ESI] 0167:005E242F 8B560C MOV EDX,[ESI+0C] 0167:005E2432 668B5608 MOV DX,[ESI+08] 0167:005E2436 8B4614 MOV EAX,[ESI+14] 0167:005E2439 668B4610 MOV AX,[ESI+10] 0167:005E243D 2BC2 SUB EAX,EDX 0167:005E243F 2BD1 SUB EDX,ECX 0167:005E2441 2BC2 SUB EAX,EDX 0167:005E2443 7406 JZ 005E244B <- 這裡得跳 0167:005E2445 E831000000 CALL 005E247B 0167:005E244A C3 RET 0167:005E244B 33C0 XOR EAX,EAX 0167:005E244D C3 RET 很快到下面: 0167:005E23CE 8907 MOV [EDI],EAX 0167:005E23D0 8385FD31400004 ADD DWORD [EBP+004031FD],BYTE +04 0167:005E23D7 E93BFFFFFF JMP 005E2317 0167:005E23DC 83C614 ADD ESI,BYTE +14 0167:005E23DF 8B9565344000 MOV EDX,[EBP+00403465] 0167:005E23E5 E9A8FEFFFF JMP 005E2292 0167:005E23EA EB16 JMP SHORT 005E2402 <- 在這設斷點 0167:005E23EC 45 INC EBP 0167:005E23ED 4D DEC EBP 0167:005E23EE 42 INC EDX 到005E2402很快就到oep: push eax ret <- 到oep 在oep處makepe即可 enjoy! 鐵甲2.01與JDpack1.01脫殼綜述 鐵甲和JDpack是由中國人姜東開發的加殼軟體。隨著版本的昇級程序的易用 性得到了用戶的信賴,儘管加殼技術並不成熟。比方說他自身的加密,鐵甲2.01 軟體,只要把系統時間調到2001年7月1日以前,就能正常使用。 通過對由他們加殼的程序的跟蹤發現,在鐵甲和JDpack加殼的程序上存在著 對偵錯工具的防範措施,但是使用的技術很簡單。兩個軟體原理基本相同,但是 程式碼和方法可能有所不同,下面以鐵甲2.01來說一下。 =============================================================================== 使用鐵甲加殼windows內已含有notepad.exe,然後偵錯分析: 啟動trw2000,然後載入notepad.exe,程序被攔截到TRW2000領域,開始使用 F8鍵繼續跟蹤,一直跟蹤到如下程式碼: 0167:0040D04B 32C3 XOR AL,BL 0167:0040D04D 8806 MOV [ESI],AL 0167:0040D04F 889D00244000 MOV [EBP+00402400],BL 0167:0040D055 46 INC ESI //--下指令G 40D058 0167:0040D056 E2EB LOOP 0040D043 //---循環 0167:0040D058 9C PUSHF //---游標跳到這裡,程式碼發生變化 0167:0040D059 46 INC ESI 0167:0040D05A B074 MOV AL,74 0167:0040D05C 7501 JNZ 0040D05F 0167:0040D05E 07 POP ES 0167:0040D05F F8 CLC 0167:0040D060 5D POP EBP 0167:0040D061 684A0A0A81 PUSH DWORD 810A0A4A 0167:0040D066 347D XOR AL,7D ======================變化後的程式碼================================ 0167:0040D04B 32C3 XOR AL,BL 0167:0040D04D 8806 MOV [ESI],AL 0167:0040D04F 889D00244000 MOV [EBP+00402400],BL 0167:0040D055 46 INC ESI 0167:0040D056 E2EB LOOP 0040D043 0167:0040D058 9C PUSHF //---游標在這裡 0167:0040D059 58 POP EAX 0167:0040D05A F6C401 TEST AH,01 0167:0040D05D 7406 JZ 0040D065 //--R FL Z跳過,否則 0167:0040D05F FFA535224000 JMP NEAR [EBP+00402235] //執行這個非法 0167:0040D065 8BB549224000 MOV ESI,[EBP+00402249] //跳到這裡 =================================================================== F10開始繼續跟蹤,應該經過如下程式碼段3次,不要理會,當過了 CALL 0040D3F4 3次後,要小心了,因為程序的反跟蹤程式碼就在這裡開始第一次檢查: 0167:0040D0A9 F3A4 REP MOVSB 0167:0040D0AB 8BB529224000 MOV ESI,[EBP+00402229] 0167:0040D0B1 8BB84D224000 MOV EDI,[EAX+0040224D] 0167:0040D0B7 03FA ADD EDI,EDX 0167:0040D0B9 57 PUSH EDI 0167:0040D0BA 56 PUSH ESI 0167:0040D0BB E834030000 CALL 0040D3F4 //循環3次後,F10仔細跟蹤 0167:0040D0C0 5E POP ESI 0167:0040D0C1 5F POP EDI 0167:0040D0C2 58 POP EAX 0167:0040D0C3 5E POP ESI ====================================================================== 過來以後,發現一段程式碼: 0167:0040D1B6 EB00 JMP SHORT 0040D1B8 0167:0040D1B8 83C602 ADD ESI,BYTE +02 0167:0040D1BB E2B8 LOOP 0040D175 0167:0040D1BD EB9E JMP SHORT 0040D15D 0167:0040D1BF E8FE010000 CALL 0040D3C2 //--ANTI-Debug ,F8跟進去 0167:0040D1C4 8B9505244000 MOV EDX,[EBP+00402405] 0167:0040D1CA 8BB539224000 MOV ESI,[EBP+00402239] 0167:0040D1D0 03F2 ADD ESI,EDX ========================== F8跟進去到了這裡,典型的ANTI-Debug的基本模式: 0167:0040D3BF C20400 RET 04 0167:0040D3C2 8CC8 MOV EAX,CS 0167:0040D3C4 50 PUSH EAX 0167:0040D3C5 0F014C24FE SIDT [ESP-02] //----利用IDT來檢測,F8繼續 0167:0040D3CA 5E POP ESI 0167:0040D3CB 83C618 ADD ESI,BYTE +18 0167:0040D3CE 8B4E04 MOV ECX,[ESI+04] 0167:0040D3D1 668B0E MOV CX,[ESI] 0167:0040D3D4 8B560C MOV EDX,[ESI+0C] 0167:0040D3D7 668B5608 MOV DX,[ESI+08] 0167:0040D3DB 8B4614 MOV EAX,[ESI+14] 0167:0040D3DE 668B4610 MOV AX,[ESI+10] 0167:0040D3E2 2BC2 SUB EAX,EDX 0167:0040D3E4 2BD1 SUB EDX,ECX //--注意這裡EAX=10 0167:0040D3E6 2BC2 SUB EAX,EDX //--為使結果為0,可以使用指令R修改EDX=10 0167:0040D3E8 7409 JZ 0040D3F3 //結果為0就跳走,不為0就顯示藍色 // 如果不修改EDX,可以在這裡R FL Z,讓程序 // 躲避過第一次檢測 0167:0040D3EA 8B44241C MOV EAX,[ESP+1C] 0167:0040D3EE 03C2 ADD EAX,EDX 0167:0040D3F0 FFD0 CALL EAX 0167:0040D3F2 C3 RET 0167:0040D3F3 C3 RET 0167:0040D3F4 60 PUSHA =========================================================================================== 好了躲過了第一次檢測,程序還有第二次檢測,同樣是使用CALL 0040D3C2,所以F8繼續跟蹤 到以下程式碼: 0167:0040D240 53 PUSH EBX 0167:0040D241 FFB541224000 PUSH DWORD [EBP+00402241] 0167:0040D247 FF9580234000 CALL NEAR [EBP+00402380] 0167:0040D24D 8907 MOV [EDI],EAX 0167:0040D24F 83854522400004 ADD DWORD [EBP+00402245],BYTE +04 //從這裡G 0040D266 0167:0040D256 EBAB JMP SHORT 0040D203 0167:0040D258 83C614 ADD ESI,BYTE +14 0167:0040D25B 8B9505244000 MOV EDX,[EBP+00402405] 0167:0040D261 E96CFFFFFF JMP 0040D1D2 0167:0040D266 E857010000 CALL 0040D3C2 //跳到檢測口,F8跟進去,如同上一個檢測處理 0167:0040D26B 83BD7D22400001 CMP DWORD [EBP+0040227D],BYTE +01 0167:0040D272 7505 JNZ 0040D279 0167:0040D274 E9F9000000 JMP 0040D372 0167:0040D279 8DB5A5224000 LEA ESI,[EBP+004022A5] ====================== 處理好第二個以後,程序出口到了程式碼: 0167:0040D266 E857010000 CALL 0040D3C2 //檢測成功,程序執行下一行 0167:0040D26B 83BD7D22400001 CMP DWORD [EBP+0040227D],BYTE +01 // 與01比較, 0167:0040D272 7505 JNZ 0040D279 // 程序不能跳,跳了就非法 0167:0040D274 E9F9000000 JMP 0040D372 //----跳到程序的OEP入口---->>>>> 0167:0040D279 8DB5A5224000 LEA ESI,[EBP+004022A5] 0167:0040D27F 56 PUSH ESI 0167:0040D280 FF9588234000 CALL NEAR [EBP+00402388] 0167:0040D286 83F800 CMP EAX,BYTE +00 0167:0040D289 7408 JZ 0040D293 0167:0040D28B 8985A1224000 MOV [EBP+004022A1],EAX 0167:0040D291 EB07 JMP SHORT 0040D29A ======================= 成功的到達程序OEP入口處: 典型的 JMP EAX 0167:0040D370 EB00 JMP SHORT 0040D372 0167:0040D372 8B9505244000 MOV EDX,[EBP+00402405] //---跳到這裡 0167:0040D378 8B8535224000 MOV EAX,[EBP+00402235] 0167:0040D37E 03C2 ADD EAX,EDX 0167:0040D380 5D POP EBP 0167:0040D381 FFE0 JMP EAX //----程序的正確入口! 這裡pedump出解壓的文件 0167:0040D383 55 PUSH EBP 0167:0040D384 8BEC MOV EBP,ESP 0167:0040D386 50 PUSH EAX ======================================================================================= 完成脫殼了。在JMP EXA上F10一次,程序直接從NOTEPAD.hmjd跳到NOTEPAD.text,程式碼如下: 0167:004010C0 25322E3264 AND EAX,64322E32 0167:004010C5 0000 ADD [EAX],AL 0167:004010C7 000D0A000055 ADD [5500000A],CL 0167:004010CD 8BEC MOV EBP,ESP 0167:004010CF 83EC44 SUB ESP,BYTE +44 0167:004010D2 56 PUSH ESI 0167:004010D3 FF15E4634000 CALL `KERNEL32!GetCommandLineA` 0167:004010D9 8BF0 MOV ESI,EAX 0167:004010DB 8A00 MOV AL,[EAX] 0167:004010DD 3C22 CMP AL,22 0167:004010DF 751B JNZ 004010FC 0167:004010E1 56 PUSH ESI 0167:004010E2 FF15F4644000 CALL `USER32!CharNextA` 呵呵,驗證無誤,OK,該休息了,脫殼到了0:19分。 ================================================================================= 在本電腦上Jdpe 2.01的入口是10CC,用TRW2000脫出後,就可以修復ITA,完成脫殼和修 復工作。 接著看了看JDpack的殼,大致情形一樣,但是我沒有跟到他的ANTI-Debug,在這裡要說的 是跟蹤的時候注意幾個循環和跳轉的處理,比較累了,得休息了,明天繼續研究寫個jdpack 的脫殼程序。 CrackerABC 2002/07/31 ================================================================================ JDPack 1.01脫殼 由於沒有跟蹤到JDPack的Anti-Debug程式碼,加上迷惑處很多,所以就直接使用trw2000來 動態脫殼。 首先使用衝擊波檢測到程序入口為40DC50,所以在TRW2000中下斷點BPX 40DC50,然後運 行被加殼的程序,成功攔截以後,PEDUMP出解壓文件。 然後,啟動加殼後的程序,然後啟動ImportREC,從程序工作中選項被加殼的程序,然後 手動輸入入口點DC50,自動搜尋ITA表內容,然後獲取輸入表,發現所有的函數都有效,直接 修復脫殼出來的程序,執行,完全正常。 這裡要提一點:如果在中斷後,使用suspend指令掛起TRW2000,然後使用Procdump來脫 出文件,則文件可以直接執行,但是,無法反編譯後看到字串。如果嘗試使用ImportREC來 修復ITA,程序就會非法,還得去分析非法原因,所以不如直接使用TRW2000脫殼出來修復來 的快和好。而且脫出來的程序也就大了4K左右。 |
送花文章: 3,
|