加密壳之ACProtect之OEP的处理
菜驹也玩加密壳之ACProtect之OEP的处理
附件下载:加壳文件和pdf
1. 加密过程:
ACProctect v1.41版本号
分析对OEP入口点代码的偷取
2. 分析过程:
加载后,EIP= 00412000
00412000> 60 pushad
00412001 E8 01000000 call vcmfc库1.00412007
00412006 - 7E 83 jle Xvcmfc库1.00411F8B
00412008 04 24 add al,0x24
0041200A 06 push es
0041200B C3 retn
0041200C 77 01 ja Xvcmfc库1.0041200F
0041200E 43 inc ebx
0041200F FC cld
00412010 75 01 jnz Xvcmfc库1.00412013
入口点是在壳段(地址:00412000,大小:19000)
依据壳的特征,用ESP,在00412001处下HR ESP
来到这里:
0041254A 56 push esi
0041254B 8F05 A1294100 pop dword ptr ds:[0x4129A1]
00412551 60 pushad
00412552 78 03 js Xvcmfc库1.00412557
00412554 79 01 jns Xvcmfc库1.00412557
00412556 7B 40 jpo Xvcmfc库1.00412598
能够看到pushad,清除上面的硬件断点后,在pushad以下下HR ESP
来到这里:
00427753 51 push ecx
00427754 8F05 89284100 pop dword ptr ds:[0x412889] ; [889] = ecx
0042775A 60 pushad
0042775B 61 popad
0042775C 51 push ecx
0042775D 8F05 CD294100 pop dword ptr ds:[0x4129CD] ; [9cd] = ecx
00427763 FF35 CD294100 push dword ptr ds:[0x4129CD]
00427769 8915 E1284100 mov dword ptr ds:[0x4128E1],edx
0042776F FF35 E1284100 push dword ptr ds:[0x4128E1]
00427775 56 push esi
00427776 BE 11294100 mov esi,vcmfc库1.00412911
0042777B 8BD6 mov edx,esi
0042777D 5E pop esi
0042777E 52 push edx
0042777F 59 pop ecx ; ecx =edx = 412911
00427780 8F05 3D284100 pop dword ptr ds:[0x41283D]
00427786 8B15 3D284100 mov edx,dword ptr ds:[0x41283D]
0042778C 8929 mov dword ptr ds:[ecx],ebp ; [412911] = ebp
0042778E 8F05 A12A4100 pop dword ptr ds:[0x412AA1]
00427794 56 push esi
00427795 BE A12A4100 mov esi,vcmfc库1.00412AA1
0042779A 8B0E mov ecx,dword ptr ds:[esi]
0042779C 5E pop esi
0042779D FF35 11294100 push dword ptr ds:[0x412911] ; 这地方就是被偷的第一句代码pushebp
004277A3 8925 192B4100 mov dword ptr ds:[0x412B19],esp
004277A9 90 nop
004277AA 90 nop
004277AB 60 pushad
004277AC E8 01000000 call vcmfc库1.004277B2
004277B1 ^ 77 83 ja Xvcmfc库1.00427736
注意当中的nop nop pushad 这三条指令,出现这个意味着这就是偷取的代码的開始。。。。
当然,这里的nop是任意填充的,可能没有,也可能有一个。也可能有两个。也可能多个..关键是pushad指令
把NOP之前的指令所有复制成二进制保存。
00427753 51 push ecx
00427754 8F05 89284100 pop dword ptr ds:[0x412889] ; [889] = ecx
0042775A 60 pushad
0042775B 61 popad
0042775C 51 push ecx
0042775D 8F05 CD294100 pop dword ptr ds:[0x4129CD] ; [9cd] = ecx
00427763 FF35 CD294100 push dword ptr ds:[0x4129CD]
00427769 8915 E1284100 mov dword ptr ds:[0x4128E1],edx
0042776F FF35 E1284100 push dword ptr ds:[0x4128E1]
00427775 56 push esi
00427776 BE 11294100 mov esi,vcmfc库1.00412911
0042777B 8BD6 mov edx,esi
0042777D 5E pop esi
0042777E 52 push edx
0042777F 59 pop ecx ; ecx =edx = 412911
00427780 8F05 3D284100 pop dword ptr ds:[0x41283D]
00427786 8B15 3D284100 mov edx,dword ptr ds:[0x41283D]
0042778C 8929 mov dword ptr ds:[ecx],ebp ; [412911] = ebp
0042778E 8F05 A12A4100 pop dword ptr ds:[0x412AA1]
00427794 56 push esi
00427795 BE A12A4100 mov esi,vcmfc库1.00412AA1
0042779A 8B0E mov ecx,dword ptr ds:[esi]
0042779C 5E pop esi
0042779D FF35 11294100 push dword ptr ds:[0x412911] ; 这地方就是被偷的第一句代码pushebp
004277A3 8925 192B4100 mov dword ptr ds:[0x412B19],esp
这段代码的二进制数据为:
51 8F 05 89 2841 00 60 61 51 8F 05 CD 29 41 00 FF 35 CD 29 41 00 89 15 E1 28 41 00 FF 35 E128 41 00 56 BE 11 29 41 00 8B D6 5E 52 59 8F 05 3D 28 41 00 8B 15 3D 28 41 0089 29 8F 05 A1 2A 41 00 56 BE A1 2A 41 00 8B 0E 5E FF 35 11 29 41 00 89 25 192B 41 00
反复上面的步骤,直到n次。怎么确定n,我这里是弹出试用版nag之后就出现了。
把这n次之间的二进制数据都保存下来。
00429106 /EB 01 jmp Xvcmfc库1.00429109
00429108 |E8 FF254B91 call 918DB70C
0042910D 42 inc edx
00429106处是一个近跳,F7进去
00429109 - FF25 4B914200 jmp dword ptr ds:[0x42914B] ; vcmfc库1.00405391
0042910F 60 pushad
00429110 E8 00000000 call vcmfc库1.00429115
00429115 5E pop esi
00429116 83EE 06 sub esi,0x6
当中:
ds:[0042914B]=00405391 (vcmfc库1.00405391)
这是一个跨段的长跳转,何为跨段?当前指令是在00429109 它要跳到00405391。
从模块图中看出,它是要从.perplex段跳到.text段运行..这就是传说中的跨段
所以说。进到代码段后。就是传说中的伪OEP了,伪OEP是长得这个样子的
以下就把它DUMP出来
用import rec修复下IAT。没有问题 fix一下dump出来的文件
Import rec会给文件加一个.mackt的区段。里面存的是输入表。大小为1000,输入表用不了这么大的空间,我们把被偷的代码放在这个区段里好了。
用OD打开修复过和dump_.exe,在0042b000的段处找一个空的位置,
我找的是0042BBA0,把上面得到的二进制贴上去,贴完后,再加上一句JMP 00405391(跳到伪OEP)
0042BEBF 58 POP EAX
0042BEC0 8908 MOV DWORD PTR DS:[EAX], ECX
0042BEC2 A1 A4604000 MOV EAX, DWORD PTR DS:[0x4060A4]
0042BEC7 - E9 C594FDFF JMP dumped_.<ModuleEntryPoint>
用LOAD PE把入口点改动成0042BBA0,OK。完工。。
。
保存的所有的二进制数据:
00427753 51 push ecx
00427754 8F05 89284100 pop dword ptrds:[0x412889] ; [889]= ecx
0042775A 60 pushad
0042775B 61 popad
0042775C 51 push ecx
0042775D 8F05 CD294100 pop dword ptrds:[0x4129CD] ; [9cd]= ecx
00427763 FF35 CD294100 push dword ptrds:[0x4129CD]
00427769 8915 E1284100 mov dword ptrds:[0x4128E1],edx
0042776F FF35 E1284100 push dword ptrds:[0x4128E1]
00427775 56 push esi
00427776 BE 11294100 mov esi,vcmfc库1.00412911
0042777B 8BD6 mov edx,esi
0042777D 5E pop esi
0042777E 52 push edx
0042777F 59 pop ecx ; ecx =edx = 412911
00427780 8F05 3D284100 pop dword ptrds:[0x41283D]
00427786 8B15 3D284100 mov edx,dword ptrds:[0x41283D]
0042778C 8929 mov dword ptrds:[ecx],ebp ;[412911] = ebp
0042778E 8F05 A12A4100 pop dword ptrds:[0x412AA1]
00427794 56 push esi
00427795 BE A12A4100 mov esi,vcmfc库1.00412AA1
0042779A 8B0E mov ecx,dword ptrds:[esi]
0042779C 5E pop esi
0042779D FF35 11294100 push dword ptrds:[0x412911] ; 这地方就是被偷的第一句代码pushebp
004277A3 8925 192B4100 mov dword ptrds:[0x412B19],esp
51 8F 05 89 28 41 00 60 61 51 8F 05 CD 2941 00 FF 35 CD 29 41 00 89 15 E1 28 41 00 FF 35 E1 28
41 00 56 BE 11 29 41 00 8B D6 5E 52 59 8F05 3D 28 41 00 8B 15 3D 28 41 00 89 29 8F 05 A1 2A 41
00 56 BE A1 2A 41 00 8B 0E 5E FF 35 11 2941 00 89 25 19 2B 41 00
FF 35 19 2B 41 00 8F 05 C1 29 41 00 56 BEC1 29 41 00 8B 2E 5E 57 BF 9D 29 41 00 89 1F 5F FF 35
9D 29 41 00 89 35 31 28 41 00 FF 35 31 2841 00 68 FF FF FF FF 5E 89 35 99 2A 41 00 8B 1D 99 2A
41 00 8F 05 0D 2A 41 00 8B 35 0D 2A 41 0057
89 1C 24 8F 05 05 29 41 00 8F 05 19 28 4100 FF 35 19 28 41 00 5B FF 35 05 29 41 00 89 05 D5 2A
41 00 FF 35 D5 2A 41 00 89 3C 24 89 0C 24C7 04 24 A0 61 40 00 57 8F 05 E1 2A 41 00 FF 35 E1 2A
41 00 89 1C 24 C7 04 24 C0 54 40 00
64 A1 00 00 00 00 89 05 A5 29 41 00 FF 35A5 29 41 00 89 1C 24 89 0D 85 2A 41 00 FF 35 85 2A 41
00 57 BF 91 29 41 00 8B CF 5F 56 8B F1 8BDE 5E 8B 0C 24 8F 05 B5 2A 41 00 89 03 8B 1C 24 8F 05
ED 28 41 00 FF 35 91 29 41 00
64 89 25 00 00 00 00 83 EC 68 53 8F 05 D529 41 00 FF 35 D5 29 41 00 8F 05 99 28 41 00 FF 35 99
28 41 00 57 89 04 24 8F 05 65 29 41 00 FF35 65 29 41 00 89 34 24 52 8F 05 F1 28 41 00 FF 35 F1
28 41 00 89 3D C9 2A 41 00 FF 35 C9 2A 4100
56 8F 05 31 2A 41 00 60 61 68 E5 2A 41 005F 51 8B CF 8B D1 59 8F 05 B9 28 41 00 8B 3D B9 28 41
00 89 3A 8F 05 D1 28 41 00 53 BB D1 28 4100 8B 13 5B FF 35 E5 2A 41 00 89 65 E8 33 DB 89 5D FC
89 15 85 29 41 00 FF 35 85 29 41 00 89 3424 53 89 14 24 50 B8 02 00 00 00 60
8B D0 58 52 5E 8F 05 01 2A 41 00 8B 15 012A 41 00 56 89 14 24 50 B8 25 29 41 00 8B D0 58 89 32
8F 05 AD 29 41 00 8B 15 AD 29 41 00 8B 3424 8F 05 B9 2A 41 00 FF 35 25 29 41 00 FF 15 98 60 40
00 8F 05 01 29 41 00 50 B8 5D 2A 41 00 8938 58
FF 35 5D 2A 41 00 51 C7 04 24 01 29 41 008F 05 85 28 41 00 8B 3D 85 28 41 00 8B 0F 8B 3C 24 8F
05 61 29 41 00 83 0D B4 F1 40 00 FF 83 0DB8 F1 40 00 FF FF 15 9C 60 40 00 89 05 C1 28 41 00 FF
35 C1 28 41 00 57 BF 35 28 41 00 8B C7 5F89 30
8B 04 24 8F 05 41 28 41 00 FF 35 35 28 4100 50 8F 05 6D 2A 41 00 FF 35 6D 2A 41 00 89 3D 39 28
41 00 FF 35 39 28 41 00 51 B9 7C 71 40 008B F9 59 57 58 5F 50 5E 8F 05 2D 2A 41 00 8B 05 2D 2A
41 00 8B 0E 8F 05 11 2B 41 00 FF 35 11 2B41 00
55 8F 05 25 2B 41 00 60 61 5E 89 08 FF 15A0 60 40 00 52 8F 05 55 2A 41 00 FF 35 55 2A 41 00 C7
05 29 29 41 00 78 71 40 00 FF 35 29 29 4100 8F 05 35 2A 41 00 8B 15 35 2A 41 00 8B 0A 8F 05 C9
28 41 00 50 B8 C9 28 41 00 8B 10 58 89 08A1 A4 60 40 00
加密壳之ACProtect之OEP的处理的更多相关文章
- 脱壳系列_2_IAT加密壳_详细版_解法1_包含脚本
1 查看壳程序信息 使用ExeInfoPe 分析: 发现这个壳的类型没有被识别出来,Vc 6.0倒是识别出来了,Vc 6.0的特征是 入口函数先调用GetVersion() 2 用OD找OEP 拖进O ...
- 脱壳系列_2_IAT加密壳_详细版解法1(含脚本)
1 查看壳程序信息 使用ExeInfoPe 分析: 发现这个壳的类型没有被识别出来,Vc 6.0倒是识别出来了,Vc 6.0的特征是 入口函数先调用GetVersion() 2 用OD找OEP 拖进O ...
- “破解大牛是怎么炼成的”之壳与ESP定律
文章难易度:★★★ 文章阅读点/知识点:逆向破解 文章作者:Sp4ce 文章来源:i春秋 关键字:网络 信息安全技术 本文参与i春秋社区原创文章奖励计划,未经许可禁止转载! 一.前言 通过前面几篇 ...
- 关于《加密与解密》的读后感----对dump脱壳的一点思考
偶然翻了一下手机日历,原来今天是夏至啊,时间过的真快.ISCC的比赛已经持续了2个多月了,我也跟着比赛的那些题目学了2个月.......虽然过程很辛苦,但感觉还是很幸运的,能在大三的时候遇到ISCC, ...
- 深入底层逆向分析TDC‘s keygenme(手脱压缩壳)
系统 : Windows xp 程序 : TDC‘s keygenme 程序下载地址 :http://pan.baidu.com/s/1gdWyt6z 要求 : 脱壳 & 注册机编写 使用工具 ...
- 脱壳第三讲,UPX压缩壳,以及补充壳知识
脱壳第三讲,UPX压缩壳,以及补充壳知识 一丶什么是压缩壳.以及壳的原理 在理解什么是压缩壳的时候,我们先了解一下什么是壳 1.什么是壳 壳可以简单理解为就是在自己的PE文件中包含了代码.而有不影响我 ...
- 寻找真正的入口(OEP)--广义ESP定律
1.前言 在论坛上看到很多朋友,不知道什么是ESP定律,ESP的适用范围是什么,ESP定律的原理是什么,如何使用ESP定律?看到了我在“”调查结果发现,大家对ESP定律很感兴趣,当然因为实在是太好用了 ...
- 菜鸟脱壳之脱壳的基础知识(四)——利用ESP定律来寻找OEP
.上节说的是单步跟踪法,这节讲的是利用堆栈平衡(ESP定律)来进行脱壳!想必大家都听说过ESP定律这个大名吧!ESP定律运用的就是堆栈平衡原理!一般的加壳软件在执行时,首先要初始化,保存环境(保存各个 ...
- 脱壳_00_压缩壳_ASPACK
写在前面的话: Aspack是最常见的一种压缩壳,具有较好的兼容性.压缩率和稳定性,今天我们就来一起分析一下这个壳: 零.分析压缩壳: 0.在开始动态调试前,用PEID和LoadPE查看一些信息,做到 ...
随机推荐
- 阿里云服务器ecs配置之安装mysql
安装mysql数据库 1.安装工作: 下载 mysql 源安装包 [root@ming ~]# wget http://dev.mysql.com/get/ ...
- 如何根据实体动态生成sql语句
该文章同时解决了,如何向数据库中添加Null值,以及如何处理“参数化查询未提供参数”的错误.解决方案请看第二段折叠的代码. 背景: 在项目开发的过程中,往往需要根据实体的值来修改sql语句,比如说,有 ...
- 异常 Failed to bind NettyServer on /10.133.7.216:29105, cause: Failed to bind to: /0.0.0.0:29105
"C:\Program Files\Java\jdk1.7.0_80\bin\java" -agentlib:jdwp=transport=dt_socket,address=12 ...
- 关联及web_reg_save_param
一.什么是关联 关联(correlation):脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应的内容中查 找,得到相应的值,已变量的形式替换录制时的静 ...
- ubuntu 18.04取消自动锁屏以及设置键盘快捷锁屏
1:操作设置取消自动锁屏: setting-->power--->never 2: 设置自动锁屏快捷键: 快捷键设置一般在setting-->devices--->keybo ...
- hdu6110:路径交
$n \leq 500000$的树给$m \leq 500000$个路径,$q \leq 500000$个询问每次问一个区间的路径交. 路径交口诀:(前方高能) 判有交,此链有彼祖: 取其交,最深两两 ...
- ES6__数据结构 Set
/* 数据结构 Set */ /* *集合的基本概念:集合是由一组无序且唯一(即不能重复)的项组成的.这个数据结构使用了与有限集合相同的数学概念,应用在计算机的数据结构中. *特点:key 和 val ...
- poj1470 Closest Common Ancestors [ 离线LCA tarjan ]
传送门 Closest Common Ancestors Time Limit: 2000MS Memory Limit: 10000K Total Submissions: 14915 Ac ...
- poj1190,DFS/已知一个等式,求另一个最小值
7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱. ...
- app后端搜索入门
现在人们的网络生活已经离不开搜索了,遇到不懂的问题,想知道的事情,搜索一下,就知道答案. 在app中,最常见的搜索情景就是搜索用户.只有几百,几千的用户量时,可以直接用用like这样的模糊查询,但是, ...