软件手动脱壳是软件逆向及病毒分析最基本的操作,主要为在病毒分析和软件逆向的过程中,帮我们脱掉程序的壳代码,从而方便去分析该程序的关键代码。

什么是加壳

  • 加壳的全称是可执行程序资源压缩,是保护文件的常用手段。加壳过的程序可以直接运行,但是不能查看源代码。要经过脱壳才可以查看源代码。
  • 加壳是利用特殊的算法,对EXE、DLL文件里的资源进行压缩、加密。类似WINZIP 的效果,只不过这个压缩之后的文件,可以独立运行,解压过程完全隐蔽,都在内存中完成。它们附加在原程序上通过Windows加载器载入内存后,先于原始程序执行,得到控制权,执行过程中对原始程序进行解密、还原,还原完成后再把控制权交还给原始程序,执行原来的代码部分。加上外壳后,原始程序代码在磁盘文件中一般是以加密后的形式存在的,只在执行时在内存中还原,这样就可以比较有效地防止破解者对程序文件的非法修改,同时也可以防止程序被静态反编译。

什么是脱壳

  • 有矛就有盾,脱壳即去掉软件所加的壳。目前脱壳一般分手动和自动两种,手动就是通过调试工具脱壳,对脱壳者有一定水平要求,涉及到很多汇编语言和软件调试方面的知识;而自动就是用专门的脱壳工具,最常用某种压缩软件都有他人写的反压缩工具对应,有些压缩工具自身能解压,如UPX;有些不提供这功能,如:ASPACK,就需要UNASPACK对付。
  • 软件自动脱壳或者说是机器脱壳的好处是简单,但缺点也很明显,一是不能解决部分手写壳,二是壳代码更新后,之前的脱壳工具就会失效。

什么是OEP

  • OEP:(Original Entry Point),程序的入口点。软件加壳一般隐藏了程序真实的OEP(或者用了假的OEP), 我们需要寻找程序真正的OEP,才可以完成脱壳。

  • 一般加壳程序在使用Ollydbg等动态调试工具时,会停在壳的预处理块。即处在对于程序原始代码块的解压或解密操作之前,在运行完程序自脱壳模块后,会停留在程序加壳之前的OEP位置,此时是dump程序的最佳时期。脱壳时在真实OEP处下int3断点,就可以捕捉到程序代码段完全恢复的状态。因此,寻找加壳程序的正确OEP,也成了手动脱壳时的第一要务。

什么是IAT

IAT:(Import Address Table),导入地址表。由于导入函数就是被程序调用但其执行代码又不在程序中的函数,这些函数的代码位于一个或者多个DLL中。当PE文件被装入内存的时候,Windows装载器才将DLL 装入,并将调用导入函数的指令和函数实际所处的地址联系起来(动态连接),这操作就需要导入表完成。其中导入地址表就指示函数实际地址。 多数加壳软件在运行时会重建导入地址表,因此获取加壳程序正确的导入地址表也是手动脱壳操作中的一个关键问题。

一、脱壳方法

1 单步跟踪法

  • 单步跟踪法的原理就是通过Ollydbg的单步(F8)、单步进入(F7)和运行到(F4)功能,完整走过程序的自脱壳过程,跳过一些循环恢复代码的片段,并用单步进入确保程序不会略过OEP。这样可以在软件自动脱壳模块运行完毕后,到达OEP,并dump程序。

2 ESP定律法

ESP定律法是脱壳的利器,是应用频率最高的脱壳方法之一。

  • ESP定律的原理在于程序中堆栈平衡的合理利用。由于在程序自解密或者自解压过程中,不少壳会先将当前寄存器内容压栈,如使用pushad,在解压结束后,会将之前的寄存器值出栈,如使用popad。因此在寄存器出栈时,往往程序代码被自动恢复,此时硬件断点触发。然后在程序当前位置,只需要少许单步跟踪,就很容易到达正确的OEP位置。

3 内存镜像法(二次断点法)

  • 内存镜像法是在加壳程序被加载时,通过OD的ALT+M快捷键,进入到程序虚拟内存区段。然后通过加两次内存一次性断点,到达程序正确OEP的位置。
  • 内存镜像法的原理在于对于程序资源段和代码段下断点,一般程序自解压或者自解密时,会首先访问资源段获取所需资源,然后在自动脱壳完成后,转回程序代码段。这时候下内存一次性断点,程序就会停在OEP处。

4 一步到达OEP

  • 所谓的一步到达OEP的脱壳方法,是根据所脱壳的特征,寻找其距离OEP最近的一处汇编指令,然后下int3断点,在程序走到OEP的时候dump程序。 如一些压缩壳往往popad指令距离OEP或者Magic Jump特别近,因此使用Ollydbg的搜索功能,可以搜索壳的特征汇编代码,达到一步断点到达OEP的效果。

5 最后一次异常法

  • 最后一次异常法的原理是,程序在自解压或自解密过程中,可能会触发无数次的异常。如果能定位到最后一次程序异常的位置,可能就会很接近自动脱壳完成位置。现在最后一次异常法脱壳可以利用Ollydbg的异常计数器插件,先记录异常数目,然后重新载入,自动停在最后一次异常处。

6 模拟跟踪法

  • 模拟跟踪法的原理就是使用Ollydbg下条件断点,SFX相当于是一个自解压段,在自解压段结束时(eip的值转到代码段时),已经距离OEP很近,但是这种跟踪方法会比较耗时。

