ACProtect 1.21專業版主程式的脫殼

看雪資料發表於2015-11-15

標 題:ACProtect 1.21專業版主程式的脫殼

發信人:tDasm

時 間:2004年2月22日 08:49 

詳細資訊: 



ACProtect 1.21專業版主程式的脫殼

作業系統:WIN2K 
工具:OLLYDBG1.1,ImportREC,LordPE 
下載地址:  http://www.ultraprotect.com/acpr_pro.exe 
目標程式:ACProtect 1.21專業版主程式。 

脫殼過程: 
1.尋找Stolen code的變形及其偽OEP。 
用OLLYDBG1.1載入後,停留在程式的入口: 
006D4000   pushad
006D4001   dec ecx
006D4002   sbb esi,B59B7C21
006D4008   clc
006D4009   mov ecx,ebx
006D400B   dec ecx
    用IsDebug 1.4外掛去掉Ollydbg的偵錯程式標誌。忽略除了“int3異常”之外的所有其他異常選項。
檢視堆疊esp=12ffc4,根據此值來設定硬體訪問斷點:去轉存視窗,Ctrl+G:0012FFC0(入口esp-4),在0012FFC0處的4個位元組上,下硬體訪問->DWord 斷點。 
F9開始執行,斷下後再取消該硬體斷點。 
006E56FF   popad
006E5700   mov dword ptr ds:[6D4E73],ebx
006E5706   push dword ptr ds:[6D4E73]
006E570C   push eax
006E570D   mov eax,ACProtec.006D4ECF
006E5712   mov ebx,eax
006E5714   pop eax                                       ; KERNEL32.77E887E7
006E5715   mov dword ptr ds:[ebx],ecx
006E5717   pop ebx                                       ; KERNEL32.77E887E7
006E5718   push dword ptr ds:[6D4ECF]
006E571E   mov dword ptr ss:[esp],esi
006E5721   mov dword ptr ss:[esp],ebx
006E5724   mov dword ptr ss:[esp],eax
006E5727   push edx
006E5728   pop dword ptr ds:[6D4ECB]                     ; KERNEL32.77E887E7
006E572E   push dword ptr ds:[6D4ECB]
006E5734   mov dword ptr ss:[esp],ecx
006E5737   mov dword ptr ss:[esp],ACProtec.006D4F0F
006E573E   pop dword ptr ds:[6D4EEF]                     ; KERNEL32.77E887E7
006E5744   mov dword ptr ds:[6D4E9F],ebx
006E574A   push dword ptr ds:[6D4E9F]
006E5750   pushad
006E5751   call ACProtec.006E1460
006E5756   call ACProtec.006E575B
006E575B   pop ebx                                       ; KERNEL32.77E887E7
006E575C   sub ebx,dword ptr ss:[ebp+4023EC]
006E5762   sub ebx,1175B
006E5768   mov dword ptr ss:[ebp+40D2AA],ebx
006E576E   popad
006E576F   mov dword ptr ss:[esp],edi                    ; ACProtec.005D16A8
006E5772   mov dword ptr ds:[6D4E9B],ACProtec.006D4EEF
006E577C   push dword ptr ds:[6D4E9B]
006E5782   pop dword ptr ds:[6D4E97]                     ; KERNEL32.77E887E7
006E5788   mov edi,dword ptr ds:[6D4E97]
006E578E   mov eax,dword ptr ds:[edi]
006E5790   mov edi,dword ptr ss:[esp]                    ; KERNEL32.77E887E7
006E5793   pop dword ptr ds:[6D4EC7]                     ; KERNEL32.77E887E7
006E5799   mov dword ptr ds:[eax],ebp  //stolen code第1行,push ebp的變形
006E579B   mov eax,dword ptr ss:[esp]                    ; KERNEL32.77E887E7
006E579E   pop dword ptr ds:[6D4EFB]                     ; KERNEL32.77E887E7
006E57A4   push dword ptr ds:[6D4F0F]
006E57AA   mov dword ptr ds:[6D4F0B],esp
006E57B0   push dword ptr ds:[6D4F0B]
006E57B6   pop dword ptr ds:[6D4EF7]                     ; KERNEL32.77E887E7
006E57BC   push eax
006E57BD   nop
006E57BE   nop
006E57BF   pushad
006E57C0   call ACProtec.006E1460
006E57C5   call ACProtec.006E11FE
006E57CA   mov dword ptr ss:[ebp+40E205],eax
006E57D0   popad
006E57D1   mov dword ptr ss:[esp],edx
006E57D4   mov dword ptr ds:[6D4E93],ACProtec.006D4EDB
006E57DE   mov edx,dword ptr ds:[6D4E93]
006E57E4   mov dword ptr ds:[edx],ecx
006E57E6   mov edx,dword ptr ss:[esp]                    ; KERNEL32.77E887E7
006E57E9   pop dword ptr ds:[6D4E8F]                     ; KERNEL32.77E887E7
006E57EF   push dword ptr ds:[6D4EDB]
006E57F5   push ACProtec.006D4EF7
006E57FA   pop dword ptr ds:[6D4EC3]                     ; KERNEL32.77E887E7
006E5800   push dword ptr ds:[6D4EC3]
006E5806   pop dword ptr ds:[6D4EBF]                     ; KERNEL32.77E887E7
006E580C   push dword ptr ds:[6D4EBF]
006E5812   pop ecx                                       ; KERNEL32.77E887E7
006E5813   mov ebp,dword ptr ds:[ecx//stolen code第2行,mov ebp,esp的變形
006E5815   mov ecx,dword ptr ss:[esp]                    ; KERNEL32.77E887E7
006E5818   pop dword ptr ds:[6D4ED7]                     ; KERNEL32.77E887E7
006E581E   push edx
006E581F   nop
006E5820   nop
006E5821   pushad
006E5822   call ACProtec.006E1460
006E5827   mov byte ptr ss:[ebp+40D1D0],0
006E582E   popad
006E582F   mov edx,ACProtec.006D4EBB
006E5834   mov dword ptr ds:[edx],ebx
006E5836   pop edx                                       ; KERNEL32.77E887E7
006E5837   push dword ptr ds:[6D4EBB]
006E583D   pop dword ptr ds:[6D4EEB]                     ; KERNEL32.77E887E7
006E5843   push dword ptr ds:[6D4EEB]
006E5849   mov dword ptr ss:[esp],eax
006E584C   mov dword ptr ss:[esp],esi  //stolen code第3行,push esi的變形
006E584F   push edx
006E5850   mov edx,ACProtec.006D4EB7
006E5855   mov dword ptr ds:[edx],ecx
006E5857   pop edx                                       ; KERNEL32.77E887E7
006E5858   push dword ptr ds:[6D4EB7]
006E585E   push ecx
006E585F   mov dword ptr ss:[esp],ACProtec.006D4EE7
006E5866   pop dword ptr ds:[6D4E8B]                     ; KERNEL32.77E887E7
006E586C   mov ecx,dword ptr ds:[6D4E8B]
006E5872   mov dword ptr ds:[ecx],eax
006E5874   mov ecx,dword ptr ss:[esp]                    ; KERNEL32.77E887E7
006E5877   pop dword ptr ds:[6D4EB3]                     ; KERNEL32.77E887E7
006E587D   nop
006E587E   nop
006E587F   pushad
006E5880   call ACProtec.006E369A
006E5885   popad
006E5886   push dword ptr ds:[6D4EE7]
006E588C   pop dword ptr ds:[6D4F07]                     ; KERNEL32.77E887E7
006E5892   push dword ptr ds:[6D4F07]
006E5898   push edi                                      ; ACProtec.005D16A8
006E5899   mov edi,ACProtec.006D4EAF
006E589E   mov dword ptr ds:[edi],esi
006E58A0   pop edi                                       ; KERNEL32.77E887E7
006E58A1   push dword ptr ds:[6D4EAF]
006E58A7   mov dword ptr ss:[esp],edi                    ; ACProtec.005D16A8
006E58AA   push ebx
006E58AB   pop dword ptr ds:[6D4EAB]                     ; KERNEL32.77E887E7
006E58B1   push dword ptr ds:[6D4EAB]
006E58B7   mov dword ptr ds:[6D4E87],eax
006E58BD   push dword ptr ds:[6D4E87] //stolen code第4行,push eax的變形    
006E58C3   mov dword ptr ds:[6D4E83],ACProtec.006D4EF3
006E58CD   mov eax,dword ptr ds:[6D4E83]
006E58D3   push ecx
006E58D4   mov ecx,eax
006E58D6   pushad
006E58D7   call ACProtec.006E3437
006E58DC   popad
006E58DD   mov ebx,ecx
006E58DF   pop ecx                                       ; KERNEL32.77E887E7
006E58E0   pop dword ptr ds:[6D4E7F]                     ; KERNEL32.77E887E7
006E58E6   mov eax,dword ptr ds:[6D4E7F]
006E58EC   push edi                                      ; ACProtec.005D16A8
006E58ED   mov edi,ACProtec.006D4EA7
006E58F2   mov dword ptr ds:[edi],ebx
006E58F4   pop edi                                       ; KERNEL32.77E887E7
006E58F5   push edx
006E58F6   mov edx,ACProtec.006D4EA7
006E58FB   mov edi,dword ptr ds:[edx]
006E58FD   pop edx                                       ; KERNEL32.77E887E7
006E58FE   mov ebx,dword ptr ss:[esp]                    ; KERNEL32.77E887E7
006E5901   pop dword ptr ds:[6D4EA3]                     ; KERNEL32.77E887E7
006E5907   mov dword ptr ds:[edi],esi
006E5909   pop dword ptr ds:[6D4ED3]                     ; KERNEL32.77E887E7
006E590F   push dword ptr ds:[6D4ED3]
006E5915   pop dword ptr ds:[6D4E7B]                     ; KERNEL32.77E887E7
006E591B   mov edi,dword ptr ds:[6D4E7B]
006E5921   push dword ptr ds:[6D4EF3]
006E5927   mov dword ptr ss:[esp],ebx  //stolen code第5行,push ebx的變形      
006E592A   nop
006E592B   nop
006E592C   nop
006E592D   pushad
006E592E   call ACProtec.006E56B9
006E5933   popad
006E5934   mov dword ptr ds:[6D4E77],ebx
006E593A   push dword ptr ds:[6D4E77]
006E5940   mov dword ptr ss:[esp],eax
006E5943   pop dword ptr ds:[6D4EE3]                     ; KERNEL32.77E887E7
006E5949   push dword ptr ds:[6D4EE3]
006E594F   mov dword ptr ss:[esp],edx
006E5952   mov dword ptr ss:[esp],esi  //stolen code第6行,push esi的變形
006E5955   push esi
006E5956   mov dword ptr ss:[esp],ebx
006E5959   mov dword ptr ss:[esp],ACProtec.004CBFF8
006E5960   pop dword ptr ds:[6D4EDF]                     ; KERNEL32.77E887E7
006E5966   push dword ptr ds:[6D4EDF]
006E596C   pop dword ptr ds:[6D4F03]                     ; KERNEL32.77E887E7
006E5972   push dword ptr ds:[6D4F03]
006E5978   mov eax,dword ptr ss:[esp//stolen code第7行,mov eax,4cbff8的變形
006E597B   pop dword ptr ds:[6D4EFF]                     ; KERNEL32.77E887E7
006E5981   nop
006E5982   nop
以上程式碼要一步一步按F7跟蹤,注意執行前後各暫存器值的變化以及堆淺esp的變化,以便確認是附值還是push,從而得出正確的stolen code,並作好紀錄。到006e5981後按F9繼續執行。出現int3異常中斷:
006E2CFE   int3
006E2CFF   nop
006E2D00   pop dword ptr fs:[0]                          ; 0012FFE0
006E2D06   add esp,4
006E2D09   pushad
006E2D0A   call ACProtec.006E2D0F
006E2D0F   pop esi                                       ; 0012FFE0
006E2D10   sub esi,6
006E2D13   mov ecx,5B
006E2D18   sub esi,ecx
006E2D1A   mov edx,8C98BB7
006E2D1F   shr ecx,2
006E2D22   sub ecx,2
006E2D25   cmp ecx,0
006E2D28   jl short ACProtec.006E2D44
006E2D2A   mov eax,dword ptr ds:[esi+ecx*4]
006E2D2D   mov ebx,dword ptr ds:[esi+ecx*4+4]
006E2D31   xor eax,ebx
006E2D33   ror eax,12
006E2D36   add eax,edx
006E2D38   sub edx,7D69989C
006E2D3E   mov dword ptr ds:[esi+ecx*4],eax
006E2D41   dec ecx
006E2D42   jmp short ACProtec.006E2D25
006E2D44   popad
006E2D45   popad
006E2D46   retn //在此處按F2,然後按shift-F9,停在此處再按F2取消,F7走1步  
此時再次察看ESP=12FF90,去轉存視窗,Ctrl+G:0012FF90  到達0012FF90記憶體處,在0012FF90處的4個位元組上,下硬體訪問->DWord 斷點.F9執行,斷下。
    由於執行以下程式碼包含許多call,會影響程式程式碼和資料的變化,因此在這兒用LordPE完全DUMP程式。  
    接著前面繼續分析stolen code。以下仍然是F7單步跟蹤,遇到call時再F8。  
006ED0E3   push esi
006ED0E4   mov dword ptr ss:[esp],ecx
006ED0E7   push eax                                      ; ACProtec.004CBFF8
006ED0E8   mov eax,ACProtec.00406EDC
006ED0ED   mov ecx,eax                                   ; ACProtec.004CBFF8
006ED0EF   pop eax                                       ; ACProtec.004CBFF8
006ED0F0   push ecx
006ED0F1   pop dword ptr ds:[6D4F0F]
006ED0F7   pop dword ptr ds:[6D4EFF]                     ; ACProtec.004CBFF8
006ED0FD   mov ecx,dword ptr ds:[6D4EFF]                 ; ACProtec.004CBFF8
006ED103   call dword ptr ds:[6D4F0F]  //stolen code第8行,call 406edc的變形
006ED109   mov eax,dword ptr ds:[4F258C]  //stolen code第9行,沒變形
006ED10E   mov eax,dword ptr ds:[eax]     //stolen code第10行,沒變形
006ED110   mov dword ptr ds:[6D4EFB],ACProtec.004622F8
006ED11A   push dword ptr ds:[6D4EFB]
006ED120   pop dword ptr ds:[6D4F0B]
006ED126   call dword ptr ds:[6D4F0B]  //stolen code第11行,call 4622f8的變形
006ED12C   mov dword ptr ds:[6D4EF7],edi                 ; ACProtec.005D16A8
006ED132   nop
006ED133   pushad
006ED134   call ACProtec.006E1460
006ED139   mov eax,dword ptr ss:[ebp+41A27A]
006ED13F   add eax,dword ptr ss:[ebp+40D2AA]
006ED145   mov dword ptr ss:[ebp+41A27A],eax             ; ACProtec.004CBFF8
006ED14B   popad
006ED14C   push dword ptr ds:[6D4EF7]
006ED152   push eax                                      ; ACProtec.004CBFF8
006ED153   mov eax,ACProtec.004F2354
006ED158   mov edi,eax                                   ; ACProtec.004CBFF8
006ED15A   pop eax                                       ; ACProtec.004CBFF8
006ED15B   mov ecx,dword ptr ds:[edi]  //stolen code第12行,mov ecx,[4f2354]

的變形
006ED15D   pop dword ptr ds:[6D4EF3]
006ED163   mov edi,dword ptr ds:[6D4EF3]
006ED169   mov eax,dword ptr ds:[4F258C]  //stolen code第13行,沒變形
006ED16E   mov eax,dword ptr ds:[eax]     //stolen code第14行,沒變形
006ED170   mov dword ptr ds:[6D4EEF],eax                 ; ACProtec.004CBFF8
006ED176   push dword ptr ds:[6D4EEF]                    ; ACProtec.006D4F0F
006ED17C   mov dword ptr ds:[6D4EEB],ACProtec.0047FB5C
006ED186   mov eax,dword ptr ds:[6D4EEB]
006ED18C   mov edx,dword ptr ds:[eax]  //stolen code第15行,mov edx,[47fb5c]

的變形
006ED18E   pop dword ptr ds:[6D4EE7]
006ED194   mov eax,dword ptr ds:[6D4EE7]
006ED19A   push ebx
006ED19B   nop
006ED19C   pushad
006ED19D   call ACProtec.006E1460
006ED1A2   mov byte ptr ss:[ebp+41A237],0E8
006ED1A9   popad
006ED1AA   mov dword ptr ss:[esp],ACProtec.00462310
006ED1B1   pop dword ptr ds:[6D4F07]
006ED1B7   call dword ptr ds:[6D4F07]  //stolen code第16行,call 462310的變形
006ED1BD   push dword ptr ds:[4F228C]                    ; ACProtec.004F45E8
006ED1C3   pop dword ptr ds:[6D4EE3]
006ED1C9   mov ecx,dword ptr ds:[6D4EE3]  //stolen code第17行,mov 

ecx,[4f228c]的變形
006ED1CF   mov eax,dword ptr ds:[4F258C]  //stolen code第18行,沒有變形
006ED1D4   mov eax,dword ptr ds:[eax]     //stolen code第19行,沒有變形
006ED1D6   push dword ptr ds:[47F7CC]                    ; ACProtec.0047F818
006ED1DC   pop edx                 //stolen code第20行,mov edx,[47f7cc]的變形
006ED1DD   push ACProtec.00462310
006ED1E2   pop dword ptr ds:[6D4F03]                     ; ACProtec.004CBFF8
006ED1E8   call dword ptr ds:[6D4F03] //stolen code第21行,call 462310的變形
006ED1EE   mov eax,dword ptr ds:[4F258C] //stolen code第22行,沒有變形
006ED1F3   mov eax,dword ptr ds:[eax]    //stolen code第23行,沒有的變形
006ED1F5   nop
006ED1F6   nop
006ED1F7   nop
006ED1F8   nop
006ED1F9   nop
006ED1FA   pushad
006ED1FB   call ACProtec.006E1460
006ED200   mov dword ptr ss:[ebp+41A238],25FF
006ED20A   lea eax,dword ptr ss:[ebp+41A27A]
006ED210   mov dword ptr ss:[ebp+41A23A],eax             ; ACProtec.004CBFF8
006ED216   call ACProtec.006E1460
006ED21B   lea edi,dword ptr ss:[ebp+419F20]
006ED221   lea ecx,dword ptr ss:[ebp+41A22C]
006ED227   sub ecx,edi                                   ; ACProtec.005D16A8
006ED229   shr ecx,2
006ED22C   call ACProtec.006E11FE
006ED231   stos dword ptr es:[edi]
006ED232   loopd short ACProtec.006ED22C
006ED234   popad
006ED235   jmp short ACProtec.006ED238

006ED238   jmp dword ptr ds:[6ED27A]  //飛向光明之巔!JMP 04cc263  

2.修復輸入表 
為了還原加密了IAT,隨便在程式一個空地(偶是選擇6d4525處),寫入以下程式碼並執行:
006D4D25   pushad
006D4D26   mov esi,ACProtec.006D4010
006D4D2B   mov edi,dword ptr ds:[esi+8]
006D4D2E   xor dword ptr ds:[esi+1],edi                  ; ACProtec.005D16A8
006D4D31   add esi,0D
006D4D34   cmp byte ptr ds:[esi],68
006D4D37   je short ACProtec.006D4D2B
006D4D39   popad
執行ImportREC,選擇這個程式。把OEP改為00CC263,點IT AutoSearch,發現完全不對。於是回到OLLYDBG,找到能正確顯示API呼叫的程式碼,偶隨便找到4074a8處,於是在ImportREC中把OEP修改為0074a8,點IT AutoSearch,點“Get Import”,用層次1即可修復全部無效函式數。FixDump!  

3.修復入口Stolen code 
根據分析變形後stolen code得出程式的入口程式碼,並在004cc210開始處補上:
push ebp 
mov ebp,esp 
sub esp,10   (變形後為:push esi;push eax;push ebx;push esi) 
mov eax,04cbff8 
call 406edc 
mov eax,[4f528c] 
mov eax,[eax
call 4622f8 
mov ecx,[4f2354] 
mov edx,[47fb5c] 
mov eax,[4f258c] 
mov eax,[eax
call 462310 
mov ecx,[4f228c] 
mov eax,[4f258c] 
mov eax,[eax
mov edx,[47f7cc] 
call 462310 
mov eax,[4f258c] 
mov eax,[eax]
4.程式還有許多暗樁有待修復,這裡只討論脫殼。

相關文章