第四课  脱壳必备知识要点及方法

今天所要讲的是这高级篇中最为关键,最为重要的一课,希望大家能认真学习,反复推敲,举一反三学习脱壳的各种方法,当然有的时候可能需要几种方法一起使用,今后我们也会一点一点接触到,今天我们先学习大体的几种脱壳法。

一:常见脱壳调试法

二:预备知识

OEP是Original Entry Point缩写,即程序加壳前的真正的入口点。

外壳初始化的现场环境(各寄存器值)与原程序的现场环境是相同的。加壳程序初始化时保存各寄存器的值,外壳执行完毕,会恢复各寄存器内容。其代码形式一般如下:

PUSHFD         ; 将标志寄存器入栈保存

PUSHAD         ; push eax, ecx, edx, ebx, esp, ebp, esi, edi

……           ; 外壳代码部分

POPAD          ; pop edi, esi, ebp, esp, ebx, edx, ecx, eax

POPFD          ; 恢复标志寄存器

JMP OEP        ; 大的跳转

OEP: ……      ; 解压后的程序原代码

PUSHAD (压栈) 代表程序的入口点,

POPAD  (出栈) 代表程序的出口点,与PUSHAD想对应,一般找到这个OEP就在附近

三:脱壳方法之单步跟踪找OEP

1.用OD载入,如果有提示是否分析代码,就点“ 不分析代码!”

2.F8单步向下跟踪调试,没有实现的向上的跳,向下的跳都可以步过,阻止实现的向上的跳。

3.遇到会跑飞的CALL我们就F7步入。

Btw:遇到程序无法向下跟踪调试的时候,在附近(上下均可)找一个大跳转(像下的实现的,跳的大小看线的长短)(如果找不到大的跳就找一个不跳的跳(没有线),FSG2.0就是这样),F4运行到该跳处,然后右键→跟随或者回车到达跟随的地址按F2下断点,然后shift+F9(忽略异常运行)运行到跟随的地址,然后再F2取消断点,接着就可以F8继续单步调试了(对于FSG2.0的课可能直接就到oep了,另外老版的OD可能会出现要你分析代码,解决办法:右键-->分析-->从模块删除目标文件)。另:在F8单步跟踪的时候并不一定非要是在实现的向上的跳的下一句F4,如果是像:je,jne,ja,jna,等有条件的跳也可以继续F8单步,因为你跟着循环个次它的条件一般就会改变然后向后走(它本身变成了为实现的跳了)。但是如果是像jmp这样非条件的跳,如果你还F8单步的话它会一直循环,所以这种跳就必须F4。

清除OD的使用记录:OD菜单-〉插件-〉文件清除-〉全部文件

退出OD,在OD目录里有个UDD文件夹,把里面的东西删除干净,这样就清除了OD的历史记录。

四:脱壳方法之根据堆栈平衡原理找OEP(ESP定律法)

堆栈平衡原理找OEP,Lenus写过一篇文章《寻找真正的入口(OEP)--广义ESP定律》我会打包给大家,有兴趣的可以自己看一下堆栈平衡原理,做免杀自己写花指令也需要用到这个原理,所以这文章对大家相当有帮助。

1.F8单步跟踪调试在关键句的下一句,在OD寄存器窗口ESP突显为红色

2.在OD命令行下输入(dd ESP突显红色的地址) 或者 (hr ESP突显红色的地址)

3.下硬件访问断点

4.F9运行(然后删除硬件断点),继续F8单步向下调试。

五:脱壳方法之内存断点法找OEP(内存镜像法)

1.OD载入程序后,我们直接对code段下内存访问断点

2.Shift+F9运行 (code段没有解压完毕,所以会不断得中断,连续按F9。当然这种方法是不可取的)

正确的方法是:我们使用两次断点法。

假设我是程序作者,一个程序有code段,data段,rsrc段....依次排列在你的内存空间中。那么我会怎么解码呢?程序会先将code段解码,然后再将data段解码,接着是rsrc段....只要你在data段或者rsrc段下内存访问断点,那么中断的时候code段就已经解压完毕了。这时我们再对code段下内存访问断点,不就可以直接到达OEP了吗?

综上正确的操作方法是:

1, 1.OD载入程序-->查看-->内存-->在程序块(属主名和程序名一样)的rsrc段F2-->Shift+F9(忽略异常运行到该断点)-->然后再对code段(一般它的地址是:00401000)F2下断-->Shift+F9(对于tElock直接就到OEP了,也不再F2-->Shift+9运行到该处了,因为这里对应的就是我们在code段设断点的地方)。注:两个断点不用删除

总结一下:如果我们知道壳在什么地方对code段解压完毕我们就可以使用内存断点,找到OEP。如果不知道,那么我们就依靠2次内存断点去找,如果还不行就用多次内存断点。总之明白了原理再多次的内存断点其实都一样。

