概述
前言
ABC Cryptor(1.0)[-] 特点 : 可以找到跳到OEP之前的OPCODE, 再F8一次,就可以到达OEP.
这个脚本用来练习搜索特征码.
脱壳脚本
// @file ollyScriptDump_ABC Cryptor(1.0)[-].txt
// @brief ollyScript脱壳脚本 for ABC Cryptor(1.0)[-]
// @note ABC Cryptor(1.0)[-] 特点 : 可以找到跳到OEP之前的OPCODE, 再F8一次,就可以到达OEP.
/**
特征码
0046B0B2 E8 00000000 call 0046B0B7
0046B0B7 C3 retn
*/
// 脚本函数全局变量
var g_IpToOpt // 要进行操作的IP值,先赋值, 再调用函数, 相当于给入参
/** e.g.
mov g_IpToOpt, eip
call fnDispDisasmCmdByEip
*/
var g_vImageBase // ImageBase值, 用于计算ImpREC填写的OEP值
var g_vPeNameDumpTo // 脱壳后的PE名称, 不要加路径, 和被脱壳程序在同一目录
// 脚本主函数需要的变量
var vEIP // eip值
var vEP // EP值
var vESP // ESP值
var vEspValue // [ESP]的值
var vBpAddr_OEP // OEP下断地址
var vTmp
call fnScriptInit
eval ">> task begin ..."
log $RESULT
GMI eip, MODULEBASE // 得到ImageBase
mov g_vImageBase, $RESULT
eval "ImageBase = {g_vImageBase}"
log $RESULT
mov vEIP, eip
GMI eip, ENTRY // 得到EP值
mov vEP, $RESULT
eval "EP = {vEP}"
log $RESULT
cmp vEP, eip
je L_UNPACK_BEGIN
// 报错信息-此脚本必须在EP处开始运行
eval "error:rn脚本需要从EP({vEP})开始运行, 但是EIP = ({eip})rn请重新载入程序后, 再运行此脚本"
msg $RESULT
jmp L_END
L_UNPACK_BEGIN:
// findop 用来搜索一句完整的opcode
// findmem 用来搜索一个内存块数据, 比findop好用
findmem #E800000000C3#, vEP // 特征码在前, IP在后
mov vBpAddr_OEP, $RESULT
cmp vBpAddr_OEP, 0
je L_FINDOPCODE_FAILED
add vBpAddr_OEP, 5 // 在ret处下硬件执行断点
bphws vBpAddr_OEP, "x"
eob L_BP_PROC
go
L_FINDOPCODE_FAILED:
msg "没有找到壳的特征码"
jmp L_END
L_END:
eval "<< task end"
log $RESULT
ret
// 断点的回调函数
L_BP_PROC:
eval ">> L_BP_PROC"
log $RESULT
mov g_IpToOpt, eip
call fnDispDisasmCmdByEip
// 这里要向前走一步的话, 用sto或sti要执行2次
// 即使取消了EIP上的断点, 也要走2次单步才能过去
sto
sto
mov g_IpToOpt, eip
call fnDispDisasmCmdByEip
call fnDumpAndWaitIatfix
jmp L_END
ret
fnDispDisasmCmdByEip:
var _vDisasmCmd
GCI g_IpToOpt, COMMAND // 得到当前EIP的汇编命令信息, e.g. "call ebp"
mov _vDisasmCmd, $RESULT
eval "{g_IpToOpt} {_vDisasmCmd}" // 打印当前反汇编命令
log $RESULT
ret
fnScriptInit:
mov g_vPeNameDumpTo, "dumpByOllyScript.exe"
LCLR // 清除Script日志窗口内容
bc * // 清除所有F2断点
BPHWCALL // 清除所有硬断点
call fnPrintOllyScriptVersion
ret
fnPrintOllyScriptVersion:
eval "ollyScript version = {$VERSION}"
log $RESULT
ret
fnDumpAndWaitIatfix:
var _vTmp
var _vImpRecOEP // 在ImpREC中填写的OEP值
// 到达了OEP, 脱壳
an eip // 分析代码
cmt eip, "this is OEP" // 在OEP地址处加日志
// 脱壳
dpe g_vPeNameDumpTo, eip
// 脱壳完成, 提示我使用ImpREC进行IAT修复
mov _vImpRecOEP, eip
sub _vImpRecOEP, g_vImageBase
eval "脱壳完成: 请停在此处, 对[{g_vPeNameDumpTo}]进行IAT修复rn impREC's OEP = {_vImpRecOEP}"
mov _vTmp, $RESULT
log _vTmp
msg _vTmp
ret
运行效果
Script Log Window
Address Message
46B001 $RESULT: ollyScript version = 1.65
46B001 $RESULT: >> task begin ...
46B001 $RESULT: ImageBase = 400000
46B001 $RESULT: EP = 46B001
46B0B7 $RESULT: >> L_BP_PROC
46B0B7 $RESULT: 46B0B7 retn
4271B0 $RESULT: 4271B0 push ebp
4271B0 _vTmp: 脱壳完成: 请停在此处, 对[dumpByOllyScript.exe]进行IAT修复
impREC's OEP = 271B0
4271B0 $RESULT: << task end
最后
以上就是典雅绿草为你收集整理的ollyScript脱壳脚本 for ABC Cryptor(1.0)[-]的全部内容,希望文章能够帮你解决ollyScript脱壳脚本 for ABC Cryptor(1.0)[-]所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复