手脱ACProtect V1.4X(有Stolen Code)

1.载入PEID

ACProtect V1.4X -> risco

首先需要说明的是,这个壳被偷取的代码非常多,如果去找的话会比较麻烦,所以我们换一种另类的方法,不脱壳也可以使用资源修改器对程序进行修改。先来看下被偷取的代码

0040A41E >/$  55            push ebp
0040A41F  |.  8BEC          mov ebp,esp
0040A421  |.  6A FF         push -1
0040A423  |.  68 C8CB4000   push 跑跑排行.0040CBC8
0040A428  |.  68 A4A54000   push <jmp.&MSVCRT._except_handler3>      ;  Entry address; SE handler installation
0040A42D  |.  64:A1 0000000>mov eax,dword ptr fs:[0]
0040A433  |.  50            push eax
0040A434  |.  64:8925 00000>mov dword ptr fs:[0],esp
0040A43B  |.  83EC 68       sub esp,68
0040A43E  |.  53            push ebx
0040A43F  |.  56            push esi
0040A440  |.  57            push edi
0040A441  |.  8965 E8       mov [local.6],esp
0040A444  |.  33DB          xor ebx,ebx
0040A446  |.  895D FC       mov [local.1],ebx
0040A449  |.  6A 02         push 2
0040A44B  |.  FF15 BCC24000 call dword ptr ds:[<&MSVCRT.__set_app_ty>;  msvcrt.__set_app_type
0040A451  |.  59            pop ecx
0040A452  |.  830D F0FF4000>or dword ptr ds:[40FFF0],FFFFFFFF
0040A459  |.  830D F4FF4000>or dword ptr ds:[40FFF4],FFFFFFFF
0040A460  |.  FF15 C0C24000 call dword ptr ds:[<&MSVCRT.__p__fmode>] ;  msvcrt.__p__fmode
0040A466  |.  8B0D D0FF4000 mov ecx,dword ptr ds:[40FFD0]
0040A46C  |.  8908          mov dword ptr ds:[eax],ecx
0040A46E  |.  FF15 C4C24000 call dword ptr ds:[<&MSVCRT.__p__commode>;  msvcrt.__p__commode
0040A474  |.  8B0D CCFF4000 mov ecx,dword ptr ds:[40FFCC]
0040A47A  |.  8908          mov dword ptr ds:[eax],ecx
0040A47C  |.  A1 C8C24000   mov eax,dword ptr ds:[<&MSVCRT._adjust_f>
0040A481  |.  8B00          mov eax,dword ptr ds:[eax]

 

2.载入OD,异常选项不勾选INT3选项,隐藏OD,吾爱官方现在的OD隐藏OD在strongOD里面,还是使用最后一次异常法shift+F9一次,第二次就会跑飞了,注意,这个壳对OD检测比较严格,所以可能需要多试几次才能成功,只要运行一次就是最后一次异常了,第二次就会跑飞了

3.最后一次异常的落脚点,落脚后堆栈窗口右键点SE句柄—数据窗口跟随,然后数据窗口下内存访问断点,然后shift+F9运行一次

0043D74D    CD 01           int 0x1                                  ; //F9落脚点
0043D74F    40              inc eax
0043D750    40              inc eax
0043D751    0BC0            or eax,eax
0043D753    75 05           jnz short 跑跑排行.0043D75A
0043D755    90              nop

0012FEC8   0043D731  SE处理程序

0043D731  0C245C8B          //数据窗口跟随

 


4.落脚后,在落脚点下F2断点,然后shift+F9运行一次

0043D731    8B5C24 0C       mov ebx,dword ptr ss:[esp+0xC]           ; //落脚点
0043D735    8383 B8000000 0>add dword ptr ds:[ebx+0xB8],0x2
0043D73C    33C0            xor eax,eax
0043D73E    C3              retn
0043D73F    64:67:FF36 0000 push dword ptr fs:[0]
0043D745    64:67:8926 0000 mov dword ptr fs:[0],esp
0043D74B    33C0            xor eax,eax

 

 

5.落脚后再次再落脚点下F2断点,然后shift+F9运行一次

0043D781    8B048E          mov eax,dword ptr ds:[esi+ecx*4]         ; //落脚点
0043D784    8B5C8E 04       mov ebx,dword ptr ds:[esi+ecx*4+0x4]
0043D788    2BC3            sub eax,ebx
0043D78A    C1C0 06         rol eax,0x6
0043D78D    03C2            add eax,edx
0043D78F    81F2 80657CA3   xor edx,0xA37C6580

 

 

6.然后来到这里,先清除所有断点(两个F2断点,一个内存访问断点),然后F4运行到retn位置

0043D795    89048E          mov dword ptr ds:[esi+ecx*4],eax         ; //落脚点
0043D798    49              dec ecx
0043D799  ^ EB E1           jmp short 跑跑排行.0043D77C
0043D79B    61              popad
0043D79C    61              popad
0043D79D    C3              retn                                     ; //F4
0043D79E    0000            add byte ptr ds:[eax],al
0043D7A0    0000            add byte ptr ds:[eax],al

 

 

7.打开内存窗口在401000位置下内存断点然后shift+F9运行一次

Memory map, 条目 16
 地址=00401000
 大小=0000B000 (45056.)
 属主=跑跑排行 00400000
 区段=.text
 包含=代码
 类型=Imag 01001002
 访问=R
 初始访问=RWE

 

 

8.来到假的OEP

0040A483    A3 ECFF4000     mov dword ptr ds:[40FFEC],eax            ; //假的OEP
0040A488    E8 16010000     call 跑跑排行.0040A5A3
0040A48D    391D 90FE4000   cmp dword ptr ds:[40FE90],ebx
0040A493    75 0C           jnz short 跑跑排行.0040A4A1
0040A495    68 A0A54000     push 跑跑排行.0040A5A0
0040A49A    FF15 CCC24000   call dword ptr ds:[40C2CC]               ; msvcrt.__setusermatherr
0040A4A0    59              pop ecx
0040A4A1    E8 E8000000     call 跑跑排行.0040A58E
0040A4A6    68 1CF04000     push 跑跑排行.0040F01C
0040A4AB    68 18F04000     push 跑跑排行.0040F018

 

 

9.重新载入要脱壳的程序,入口点是一个pushad入栈,下一行使用ESP运行到最后一次异常,正常情况应该是第16次就跑飞了,15次是一个大跳转,所以我们运行到第14次就可以了

0042C000 >  60              pushad                                   ; //入口点
0042C001    E8 01000000     call 跑跑排行.0042C007                       ; //ESP
0042C006  - 79 83           jns short 跑跑排行.0042BF8B
0042C008    04 24           add al,0x24
0042C00A    06              push es
0042C00B    C3              retn
0042C00C    E8 01000000     call 跑跑排行.0042C012

 

 

10.程序落脚点应该是这个位置,我们在这个地方使用LoadPE+ImoprtREC进行脱壳,需要注意的是,使用ImoprtREC修复过程中,我们首先需要填入的地址应该是假的OEP地址0040A483-00400000也就是A483(这个原因大家都应该懂得),然后修复完成后先不急着转存,把OEP地址换成ESP最后一次异常落脚点的地址,也就是41E4D(减去00400000基址的地址)。然后再进行转存,其实这样是没有把壳脱掉的,不过已经达到我们的目的了,可以使用资源修改软件对程序进行修改破解了。所以再实在不好脱壳的时候考虑下这种方式也是蛮好的

00441E4D    64:A1 00000000  mov eax,dword ptr fs:[0]                 ; //在这里脱壳
00441E53    8905 39CA4200   mov dword ptr ds:[0x42CA39],eax          
00441E59    FF35 39CA4200   push dword ptr ds:[0x42CA39]
00441E5F    8F05 71CA4200   pop dword ptr ds:[0x42CA71]              
00441E65    FF35 71CA4200   push dword ptr ds:[0x42CA71]
00441E6B    891C24          mov dword ptr ss:[esp],ebx
00441E6E    890424          mov dword ptr ss:[esp],eax   

 

转载于:https://www.cnblogs.com/JianXu/p/5158368.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ACProtect是一个对Windows下的可执行文件提供保护的软件,可以非常有效的防止盗版。通过公匙加密算法(RSA)创建并校验注册KEY,只有在RSA KEY正确的情况下,才对那些受保护的代码进行正常解码。同时,ACProtect还使用了内嵌式加密,可以有效的防止加密软件从内存中被抓取,也就是无法被脱壳。内置反调试引擎,有效的增加了破解的难度。专用的API系统,可以使ACProtect和你的软件紧密的接合在一起,这样,你就可以通过使用ACProtect来创建你的全功能评估版。试想,你既可以让用户完全感受到你的软件给他们所带来的一切实用功能,又不用花费过多时间在加密保护上,这岂不是一个一举两得的完美方案? 主要特色 嵌入式加密系统 --- 你可以自行指定程序中所需加密的代码段,通过使用这个系统,那怕破解者知道你的程序的入口点(OEP)并且重建了输入表。 代码替换 ?--Acprotect在不影响软件功能的情况下,可以用ACProtect代码来替换你原程序中的某些代码,使得保护代码和被保护程序更加无缝的结合在一起。如果Acprotect被非法脱壳之后,软件就会由于部分代码无法正确还原而导致非法操作。 多态引擎--- 有效的动态变异,多态引擎产生多层解码代码,解码代码和被保护代码在你每次执行保护的时候都是变化的。可以有效对抗静态分析和动态跟踪。运行完毕之后,所有代码可以恢复到加密状态。 RSA 1024 License---通过使用RSA KEY系统,破解者无法在没有RSA密匙的情况下制作出你的软件的KeyGen,因为在通常情况下,RSA密匙只有作者本人知道。你同样可以决定,哪一些代码是需要通过RSA密匙来保护的,破解者根本无法获取你的“key.dat”。如果没有正确的KEY,受保护的代码将无法被正确解码。 API ---专用的API系统,外壳以及被保护程序可以被相互调用,从而使外壳和受保护的程序更加紧密地接合在一起。 反补丁/反载入--- 可以有效的防止你的软件被打上补丁/被装载,或者被反编译。 Anti-SoftIce --- 可以探测到Numega SoftIce (tm)和Frogsice。 反调试/反抓取/反跟踪 --- 在反调试的同时,有效的监控W32Dasm、SoftIce、TRW 2000、Turbo Debugger, Sourcer、Filemon、ExeSpy、ResSpy、RegMon、Memory Monitor等常用破解工具是否在运行。 动态代码加密/解密 --- 对你程序中指定代码提供动态加密/解密,有效防止内存补丁(memory patch)。 指定系统授权 --- 通过对用户定义的系统硬件识别识别函数,可以对用户计算机指定授权,确保了被授权的系统的唯一性。 黑名单 --- 可以将那些非法或者被公布的KEY列为黑名单,有效防止非法更新。 试用设置 --- 可以设置使用次数限制、使用日期限制或最后日期限制等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值