一枚简单的未知壳

xiaoeryu Lv5

工具&环境:

工具 系统环境
PEID win7_x86
OD
IDA
imporREC

查壳

先用PEID扫了一下发现什么都没有扫到

直接先用OD打开看一下

发现有pushad/fd先用ESP定律下断试一下

嗯,直接就这样到了,F7几下就到了OEP

这里有个sub esp,0x58所以应该是Delphi写的,第一个call本来应该显示getversion的,但是并没有,发现它IAT加密了
OEP是47148B

那我们先跟进去看一下

这里有对ebx一个sub和add运算看了一下发现它获取到了GetVersion的地址

但是0x475080还是它WriteIAT的地址,所以在这里下硬件写入断点,然后重新运行寻找它GetAPI的地方

F9了两次发现这个地方像是写入IAT的地方

那这个1D0897应该是WriteIATAddr了

在0x2F0895这个地方下断用run跟踪F7跑一下

run跟踪的原理就是模拟操作然后全部记录在run跟踪窗口中

在写入iat的地方下断点,然后run跟踪,运行到下一次写入的时候就会断下来,

然后进run跟踪的界面,找到7*******开头往这个eax里面写入的地址就是GetAPIAddr了

可以看到这里获取到了API的地址

这个地方就可以用了,也可以再往上找一下eax是从哪来的

找到是从这个地方获取的

1D1914或者1D0474
我们写脱壳脚本的时候GetAPI用这两个地址都可以

// 定义变量,初始化变量 
VAR dwGetAPIAddr 
VAR dwWriteIATAddr 
VAR dwOEP VAR dwTmp 
MOV dwGetAPIAddr, 001D0474     // 获取 API 地址的地方      
MOV dwWriteIATAddr, 001D0897   // 填充 IAT 的地方 
MOV dwOEP, 0047148B            // OEP
// 清理环境 
BC     // 清理软件断点 
BPHWC  // 清理硬件断点 
BPMC   // 清理内存断点 
// 设置断点 
BPHWS dwOEP, "x" 
BPHWS dwGetAPIAddr, "x" 
BPHWS dwWriteIATAddr, "x"
// 构造循环 
LOOP1:  
// 运行程序 
RUN 
// 判断 是 获取 API 地址的地方 
cmp eip,dwGetAPIAddr 
JNZ SIGN1 
MOV dwTmp, eax 
jmp LOOP1   
// 判断 是 填充 IAT 的地方 
SIGN1: 
cmp eip,dwWriteIATAddr 
JNZ SIGN2  
MOV [edx],dwTmp 
jmp LOOP1  
// 判断是 OEP ,结束了 
SIGN2: 
cmp eip,dwOEP 
JZ EXIT1 
jmp LOOP1  // 脚本结束 
EXIT1: 
MSG "yes,今晚吃鸡!"

等脚本跑完 修复完导入表

在OEP处右键使用OllyDump将程序dump出来

然后用imporREC修复一下dump出来程序的导入表就可以了

完成

  • 标题: 一枚简单的未知壳
  • 作者: xiaoeryu
  • 创建于 : 2021-05-24 15:29:04
  • 更新于 : 2023-11-17 19:37:53
  • 链接: https://github.com/xiaoeryu/2021/05/24/一枚简单的未知壳/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论