- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
脱壳学习笔记
脱壳综述
壳的加载
保存入口参数
加壳程序初始化时保存各寄存器的值,外壳执行完毕,再恢复各寄存器内容,最后再跳到原程序执行。通常使用pushad/popad、pushfd/popfd指令对来保护与恢复环境。
获取壳自己所需要使用的API地址
一般壳的输入表中只有GetProcAddress、GetModuleHandle和LoadLibrary这几个API函数,甚至只有Kernel32.dll以及GetProcAddress。如果需要其他API函数,则通过LoadLibrary载入所需要的Dll或者使用GetModuleHandle来获取所需dll句柄,然后GetProcAddress来获取具体的API函数。
解密原程序的各个区块的数据
壳一般按区块加密,那么在解密时也是按区块解密,并且把解密的区块的数据按照区块的定义放在合适的内存位置。
IAT的初始化
在加壳时,壳会自己构造一个导入表,并让PE头中的导入表指针指向了自建的导入表。系统会在载入程序时加载这个导入表。原程序的导入表则是由壳处理,最终构建原程序的IAT。
重定位项的处理
HOOK-API
在壳处理导入表时,壳可以将HOOK-API的代码的地址填入IAT,从而间接获取程序的控制权。
跳转到程序的原入口点(OEP)
从这个时候起壳就把控制权交还给原程序了,一般的壳在这里会有明显的一个“分界线”。当然现在越来越多的加密壳将OEP一段代码搬到外壳的地址空间里,然后将这段代码清除掉,这种技术成为Stolen Bytes。这样,OEP与外壳间就没那条明显的分界线了。
01脱壳软件介绍
脱壳的一般流程:查壳(PEID、FI、PE-SCAN)(寻找OEP(OD)(脱壳(LordPE、PeDumper、
OD自带的脱壳插件、PETools)(修复(Import REConstructor)
PEID原理:提取特征码,然后对比。在userdb.txt中存储着特征码。
脱壳技巧:近CALL用F7跟进,远CALL用F8跳过。
初步猜测,由于代码之间插有数据,或者非有意义代码,故使用近跳跳过。如:
图中所示为跳到0A处,但0A处没有代码。强制将0A处编码:
哦,其实这里是一段混淆代码。Pop EBP赋值EBP为0040D007,自增1获得0040D008,在入栈,然后ret便到了0040D008处。这一段代码中没有绝对地址,只有很小的偏移量,其原因就是在代码中间插入了一个字节,代码的作用便是跳过这一字节。其实,这是一段重定位代码,使用EBP获取EIP。
OEP的判断:大跨段跳转,如下:
从D3BA跳到10CC处,跨越不小。
02 脱壳常用思路
A. 单步跟踪法
1. 用OD 载入,点“不分析代码!”
2. 单步向下跟踪F8,实现向下的跳转,向上的跳使用F4到下一句打断
3. 近CALL使用F7,跟飞的CALL使用F7
4. 一般情况下,遇到很远的跳转(大跨段),比如jxx XXXX或者push XXXX retn,机会很快到程序的OEP
PS:在有些壳无法向下跟踪的时候,我们可以在附近找到没有实现的大跳转,在跳转地址下断点,shift+f9运行到此,继续F8,一般情况可以轻松跟到OEP。
B. ESP定律法
程序开始F8,同时观察OD右上角的ESP寄存器。
变色之后,在ESP所指向的内存地址设置硬件断点,F9运行,直接来到大跨段跳转处。
:所谓的ESP定律法是由于pushad保存环境,而popad是恢复环境,而在此期间,此段栈空间是不会被访问的,而当其被访问的时候,便是肉被释放的时候。
C. 内存镜像法
忽略所有异常
ALT+M打开内存镜像,找到主模块的第一个.rsrc按F2设置断点,SHIFT+F9或者无异常F9运行直到程序停下,ALT+M再次打开内存镜像,在主模块.rsrc上的.txt或者.code处设置断点,SHIFT+F9或者无异常F9运行直到程序停下,此处即为OEP。
D. 一步到达OEP
载入程序,Ctrl+F,输入POPAD(适合少数壳,包括UPX, ASPACK),然后找到附近有大跨段处,然后F2设置断点,F9运行到此处。
E. 最后一次异常法
载入程序,去掉忽略所有异常。
SHIFT+F9直到程序运行,统计SHIFT+F9总共被按下的次数m
重新载入程序,SHIFT+F9按m-1次
此时,OD左下角有一个“SE 句柄”,在句柄前的地址处设置断点,然后SHIFT+F9运行
去掉断点,F8跟踪直到OEP。
F. 模拟跟踪法
先运行程序,跟踪一下程序,看有没有SEH暗装之类
打开内存查看窗口,找到如下图阴
文档评论(0)