局限性:当一个壳如果它在JMP到OEP前的一行代码仍在对code段解压,那么我们就不能再使用这种办法了。更贴切得说,是我们没必要使用这种方法。(如UPX,ASPACK)

六:脱壳方法之最后一次异常法

1.OD载入程序后

2.设置异常选项:选项——调试设置——异常(一般情况我们忽略所有的异常选项(去掉所有的勾选),当然后面根据猛壳的特点我们可以自己选择设置异常选项,注意:只有用这种方法是需要设置这里,其它方法一定要全部勾选上,不然不能跟踪下去的)

3.重载下OD(然后,插件-->隐藏od-->隐藏(不然OD会跑飞的),然后不用重载了),我们按SHIFT+F9,直到程序跑起来为止,我们把按的次数记住

4.再次重载OD,再次按SHIFT+F9,我们按到程序跑起来的前一次。(第一次如果按了21下程序跑起来了,那么我们第二次就按20次,跑起来的前一次)

5.在OD的右下角(堆栈窗口)看见一个"SE句柄",这时我们按CTRL+G,输入SE句柄前的数值(注:不是地址)!

6.来到SE句柄的地方我们按F2下断,F9运行至断点这,然后再F2取消断点

7.接着我们F8单步继续向下调试

经验:popad

Jmp  XXXX

看到这两句就应该引起我的注意,特别当jmp 没注明short时,那么这里很可能就是壳的出口,也即OEP入口。

七:脱壳方法之其他方法

八:模拟跟踪法

1.F9运行程序,确定是否有暗桩。看程序能不能跑起来,如果程序能正常跑起来说明没有暗桩(有暗桩才能用这种方法)

2,用“脱壳方法之最后一次异常法”(到6)(目的是把暗桩给过掉)

2.打开内存镜像,找到包含有SFX,imports,relocations的区段

3.命令行下输入tc eip<区段地址(上面找到的包含有SFX,imports(输入表),relocations(重定向)的区段的地址)。回车后会自动跟踪出OEP地址。

九:根据编译语言特点找OEP

(一).delphi程序

1.执行程序。

2.用LordPE脱壳。

3.接着用16进制编辑器(如Hex Workshop,winhex,UE等)打开脱壳程序。

4.搜索文本“runtime”,搜到后,向前查找离“runtime”最近的十六进制数字“55 8B EC”,

数字所在的地址就是程序的OEP。

(二).Visual C程序

利用Visual C启动部分的几个函数GetCommandLineA(W)、GetVersion、GetModuleHandleA(W)、

GetStartupInfoA(W) 等来定位程序的OEP。

十. 一步到达OEP

1.开始按ctrl+f,输入:popad(适合少数壳,如UPX,ASPACK等)

2.F2下断,F9运行到此断点处,再F2取消断点

3.F8继续向下调试

十一: “SFX”法

1.设置OD,忽略所有异常(去掉所有勾选)

2.切换到SFX选项卡,选择“字节模式跟踪实际入口(速度非常慢)”

3.重载程序(自动走到OEP停下来)

(注:用完之后记得还原设置:停在解压入口)

十二: 内存另类断点法

1.OD载入程序

2.在内存镜像中找到包含code/text(代码)的区段,双击,然后在数据窗口第一个下内存访问断点

3.不断的按F9,直到从程序领空到系统领空,记录下按了几下(如:9次)(按得过程注意可能反应比较慢,要按一下等一会儿,即到暂停状态再按,(文件按钮下显示状态))

4.重载,继续上面的操作,不同的是我们按8次F9 。

5.然后继续用单步跟踪法调试

Btw:OEP可能会在我们到达的地方的上面,我们可以倒着走,向下跳转不让实现,实现向上跳转。也可以在程序跑起来的前两次开始F8跟踪,大家多多实验。

好了,我们今天的课程就到这里,部分资料会打包给大家。大家有空好好复习下,今天给大家留下作业就是用多种方法找到课件中的FSG2.0和TELOCK的OEP。

转载于:https://www.cnblogs.com/eldn/archive/2012/08/28/2660896.html

