《加密与解密》ASProtect 2.1x SKE 脱壳过程中遇到的问题与解决方法及脱壳小结
- 寻找OEP
- Dump
- 解除 “Emulate standard system functions”功能
- 通过脚本解除 “Emulate standard system functions”功能
外壳修改原程序的调用地址:002DBAB5 2BC5 sub eax, ebp
002DBAB7 83E8 05 sub eax, 5
002DBABA 45 inc ebp //外壳修改后的代码是call 0x????????,因此ebp是加1(第一个字节为 EB ),而在新写入的代码中是加2(前两个字节是 FF15)
002DBABB 8945 00 mov dword ptr [ebp], eax //此处的eax为外壳代码的地址,如0x1F0004,0x1F0000是VirtualAlloc给外壳分配的。
脚本部分:LABEL:cmp eip,2DBA97 //0x2DBA97设硬件断点,使脚本在 jmp LABEL 后能循序执行jne ENDmov eip,470000 //用HideOD新分配的空间runjmp LABELEND:pause
在新分配空间写入的代码部分:
00470000 60 pushad
00470001 66:C745 00 FF15 mov word ptr [ebp], 15FF //call dword ptr [0x????????] 机器码的前两个字节
00470007 BE 00404000 mov esi, 404000 //IAT起始地址
0047000C 3906 cmp dword ptr [esi], eax //在 0x2DBA97 处eax的值为即将修改的系统函数地址
0047000E 74 13 je short 00470023
00470010 83C6 04 add esi, 4
00470013 81FE D0404000 cmp esi, 4040D0
00470019 ^ 72 F1 jb short 0047000C
0047001B FF05 50004700 inc dword ptr [470050] //检查是否在IAT中,根据实验,这行代码不会被执行,只是方便之后错误的排查
00470021 EB 03 jmp short 00470026
00470023 8975 02 mov dword ptr [ebp+2], esi //call dword ptr [0x????????] 机器码的后四字节
00470026 61 popad
00470027 - E9 8DBAE8FF jmp 002DBABE
002DBAA3 E8 CCB6FFFF call 002D7174 //这两个函数实现“模拟系统函数”002DBAB0 E8 EF010000 call 002DBCA4 //002DBA81 E8 66F3FFFF call 002DADEC //这个函数负责检查在执行“模拟系统函数”期间,是否有什么异常发生,比如INT3断点等,如果发现则报错
修改后的脚本部分:LABEL:cmp eip,2DBA97jne NEXTmov eip,470060runjmp LABEL
NEXT:cmp eip,2DBABAjne ENDmov eip,470000runjmp LABEL
END:pause
修改后的代码部分:00470000 60 pushad
00470001 66:C745 00 FF15 mov word ptr [ebp], 15FF
00470007 A1 70004700 mov eax, dword ptr [470070] //执行 0x470060 时保存的系统函数地址
0047000C BE 00404000 mov esi, 404000
00470011 3906 cmp dword ptr [esi], eax
00470013 74 13 je short 00470028
00470015 83C6 04 add esi, 4
00470018 81FE D0404000 cmp esi, 4040D0
0047001E ^ 72 F1 jb short 00470011
00470020 FF05 50004700 inc dword ptr [470050]
00470026 EB 03 jmp short 0047002B
00470028 8975 02 mov dword ptr [ebp+2], esi
0047002B 61 popad
0047002C - E9 8DBAE8FF jmp 002DBABE00470060 60 pushad //新添加的代码
00470061 A3 70004700 mov dword ptr [470070], eax
00470066 61 popad
00470067 52 push edx
00470068 - E9 2BBAE8FF jmp 002DBA98
02010004 FF0424 inc dword ptr [esp] //将返回地址加1
02010007 68 00000002 push 2000000 //这里有可能直接是jmp指令,如 0x1EB0004
0201000C C3 retn //跳到 0x2000000处01EB0004 FF0424 inc dword ptr [esp]
01EB0007 - E9 F4FFFEFF jmp 01EA0000
通过以上代码可知,call 2010004 后的一个字节是垃圾数据,这也是之前修改函数为 call dword ptr []的原因,因为这种函数调用占6个字节,刚好把一字节的垃圾数据覆盖了。我们再来到 0x2000000 处。
02000000 8BFF mov edi, edi
02000002 55 push ebp
02000003 8BEC mov ebp, esp
02000005 64:A1 30000000 mov eax, dword ptr fs:[30]
0200000B 83EC 18 sub esp, 18
0200000E 53 push ebx
0200000F 8B58 10 mov ebx, dword ptr [eax+10]
02000012 56 push esi
02000013 8B35 9C07E275 mov esi, dword ptr [75E2079C]
02000019 85F6 test esi, esi //以上的代码是系统函数的开头部分,即外壳复制的一小段代码
0200001B 68 FB8FD375 push 75D38FFB
02000020 C3 retn //此处返回系统函数内部
类似 0x2010004、0x2000000组合,其他外壳修改的部分都一样。接下来是脚本的思路。
01F60000 8BFF mov edi, edi
01F60002 55 push ebp
01F60003 8BEC mov ebp, esp
01F60005 5D pop ebp
01F60006 8BFF mov edi, edi
01F60008 55 push ebp
01F60009 8BEC mov ebp, esp
01F6000B 83EC 14 sub esp, 14
01F6000E A1 683B0476 mov eax, dword ptr [76043B68]
01F60013 33C5 xor eax, ebp
01F60015 8945 FC mov dword ptr [ebp-4], eax
01F60018 837D 08 00 cmp dword ptr [ebp+8], 0
01F6001C 68 4630F975 push 75F93046
01F60021 C3 retn
以上代码中有一次多余的mov push mov,这会导致第五步计算的地址出错。在这种情况下,就需要在第六步的开头添加一步,判断word ptr [D]是否是0x90(nop ),如果是,则需要执行一个循环:
while(byte ptr [D-1] != 0x90){D--;
}
《加密与解密》ASProtect 2.1x SKE 脱壳过程中遇到的问题与解决方法及脱壳小结相关推荐
- 加密字符 【问题描述】 在情报传递过程中,为了防止情报被截获,往往需要用一定的方式对情报进行加密。简单的加密算法虽然不足以完全避免情报被破译,但仍然能防止情报被轻易识别
加密字符 [问题描述] 在情报传递过程中,为了防止情报被截获,往往需要用一定的方式对情报进行加密.简单的加密算法虽然不足以完全避免情报被破译,但仍然能防止情报被轻易识别.我们给出一种加密算法,对给定的 ...
- 如何修复win无线服务器,win10 无线802 1X认证故障处理 以 升级后网络故障常规解决方法...
本帖最后由 郭友友 于 2016-7-5 14:05 编辑 [问题现象]当升级Windows10 后无法连接到的 WPA-2 企业网络(尤其是校园网),即使用证书进行服务器端或相互身份的验证 (EAP ...
- 探讨.NET Core数据进行3DES加密和解密问题
前言 一直困扰着我关于数据加密这一块,24号晚上用了接近3个小时去完成一项任务,本以为立马能解决,但是为了保证数据的安全性,我们开始去对数据进行加密,然后接下来3个小时专门去研究加密这一块,然而用着用 ...
- Spring Cloud Config 加密和解密
重要 先决条件:要使用加密和解密功能,您需要在JVM中安装全面的JCE(默认情况下不存在).您可以从Oracle下载"Java加密扩展(JCE)无限强度管理策略文件",并按照安装说 ...
- python输出字体的大小_Python密码学编程:文件的加密与解密
在之前的章节中,编写的程序只能操作较少的信息,这些信息往往是以字符串的形式直接写在代码中的.但本章中的程序可以对整个文件进行加密和解密,文件的大小可以包括成千上万个字符. 本章要点 open()方法. ...
- Node之加密与解密处理
crypto模块概述 在Node.js中,使用OpenSSL类库作为其内部实现加密与解密处理的基础手段,这是因为目前OpenSSL已经成为了一个经过严格测试的可靠的加密与解密算法的实现工具. 在Nod ...
- 加密、解密详解及CA的实现
加密.解密详解及CA的实现 推荐 转载nmshuishui的文章,文章链接 http://blog.51cto.com/nmshuishui/1370917?utm_source=tuicool&am ...
- PHP实现RSA与RSA256加密,解密,加签,验签
1.RSA加密简介 RSA加密是一种非对称加密.可以在不直接传递密钥的情况下,完成解密.这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险.是由一对密钥来进行加解密的过程,分别称为公钥和私 ...
- RSA加密、解密、签名、验签的原理及方法
目录 一.RSA加密简介 二.公钥与私钥的理解 三.RSA加密解密 四.RSA签名和验证 五.加密的作用 六.两种不同的加密与解密 七.RSA加密.签名区别 八.RSA加密.签名的方法,代码例子如下: ...
最新文章
- 苹果要垄断?官方证实:T2安全芯片会限制新款Mac电脑第三方
- 互动整合营销_初识网络整合营销
- OpenGL Overdraw Count透支数的实例
- EOJ Monthly 2019.2 (based on February Selection) D.进制转换
- LeetCode-28 实现strStr()
- php表单密码由加密变明文,PHP 安全性漫谈 Linux+Apache+Mysql+PHP
- Linux下的文件共享全攻略系列之二:NFS快速配置教程与安全策略
- Vue的单页应用中如何引用单独的样式文件
- Shell子程序结构,函数
- 如何修复Sketchup经常遇到的错误报告问题
- 协方差矩阵-Covariance Matrix
- 基于FPGA的PWM加减速控制实现
- NOI 2.6 动态规划 6045:开餐馆
- PLSQL Developer几个可能的隐患
- Logistics回归模型
- 二维数组名再取地址是什么
- Bert模型做多标签文本分类
- 七夕祝福网页制作_七夕的七个冷知识:是情人节还是女儿节?
- ITeye,还IT淫一个简洁的首页吧!
- mysql社区版与cluster 区别_MySQL版本Enterprise/Community/Cluster有何区别
热门文章
- 数据库系统原理名词解释
- 虚拟机实现NAT上网问题
- web网站java实现QQ第三方登录
- 常见的linux、docker、kubectl命令
- 洗地机和吸尘器哪个实用,洗地机优点和缺点
- 数据结构与算法分析之---部分排序算法的实现
- [证券日报]阿里或收购东方证券,全行业颤抖 ?
- java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z 两种解决方案
- 绩效考核中,领导该如何评估员工的投入度?
- android 8.0彩蛋插件,谷歌 Android 8.0 小彩蛋:免 Root 换主题