软件脱壳技术(手动脱壳教程)

软件脱壳技术

手动脱壳教程在第二部分,下面是例子

https://blog.youkuaiyun.com/LH1013886337/article/details/143823816

1 壳的概念

“壳”就是专门压缩/加密的工具,通过在压缩/加密的过程中加入保护性代码,程序文件会失去原来的程序结构,改变代码的表现形式,增加被篡改和反编译的难度,达到保护程序内部逻辑的效果。

**压缩壳:**以减小软件体积和改变软件可执行代码的特征为目的,压缩壳主要有ASPack、UPX和PECompact等

**加密壳:**以保护软件为目的,根据用户输入的密码用相应的加密算法对原程序进行加密,ASProtect、EXECryptor、 Armadillo等

壳代码的运行流程:

  1. **保存入口参数:**壳代码会先于源程序逻辑获得控制权,执行壳部分的代码势必会改变各个寄存器的值,因此,需要先保存各寄存器的值,当壳代码执行完毕后,再将寄存器的值恢复,并开始执行源程序的逻辑,保存和恢复寄存器的值通常采用的是pushad/popad、 pushfd/popfd指令

    pushad: 将所有的32位通用寄存器压入堆栈,其入栈顺序是:EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI

    pushfd:将32位标志寄存器EFLAGS压入堆栈

  2. **获取所需要的API地址:**正常的程序导入表中存放了从外部加载的函数信息,其中包括DLL名称、函数名称、函数地址等,为了防止从这些信息猜测出来程序的功能,外壳的导入表中只有GetProcAddress、GetModuleHandle和 LoadLibrary这几个函数

    利用函数LoadLibrary可以将DLL文件映射到进程的地址空间

    函数GetModuleHandleA(W)可以获得DLL模块句柄

    函数GetProcAddress可以获得指定函数的真实地

    利用这些信息可以动态获取API函数的真实地址,并调用这些API函数,同时还隐藏了导入表中的函数信息

  3. **解密原程序的各个区块的数据:**加壳过程一般都会对源程序的各个块进行加密,在壳执行完毕后,为了能正确执行源程序的代码,需要对加密后的各个块进行解密

  4. **初始化程序的IAT表:**壳一般都修改了原程序文件的输入表,为了让源程序正常运行,外壳需要自己模仿Windows系统的工作来填充 输入表中相关的数据

    输入表(导入表)是记录PE文件中用到的dll的集合,一个dll库 在输入表中占用一个元素信息的位置,一个元素信息描述了该 输入dll的具体信息

    导入的函数就是被程序调用,但其执行代码又不在程序中的函数,这些函数的代码位于一个或者多个dll 中

    PE 文件被装入内存时,Windows 装载器通过输入表才能将DLL 装入

    有些壳程序还会将IAT表中的数据填充为HOOK-API代码的地址,这样程序在调用这些API时会先执行HOOK-API代码, 可以达到监控程序行为的目的

  5. **对重定位项进行处理:**程序在加载执行时,系统会按照文件声明中填写的地址, 将程序载入指定内存中,这个地址称为基址,对于EXE文件,Window提供给程序的基址是400000h,在这种情况下,重定位功能是不需要的。为了使程序更小巧,有些加壳程序删除了重定位区块。 但对于DLL动态链接库这种需要动态加载的可执行文件, 需要对重定位区块重建,以保证正常运行

  6. **跳转到程序的原入口点:**OEP:(Original Entry Point),程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP), 只要找到程序真正的OEP,就可以立刻脱壳,当程序运行到OEP这个位置,程序控制权会交还给原程序, 一般脱壳的步骤需要寻找这个OEP点

2 脱壳的相关工具

Exeinfo PE 是一款免费的Win32可执行程序检查器**(建议用PEID,因为Exeinfo只能查exe)**

image-20241101103031716

查看程序的段信息,只需点击EP Section右边的”>”即可

PEiD还支持简单的反汇编功能(FirstBytes)

内存Dump工具

LordPE和OllyDump

内存Dump原理:

在执行到原程序入口点后,外壳程序已经将原程序的各个段以及导入表等数据都恢复完成

为了能够调试分析该程序, 要把程序在内存空间的数据都导出来,这就是Dump,生成的文件称为dump文件

