手脱ASProtect v1.23 RC1(有Stolen Code)
1.载入PEID
ASProtect v1.23 RC1
常见ASprotect版本壳:
ASProtect 1.23 RC4 按shift+f9键26次后来到典型异常
ASProtect 1.31 04.27 按shift+f9键36次后来到典型异常
ASProtect 1.31 05.18 按shift+f9键40次后来到典型异常
ASProtect 1.31 06.14 按shift+f9键38次后来到典型异常
2.载入OD,不勾选内存访问异常,其他异常全部勾选,然后使用最后一次异常法,应该是第26次,第27次就会跑飞
> 01C06D00 push SoWorker.006DC001 ; //入口点
E8 call SoWorker.0040100B
0040100A C3 retn
0040100B C3 retn
0040100C je short SoWorker.
0040100E C039 sar byte ptr ds:[ecx],
0FD19CA4 0599E0>psrlw mm3,qword ptr ss:[esp+CFE09905]
AA stos byte ptr es:[edi]
3.落脚点在这个位置,还是像之前脱ASProtect一样,往下拉找到最近的一个retn,然后让程序运行过去
00C339EC xor dword ptr ds:[eax],eax ; //落脚点
00C339EE :8F05 >pop dword ptr fs:[]
00C339F5 pop eax
00C339F6 833D B07EC300 >cmp dword ptr ds:[C37EB0],
00C339FD je short 00C33A13
00C339FF 6A 0C push 0C
00C33A01 B9 B07EC300 mov ecx,0C37EB0
00C33A06 8D45 F8 lea eax,dword ptr ss:[ebp-]
00C33A09 BA mov edx,
00C33A0E E8 2DD1FFFF call 00C30B40
00C33A13 FF75 FC push dword ptr ss:[ebp-]
00C33A16 FF75 F8 push dword ptr ss:[ebp-]
00C33A19 8B45 F4 mov eax,dword ptr ss:[ebp-C]
00C33A1C cmp dword ptr ds:[eax],
00C33A1F je short 00C33A23
00C33A21 FF30 push dword ptr ds:[eax]
00C33A23 FF75 F0 push dword ptr ss:[ebp-]
00C33A26 FF75 EC push dword ptr ss:[ebp-]
00C33A29 C3 retn ; //最近的tetn
00C33A2A 5F pop edi
00C33A2B 5E pop esi
00C33A2C 5B pop ebx
4.程序运行到最近的retn后,我们就可以开始寻找丢失的代码了。不过这里可以先给大家看下假的OEP,打开内存窗口,在401000处下段然后shift+F9运行一次就来到假的OEP,落点处就是假的OEP,代码往上拉可以看到很多空的位置,这里就是待会找回丢失的代码后需要补充的位置了。
004F27A7 ^\EB F8 jmp short SoWorker.004F27A1
004F27A9 add byte ptr ds:[eax],al
004F27AB add byte ptr ds:[eax],al
004F27AD add byte ptr ds:[eax],al
004F27AF add byte ptr ds:[eax],al
004F27B1 add byte ptr ds:[eax],al
004F27B3 add byte ptr ds:[eax],al
004F27B5 add byte ptr ds:[eax],al
004F27B7 add byte ptr ds:[eax],al
004F27B9 add byte ptr ds:[eax],al
004F27BB add byte ptr ds:[eax],al
004F27BD add byte ptr ds:[eax],al
004F27BF add byte ptr ds:[eax],al
004F27C1 add byte ptr ds:[eax],al
004F27C3 add byte ptr ds:[eax],al
004F27C5 add byte ptr ds:[eax],al
004F27C7 add byte ptr ds:[eax],al
004F27C9 add byte ptr ds:[eax],al
004F27CB add byte ptr ds:[eax],al
004F27CD add byte ptr ds:[eax],al
004F27CF FF15 9CC25200 call dword ptr ds:[52C29C] ; //假的OEP
004F27D5 33D2 xor edx,edx
004F27D7 8AD4 mov dl,ah
004F27D9 mov dword ptr ds:[],edx
004F27DF 8BC8 mov ecx,eax
004F27E1 81E1 FF000000 and ecx,0FF
004F27E7 890D mov dword ptr ds:[],ecx
004F27ED C1E1 shl ecx,
004F27F0 03CA add ecx,edx
004F27F2 890D 2C306900 mov dword ptr ds:[69302C],ecx
004F27F8 C1E8 shr eax,
004F27FB A3 mov dword ptr ds:[],eax
004F2800 6A push
004F2802 E8 933B0000 call SoWorker.004F639A
5.然后重新载入程序,运行完步骤1-3的操作,也就是让程序运行到最近的一个retn处。然后看堆栈窗口第四行(也就是程序名下面第二行)的值”0012ffa4”
0012FF5C 00C45A1C //第一行
0012FF60 SoWorker.
0012FF64 E3DE7228
0012FF68 0012FFA4
0012FF6C 00C20000
6.命令行下硬件访问断点”hr 0012ffa4”然后shift+F9运行一次,落脚后先F8单步跟一会。
00C45C07 /:EB jmp short 00C45C0B ; //落脚点
00C45C0A |C7 ???
00C45C0B \EB jmp short 00C45C0F
00C45C0D CD20 83EC372E vxdjump 2E37EC83
00C45C13 EB jmp short 00C45C16
00C45C15 - E9 8D642479 jmp 79E8C0A7
00C45C1A :EB jmp short 00C45C1E
7.一直到程序运行到这里,之前应该是没有call的,下面开始可能就会有call了。ASProtect的call可能会经常跑飞,所以我们遇到call就F7跟进去,没有call还是可以使用F8,当然你也可以一直使用F7,效果是一样的。
00C45C3B BD 415CC400 mov ebp,0C45C41 ; //到这里
00C45C40 FF55 call dword ptr ss:[ebp+] ; //这里就F7跟进
00C45C43 E8 4D5CC400 call 0188B895
00C45C48 9A E969F29A 5DF>call far F35D:9AF269E9
00C45C4F EB jmp short 00C45C53
00C45C51 CD20 1BE9EB02 vxdjump 2EBE91B
00C45C57 CD20 33E8EB02 vxdjump 2EBE833
00C45C5D CD20 EB010F8D vxdcall 8D0F01EB
8.F7跟进后我们继续往下走,寻找丢失的代码,走到下面代码的位置的时候我们可以看到有好几个jmp,并且从第一个jmp后面的代码就比较熟悉了push ebp…其实这就是我们要寻找的丢失的代码了,每两个jmp中间除去问号剩下的就是我们应该要寻找的丢失的代码了。直到两个jmp中间只剩下问号为止,仔细看下下面的代码,总共是5段,我们再分别把5段代码连同二进制代码复制下来
00C45C66 5D pop ebp
00C45C67 EB jmp short 00C45C6A ;//jmp
00C45C69 C7 ???
00C45C6A push ebp ; //第一段
00C45C6B 8BEC mov ebp,esp ; //第一段
00C45C6D 6A FF push - ; //第一段
00C45C6F 78E35300 push 53E378 ; //第一段
00C45C74 407B4F00 push 4F7B40 ; //第一段
00C45C79 :A1 mov eax,dword ptr fs:[] ; //第一段
00C45C7F EB jmp short 00C45C82 ;//jmp
00C45C81 C7 ???
00C45C82 push eax ; //第二段
00C45C83 : >mov dword ptr fs:[],esp ; //第二段
00C45C8A 83EC sub esp, ; //第二段
00C45C8D EB jmp short 00C45C90 ;//jmp
00C45C8F C7 ???
00C45C90 push ebx ; //第三段
00C45C91 EB jmp short 00C45C94 ;//jmp
00C45C93 C7 ???
00C45C94 push esi ; //第四段
00C45C95 EB jmp short 00C45C98 ;//jmp
00C45C97 C7 ???
00C45C98 push edi ; //第五段
00C45C99 E8 mov dword ptr ss:[ebp-],esp ; //第五段
00C45C9C :EB jmp short 00C45CA0 ;//jmp
00C45C9F C7 ???
00C45CA0 EB jmp short 00C45CA4 ;//jmp
00C45CA2 CD20 68CF274F vxdjump 4F27CF68
- 第一段:
00C45C6A push ebp ; //第一段
00C45C6B 8BEC mov ebp,esp ; //第一段
00C45C6D 6A FF push - ; //第一段
00C45C6F 78E35300 push 53E378 ; //第一段
00C45C74 407B4F00 push 4F7B40 ; //第一段
00C45C79 :A1 mov eax,dword ptr fs:[] ; //第一段
55 8B EC 6A FF 68 78 E3 53 00 68 40 7B 4F 00 64 A1 00 00 00 00
- 第二段
00C45C82 push eax ; //第二段
00C45C83 : >mov dword ptr fs:[],esp ; //第二段
00C45C8A 83EC sub esp, ; //第二段
50 64 89 25 00 00 00 00 83 EC 58
- 第三段
00C45C90 push ebx ; //第三段
53
- 第四段
00C45C94 push esi ; //第四段
56
- 第五段
00C45C98 push edi ; //第五段
00C45C99 E8 mov dword ptr ss:[ebp-],esp ; //第五段
57 89 65 E8
9.OK,这样被偷取的代码我们就找回来了,然后你可以选择继续F8走到假的OEP或者是重新载入一下来到假的OEP位置。这个都无所谓的。我们先把程序运行到假的OEP位置,然后把五段被偷取的二进制代码整合一下,然后假的OEP往上拉,把空的代码行选中,二进制把被偷取代码粘贴进去
55 8B EC 6A FF 68 78 E3 53 00 68 40 7B 4F 00 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 83 EC 58 53 56 57 89 65 E8
004F27A7 ^\EB F8 jmp short SoWorker.004F27A1
004F27A9 add byte ptr ds:[eax],al ; //从这里开始
004F27AB add byte ptr ds:[eax],al
004F27AD add byte ptr ds:[eax],al
004F27AF add byte ptr ds:[eax],al
004F27B1 add byte ptr ds:[eax],al
004F27B3 add byte ptr ds:[eax],al
004F27B5 add byte ptr ds:[eax],al
004F27B7 add byte ptr ds:[eax],al
004F27B9 add byte ptr ds:[eax],al
004F27BB add byte ptr ds:[eax],al
004F27BD add byte ptr ds:[eax],al
004F27BF add byte ptr ds:[eax],al
004F27C1 add byte ptr ds:[eax],al
004F27C3 add byte ptr ds:[eax],al
004F27C5 add byte ptr ds:[eax],al
004F27C7 add byte ptr ds:[eax],al
004F27C9 add byte ptr ds:[eax],al
004F27CB add byte ptr ds:[eax],al
004F27CD add byte ptr ds:[eax],al ; //到这里结束
004F27CF FF15 9CC25200 call dword ptr ds:[52C29C] ; //假的OEP
004F27D5 33D2 xor edx,edx
004F27D7 8AD4 mov dl,ah
004F27D9 mov dword ptr ds:[],edx
004F27DF 8BC8 mov ecx,eax
004F27E1 81E1 FF000000 and ecx,0FF .粘贴好的OEP应该是这样子的,我们在粘贴好的代码的第一行,也就是那个push ebp的位置右键–新建EIP 004F27A7 ^\EB F8 jmp short SoWorker.004F27A1
004F27A9 push ebp ; //此处新建OEP
004F27AA 8BEC mov ebp,esp
004F27AC 6A FF push -
004F27AE 78E35300 push SoWorker.0053E378
004F27B3 407B4F00 push SoWorker.004F7B40
004F27B8 :A1 mov eax,dword ptr fs:[]
004F27BE push eax
004F27BF : >mov dword ptr fs:[],esp
004F27C6 83EC sub esp,
004F27C9 push ebx
004F27CA push esi
004F27CB push edi
004F27CC E8 mov dword ptr ss:[ebp-],esp
004F27CF FF15 9CC25200 call dword ptr ds:[52C29C] ; //假的OEP
004F27D5 33D2 xor edx,edx
004F27D7 8AD4 mov dl,ah
11.至此我们就可以进行脱壳了,记得脱壳后修复的时候使用插件修复。
12.运行查壳
运行OK,查壳:Microsoft Visual C++ v6.0
手脱ASProtect v1.23 RC1(有Stolen Code)的更多相关文章
- 手脱ASProtect v1.23 RC1(有Stolen Code)之以壳解壳
1.载入PEID ASProtect v1.23 RC1 2.载入OD,不勾选内存访问异常,其他异常全部勾选 > 01C06D00 push SoWorker.006DC001 ; //入口点 ...
- 手脱ASProtect v1.23 RC1(无Stolen Code)
1.载入PEID ASProtect v1.23 RC1 2.载入OD,不勾选内存访问异常,其他异常全部勾选 > 01C04200 push 跑跑排行.0042C001 ; //入口处 E8 c ...
- 手脱ASProtect v1.2(无Stolen Code)
1.载入PEID ASProtect v1.2 2.载入OD > 01C04200 push 跑跑赛道.0042C001 ; //入口处 C3 retn AA stos byte ptr es: ...
- 手脱ACProtect V1.4X(有Stolen Code)之补区段
首先需要说的是,这个壳是ximo大神视频教程里的 0041F000 > pushad ; //程序入口点 0041F001 E8 call NgaMy.0041F007 0041F006 E8 ...
- 手脱ACProtect v1.35(无Stolen Code)之二
首先,想说明的是这个壳在我的PC上是可以用上一个帖子中的方法来到假的OEP的:http://www.52pojie.cn/forum.php?mod=viewthread&tid=433462 ...
- 手脱ACProtect V1.4X(有Stolen Code)
1.载入PEID ACProtect V1.4X -> risco 首先需要说明的是,这个壳被偷取的代码非常多,如果去找的话会比较麻烦,所以我们换一种另类的方法,不脱壳也可以使用资源修改器对程序 ...
- 手脱ACProtect v1.35(有Stolen Code)
1.载入PEID ACProtect v1.35 -> risco software Inc. & Anticrack Soft 2.载入OD,需要注意的是,异常选项除了[内存访问异常] ...
- 手脱ACProtect v1.35(无Stolen Code)
1.载入PEID ACProtect v1.35 -> risco software Inc. & Anticrack Soft 2.载入OD,需要注意的是,异常选项除了[内存访问异常] ...
- 手脱FSG v1.33
1.载入PEID FSG v1.33 (Eng) -> dulek/xt 2.载入OD,先F8跟一会 004103E3 > BE A4014000 mov esi,fsg1_33.0040 ...
随机推荐
- 在页面使用echarts的地图(解决地图不完整)
测试环境:IDEA+Tomcat7 谷歌浏览器 创建好web工程,编写jsp页面,在自己编写的JSP页面上导包 现在echarts停止了在其网站上下载地图脚本,直接通过src引用网站上的china.j ...
- nordic mesh 任务调度实现
nordic mesh 任务调度实现 nordic mesh的任务调度室基于定时器实现的,有两个链表结构维护任务. 需要注意的是,任务调度的部分接口只能在"bearer event" ...
- SpringCloud IDEA 教学 (三) Eureka Client
写在前头 本篇继续介绍基于Eureka的SpringCloud微服务搭建,回顾一下搭建过程, 第一步:建立一个服务注册中心: 第二步:建立微服务并注入到注册中心: 第三步:建立client端来访问微服 ...
- Thinkphp实现excel导出数据
前端: 点击导出触发click事件,传值export指令和args关键字(args是指我们是否有查询取哪些数据)到控制器 $(document).on("click", " ...
- popen()与system()
一.popen() 用途:执行shell命令(并读取其输出或向其发送一些输入) 特点:通过管道来与shell命令进行通信 二.system()
- 直接管理内存——new和delete
一.运算符new 1. 使用new动态分配对象 在自由空间分配的内存是无名的,故new无法为其分配的对象命名,而是返回一个指向该对象的指针 int *pi = new int; //pi指向一个动态分 ...
- Python 字符串与基本语句
Python特点 python中没有变量的声明 语句结束后没有分号 严格要求缩进 支持很长很长的大数运算(直接在Idle中输入即可) 用"#"来注释 BIF:Bulit-in fu ...
- android平台蓝牙编程(转)
http://blog.csdn.net/pwei007/article/details/6015907 Android平台支持蓝牙网络协议栈,实现蓝牙设备之间数据的无线传输. 本文档描述了怎样利用a ...
- javabean的内省技术和BeanUtils的使用
一.关于javabean javabean是固定写法的java类 书写格式为: 1)必须有无参构造函数 2)属性必须私有, 我们称为字段 3)提供标准的getter和setter 例: name 字段 ...
- NSDate常用的日期操作
// 当前时间创建NSDate NSDate *myDate = [NSDate date]; NSLog(@"myDate = %@",myDate); //从现在开始的24小时 ...