--------------------------------------------------------------------------------
【破解作者】 SYSCOM
【使用工具】 Ollydbg1.10, LordPE,ImportREC 1.62 ,PEid 0.94
【破解平台】 Windows XP SP1
【软件名称】 MultiTranse 3.5.8
【下载地址】 Http://www.tialsoft.com/multitranse/
【软件简介】 Online Translation Software
【加壳方式】 ASProtect SKE 2.X
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
(0) 用 PEid 0.94 偵測為 ASProtect 2.1x SKE -> Alexey Solodovnikov
(1) 用ollydbg 载入MultiTranse.exe ,按 ALT+O 设置异常 Memory Access Violation。
按 F9 , 會發生異常中斷在位址 00BDB530
00BDB530-- MOV DWORD PTR DS:[EAX],12C5EC7F
(2) 按 CTRL+B 搜尋 83,C4,2C,5D,5F,5E,5B,C3 ,在 00BDA8C5 ,設硬件斷點
00BDA8C5--E8 7ACEFFFF CALL 00BD7744 <= 設硬件斷點
00BDA8CA--83C4 2C ADD ESP,2C
00BDA8CD--5D POP EBP
00BDA8CE--5F POP EDI
00BDA8CF--5E POP ESI
00BDA8D0--5B POP EBX
00BDA8D1--C3 RETN
(3) 按 CTRL+F2 ,重新載入 ,按 ALT+O 忽略异常 Memory Access Violation。
按 F9 , 會發生硬件中斷在位址 00BDA8C5 按 F7 STEP 走到 00BD77BE
00BD77BE--RETN <==== 返回到 00EA02CD => OEP 開始
00BD77BF--JMP SHORT 00BD77C2
00EA02CD--PUSH EBP <== OEP Start
00EA02CE--JMP 00EA0C22
00EA02D3--MOV DWORD PTR DS:[54B718],EAX
00EA02D8--ADD EAX,EBX
(4) 按 CTRL+B 搜尋 89,45,F0,B8,00,07,00,00 修改 00BE7097==>JMP 0054B060
00BE7092--33C0 XOR EAX,EAX
00BE7094--8945 F0 MOV DWORD PTR SS:[EBP-10],EAX
00BE7097--B8 00070000 MOV EAX,700 修改 ==>JMP 0054B060(獲得API返回 Patch)
(5) 貼上 Patch Code ,在 0054B000 空白區,CTRL+ Gray* 將 EIP=> 0054B000
準備取出正確 WIN32 API
(6) 第一次,設 ESI=1 ,F2->中斷設在 0054B05E,按 F9,
使 5C0000 區塊獲得 IAT (亂序)
(6.1) 在 5C0000 區塊中,會發現一個,指向 00BEXXXX ,殼的 API ,
那個就是隱藏的 API => GetProcAddress ,修正它
(7) CTRL+ Gray* 將 EIP=>0054B0D0 ,F2->中斷設在 0054B0F7,
按 F9,在 5C0000 區塊獲得 IAT(排序)
(8)COPY->IAT 5C0000 區塊, 到文字檔 IAT.TXT ,利用編輯軟體,例如 WinHex,UEdit32
將 IAT 中,各 DLL中間,插入 4 BYTES 00 00 00 00 區隔,完成後,再貼回 005C0000
(9) 第二次,設 ESI=2 ,F2->中斷設在 0054B05E,按 F9,使 CODE 重新定位 IAT ADDRESS
(10)Patch 完成後,Full_Dump ,然後執行 ImportREC 令 RVA=1C0000,SIZE= 868
->Fix Dump 完成 90% 進度
修復 CODE AND 重建 IAT - Patch Code
========================================================================
0054B000--BE 01000000 MOV ESI,1 ;ESI=1取出API,ESI=2重定位API
0054B005--B8 00005C00 MOV EAX,MultiTra.005C0000 ;IAT 開始位址
0054B00A--A3 F4AF5400 MOV DWORD PTR DS:[54AFF4],EAX
0054B00F--BA 00104000 MOV EDX,MultiTra ;CODE 開始位址
0054B014--803A E8 CMP BYTE PTR DS:[EDX],0E8 ;是否 CALL ??
0054B017--75 19 JNZ SHORT MultiTra.0054B032
0054B019--8B5A 01 MOV EBX,DWORD PTR DS:[EDX+1]
0054B01C--03DA ADD EBX,EDX
0054B01E--83C3 05 ADD EBX,5 ;計算正確的 CALL ADDR
0054B021--81FB 0000EA00 CMP EBX,0EA0000 ;是否 ASPR 解碼位址??
0054B027--75 2C JNZ SHORT MultiTra.0054B055
0054B029--60 PUSHAD ;保存寄存器
0054B02A--8925 F0AF5400 MOV DWORD PTR DS:[54AFF0],ESP ;保存 ESP 值
0054B030--FFE2 JMP EDX ;進入ASPR 解碼
0054B032--66:813A FF25 CMP WORD PTR DS:[EDX],25FF ;是否 JMP [XX]?
0054B037--75 1C JNZ SHORT MultiTra.0054B055
0054B039--8B5A 02 MOV EBX,DWORD PTR DS:[EDX+2]
0054B03C--81FB 08D25400 CMP EBX,MultiTra.0054D208 ;是否在原來IAT位址筥圍
0054B042--72 11 JB SHORT MultiTra.0054B055 ;小於 54D208?
0054B044--81FB 08E25400 CMP EBX,MultiTra.0054E208
0054B04A--77 09 JA SHORT MultiTra.0054B055 ;大於 54E208?
0054B04C--8B1B MOV EBX,DWORD PTR DS:[EBX]
0054B04E--83FE 01 CMP ESI,1 ;ESI=1??
0054B051--74 26 JE SHORT MultiTra.0054B079
0054B053--EB 4B JMP SHORT MultiTra.0054B0A0
0054B055--42 INC EDX ;計數器 +1
0054B056--81FA 00505400 CMP EDX,MultiTra.00545000
0054B05C--72 B6 JB SHORT MultiTra.0054B014 ;CODE 段結束?
0054B05E--EB FE JMP SHORT MultiTra.0054B05E ;Patch 結束 中斷點
0054B060--90 NOP ;<=取得 API 返回點
0054B061--8BDA MOV EBX,EDX
0054B063--891D F8AF5400 MOV DWORD PTR DS:[54AFF8],EBX ;保存 API
0054B069--8B25 F0AF5400 MOV ESP,DWORD PTR DS:[54AFF0] ;取回 ESP
0054B06F--61 POPAD ;還原寄存器
0054B070--8B1D F8AF5400 MOV EBX,DWORD PTR DS:[54AFF8] ;取出 API
0054B076--EB D6 JMP SHORT MultiTra.0054B04E
0054B078--90 NOP
0054B079--8B0D F4AF5400 MOV ECX,DWORD PTR DS:[54AFF4]
0054B07F--B8 00005C00 MOV EAX,MultiTra.005C0000 ;IAT 開始位址
0054B084--3918 CMP DWORD PTR DS:[EAX],EBX
0054B086--74 CD JE SHORT MultiTra.0054B055 ;是否重複??
0054B088--05 04000000 ADD EAX,4
0054B08D--3BC1 CMP EAX,ECX
0054B08F--72 F3 JB SHORT MultiTra.0054B084
0054B091--8919 MOV DWORD PTR DS:[ECX],EBX ;保存 API
0054B093--8305 F4AF5400 04ADD DWORD PTR DS:[54AFF4],4 ;指到下個 API ADDR
0054B09A--EB B9 JMP SHORT MultiTra.0054B055
0054B09C--90 NOP
0054B09D--90 NOP
0054B09E--90 NOP
0054B09F--90 NOP
0054B0A0--B8 00005C00 MOV EAX,MultiTra.005C0000 ;IAT 開始位址
0054B0A5--3918 CMP DWORD PTR DS:[EAX],EBX
0054B0A7--74 0E JE SHORT MultiTra.0054B0B7 ;是否找到??
0054B0A9--05 04000000 ADD EAX,4
0054B0AE--3D 6C085C00 CMP EAX,MultiTra.005C086C ;IAT 結束位址?
0054B0B3--72 F0 JB SHORT MultiTra.0054B0A5
0054B0B5--EB FE JMP SHORT MultiTra.0054B0B5
0054B0B7--66:C702 FF25 MOV WORD PTR DS:[EDX],25FF ;修正為 JMP
0054B0BC--2D 00005C00 SUB EAX,MultiTra.005C0000
0054B0C1--05 00105C00 ADD EAX,5C1000 ;修正 OFFSET
0054B0C6--8942 02 MOV DWORD PTR DS:[EDX+2],EAX ;重定位 ADDR
0054B0C9--EB 8A JMP SHORT MultiTra.0054B055
0054B0CB--90 NOP
0054B0CC--90 NOP
0054B0CD--90 NOP
0054B0CE--90 NOP
0054B0CF--90 NOP ;排序 API
0054B0D0--B9 2C085C00 MOV ECX,MultiTra.005C082C ;IAT 結束位址
0054B0D5--BE 00005C00 MOV ESI,MultiTra.005C0000 ;IAT 開始位址
0054B0DA--8BFE MOV EDI,ESI
0054B0DC--8B06 MOV EAX,DWORD PTR DS:[ESI]
0054B0DE--8B1F MOV EBX,DWORD PTR DS:[EDI]
0054B0E0--3BC3 CMP EAX,EBX
0054B0E2--76 05 JBE SHORT MultiTra.0054B0E9
0054B0E4--93 XCHG EAX,EBX ;如果大於則互換
0054B0E5--8906 MOV DWORD PTR DS:[ESI],EAX
0054B0E7--891F MOV DWORD PTR DS:[EDI],EBX
0054B0E9--83C7 04 ADD EDI,4
0054B0EC--3BF9 CMP EDI,ECX
0054B0EE--76 EC JBE SHORT MultiTra.0054B0DC ;LOOP X1
0054B0F0--83C6 04 ADD ESI,4
0054B0F3--3BF1 CMP ESI,ECX
0054B0F5--76 E3 JBE SHORT MultiTra.0054B0DA ;LOOP X2
0054B0F7--EB FE JMP SHORT MultiTra.0054B0F7 ;排序結束
========================================================================
(11) 執行 LordPE ,選定 MultiTranse.exe 按右 key Mouse,
選 dump region 取出 Stolen Code 區段,忽略無用模擬 API VM,
取出必須的 M1-M3 Stolen Code VM 區段 ,及 OEP 區段
VM Address Size
===========================
00BC0000 33000 <-ASProtect 解密 CODE 區段
00C40000 4000 <-ASProtect 資料 DATA 區段
00EA0000 3000 <-OEP Stolen Code
00F00000 1000 <-M1 Stolen Code
00F10000 1000 <-M1 Stolen Code
00F20000 1000 <-M2 Stolen Code
00F30000 1000 <-M2 Stolen Code
00F40000 1000 <-M2 Stolen Code
00F50000 1000 <-M3 Stolen Code
00F60000 1000 <-M3 Stolen Code
===========================
全部抓出來後,再用 LordPE ,附加在 DUMP 檔尾,並修正 PE Header
(12) 修正 4 個,預先解碼的 API (注意:不是每個ASProtect,都會預先解碼)
如果沒遇到,可以跳過這修正..
00401384--JMP DWORD PTR DS:[kernel32.GetModuleFileNameA]
00406F50--JMP DWORD PTR DS:[ADVAPI32.RegCloseKey]
00406F58--JMP DWORD PTR DS:[ADVAPI32.RegCreateKeyExA]
00406F98--JMP DWORD PTR DS:[ADVAPI32.RegQueryValueExA]
(13)修正 Route Check
修正前....
00BE8542--MOV EAX,DWORD PTR DS:[EAX+34]
00BE8545--CALL EAX
00BE8547--SUB DWORD PTR SS:[EBP+C],EAX
修正後
00BE8542--NOP
00BE8543--NOP
00BE8544--MOV EAX,DWORD PTR SS:[ESP+58]
00BE8548--SUB EAX,5
(14) 開始 RUN ,跨平台 TEST ~OK~!!!!!
PS.(1)只要是 ASProtect 2.1x SKE + Delphi (有/無 Stolen Code 都可)
都可適用,此 PATCH ....(改一下位址,即可套用)
如果是 VC ++ 程序,請找我以前發的一篇文章,套用 PATCH,即可
(2)那些分離的 Stolen Code,基本上你時間多,都可以,還原回去的
相關的文章,可以參考 loveboom 兄,所寫的 ASProtect 系列
新手脫殼,如有錯誤,還望高手不吝指正....