壳:一段保护软件不被非法修改或反编译的程序,它会在附加在我们的代码之前,获得运行的权利,然后对程序进行修改。实现对软件的保护与压缩。

一、进行FSG压缩后的产生的效果

1、进行FSG压缩前后的效果图

FSG压缩前为34KB,压缩后为9KB。此时不用怀疑,这两个程序都能都正常运行。

2、使用PEID查壳


可以看到,TestFSG使用的是FSG v2.0进行的压缩

3、使用OD对比查看模块间的调用(右键->查找->所有模块间的调用)


进行FSG的压缩之后,我们看不到模块之间的调用了

4、使用LoadPE查看TestFSG.exe的输入表

此时输入表中只有两个API,它们就是FSG壳运行时所需要使用到的两个API。
FSG壳通过LoadLibrayA加载原始程序所需要使用的动态链接库,然后通过GetProcAddress获取原始程序所需要调用的API的地址,将原始的输入表还原到程序。
根据这样就实现了加载程序时对输入表的动态还原,所以我们第3点中看不到模块间的调用的原因。

既然FSG壳将我们的API进行了“隐藏”,那么我们要进行的脱壳就是要实现API的还原。

二、手工脱FSG壳

1、使用OD加载TestFSG

此时程序先运行的是FSG这个壳的代码,这段代码主要用于将原始的代码、数据进行解压还原的操作。
解压完成后,程序就会跑到我们原始的程序上运行。
此时我们就可以将原始程序dump(转储)下来,再进行一些修复,就完成了FSG的手动脱壳。

2、使用F8单步运行,如果遇到call直接往下运行,如果遇到往前面运行的jmp语句,直接点击jmp的下一条语句,按F4(运行到指定位置)往下运行。直到跑到该汇编指令处:

jnz语句用于最终判断FSG壳是否解压完成。如果没有解压完成,就跳转到004001D4的指令继续解压(循环解压);如果解压完成,继续往下执行0040001D1的jmp指令,使得程序跳转到原始程序的入口点运行。

3、在jmp处下断点(F2),F9运行到jmp处

在jmp处F7(单步步入)执行后,就跳转到了我们原是程序的入口点

此时并不能看到汇编代码,我们右键->分析->分析代码,此时就能显示了

4、使用LoadPE进行dump解压后的内存中的程序(注:如果无法在进程中找到使用OD打开的应用程序,使用管理员权限再运行下LoadPE)

右键->完整转存(dump full)
转存后的可执行文件:dumped.exe

双击dumped.exe,此时并不能正常运行!

这是正常情况,因为壳通常都会修改IAT(关于IAT的理解)。于是乎,程序虽然经过FSG的解压,进入到了程序的入口点,但是FSG壳在还原的时候,并没有完全的还原IAT(导入函数地址表)。
甚至其它的一些壳不会进行还原IAT,它仅仅是实现了一个自己能够识别的IAT,然后再程序运行的过程中,它自身进行动态的还原。

5、使用ImpREC选择脱壳的程序查看输入表函数信息(注:如果没有找到脱壳程序的话,同样使用管理员权限运行即可)

1)选择我们的脱壳进程TestFSG.exe(它这里自动转换成了小写testfsg.exe,不用介意)
2)填写我们OEP(程序入口点)的RVA值。
获取的方法一:手动计算,前面我们通过OD已经跳转到了OEP,地址为0040102D,00400000为基址,102D为OEP的RVA值。
获取的方法二:在OEP指令右键->用OllyDump脱壳调试进程->获取EIP作为OEP

3)点击“自动查找IAT”,再点击“获取输入表”,此时就能获取到输入表的函数信息了
4)点击“转储到文件”转储到先前的dumped.exe文件,会新形成一个dumped_.exe文件

到此,程序依旧不能运行,因为ImpREC仅仅帮我们修复了IAT中的一个dll,并没有完全的还原IAT

6、手动修复导入表(就是输入表)中的导入函数表信息(IAT Import address table)
1)在ImpREC获取一个导入函数的RVA值,在OD的内存地址窗口中跳转到RVA值

此时取第一个函数的RVA值:00009000
前面我们知道程序加载到内存中的基址为:00400000
所以函数在内存中地址为:00400000+00009000=00409000

2)在内存中”Ctrl+G”跳转到00409000地址处,再”右键->长型->地址”,就可显示出调用的API名字

首先我们得知道:每个Dll的导入函数地址表中根据0字节结尾!因为它们本身就是一个数组实现的。
而FSG虽然在应用程序加载的时候进行的动态还原,但是它并没有使得每个导入函数地址表中以0结尾,而我们要做的就是将不以0结尾了,使用二进制0填充

3)往下拉取到一个Dll的导入函数列表(IAT)末尾处

使用0填充后效果

4)然后将每个Dll的IAT末尾不为0的,都使用0字节填充,直到到导入表中的最后一个dll的IAT结束(通常为许多0字节结束的地方为结束位置,你也可以在结束的位置继续往下拉取,自行判断是否为结束)

至此,对IAT的修复已经完成。
记录最后结束为止的RVA值:9170
减去起始位置的RVA值,得出IAT的大小:9170-9000=170

5)再使用ImpREC手动填写IAT的起始RVA(9000),以及IAT的大小170,再进行转储dumped.exe就OK了

注:如果有显示无效的的输入表函数信息,直接右键->删除指针后再转储即可

