前言
继续做脱壳练习.
AHpack(0.1)[-] 是压缩壳, 手工用ESP定律完成脱壳.
尝试用ollyScript模拟手工脱壳, 试验完成了.
如果是那种步骤比较繁杂的脱壳任务, 用脚本完成脱壳, 那性价比应该蛮高的.
记录
// @file ollyScriptDump_AHpack(0.1)[-].txt
// @brief ollyScript脱壳脚本 for AHpack(0.1)[-]
var vEIP // eip值
var vEP // EP值
var vESP // ESP值
var vEspValue // [ESP]的值
var vImageBase // ImageBase值, 用于计算ImpREC填写的OEP值
var vImpRecOEP // 在ImpREC中填写的OEP值
var vPeNameDumpTo // 脱壳后的PE名称, 不要加路径, 和被脱壳程序在同一目录
var vTmp
mov vPeNameDumpTo, "dumpByOllyScript.exe"
LCLR // 清除Script日志窗口内容
bc * // 清除所有F2断点
BPHWCALL // 清除所有硬断点
eval ">> task begin ..."
log $RESULT
eval "ollyScript version = {$VERSION}"
log $RESULT
mov vEIP, eip
eval "EIP = {vEIP}"
log $RESULT
GMI eip, MODULEBASE // 得到ImageBase
mov vImageBase, $RESULT
eval "ImageBase = {vImageBase}"
log $RESULT
GMI eip, ENTRY // 得到EP值
mov vEP, $RESULT
eval "EP = {vEP}"
log $RESULT
cmp vEP, eip
je L_BEGIN
// 报错信息-此脚本必须在EP处开始运行
eval "error:\r\n脚本需要从EP({vEP})开始运行, 但是EIP = ({eip})\r\n请重新载入程序后, 再运行此脚本"
msg $RESULT
jmp L_END
L_BEGIN:
sto // F8
// 下栈顶访问硬断点
mov vESP, esp
mov vEspValue, [esp]
eval "[esp({vESP})] = ({vEspValue})"
log $RESULT
bphws vESP, "r" // 对栈顶指向的地址下硬件访问断点
eob L_HBP_R_PROC
// 如果刚卸载了安全软件(e.g. 火绒4.0), 不重新启动计算机, 就使用go或run命令, 会有报错提示, 打断了自动化脚本.
// Unable to open or read executable file 'C:\WINDOWS\system32\dtrampo.dll'
go
// 这里不会再执行了, 已经交给了调试器
L_END:
eval "<< task end"
log $RESULT
ret
L_HBP_R_PROC:
eval ">> L_HBP_R_PROC"
log $RESULT
call fnDispDisasmCmdOnCurEip
sto // F8
call fnDispDisasmCmdOnCurEip
sto // F8
// 到达了OEP
call fnDispDisasmCmdOnCurEip
an eip // 分析代码
cmt eip, "this is OEP"
// 脱壳
dpe "dumpByOllyScript.exe", eip
// 脱壳完成, 提示我使用ImpREC进行IAT修复
mov vImpRecOEP, eip
sub vImpRecOEP, vImageBase
eval "脱壳完成: 请停在此处, 对[{vPeNameDumpTo}]进行IAT修复\r\n impREC's OEP = {vImpRecOEP}"
mov vTmp, $RESULT
log vTmp
msg vTmp
jmp L_END
fnDispDisasmCmdOnCurEip:
mov vEIP, eip
GCI vEIP, COMMAND // 得到当前EIP的汇编命令信息, e.g. "call ebp"
mov vDisasmCmd, $RESULT
eval "{vEIP} {vDisasmCmd}" // 打印当前反汇编命令
log $RESULT
ret
脚本日志
Script Log Window
Address Message
46B0FF $RESULT: >> task begin ...
46B0FF $RESULT: ollyScript version = 1.65
46B0FF $RESULT: EIP = 46B0FF
46B0FF $RESULT: ImageBase = 400000
46B0FF $RESULT: EP = 46B0FF
46B100 $RESULT: [esp(12FFA4)] = (7C930208)
46B29A $RESULT: >> L_HBP_R_PROC
46B29A $RESULT: 46B29A mov edx, 004271B0
46B29F $RESULT: 46B29F jmp edx
4271B0 $RESULT: 4271B0 push ebp
4271B0 vTmp: 脱壳完成: 请停在此处, 对[dumpByOllyScript.exe]进行IAT修复
impREC's OEP = 271B0
4271B0 $RESULT: << task end