以殼解殼――ASProtect 1.23RC4殼的Stolen Code簡便解決方案

看雪資料發表於2004-05-13

下載頁面:http://www.superdown.com/soft/17405.htm 
軟體大小:4250KB
軟體語言:英文
軟體類別:國外軟體 / 共享版 / 程式設計開發
執行環境:Win9x/WinNT/2000/ME/XP
加入時間:2004-4-16 20:08:04
軟體評級:***
開 發 商:http://www.sicomponents.com/rbldr.html
軟體介紹:自稱是自Borland Resource WorkShop 4.5後的長久期待>可以直接開啟資原始檔,可以匯入.exe檔案並可選擇指定的資源以便於修改,修改後只能存為資源格式,如果直接開啟表但可以類似exescope一樣修改,如果是匯入的話,只能看到16進位制碼。 
            
【作者宣告】:只是感興趣,沒有其他目的。失誤之處敬請諸位大俠賜教!
            
【除錯環境】:WinXP、Ollydbg1.10B、PEiD、LordPE、AsprDbgr、ImportREC 1.42+
            
――――――――――――――――――――――――――――――――― 
【脫殼過程】:
                     
            
                      
如今的猛殼們把Stolen Code越做越變態,雖然大部分Stolen Code都可以分析出來,但是有點費時間。這次以Resource Builder 2.1.0.3為例來演示一種ASProtect 1.23RC4殼的Stolen Code簡便解決方案。這個方法我曾經見過飛速兄用過。在殼把所有的程式碼解壓之後、處理Stolen Code之前,把程式Dump出來,補上那段殼程式碼,模仿構造當時的堆疊和暫存器值環境,這樣就由殼自己來解決Stolen Code的問題啦。推而廣之,這個Stolen Code簡便解決方案也適用於某些其他殼。
            
―――――――――――――――――――――――――――――――――
一、Pre-Dip:用自己的名字註冊
            
            
老規矩:用IsDebug 1.4外掛去掉Ollydbg的偵錯程式標誌。
因為程式的rbcore.dll和sicmplr.dll也是用了ASProtect加殼,所以我們先忽略所有的異常選項,當Ollydbg彈出“是壓縮程式碼――要繼續進行分析嗎?”,點“否”。接著設定Ollydbg忽略除了“記憶體訪問異常”之外的所有其它異常選項。
      

程式碼:
       00401000     68 01A06E00          push Resbldr2.006EA001//進入OD後停在這 00401005     E8 01000000          call Resbldr2.0040100B 0040100A     C3                   retn
 
            
Shift+F9執行,注意看堆疊,當第2次在堆疊中看見“8wh3JAAQjOI=”硬碟指紋時,可以處理了。
            
程式碼:
0012FF3C    0012FF44  指標到下一個 SEH 記錄 0012FF40    012B465C  SE 控制程式碼 0012FF44    0012FFE0  指標到下一個 SEH 記錄 0012FF48    012B4C49  SE 控制程式碼 0012FF4C    0012FF90 0012FF50    012A0000 0012FF54    00D00000 0012FF58    012B4138 0012FF5C    012D33BC  ASCII "8wh3JAAQjOI="//硬碟指紋
 
            
程式碼:
012B46A5     3100                 xor dword ptr ds:[eax],eax//異常,第2次看見硬碟指紋 012B46A7     EB 01                jmp short 012B46AA

            
Alt+M開啟記憶體檢視視窗,在00401000段下 記憶體訪問斷點,Shift+F9透過異常,斷下
            
程式碼:
00578654     55                   push ebp 00578655     8BEC                 mov ebp,esp 00578657     8B45 08              mov eax,dword ptr ss:[ebp+8] 0057865A     85C0                 test eax,eax 0057865C     74 0C                je short Resbldr2.0057866A 0057865E     8038 00              cmp byte ptr ds:[eax],0 00578661     74 07                je short Resbldr2.0057866A 00578663     C605 90046200 01     mov byte ptr ds:[620490],1 0057866A     8B15 84046200        mov edx,dword ptr ds:[620484] 00578670     8915 80046200        mov dword ptr ds:[620480],edx 00578676     A3 84046200          mov dword ptr ds:[620484],eax//註冊名 0057867B     5D                   pop ebp 0057867C     C2 0400              retn 4

            
過了00578676之後,[620484]處應該是儲存的註冊使用者名稱,找一段空地,在613B00處寫入:fly  [OCN][FCG][NUKE][DCM],然後把[620484]處的值改為613B00。OK,這個Pre-Dip處理完畢。感謝lipton兄的指教。這個程式有幾個功能的程式碼需要真正的Key才能解開,所以這只是偽註冊罷了。
            
                        
―――――――――――――――――――――――――――――――――
二、Dump以及區域脫殼
            
            
取消記憶體斷點,繼續Shift+F9執行。來到ASProtect最後1次典型異常處。
            