本文难免有所错误,如有问题欢迎留言

脱壳笔记-手工脱FSG压缩壳相关推荐

  1. 006 kkrunchy_Ryd之类FSG压缩壳

    文章目录 前言 查壳 OD脱壳 修复导入表 前言 最近一直在看脱壳系列的教程,国内能找到的脱壳视频几乎都看了个遍,大部分由于年代实在是太久了,附带的示例程序完全不能运行,或者是某些未知原因用相同的步骤 ...

  2. 手工脱壳之 FSG压缩壳【IAT反修复】

    一.工具及壳介绍 使用工具:Ollydbg,PEID,ImportREC,LoadPE FSG壳 2.0: 二.脱壳 1.追踪 修复IAT表代码 入口处,没有pushad特征,无法使用ESP定律. 查 ...

  3. 35. 脱壳篇-UPX和WinUpack压缩壳的使用和脱法

    UPX官网:http;//upx.sourceforge.net UPX加壳 通过cmd窗口执行,进入upx目录,执行: upx.exe fishc.exe 或者直接将exe拖至upx.exe上即可 ...

  4. 逆向破解程序脱壳篇-压缩壳

    一.普及 What?壳 所谓"壳"就是专门压缩的工具. 这里的压缩并不是我们平时使用的RAR.ZIP这些工具的压缩,壳的压缩指的是针对exe.com.和dll等程序文件进行压缩,在 ...

  5. 【2022.1.3】手脱压缩壳练习(含练习exe)

    [2022.1.3]手脱压缩壳练习(含练习exe) 文章目录 [2022.1.3]手脱压缩壳练习(含练习exe) 0.简介 1.单步跟踪法 (#)方法介绍 (0)练习exe下载 (1).查看源程序 ( ...

  6. 脱壳入门初级教学(第四课 常见压缩壳与加密壳)

    转自:http://bestmk.cn/thread-491.htm 加壳软件按照其加壳目的和作用,可分为两类:一是压缩(Packers),二是保护(Protectors).压缩这类壳主要目的是减小程 ...

  7. 脱壳入门(三)之UPX压缩壳

    脱壳入门(三)之UPX压缩壳 一.找OEP 查壳:UPX壳.链接器版本2.25(可能是Delphi程序).区段信息 根据ESP定律寻找OEP OEP定律原理:壳代码就像一个函数,进入时会开辟堆栈.保存 ...

  8. 【原创】脱UPX加壳的notepad.exe

    [文章标题]: 脱UPX加壳的notepad.exe [文章作者]: 微微虫[S.T.C][DCT] [作者邮箱]: ]nuxgod@163.com [作者主页]: http://wwcgodsoft ...

  9. 手动脱Mole Box壳实战总结

    作者:Fly2015 这个程序是吾爱破解脱壳练习第8期的加壳程序,该程序的壳是MoleBox V2.6.5壳,这些都是广告,能够直接无视了.前面的博客手动脱Mole Box V2.6.5壳实战中已经给 ...

  10. linux 下 upx 脱壳笔记

    linux很少有需要crack的软件,所以最近总是自娱自乐.自己写的软件自己破着玩但是由于都是知道自己的手段,没有什么意思.真的希望有高手们写些crackme for linux . 最近看了看win ...

最新文章

  1. 李洪强iOS经典面试题153- 补充
  2. [转]Linux系统中用户帐户清洁与安全方法
  3. node n 切换node版本失败_node版本如何升级
  4. SQL Server 2005查询处理结构-用户模式计划(UMS)
  5. “中国GPT-3”开放APP开发接口,百万奖金智能应用开发大赛同步启动
  6. 使用ABAP代码创建S/4HANA里的Sales Order
  7. java netty socket_Netty对socket的抽象
  8. C/C++中printf和C++中cout的输出格式
  9. 深度学习 --- 优化入门六(正则化、参数范数惩罚L0、L1、L2、Dropout)
  10. 视频教程-webservice入门到精通(备java基础,xml,javaee框架)-Java
  11. spyder pyecharts不显示_飞利浦292E2E评测丨宽屏显示器中的多面手
  12. mac怎么无线打印机连接到服务器,Mac上wifi打印机怎么用 wifi打印机连接使用教程...
  13. 测度空间上的可测函数和性质
  14. 触动精灵 PLIST 文件读取 详解
  15. ODM和OEM的区别
  16. 无线网460王者荣耀服务器,王者荣耀460ms解决方法:王者荣耀网速460ms怎么办?...
  17. 14种异常检测方法汇总
  18. 网页禁止鼠标右键复制的解决办法
  19. 7.16日 别问了稳定跑就完事~ ksjsb可用版 (日均10w)
  20. 特征选择/筛选方法总结

热门文章

  1. Linux监控平台搭建
  2. Screeps入门: harvest,upgrader,builder初级自动化
  3. SPTD和虚拟光驱 以后装机我再也不带酒精52%了
  4. Vivado使用技巧(23):综合运行与OOC
  5. firefox html5 pop,数组的push、unshift、pop、shift方法实现
  6. winVNC 源代码分析
  7. 如何越狱苹果TV2在iOS 4.2使用PwnageTool
  8. 蓝队在攻防比赛中常用的防护手段汇总
  9. TDengine 入坑
  10. 电脑装windows和安卓双系统引导_Remix mini安卓电脑,玩的不只是Windows那张皮