学习x32dbg,x64dbg使用方法
x64dbg工具使用
常用调试快捷键:
- F4:运行到光标
- F7:单步步入
- F8:单步步过
- F9:运行程序
- Ctrl+F9:执行到函数返回处
壳
常见压缩壳:upx,ASpack,PECompat
常见加密壳:ASProtector,Armadillo,EXECryptor,Themida,VMProtect
保存入口参数,通常用pushed/popad、pushfd/popfd指令对来保存喝回复现场环境
壳的加载过程
保存入口参数
加壳程序初始化时保存各寄存器的值
外壳执行完毕,恢复各寄存器值
最后再跳到原程序执行
通常用 pushad / popad 、 pushfd / popfd 指令对来保存和恢复现场环境
获取所需函数 API
一般壳的输入表中只有 GetProcAddress 、 GetModuleHandle 和 LoadLibrary 这几个 API 函数
如果需要其他 API 函数,则通过 LoadLibraryA(W) 或 LoadLibraryExA(W) 将 DLL 文件映射到调用进程的地址空间中
如果 DLL 文件已被映射到调用进程的地址空间里,就可以调用 GetModuleHandleA(W) 函数获得DLL 模块句柄
一旦 DLL 模块被加载,就可以调用 GetProcAddress 函数获取输入函数的地址
解密各区块数据
处于保护源程序代码和数据的目的,一般会加密源程序文件的各个区块。在程序执行时外壳将这些区块数据解密,以让程序正常运行
外壳一般按区块加密,按区块解密,并将解密的数据放回在合适的内存位置
跳转回原程序入口点
在跳转回入口点之前,一般会恢复填写原 PE 文件输入表(IAT),并处理好重定位项(主要是DLL 文件)
因为加壳时外壳自己构造了一个输入表,因此在这里需要重新对每一个 DLL 引入的所有函数重新获取地址,并填写到 IAT 表中3. 做完上述工作后,会将控制权移交原程序,并继续执行
*《程序员的自我修养》
脱壳方法论
如今脱壳主要分为两种方式,第一种方式是:
工具脱壳
所谓脱壳机是针对特定的一种或一类壳开发出来的脱壳软件,它们是由他人在逆向完壳的相关原理后编写的一类自动化工具,具有一定的局限性。
对于无法使用工具成功脱壳的情况,便需要用到第二种方式:
手动脱壳(手脱)
也就是通过一步步分析程序加壳原理,手动还原原始程序的过程,通过手动脱壳,我们可以加深对 PE 格式的理解,增长自己的脱壳水平。在手脱的过程中,我们一般会涉及如下几个概念:
- 查壳。遇到一个加壳程序,第一步应该去分析这是一个什么壳保护的程序,之后我们才能更加有针对性地进行分析与跟踪,遇到难以处理的问题也可以更方便地利用搜索引擎检索同类壳的技术贴。
常用的查壳工具有 PEiD、Exeinfo PE、DIE 等。
寻找程序的原入口点(OEP)。通过单步跟踪、ESP 定律、内存断点等方法找到 OEP。
Dump 内存。所谓 Dump 内存,指的是将一个进程的内存镜像通过某种方式抓取下来,保存至本地磁盘中,之所以需要 Dump 内存,是因为在程序执行到 OEP 时,内存的状态往往就与未加壳前****的程序相同(因为壳段代码已经帮我们完成了解密、解压等工作),此时我们将这个状态保存出去,再加上一些后期的修复,就能完成整个脱壳操作了。
输入表(IAT)重建。在 Dump 操作结束之后,程序并不能直接运行,很大程度上是因为输入表并没有被修复好。IAT 可以根据 PE 结构手动修复,也可以通过工具完成。
关闭程序重定位。
特征
upx
- 查壳
- 识别函数少
- Ctrl-s 段名UPX*
实践1
手工脱壳:hw1.exe
寻找OEP(ESP定律)(好用)
原理利用程序中堆栈平衡来快速寻找OEP
去重定位
用CFF小辣椒或者010都可以