以殼解殼--SourceRescuer脫殼手記破解分析

看雪資料發表於2004-11-16

前言:七月份就已經發布在DFCG論壇裡了,現在看雪老大要出精華6了,大菜鳥我近來沒時間寫東東了,就把它轉來,算是投一篇稿吧。真希望能入選一篇,以回報這個給了我很多幫助的看雪論壇!

軟體名稱:
  以殼解殼--SourceRescuer脫殼手記
   
軟體簡介:
  半年多前(過年前)看見fly脫神放出的該軟體脫殼破解版(含原版)。當時偶初學破解,先當下來用用。時隔半年多,開啟雜亂的硬碟,才又發現該軟體。想想初學脫殼,一眨眼半年又過去了,唉,歲月匆匆啊!!!話不多說了,今天我們用fly脫神的以殼脫殼法治理該軟體,希望廣大脫友能有所收穫!又注:用fly脫神的標準方法脫了N>10次,沒有成功,後看了Mr.David兄的脫system cleaner4.91的動畫,才成功。Mr.David兄在後期處理使用了稍有不同的方法,我們來學學看。呵呵
   
下載地址:http://bbs.pediy.com/showthread.php?s=&threadid=7042
  
------------------------------------------------------------
   
破解作者:
  springkang[DFCG]
   
破解工具:
  OllyDbg,impr,loadpe,AsprDbgr_build_106.exe,winxp,etc
   
破解目的:
  只為技術,不唯破解!互相探討,共同提高!!
   
------------------------------------------------------------
   
[破解過程]
   
詳細過程:
用peid0.92查是ASProtect 1.23 RC4 Registered -> Alexey Solodovnikov。
用為OD載入,不忽略記憶體訪問異常,其餘全部忽略!
00401000 >  68 01405B00     PUSH SourceRe.005B4001   //載入後停在這裡,F9執行
00401005    E8 01000000     CALL SourceRe.0040100B
0040100A    C3              RETN
0040100B    C3              RETN
0040100C    AF              SCAS DWORD PTR ES:[EDI]


00AE49CB    3100            XOR DWORD PTR DS:[EAX],EAX   //偶這裡是第二十三次異常後出現第二次硬碟指紋,然後下ALT+M開啟下記憶體斷點,shift+f9
00AE49CD    EB 01           JMP SHORT 00AE49D0
00AE49CF    68 648F0500     PUSH 58F64
00AE49D4    0000            ADD BYTE PTR DS:[EAX],AL
00AE49D6    00EB            ADD BL,CH


0056BAD4    55              PUSH EBP     //停在這裡
0056BAD5    8BEC            MOV EBP,ESP
0056BAD7    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
0056BADA    A3 F8295700     MOV DWORD PTR DS:[5729F8],EAX   //注意[5729f8],現在我們可在用dd 5729f8監視該記憶體區域的值。這裡是儲存註冊名的。透過最後一次異常後就可以修改裡面的內容了。取消記憶體斷點後,再按幾次shift+f9來到經典的異常處
0056BADF    5D              POP EBP
0056BAE0    C2 0400         RETN 4



00AE3D03    3100            XOR DWORD PTR DS:[EAX],EAX  //來到這裡
00AE3D05    64:8F05 0000000>POP DWORD PTR FS:[0]
00AE3D0C    58              POP EAX
00AE3D0D    833D BC7EAE00 0>CMP DWORD PTR DS:[AE7EBC],0
00AE3D14    74 14           JE SHORT 00AE3D2A
00AE3D16    6A 0C           PUSH 0C
00AE3D18    B9 BC7EAE00     MOV ECX,0AE7EBC
00AE3D1D    8D45 F8         LEA EAX,DWORD PTR SS:[EBP-8]
00AE3D20    BA 04000000     MOV EDX,4
00AE3D25    E8 E6D2FFFF     CALL 00AE1010
00AE3D2A    FF75 FC         PUSH DWORD PTR SS:[EBP-4]
00AE3D2D    FF75 F8         PUSH DWORD PTR SS:[EBP-8]
00AE3D30    8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]
00AE3D33    8338 00         CMP DWORD PTR DS:[EAX],0
00AE3D36    74 02           JE SHORT 00AE3D3A
00AE3D38    FF30            PUSH DWORD PTR DS:[EAX]
00AE3D3A    FF75 F0         PUSH DWORD PTR SS:[EBP-10]
00AE3D3D    FF75 EC         PUSH DWORD PTR SS:[EBP-14]
00AE3D40    C3              RETN          //在這裡下F2斷點,然後shift+f9到這裡。取消斷點,好,我們看看堆疊的值:
0012FF5C   00AF750C
0012FF60   00400000  ASCII "MZP"
0012FF64   E55B8319
0012FF68   0012FFA4      //dd 0012ff68 然後 下硬體訪問斷點,也可以直接:hr 12ff68.然後F9
0012FF6C   00000003


