脱壳脚本-for DragonArmor(0.0.4.1)[-]

来源:互联网 发布:苏州爱知电机有限公司 编辑:程序博客网 时间:2024/05/02 00:16

前言

练习DragonArmor(0.0.4.1)[-]脱壳, 只要连续F8就可以到OEP.
这个壳有个特点, [0046B000]中第1次写的是OEP的RVA, 第2次写的是OEP的VA.
脱壳脚本的思路: 对0046B000下硬件写入断点, 对写入次数计数, 第2次时, 取[0046B000]的OEP值, 取消所有断点, 对OEP下硬件执行断点, go, 停下时, 就是OEP, 脱壳.
写这个脱壳脚本, 练习对内存值的检测.

脱壳脚本

// @file ollyScriptDump_DragonArmor(0.0.4.1)[-].txt// @brief ollyScript脱壳脚本 for DragonArmor(0.0.4.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 vBpAddr_OEP // OEP下断地址var vBpAddr_OepValueIndicate // 指示OEP值的内存单元, 0046B000var vCnt_OepValueIndicateWasWrite // OEP值指示单元的写入次数var vTmp    mov vPeNameDumpTo, "dumpByOllyScript.exe"    mov vBpAddr_OepValueIndicate, 0046B000    mov vCnt_OepValueIndicateWasWrite, 0    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_ENDL_BEGIN:    /**    这个壳有个特点, [0046B000]中第1次写的是OEP的RVA, 第2次写的是OEP的VA.    脱壳脚本的思路: 对0046B000下硬件写入断点, 对写入次数计数, 第2次时, 取[0046B000]的OEP值, 取消所有断点, 对OEP下硬件执行断点, go, 停下时, 就是OEP, 脱壳.    写这个脱壳脚本, 练习对内存值的检测.    */    bphws vBpAddr_OepValueIndicate, "w"    eob L_BP_PROC    go    // 这里不会再执行了, 已经交给了调试器L_END:    eval "<< task end"    log $RESULT    retL_BP_PROC:    eval ">> L_BP_PROC"    log $RESULT    call fnDispDisasmCmdOnCurEip    add vCnt_OepValueIndicateWasWrite, 1    cmp vCnt_OepValueIndicateWasWrite, 2    je L_BP_PROC_GET_OEP    goL_BP_PROC_GET_OEP:    bc * // 清除所有F2断点    BPHWCALL // 清除所有硬断点    mov vBpAddr_OEP, [vBpAddr_OepValueIndicate]    bphws vBpAddr_OEP, "x"    eob L_BP_PROC_OEP    go     retL_BP_PROC_OEP:    // 到达了OEP, 脱壳    an eip // 分析代码    cmt eip, "this is OEP" // 在OEP地址处加日志    // 脱壳    dpe vPeNameDumpTo, 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    retfnDispDisasmCmdOnCurEip:    mov vEIP, eip    GCI vEIP, COMMAND // 得到当前EIP的汇编命令信息, e.g. "call ebp"    mov vDisasmCmd, $RESULT    eval "{vEIP} {vDisasmCmd}" // 打印当前反汇编命令    log $RESULTret

运行效果

Script Log WindowAddress    Message4692B0     $RESULT: >> task begin ...4692B0     $RESULT: ollyScript version = 1.654692B0     $RESULT: EIP = 4692B04692B0     $RESULT: ImageBase = 4000004692B0     $RESULT: EP = 4692B04694D5     $RESULT: >> L_BP_PROC4694D5     $RESULT: 4694D5 rep movs dword ptr es:[edi], dword ptr [esi]469725     $RESULT: >> L_BP_PROC469725     $RESULT: 469725 push dword ptr [46B000]4271B0     vTmp: 脱壳完成: 请停在此处, 对[dumpByOllyScript.exe]进行IAT修复 impREC's OEP = 271B04271B0     $RESULT: << task end
0 0
原创粉丝点击