Alex Protector V1.0 脫殼――alexprot.exe 主程式

看雪資料發表於2004-10-17

下載頁面:  http://bbs.pediy.com/showthread.php?s=&threadid=5850點選此處本地下載
軟體大小:  52 KB  
軟體簡介:  Protector for exe files with cool import protection  
             
【作者宣告】:只是感興趣,沒有其他目的。失誤之處敬請諸位大俠賜教!
             
【除錯環境】:WinXP、Ollydbg V1.10、PEiD、LordPE、ImportREC
             
――――――――――――――――――――――――――――――――― 
【脫殼過程】:
          
         
Alex Protector V1.0是今天在exetools論壇釋出的殼。
這個殼的花指令和輸入表跳轉地址加密有些麻煩。
今年湧現不少新殼,不知道這個Alex Protector以後會如何變態。
―――――――――――――――――――――――――――――――――
一、搞定輸入表跳轉地址加密
             
             
設定Ollydbg忽略除了“記憶體訪問異常”之外的所有其它異常選項。老規矩:用IsDebug V1.4外掛去掉Ollydbg的偵錯程式標誌。

00438000     60                pushad
//進入OD後暫停在這
00438001     E8 00000000       call alexprot.00438006
00438006     5D                pop ebp
00438007     81ED 06104000     sub ebp,alexprot.00401006
0043800D     E8 24000000       call alexprot.00438036
00438012     EB 01             jmp short alexprot.00438015

Shift+F9執行,暫停在記憶體訪問異常處。
003B13C2     3300              xor eax,dword ptr ds:[eax]
//記憶體訪問異常處
003B13C4     83C4 04           add esp,4
003B13C7     FFE3              jmp ebx

Shift+F9執行,會在003B13C2處中斷3次。

Alt+M 開啟記憶體察看視窗,在00401000段“設定記憶體寫入斷點”。
Shift+F9,中斷在003B0C05處。中斷後取消記憶體斷點。
看看暫存器值,你會發現這裡就是殼寫入加密跳轉地址的地方!
我在這裡Patch,使殼寫入程式中的地址作為輸入表的跳轉地址,這樣就可以Dump下來了。

003B0C04     61                popad
003B0C05     8901              mov dword ptr ds:[ecx],eax
//中斷在這裡  
//修改為:JMP 003BB000  ★
003B0C07     83C7 04           add edi,4
003B0C0A     FECB              dec bl
003B0C0C     58                pop eax
003B0C0D     80FB 00           cmp bl,0
003B0C10     0F87 42FFFFFF     ja 003B0B58
003B0C16     803F C3           cmp byte ptr ds:[edi],0C3
003B0C19     0F84 A1FDFFFF     je 003B09C0
003B0C1F     833F 00           cmp dword ptr ds:[edi],0
003B0C22     0F84 DE000000     je 003B0D06
//輸入表處理完畢則跳轉
003B0C28     E9 8AFDFFFF       jmp 003B09B7
003B0C2D     47                inc edi
003B0C2E     8B1F              mov ebx,dword ptr ds:[edi]
003B0C30     53                push ebx
003B0C31     60                pushad
003B0C32     EB 03             jmp short 003B0C37

――――――――――――――――――――――――
在下面找點空白處(003BB000)寫入Patch程式碼:

