ollyScript脱壳脚本 for ABC Cryptor(1.0)[-]

前言

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:\r\n脚本需要从EP({vEP})开始运行, 但是EIP = ({eip})\r\n请重新载入程序后, 再运行此脚本"
    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修复\r\n 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值