找回密码
 注册
搜索
热搜: 回贴

ACProtect 1.21专业版主程序的脱壳,ACProtect,脱壳技术

2010-1-30 18:20| 发布者: admin| 查看: 111| 评论: 0|原作者: 段誉


ACProtect 1.21专业版主程序的脱壳,ACProtect,脱壳技术
2008年06月23日 星期一 下午 04:57
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.程序还有许多暗桩有待修复,这里只讨论脱壳。


最新评论

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 21:24 , Processed in 0.151046 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部