第四课 脱壳必备知识要点及方法相关推荐

  1. PE结构详解(加壳脱壳必备知识)第二篇·存储地址介绍

    昨天分享了一篇PE结构详解(加壳脱壳必备知识),本篇是上一篇续篇,主要介绍关于PE结构的三种存储地址 VA.RVA.FILEOFFSET及转换方式,希望对你有所帮助. 一.关于VA.RVA.FILEO ...

  2. PE结构详解(加壳脱壳必备知识)

    近期太忙一直没有抽出时间来更新文章,周末抽空写一篇关于PE结构相关知识,PE结构是windows下的可执行文件的标准结构.可执行文件的装载.内存分步.执行等都依赖于PE结构.如果要掌握反病毒.免杀.权 ...

  3. 蓝桥第四课《数学知识的运用》

    第一题:奇怪的捐赠 地产大亨Q先生临终的遗愿是:拿出100万元给X社区的居民抽奖,以稍慰藉心中愧疚. 麻烦的是,他有个很奇怪的要求: 1. 100万元必须被正好分成若干份(不能剩余).每份必须是7的若 ...

  4. 蓝桥杯赛前冲刺补习第四课——《数学知识的应用》

    第一题 地产大亨Q先生临终的遗愿是:拿出100万元给X社区的居民抽奖,以稍慰藉心中愧疚. 麻烦的是,他有个很奇怪的要求: 1.100万元必须被正好分成若干份(不能剩余). 每份必须是7的若干次方元. ...

  5. Linux 基本命令及用法,Linux常用命令详解和用法整理 新手站长必备知识要点

    在租用 第一.状态查询命令 查看内存占用命令:free(可选参数 -m -g) 磁盘使用情况:df(可选参数-h) 查看端口被占用:lsof -i:端口号 例如,查看8080端口的被占用情况,如下图所 ...

  6. 玩转Linux必备知识(四)

    硬盘管理系统 玩转Linux必备知识(三) 玩转Linux必备知识(二) 玩转Linux必备知识(一) 硬盘管理背景知识 硬盘常见接口: IDE 最古老的硬盘接口,淘汰品 SATA 串行接口,个人电脑 ...

  7. 用计算机计算一定比笔算简便,四年级数学(下册)期末知识要点汇总,易错题解析...

    当我第一遍读一本好书的时候,我仿佛觉得找到了一个朋友;当我再一次读这本书的时候,仿佛又和老朋友重逢.我们要把读书当作一种乐趣,并自觉把读书和学习结合起来,做到博览.精思.熟读,更好地指导自己的学习,让 ...

  8. 软件测试面试必备网络知识要点

    本文通过一些知识要点整理,可能整理不专业 1.网络分类 目前最主要的三种网络 1.电信网络(俗称的电话网络) 2.有限电视网络 3.计算机网络(目前发展最快.信息时代核心技术) 作为软件测试在工作中主 ...

  9. 八年级上册计算机知识点总结,八年级数学上册知识要点归纳

    八年级数学上册知识要点归纳 八年级的学生数学成绩总是不理想,大部分是因为课本的知识概念没有弄明白,公式和定理没有掌握好.下面是百分网小编为大家整理的八年级数学知识总结,希望对大家有用! 八年级数学上册 ...

最新文章

  1. 计算机电缆线对成缆系数,计算机电缆绞合系数 - 无图版
  2. GCD API记录(二)
  3. python基础:数据类型一
  4. 让c像python一样可以在命令行写代码并且编译
  5. Java开发框架——Struts框架
  6. Controller的激活与URL路由
  7. 11.8 scrum report
  8. 黑马vue实战项目-(五)参数列表组件的开发
  9. 微信客服系统开发SDK使用教程-给好友发消息任务
  10. MyBatis官方文档——XML映射文件部分
  11. PowerDesiger导出简洁数据字典
  12. [杂记]就《10.30日华为HR体验官胡玲在心声论坛爆料内部HR腐败行为》有感
  13. 什么是Windows驱动程序?
  14. 2021/7/15——集训Day.10
  15. 读书笔记:《群论彩图版》
  16. 修改服务器端Apache默认根目录
  17. sqli-labs Less-8(布尔盲注)
  18. 使用Spring Boot构建微服务(文末福利)
  19. Photoshop实用技巧教程
  20. 【NLP】BiLSTM 命名实体识别 手写代码

热门文章

  1. 单片机读tf卡c语言程序,单片机读写U盘闪盘超精简C源程序
  2. mysql 回滚之后抛出异常_在PHP中 开始事务后,程序抛出异常 没有执行commit也没有执行rollback mysql事务会回滚吗?...
  3. vue.js将本地文件上传到ftp服务器,vue项目使用FTP传输部署项目服务器,node命令编写...
  4. java字节流转字符流的步骤_字节流-java入门基础笔记-51CTO博客
  5. 基于JAVA springboot+VUE前后端分离疫情防疫平台设计实现
  6. HTML+CSS+JS实现 ❤️翻页倒计时ui特效❤️
  7. Oracle 数据怎么实时同步到 Elasticsearch | 亲测干货建议收藏
  8. django2与ajax,Python-Django-Ajax进阶2
  9. Java 获取 URL 响应头信息
  10. Spring Boot freemarker导出word下载