程式碼:
012B39EC     3100                 xor dword ptr ds:[eax],eax//ASProtect最後1次典型異常處 012B39EE     64:8F05 00000000     pop dword ptr fs:[0] 012B39F5     58                   pop eax 012B39F6     833D B07E2B01 00     cmp dword ptr ds:[12B7EB0],0 012B39FD     74 14                je short 012B3A13 012B39FF     6A 0C                push 0C 012B3A01     B9 B07E2B01          mov ecx,12B7EB0 012B3A06     8D45 F8              lea eax,dword ptr ss:[ebp-8] 012B3A09     BA 04000000          mov edx,4 012B3A0E     E8 2DD1FFFF          call 012B0B40 012B3A13     FF75 FC              push dword ptr ss:[ebp-4] 012B3A16     FF75 F8              push dword ptr ss:[ebp-8] 012B3A19     8B45 F4              mov eax,dword ptr ss:[ebp-C] 012B3A1C     8338 00              cmp dword ptr ds:[eax],0 012B3A1F     74 02                je short 012B3A23 012B3A21     FF30                 push dword ptr ds:[eax] 012B3A23     FF75 F0              push dword ptr ss:[ebp-10] 012B3A26     FF75 EC              push dword ptr ss:[ebp-14] 012B3A29     C3                   retn//此處下斷,Shift+F9斷下

            
此時ESP=0012FF5C,看看堆疊,使用ESP定律
            
程式碼:
0012FF5C    012CE9DC 0012FF60    00400000  ASCII "MZP" 0012FF64    C244FCB6 0012FF68    0012FFA4//注意這裡 ★

            
0012FF68=0012FFA4,選中0012FF68轉存處的4個位元組,下“硬體訪問->Word”斷點。F9執行,中斷下來
            
程式碼:
012C6A41     EB 44                jmp short 012C6A87//斷在這裡 012C6A43     EB 01                jmp short 012C6A46 012C6A46     51                   push ecx 012C6A47     57                   push edi 012C6A48     9C                   pushfd 012C6A49     FC                   cld 012C6A4A     BF 00000000          mov edi,0 012C6A4F     B9 00000000          mov ecx,0 012C6A54     F3:AA                rep stos byte ptr es:[edi]//這裡下斷 012C6A56     9D                   popfd 012C6A57     5F                   pop edi 012C6A58     59                   pop ecx 012C6A59     C3                   retn

            
程式碼:
012C6A87     03C3                 add eax,ebx 012C6A89     BB 8B070000          mov ebx,78B//注意這個值 ★ 012C6A8E     0BDB                 or ebx,ebx 012C6A90     75 07                jnz short 012C6A99

            
程式碼:
012C6A99     E8 00000000          call 012C6A9E 012C6A9E     5D                   pop ebp 012C6A9F     81ED 4DE14B00        sub ebp,4BE14D 012C6AA5     8D85 F2E04B00        lea eax,dword ptr ss:[ebp+4BE0F2] 012C6AAB     8D8D 94E14B00        lea ecx,dword ptr ss:[ebp+4BE194] 012C6AB1     03CB                 add ecx,ebx 012C6AB3     8941 01              mov dword ptr ds:[ecx+1],eax 012C6AB6     8D85 36E14B00        lea eax,dword ptr ss:[ebp+4BE136] 012C6ABC     8D8D FAE04B00        lea ecx,dword ptr ss:[ebp+4BE0FA] 012C6AC2     8901                 mov dword ptr ds:[ecx],eax 012C6AC4     B8 5E140000          mov eax,145E 012C6AC9     8D8D FFE04B00        lea ecx,dword ptr ss:[ebp+4BE0FF] 012C6ACF     8901                 mov dword ptr ds:[ecx],eax 012C6AD1     8D8D 94E14B00        lea ecx,dword ptr ss:[ebp+4BE194] 012C6AD7     8D85 94F34B00        lea eax,dword ptr ss:[ebp+4BF394] 012C6ADD     51                   push ecx 012C6ADE     50                   push eax 012C6ADF     E8 76FFFFFF          call 012C6A5A 012C6AE4     61                   popad//下面開始處理Stolen Code ★ 012C6AE5     EB 02                jmp short 012C6AE9

            
            
