手脱UPX壳不求人教程

手脱UPX壳不求人教程

小白:“为什么要手脱UPX壳呀?upx -d 不香吗?”
高手:“香个蛋,出题人各个心里阴暗,能给你upx -d的机会不多了。”

ESP定律

个人认为这个方法是最方便,最快捷的,掌握这个方法基本的UPX壳闭眼脱

原理

ESP 定律的原理在于利用程序中堆栈平衡来快速找到 OEP.

由于在程序自解密或者自解压过程中, 不少壳会先将当前寄存器状态压栈, 如使用pushad, 在解压结束后, 会将之前的寄存器值出栈, 如使用popad. 因此在寄存器出栈时, 往往程序代码被恢复, 此时硬件断点触发. 然后在程序当前位置, 只需要少许单步操作, 就很容易到达正确的 OEP 位置.

  1. 程序刚载入开始 pushad/pushfd
  2. 将第一个寄存器压入栈后就设对 ESP 寄存器设硬件断点
  3. 运行程序, 触发断点,这是upx程序几乎结束

例题讲解

ida反编译一个加upx壳的发现函数很少,但是可以发现,start函数开始有很多push操作

image-20250115225432603

打开x64dbg进行调试,指向到第二个push停止

image-20250115225742755

然后再右下栈窗口给esp下硬件访问断点,64位8字节,32位4字节

image-20250115225858495

接下来直接运行,就会断在upx壳快结束的位置

image-20250115230107554

接着一直往下运行,直到一个大的跳转,就是到达OEP

image-20250115230300395

到达OEP后就用x64dbg自带的插件进行dump和IAT的修复

image-20250115230506018

在第四步的时候,如果出现红色×就删除掉

image-20250115230603184

上边步骤已经完成了dump和IAT的修复,但是可能程序仍然不能运行

这时候我们就要去除重定位

我们需要修改其PE结构中的两个字段值:

  1. File Header 的 Charateristics
  2. Optional Header的 DllCharateristics

下面用小辣椒(CFF Explorer VII)进行修复

第三步勾选上

image-20250115231709951

第三步取消勾选

image-20250115231854920

这样一个完整的脱壳流程就完成了

可能需要自己找到main函数😭

image-20250115232224281

其他脱壳方法待补充。。。。