003BB000     53                  push ebx
003BB001     56                  push esi
003BB002     3E:8B9C24 08FFFFFF  mov ebx,dword ptr ds:[esp-F8]; USER32.77D10000
//[esp-F8]處儲存的是處理DLL的基址 ★
003BB00A     3B1D 00C03B00       cmp ebx,dword ptr ds:[3BC000]; USER32.77D10000
//提前在[3BC000]處寫入當前處理DLL的基址 ★
003BB010     74 0D               je short 003BB01F
//比較處理的DLL是否相同 ★
003BB012     891D 00C03B00       mov dword ptr ds:[3BC000],ebx
//儲存新的DLL基址 ★
003BB018     8305 08C03B00 04    add dword ptr ds:[3BC008],4
//不同則跳轉地址+4,方便修復輸入表 ★
003BB01F     8B1D 08C03B00     mov ebx,dword ptr ds:[3BC008]  ; alexprot.00429000
//提前在[3BC008]處寫入準備放跳轉地址的地址,呵呵,有點拗口了 ★
//我選擇的是程式的第4個區段,寫入00429000
003BB025     3E:8BB424 58FFFFFF  mov esi,dword ptr ds:[esp-A8]; USER32.TranslateMessage
//[esp-A8]處儲存的是正確的函式 ★
003BB02D     8933                mov dword ptr ds:[ebx],esi
//函式寫入修改的地址
003BB02F     8919                mov dword ptr ds:[ecx],ebx
//[ecx]是程式中的呼叫地址,寫入修改後的跳轉地址 ★
003BB031     8305 08C03B00 04    add dword ptr ds:[3BC008],4
//跳轉地址+4
003BB038     5E                  pop esi
003BB039     5B                  pop ebx
//恢復堆疊
003BB03A     83C7 04             add edi,4
//003B0C07處程式碼挪到這裡執行
003BB03D     E9 C85BFFFF         jmp 003B0C0A
//跳回去繼續流程

――――――――――――――――――――――――
修改完以上部分後在003B0D06處下斷,Shift+F9中斷下來,輸入表處理完畢了。

003B0D06     E8 97060000       call 003B13A2
//這裡下斷
003B0D0B     8D9D 31254000     lea ebx,dword ptr ss:[ebp+40253>
003B0D11     60                pushad
003B0D12     EB 03             jmp short 003B0D17

此時[3BC008]處是004290D8,這就是結束的地址了。
Size=004290D8-00429000=D8
OK,第一部分處理完畢。


―――――――――――――――――――――――――――――――――
二、OEP、Dump


Shift+F9執行,來到最後一次記憶體異常處。當然,這步可以省略。

003B13C2     3300              xor eax,dword ptr ds:[eax]
//最後一次記憶體異常
003B13C4     83C4 04           add esp,4
003B13C7     FFE3              jmp ebx

Alt+M 開啟記憶體察看視窗,在00401000段“設定記憶體訪問斷點”。
Shift+F9 中斷在00406B07處!

00406B05     0000              add byte ptr ds:[eax],al
00406B07     E8 4E2B0000       call alexprot.0040965A         ; jmp to kernel32.GetModuleHandleA
//中斷在這裡
00406B0C     A3 1CC64000       mov dword ptr ds:[40C61C],eax
00406B11     E8 382B0000       call alexprot.0040964E         ; jmp to kernel32.GetCommandLineA
00406B16     E8 872B0000       call alexprot.004096A2         ; jmp to comctl32.InitCommonControls

看看堆疊:
0012FFA0   00000000

根據組合語言編譯程式的特點和堆疊,補上Stolen Code:
00406B05     6A 00             push 0
//用LordPE糾正ImageSize後完全DUMP這個程式


執行ImportREC,選擇這個程式。把OEP改為00006B05,RVA=00029000、Size=000000D8,獲取輸入表。
FixDump,正常執行!  
               
             
―――――――――――――――――――――――――――――――――    
                                
         ,     _/ 
        /| _.-~/            \_     ,        青春都一晌
       ( /~   /              \~-._ |\
       `\\  _/                \   ~\ )          忍把浮名 
   _-~~~-.)  )__/;;,.          \_  //'
  /'_,\   --~   \ ~~~-  ,;;\___(  (.-~~~-.        換了破解輕狂
 `~ _( ,_..--\ (     ,;'' /    ~--   /._`\ 
  /~~//'   /' `~\         ) /--.._, )_  `~
  "  `~"  "      `"      /~'`\    `\\~~\   
                         "     "   "~'  ""
    
              UnPacked By :  fly
               2004-10-17 23:00

相關文章