7 “SFX”法

  • “SFX”法利用了Ollydbg自带的OEP寻找功能,可以选择直接让程序停在OD找到的OEP处,此时自解压已经完成,可以直接dump程序。

软件脱壳常见的几种方法相关推荐

  1. 怎么卸载手机上下载的软件?苹果手机有两种方法

    怎么卸载手机上下载的软件?很多人会在手机上下载各种各样的软件,时间一长,小内存的手机无法储存这么多内容,建议大家定期将不需要的软件直接卸载,避免占用空间影响手机的使用.今天给大家分享一下卸载手机软件的 ...

  2. 计算机无法卸载软件,电脑软件无法卸载怎么解决 电脑卸载顽固软件超有用的三种方法...

    我们在使用电脑时,经常需要使用到各种各样的软件,有时候下载软件时经常会遇到流氓软件,只下载一个软件然后莫名就给你安装了好几个,并且还无法删除,遇到电脑软件无法卸载该怎么办呢?想必有很多的用户遇到过流氓 ...

  3. Java 遍历Map常见的五种方法

    Java 遍历Map常见的四种方法 以下这种遍历是最常见的,也是我们经常使用的,在循环中需要使用健和值时,推荐使用这种方式 Map<Integer,Integer> map=new Has ...

  4. oracle 10046详解,ORACLE TRACE 10046事件常见的几种方法

    下面是10046事件的几个等级分别表示什么意思 Level 0 Tracing is disabled. This is the same as setting SQL_TRACE = FALSE. ...

  5. 东莞金蝶服务器维护,金蝶软件最常见的问题处理方法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 主要是金蝶KIS标准版.迷你版,常见问题如下: 关于账套和备份的问题: 金蝶AIS.AIB.AIR.AIY的区别是什么? 将金蝶备份文件恢复成账套文件的过 ...

  6. Ubuntu手工进行软件更新升级的两种方法

     上一篇文章说了Ubuntu系统自动更新的配置,它适合于经常更新或者干脆不更新的情况,还有一种情况就是偶尔需要更新,也就是根据需要手工更新系统或软件包.  这有两种方法,一种是图形界面的方法,一种是命 ...

  7. 权限控制最常见的五种方法

    涉及到权限的问题往往是都是复杂的问题,在系统权限控制方面,我们经常会参照现成的案例来设计自己的权限控制,以下就是最常见的几种权限控制的方法 1. 控制系统的登录 在用户状态上加状态控制,可用的用户就可 ...

  8. 万用表测线路断点位置_如何测出电线电缆断点在哪?来看看常见的7种方法

    实际工程维护检修中,对于维修人员来说最怕的莫过于碰到电线电缆中间断了找不出断点在什么地方.虽然我们弱电工程实际维修的时候,碰到线缆问题会直接想办法换线或者重新敷设,但是我们今天讨论技术上有哪些方法可以 ...

  9. 数据预处理 常见的几种方法

    给大家安利一款朋友开发的自研国产数据分析基础工具,一键式自动分析,自动生成分析模板,5分钟掌握主流61个统计类数学模型(几乎涵盖SPSS绝大部分功能),以及23个有监督机器学习(包括随机森林,SVM, ...

  10. js数组去重常见的七种方法

    1.借助ES6提供的Set结构 new Set() 简单好用 强烈推荐 直接给一个新的数组里面,利用es6的延展运算符 var arr = [1,9,8,8,7,2,5,3,3,3,2,3,1,4,5 ...

最新文章

  1. 写论文查论文查参考文献
  2. MATLAB R2018a 输入中文却显示方框问号的问题
  3. DeepMind大放送:开放4个多物体表征学习数据集,还有一篇智能体新研究
  4. Java程序设计学习笔记(四)—— GUI
  5. 从无到有算法养成篇-算法基础常识
  6. 用package.json配置NodeJS项目的模块声明
  7. Redis与MySQL双写一致性如何保证
  8. 【dfs】Election of Evil
  9. Python爬取网站上面的数据很简单,但是如何爬取APP上面的数据呢
  10. concat() “+“ 和 append() 的区别
  11. 私有云对企业来说有什么好处
  12. 天线多频设计方法精讲
  13. WEB前端大作业-程序员个人在线简历响应式网站模板(HTML+CSS+JavaScript)
  14. itsm安装部署(Vmware)
  15. linux系统电视盒子到底是什么
  16. UWP 记一次WTS 和 UCT翻车经历
  17. weblogic 与 tuxedo 互联 wtc
  18. You called this URL via POST, but the URL doesn‘t end in a slash and you hav
  19. 【代码阅读】云E办项目后端技术栈总结及源码分析
  20. 内存分配器(Memory Allocator)

热门文章

  1. Android强制系统横屏的原理和实现
  2. android bugly 错误分析,# app 3.6.1 Bugly中崩溃分析
  3. 移动云计算中选择推广应用程序的战术
  4. n位整数去掉m位后求最大值问题
  5. 现代软件工程 -- 第一周 -- 介绍自己
  6. scannable dest type struct with >1 columns (3) in result
  7. java的reader_Java Reader类
  8. Flickr网站架构分析
  9. 【USB】USB的VID和PID
  10. 计算机图形学实验报告几何变换,计算机图形学实验报告几何变换.doc