OK,現在我們不去分析這個東東的Stolen Code,程式程式碼已經解開,可以用LordPE糾正ImageSize後完全DUMP這個程式了!
接著 區域脫殼:012C0000,大小=00008000,也就是脫出上面的部分殼處理程式碼段。
            
下面走至偽OEP:在012C6A54處下斷,F9執行,斷下。
            
程式碼:
012C6A54     F3:AA                rep stos byte ptr es:[edi]//斷下 012C6A56     9D                   popfd 012C6A57     5F                   pop edi 012C6A58     59                   pop ecx 012C6A59     C3                   retn//飛向光明之巔!返回程式004072DC

            
程式碼:
             004072DC     FF25 1CA36200        jmp dword ptr ds:[62A31C]//第1個函式啦

            
F7走下去,來到偽OEP處。當然這個東東的Stolen Code也不難分析出來,這裡只是作為一個例子來演示罷了。
            
程式碼:
00613652     61                   popad 00613653     0000                 add byte ptr ds:[eax],al 00613655     0000                 add byte ptr ds:[eax],al 00613657     0000                 add byte ptr ds:[eax],al 00613659     0000                 add byte ptr ds:[eax],al 0061365B     0000                 add byte ptr ds:[eax],al 0061365D     0000                 add byte ptr ds:[eax],al 0061365F     E8 3C3DDFFF          call Resbldr2.004073A0//偽OEP ★ 00613664     33C0                 xor eax,eax 00613666     55                   push ebp 00613667     68 B6366100          push Resbldr2.006136B6 0061366C     64:FF30              push dword ptr fs:[eax] 0061366F     64:8920              mov dword ptr fs:[eax],esp 00613672     A1 EC4E6200          mov eax,dword ptr ds:[624EEC] 00613677     8B00                 mov eax,dword ptr ds:[eax] 00613679     E8 86C2E8FF          call Resbldr2.0049F904 0061367E     A1 EC4E6200          mov eax,dword ptr ds:[624EEC] 00613683     8B00                 mov eax,dword ptr ds:[eax] 00613685     BA CC366100          mov edx,Resbldr2.006136CC; ASCII "Resource Builder 2.0" 0061368A     E8 6DBEE8FF          call Resbldr2.0049F4FC

            
            
現在我們來“組裝”一下dumped.exe。呵呵,用LordPE開啟dumped.exe,從磁碟載入剛才區域脫殼的Region012C0000-012C8000.dmp區段,修改其Voffset=00EC0000,只保留LordPE的“驗證PE”選項,重建PE。Dump完成!
            
            
―――――――――――――――――――――――――――――――――
三、用AsprDbgr搞定輸入表
            
    
程式碼:
          AsprDbgr v1.0beta (:P) Made by me... Manko.   iEP=401000 (E:\試煉場\脫殼學習\ASProtect\Resource Builder 2.0\Resbldr2.exe   GST returns to: 12A2667     Trick aspr GST... (EAX=12121212h)   GV returns to: 12B1A61     IAT Start: 62A21C           End: 62ABAC        Length: 990       IATentry 62A23C = 12B1C8C resolved as GetVersion       IATentry 62A270 = 12B17A4 resolved as GetProcAddress       IATentry 62A274 = 12B1C64 resolved as GetModuleHandleA       IATentry 62A288 = 12B1CD8 resolved as GetCommandLineA       IATentry 62A31C = 12B1C64 resolved as GetModuleHandleA       IATentry 62A3CC = 12B1CC8 resolved as LockResource       IATentry 62A410 = 12B1C8C resolved as GetVersion       IATentry 62A434 = 12B17A4 resolved as GetProcAddress       IATentry 62A43C = 12B1C64 resolved as GetModuleHandleA       IATentry 62A474 = 12B1CC0 resolved as GetCurrentProcessId       IATentry 62A480 = 12B1CF0 resolved as FreeResource     SymbolInitialize seems to have frozen.     Any invalid IAT entries was NOT erased...   Dip-Table at adress: 12B7AB4     0 578654 0 578694 5786C4 578728 0 6122C0 612CF8 5785DC 578610 578644 578 0   Last SEH passed. Searching for signatures. Singlestepping to OEP!     Call + OEP-jump-setup at: 12C6A99 ( Code: E8000000 5D81ED )     Mutated, stolen bytes at: 12C6AE4 ( Code: 61EB02CD 20EB01F0 )     Erase of stolen bytes at: 12C6A48 ( Code: 9CFCBF87 6A2C01B9 )       Repz ... found. Skipping erase of stolen bytes. ;)   Dip from pre-OEP: 4072DC (Reached from: 12C6A59)   Sugested tempOEP at: 61365F   GST returns to: 76171AC0

            
            
