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

来源:互联网 发布:西安市爱知中学 编辑:程序博客网 时间:2024/05/22 15:20

前言

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    0046B0B70046B0B7    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_ENDL_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    goL_FINDOPCODE_FAILED:    msg "没有找到壳的特征码"    jmp L_ENDL_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    retfnDispDisasmCmdByEip:    var _vDisasmCmd    GCI g_IpToOpt, COMMAND // 得到当前EIP的汇编命令信息, e.g. "call ebp"    mov _vDisasmCmd, $RESULT    eval "{g_IpToOpt} {_vDisasmCmd}" // 打印当前反汇编命令    log $RESULT    retfnScriptInit:    mov g_vPeNameDumpTo, "dumpByOllyScript.exe"    LCLR // 清除Script日志窗口内容    bc * // 清除所有F2断点    BPHWCALL // 清除所有硬断点    call fnPrintOllyScriptVersion    retfnPrintOllyScriptVersion:    eval "ollyScript version = {$VERSION}"    log $RESULT    retfnDumpAndWaitIatfix:    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 WindowAddress    Message46B001     $RESULT: ollyScript version = 1.6546B001     $RESULT: >> task begin ...46B001     $RESULT: ImageBase = 40000046B001     $RESULT: EP = 46B00146B0B7     $RESULT: >> L_BP_PROC46B0B7     $RESULT: 46B0B7 retn4271B0     $RESULT: 4271B0 push ebp4271B0     _vTmp: 脱壳完成: 请停在此处, 对[dumpByOllyScript.exe]进行IAT修复 impREC's OEP = 271B04271B0     $RESULT: << task end
0 0
原创粉丝点击