1.载入PEID

ACProtect V1.4X -> risco

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

0040A41E >/$              push ebp
0040A41F |. 8BEC mov ebp,esp
0040A421 |. 6A FF push -
0040A423 |. C8CB4000 push 跑跑排行.0040CBC8
0040A428 |. A4A54000 push <jmp.&MSVCRT._except_handler3> ; Entry address; SE handler installation
0040A42D |. :A1 >mov eax,dword ptr fs:[]
0040A433 |. push eax
0040A434 |. : >mov dword ptr fs:[],esp
0040A43B |. 83EC sub esp,
0040A43E |. push ebx
0040A43F |. push esi
0040A440 |. push edi
0040A441 |. E8 mov [local.],esp
0040A444 |. 33DB xor ebx,ebx
0040A446 |. 895D FC mov [local.],ebx
0040A449 |. 6A push
0040A44B |. FF15 BCC24000 call dword ptr ds:[<&MSVCRT.__set_app_ty>; msvcrt.__set_app_type
0040A451 |. 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 |. 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 |. 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            int 0x1                                  ; //F9落脚点
0043D74F inc eax
0043D750 inc eax
0043D751 0BC0 or eax,eax
0043D753 jnz short 跑跑排行.0043D75A
0043D755 nop 0012FEC8 0043D731 SE处理程序 0043D731 0C245C8B //数据窗口跟随

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

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

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

0043D781    8B048E          mov eax,dword ptr ds:[esi+ecx*]         ; //落脚点
0043D784 8B5C8E mov ebx,dword ptr ds:[esi+ecx*+0x4]
0043D788 2BC3 sub eax,ebx
0043D78A C1C0 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*],eax         ; //落脚点
0043D798 dec ecx
0043D799 ^ EB E1 jmp short 跑跑排行.0043D77C
0043D79B popad
0043D79C popad
0043D79D C3 retn ; //F4
0043D79E add byte ptr ds:[eax],al
0043D7A0 add byte ptr ds:[eax],al
 

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

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

8.来到假的OEP

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

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

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

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

00441E4D    :A1   mov eax,dword ptr fs:[]                 ; //在这里脱壳
00441E53 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 mov dword ptr ss:[esp],eax

手脱ACProtect V1.4X(有Stolen Code)的更多相关文章

  1. 手脱ACProtect V1.4X(有Stolen Code)之补区段

    首先需要说的是,这个壳是ximo大神视频教程里的 0041F000 > pushad ; //程序入口点 0041F001 E8 call NgaMy.0041F007 0041F006 E8 ...

  2. 手脱ACProtect v1.35(无Stolen Code)之二

    首先,想说明的是这个壳在我的PC上是可以用上一个帖子中的方法来到假的OEP的:http://www.52pojie.cn/forum.php?mod=viewthread&tid=433462 ...

  3. 手脱ACProtect v1.35(有Stolen Code)

    1.载入PEID ACProtect v1.35 -> risco software Inc. & Anticrack Soft 2.载入OD,需要注意的是,异常选项除了[内存访问异常] ...

  4. 手脱ACProtect v1.35(无Stolen Code)

    1.载入PEID ACProtect v1.35 -> risco software Inc. & Anticrack Soft 2.载入OD,需要注意的是,异常选项除了[内存访问异常] ...

  5. 手脱ACProtect V2.0(无Stolen Code)

    1.载入PEID ACProtect V2.0 -> risco 2.载入OD > 00A04000 push ACP_Feed.0040A000 ; //入口点 0B104000 pus ...

  6. 手脱ASProtect v1.2(无Stolen Code)

    1.载入PEID ASProtect v1.2 2.载入OD > 01C04200 push 跑跑赛道.0042C001 ; //入口处 C3 retn AA stos byte ptr es: ...

  7. 手脱ASProtect v1.23 RC1(有Stolen Code)之以壳解壳

    1.载入PEID ASProtect v1.23 RC1 2.载入OD,不勾选内存访问异常,其他异常全部勾选 > 01C06D00 push SoWorker.006DC001 ; //入口点 ...

  8. 手脱ASProtect v1.23 RC1(有Stolen Code)

    1.载入PEID ASProtect v1.23 RC1 常见ASprotect版本壳: ASProtect 1.23 RC4 按shift+f9键26次后来到典型异常 ASProtect 1.31 ...

  9. 手脱ASProtect v1.23 RC1(无Stolen Code)

    1.载入PEID ASProtect v1.23 RC1 2.载入OD,不勾选内存访问异常,其他异常全部勾选 > 01C04200 push 跑跑排行.0042C001 ; //入口处 E8 c ...

随机推荐

  1. 2018牛客多校第二场a题

    一个人可以走一步或者跳x步,但不能连着跳,问到这个区间里有几种走法 考虑两种状态  对于这一点,我可以走过来,前面是怎么样的我不用管,也可以跳过来但是,跳过来必须保证前一步是走的 dp[i][0]表示 ...

  2. 《javascript模式--by Stoyan Stefanov》书摘--字面量和构造函数

    二.字面量和构造函数 1,能够使用对象字面量时,就没理由使用new Object构造函数 // 一个空对象var 0 = new Object();console.log( o.constructor ...

  3. css模仿微信弹出菜单

      css模仿微信弹出菜单 效果图: html: <div class="action-sheet-backdrop"> <div class="act ...

  4. Linux下实现Rsync目录同步备份

    需求:对于开发机器做目录的数据备份 测试机IP:192.168.1.100   WEB目录:/bckup/ 下面我将用一台机器来备份上面测试机 /bckup下的所有数据,并实现时时同步 备份机器IP: ...

  5. Python—字典(当索引不好用时)

    一.定义与概念 1.字典是针对非序列集合而提供的一种数据类型 举例:检索学生信息. “<键><值>对”. 键(即身份证号码) 值(即学生信息). “键值对”例子 姓名和电话号码 ...

  6. Easy Summation

    Description You are encountered with a traditional problem concerning the sums of powers. Given two ...

  7. Code obfuscatio (翻译!)

    Description Kostya likes Codeforces contests very much. However, he is very disappointed that his so ...

  8. 《剑指offer》---两个栈实现队列

    本文算法使用python3实现 1.题目描述:   用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.   时间限制:1s:空间限制:32768K 2.思路描述:   ...

  9. Java-通过比较throw与throws来阐述抛出异常

    转自:http://www.cnblogs.com/Miracle-Maker/p/6239346.html 浅谈Java异常 以前虽然知道一些异常的处理,也用过一些,但是对throw和throws区 ...

  10. Prepare方法和UnPrepare方法

    Query组件提供的Prepare方法的作用是通知BDE或数据库服务器优化并准备执行SQL操作.Query的Prepare方法能优化执行的原因在于该方法是是在SQL语句执行前就对其进行分析.检查和编译 ...