脱壳学习笔记技术报告.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

挺进公司 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档