一枚简单的未知壳
工具&环境:
工具 | 系统环境 |
---|---|
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 进行许可。
评论