要得到正在运行进程的内存数据,需要获取到进程的相关信息,然后在从该进程中读取内存数据并保存到文件中

获取进程的信息可以采用Module32Next函数,该函数会返回一个指向MODULEENTRY32结构体的指针,利用该结构体中的modBaseAddr、modBaseSize、hModule等字段, 再结合ReadProcessMemory函数可以从该进程中直接读取内存数据,实现内存Dump

**OllyDump:**为调试工具OllyDbg的一个插件的,Plugins>OllyDump>Dump>debugged process

输入表重建工具:

通过内存Dump的方式将程序的内存映像保存下来之后,一般情况下是无法直接运行这个Dump下来的程序的,一般的加密壳都会破坏掉源程序的输入表,为了让程序正常运行,需要对输入表进行重建

输入表修复原理

  • PE文件在运行时一般都会用到从外部DLL导入的函数,在编译程序时是无法事先获得这些外部函数的真实地址的
  • 为了获得这些外部函数在内存中的地址,需要在程序装载时将这些函数的地址查询出来并保存起来
  • PE文件中的输入表就是负责保存程序用到了哪些 DLL文件中的哪些函数,以及这些函数的真实地址

输入表的结构:

其中,保存函数真实地址的数据结构就是Import Address Table(IAT),外壳程序在处理的过程中会模拟Windows装载器来获取函数的真实地址并将其填充到IAT中,也就是说外壳程序处理完毕后,整个程序的内存中存在着一个完整的IAT

输入表修复的原理就是找到内存中存在的IAT,根据IAT来重新构建一个完整的输入表结构

构建完成后,程序再次运行就能通过该结构正常填充IAT中的数据,使得程序正常运行

ImportREC是一款专业的输入表重建工具,可以根据内存中的IAT重新构建一个输入表

image-20241101103812415

  1. 首先需要找到程序的原始入口点(OEP)

    利用栈平衡原理(ESP守恒定律)

    加壳软件,必须保证外壳初始化的现场环境(寄存器)与原程序的现场环境相同。

    加壳程序初始化时保存各寄存器的值,外壳执行完毕,再恢复各寄存器内容,最后再跳到原程序执行。

    程序通常使用pushad/popad、pushfd/popfd指令来保存与恢复现场环境。

  2. 根据堆栈平衡原理,先执行完pushad指令后,在栈地址0x12FFA4处设置硬件访问断点(命令:hr 12FFA4)

    地址0x12ffa4就是在push ad指令执行后的栈顶地址,也就是说这个地址处存放的是某一个寄存器的指令

    设置断点hr 12ffa4以使程序在读取这个地址时会触发断点

    当程序读取这个值的时候,就说明程序已经执行完了壳程序的部分,所以触发断点的位置就在源程序入口处附近,这样就能快速的跟踪到程序入口

    image-20241101104340779
  3. 按F9让程序运行,程序断在恢复保存的现场环境以后(即popad指令后),此操作结束后,程序会跳转至OEP

    跳转到jmp

    image-20241101104412851

  4. 找到程序入口点为0x4010B0,并使用Dump内存工具OllyDump将内存映像Dump到文件中(取消勾选重建输入表选项)

    image-20241101104444090image-20241101104501860

  5. 打开ImportREC工具,选中目标进程upx_demo.exe, 并将OEP处填为我们得到的0x10B0

    image-20241101104536423

输入表中每一个DLL都有与之对应的IAT,一般情况下IAT之间的间隔为一个DWORD的0,但是有些情况下他们之间的间隔会发生变化,这样ImportREC不能获取完整的IAT表,只能获取到其中的第一份IAT, 如果仅以此IAT进行重建,程序仍然不能正常运行, 依次点击Get Import>Fix Dump,并选择最开始 Dump下来的文件,会发现仍然不能正常运行

这时有两种方法来解决这个问题:依次填写剩余IAT的地址和大小到RVA(手工找),Size字段中,并点击“GetImport”,重复该过程直到所有的IAT均搜索完毕即可;也可以修改Size字段,使其值足够覆盖所有的IAT。这里通过将Size修改为0x1000(保证包含了所有IAT表,2000也行),最终获取到完整的输入表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值