• 标 题:淺談脫Asprotect1.07的殼. (2千字)
  • 作 者:C-pen
  • 时 间:2000-9-25 17:45:10
  • 链 接:http://bbs.pediy.com

[前    言]:有許多朋友問我關於Asprotect1.07版的脫殼方法,我想我在這裡簡單寫一下,或許對各位有幫助,或許沒有,無論如何總是一個經驗分享,我使用Imp_list來做為重建Import Table的工作,這並非正統,若你的實力夠的話,建議你還是寫個程式來重建.不過Imp_list已經有針對Asprotect1.07升級了,只是沒有開放當漏罷了. 
[目標軟件]:Advanced Word 95 Password Recovery V1.2
          URL: http://www.elcomsoft.com/aw95pr.html
          為什麼選它,嘻!因為它只要修正3個API(Thanks God!)
[使用工具]:1.Soft-ICE 4.01
          2.Icedump
          3.Procdump32
          4.BW2000 
          5.Imp_list
[脫    殼]:
1.    先用Procdump32和BW2000 去分析我們要的資料:
    Size of image:33000
    Image base:400000
    原始的程式進入點(OEP):401000
    .idata VO:8000(執行Imp_list就會知道)
2.    執行Imp_list,會產生Address.txt,Import1.bin,Import2.bin沒有最重要的Import0.bin沒關係,打開Address.txt你會發現Shell32.dll和Comdlg32.dll它們的函數成員是亂碼,這就是新版的Asprotect的保護機制,它先不還原這些API等到程式要用時它才會還原APIname,Call GetProcAddress去得到函數位址再返回這個位址去執行程式.
    記下這些指針:Shell32.dllà 006C2024
                Comdlg32.dllà 006C249C
                            006C24B8
3.    叫出Soft-ICE下bpx createfilea do “d *(esp+4)”,執行AW95pr.exe攔住後,按F5一次,按F12返回,按F10Trace,此時是在第一段的CRC  chek
    按F10一直到一連串的Jmp,Mov,此時就要按F8小心Trace,它ret會到Kernel的領空,你一直按F8會返回Aw95pr的領空,若按F10程式就會執行,來到Aw95pr的領空,再按F10Trace,如此反覆數次,一直到出現Asprotect的編碼程式,此時下d 408000, 往下找,你會看到編碼後的指針,你會看到3類指針,
    (1)API位址  (2)Call XXXXXXXX  <--  這兩種是可用Imp_list重建
    (3)Push XXXXXXXX 
      Call XXXXXXXX      <--這裡就是那些Shell32.dll,Comdlg32.dll編碼的地方
    我們的思路就是知道這些第三類指針代表那些API和求得它的位址,再將這些位址代入指針,再使用Imp_list來順利重建.
    那這些函數如何求?
    我們以006c2024為例,下d 006c2024會看到68 2e 20 6c 00,下d 006c202e,會看到65 17 6c 00,再下d 006c1765,你會看到Shell32.dll,在它的後面有一組數據9F 0E C3 2B C1 AB 66 81 14 37 AE 0C 54 50 91 EC
    DC 20 (9F –重此開始,  0E—表示API有0Eh個字元, DC—表中斷)
    其實從C3~EC這是未還原的API Name,它會跟一組變數取XOR後還原.
    再繼續Trace下去,一直來到OEP即00401000,下/dump 400000 33000C:\Awdump.exe
    ,下Bpx 006C2024,006C249C,006C24B8
    按F5,程式出現,點Open file,程式中斷在006C249C,按F8Trace,你會發現這個Call在還原API Name=GetOpenFileNameA,Address=52086112
    ,再按Save中斷在006C24B8,API Name=GetSaveFileNameA,Address=52086163,再按Save一次,再中斷在006C24B8,下a eip/jmp 006C2024(偷吃步,因為只剩下一個API)得到API Name=ShellExecuteA,Address=7FD47579
    再進去AW95pr,在00401000(即OEP處)改006C2024-->7FD47579
                    006C249C-->52086112
                    006C24B8-->52086163
    清掉Hint,f 00408550 l 00408fc0-00408550 00
    再用Imp_list去重建Import Table,這次會很成功,且有Import0.bin
    最後的工作大家應該都會做,不再贅述.
很報歉!!寫的很亂,希望對大家有幫助.
    JOHNSON      2000/09/25