00AF761A   /EB 3F           JMP SHORT 00AF765B   //中斷到這裡了,F7或F8均可,
00AF761C   |60              PUSHAD
00AF761D   |9C              PUSHFD
00AF761E   |FC              CLD
00AF761F   |BF 00000000     MOV EDI,0
00AF7624   |B9 00000000     MOV ECX,0
00AF7629   |F3:AA           REP STOS BYTE PTR ES:[EDI]  //fly是在這裡再下斷,可是本文中,我們不下斷,往後看。
00AF762B   |9D              POPFD
00AF762C   |61              POPAD
00AF762D   |C3              RETN


從00AF761A   /EB 3F           JMP SHORT 00AF765B跳到這裡:

00AF765B    03C3            ADD EAX,EBX                              ; SourceRe.00400000
00AF765D    BB 3F060000     MOV EBX,63F   //單步到這裡後,我們停住,不要再向前走了。等下修復時這裡就是入口處了!!!到這裡我們就可以dump了。先完全dump,再區域dump(我這裡是:address:00af0000,size:0000c000,考慮為什麼在這裡,因為從00af765d往下幾行程式碼就是殼對入口處程式碼的處理了)。然後我們裝配一下dump後的檔案。磁碟載入後:修復新載入的section的voffset為:00af0000-00400000=6f0000,儲存後重建pe,選項只先validate pe.重建完後。接著我們執行AsprDbgr_build_106,
00AF7662    0BDB            OR EBX,EBX
00AF7664    75 02           JNZ SHORT 00AF7668
00AF7666    50              PUSH EAX
00AF7667    C3              RETN
00AF7668    E8 00000000     CALL 00AF766D  //fly脫神等人提示這行要注意,本文中暫且不管它。

AsprDbgr_build_106執行後的程式碼:
AsprDbgr v1.0beta () Made by me... Manko.

  iEP=401000 (J:\破解\SourceRescuer\原版\SourceRescuer.exe)

    IAT Start: 573140    //這裡注意一下,我們在用impr修復時填入173140
          End: 573908
       Length: 7C8       //這個數字我們也用得上
      IATentry 573194 = AE10AC resolved as GetProcAddress
      IATentry 573198 = AE1500 resolved as GetModuleHandleA
      IATentry 5731AC = AE1574 resolved as GetCommandLineA
      IATentry 573250 = AE1500 resolved as GetModuleHandleA
      IATentry 5732CC = AE1564 resolved as LockResource
      IATentry 573304 = AE1528 resolved as GetVersion
      IATentry 57331C = AE10AC resolved as GetProcAddress
      IATentry 573324 = AE1500 resolved as GetModuleHandleA
      IATentry 57334C = AE155C resolved as GetCurrentProcessId
      IATentry 573354 = AE158C resolved as FreeResource
    15 invalid entries erased.
  Dip-Table at adress: AE7980
    0 56BAD4 0 0 56BAE4 0 0 56BB00 56BB78 56BB80 0 0 0 0
  Last SEH passed. (AE3D05) Searching for signatures. Singlestepping to OEP!
    Call + OEP-jump-setup at: AF8304 ( Code: E8000000 5D81ED )
    Mutated, stolen bytes at: AF834F ( Code: EB02CD20 6681355D )
    Erase of stolen bytes at: AF82B9 ( Code: 9CFCBFF7 82AF00B9 )
      Repz ... found. Skipping erase of stolen bytes. 
  possible (temp)OEP: 406EC8 (Reached from preOEP: AF82C9)
  Sugested tempOEP at: 56BFE3      //還有這裡,等下用impr修復時填上16bfe3


現在我們用impr開啟程式,選取最新的sourcerescuer程式(也就用AsprDbgr_build_106產生的程式,不是od產生的,注意!偶就是這裡失敗了N次)
oep填上:0056bfe3-00400000=
16bfe3,RVA和size分別填上:573140-40000=173140和7c8,然後iat autosearch 和get imports,再show invalid ,全部有效。接下來在oep處填入:00AF765D -40000=6f765d,fix dump.執行就OK了

相比之下,後期處理和fly 大俠的方法稍有點不同,脫友們體會到了嗎?




   
破解小結:
  方法源自fly脫神的以殼解殼文章,沒有他,我不可能完成脫殼。還要感謝Mr.David兄的動畫,解決了我的一些疑問!
  偶很菜了,沒時間總結了,謝謝你能耐心的看完
  偶的QQ:14695672(註明crack)
                                          
                               springkang[DFCG]  
                                 2004。7。27
                                          
   
------------------------------------------------------------

版權公有,人權私有!謝謝轉載,註明作者!

相關文章