ACProtect 1.21專業版主程式的脫殼
標 題: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.程式還有許多暗樁有待修復,這裡只討論脫殼。
相關文章
- iOS應用程式的脫殼實現原理淺析2019-03-04iOS
- upx手動脫殼2020-10-26
- iOS逆向學習之五(加殼?脫殼?)2019-10-10iOS
- 一次簡單的脫殼2024-08-30
- 十、iOS逆向之《越獄砸殼/ipa脫殼》2021-03-18iOS
- Od跟進之脫殼(待完善)2018-10-20
- 教你如何寫UPX脫殼指令碼2019-05-11指令碼
- Android.Hook框架Cydia篇(脫殼機制作)2020-08-19AndroidHook框架
- 脫殼基礎知識以及簡單應用2019-06-17
- 從Android執行時出發,打造我們的脫殼神器2020-08-19Android
- 某IOT蠕蟲病毒分析之UPX脫殼實戰2018-04-11
- 逆向基礎——軟體手動脫殼技術入門2020-08-19
- 【開源】BlackDex,無需環境,Android新姿勢脫殼工具2021-05-27Android
- Linux 外殼程式2018-08-05Linux
- CSDN版主考核方案2020-04-04
- Go 1.21的2個語言變化2023-02-18Go
- 金蟬脫殼2百度雲免費線上觀看2018-06-23
- 騰訊安全ApkPecker上線DEX-VMP自動化脫殼服務2021-07-19APK
- 貝殼專案,上傳到cos2024-07-16
- 萬能碼如何脫穎而出?(安全掃碼專業委員會)2021-11-01
- 我的 FlutterUnit 開源專案竟然被套殼商用了2021-06-19Flutter
- 動態脫敏典型應用場景分析——業務脫敏、運維脫敏、資料交換脫敏2020-08-03運維
- 請問【版主】是什麼分類?2024-05-12
- kubeadm部署高可用版Kubernetes1.21[更新]2021-07-02
- 使用 kubeadm 建立 kubernetes 叢集 v1.212021-05-07
- 程式設計師脫單指南2019-02-02程式設計師
- 如何擺脫專案命名困難的尷尬局面2019-03-03
- 擺脫虧損的專案成本控制是關鍵2018-05-15
- 去除【CSDN論壇】【部落格】所有廣告的方法(非會員or非專家/版主 也可使用哦)2018-11-15
- 1.21 JQuery4:滑鼠事件與滾動事件2018-11-11jQuery事件
- LeaRun敏捷框架甘特圖——擺脫專案管理的泥沼2021-12-22敏捷框架專案管理
- Hello Everyone (寫於版主第一天)2019-11-30
- 腦殼疼的tapable2019-04-18
- 圖解程式專業術語2018-09-28圖解
- 請求版主刪除本人 facebook 連結和 ins 的連結2020-12-04
- 高研班直播公開課《JNI函式與脫殼分析實戰》 8月14日下午1點!2022-08-14函式
- 終於有了讓程式設計師脫離程式碼的工具了2020-01-08程式設計師
- 如何成為真正專業的程式設計師2019-05-11程式設計師
- 5G位移下的封裝產業“地殼運動”2020-04-23封裝產業