執行ImportREC 1.42+,選擇這個程式。填入:RVA=0022A21C,Size=00000990,點IT AutoSearch,點“Get Import”,剪下掉幾個無效的函式,把OEP改為00EC0000,FixDump!
            
            
―――――――――――――――――――――――――――――――――
四、以殼解殼:Stolen Code簡便解決方案
            
            
現在的OEP是012C0000,修改其入口程式碼為:
            
程式碼:
012C0000     BB 8B070000          mov ebx,78B 012C0005     E9 8F6A0000          jmp dumped_.012C6A99

            
這樣就利用了原殼的程式碼來處理Stolen Code了。儲存之後就可以執行了。
             
            
―――――――――――――――――――――――――――――――――
五、2個暗樁的修復
            
            
1、另外當點選“Option”時會自動退出,跟蹤程式找到異常出錯的地方
            
程式碼:
0057AF65     E8 A2D9FFFF          call dumped_.0057890C//把這裡NOP掉就行了 0057AF6A     33C0                 xor eax,eax


程式碼:
0057890C     55                   push ebp 0057890D     8BEC                 mov ebp,esp 0057890F     51                   push ecx 00578910     53                   push ebx 00578911     8B05 1E784000        mov eax,dword ptr ds:[40781E] 00578917     8B18                 mov ebx,dword ptr ds:[eax] 00578919     FF33                 push dword ptr ds:[ebx] 0057891B     895D FC              mov dword ptr ss:[ebp-4],ebx 0057891E     8F03                 pop dword ptr ds:[ebx]//異常 00578920     8B45 FC              mov eax,dword ptr ss:[ebp-4] 00578923     5B                   pop ebx 00578924     59                   pop ecx 00578925     5D                   pop ebp 00578926     C3                   retn

            
――――――――――――――――――――――――
2、點選“Link To EXE”時會自動退出
            
            
程式碼:
005788C4     55                   push ebp 005788C5     8BEC                 mov ebp,esp 005788C7     51                   push ecx 005788C8     C645 FF 00           mov byte ptr ss:[ebp-1],0 005788CC     A1 48486200          mov eax,dword ptr ds:[624848] 005788D1     8038 00              cmp byte ptr ds:[eax],0 005788D4     75 19                jnz short 005788EF 005788D6     56                   push esi 005788D7     8B35 68666200        mov esi,dword ptr ds:[626668] 005788DD     8B46 3C              mov eax,dword ptr ds:[esi+3C] 005788E0     8B4430 28            mov eax,dword ptr ds:[eax+esi+28];00ECC000//取入口地址 005788E4     66:3D 0010           cmp ax,1000//比較後面是否是1000 005788E8     74 04                je short UnPacked.005788EE//改為JMP 005788EA     804D FF 01           or byte ptr ss:[ebp-1],1 005788EE     5E                   pop esi 005788EF     807D FF 00           cmp byte ptr ss:[ebp-1],0 005788F3     74 13                je short 00578908

            
原來005788E4這裡還檢測了原程式的入口地址,改為JMP就行了。
“Edit as Text”和“Link To EXE”的功能程式碼是需要真正的Key才能解壓的,沒辦法啦。
            
            
―――――――――――――――――――――――――――――――――    
程式碼:
                                          ,     _/          /| _.-~/            \_     ,        青春都一晌        ( /~   /              \~-._ |\        `\\  _/                \   ~\ )          忍把浮名     _-~~~-.)  )__/;;,.          \_  //'   /'_,\   --~   \ ~~~-  ,;;\___(  (.-~~~-.        換了破解輕狂  `~ _( ,_..--\ (     ,;'' /    ~--   /._`\    /~~//'   /' `~\         ) /--.._, )_  `~   "  `~"  "      `"      /~'`\    `\\~~\                             "     "   "~'  ""

    

     Cracked By 巢水工作坊――fly [OCN][FCG][NUKE][DCM]

                2004-05-13  17:00

相關文章