zoukankan      html  css  js  c++  java
  • 手动脱壳—dump与重建输入表(转)

    文章中用到的demo下载地址:

    http://download.csdn.net/detail/ccnyou/4540254

    附件中包含demo以及文章word原稿

    用到工具:

    Ollydbg

    LordPE

    ImportREC

    这些工具请自行下载准备

    Dump原理这里也不多做描述,想要了解google it!常见的dump软件有LordPE,ProcDump,PETools等本文以LordPE为例

    首先,打开 LordPE,由于此时机器上只有一个汉化版,也懒得花时间去找原版了。我们打开选项,设置成如图样子:

     

    设置好后,在LordPE的进程窗口选择相关进程(这里以加了Aspack壳 的dumpDemo.exe为例),单击右键,执行【完整转存】DumpFull,保存即可,如果有Anti-Dump,先执行修正镜像大小(correct ImageSize),再dump full。保存名字默认为dumped.exe

    重建输入表:

    一般而言,一个加密的外壳,破坏原有的输入表是必有的功能。程序被dump出来后还需要重建输入表,例如这个程序dump后运行提示:

     

    这里以ImportREC为例。在运行ImportREC之前,需要满足:

    • 目标文件完全被dump,另存为另一个文件
    • 目标文件正在运行中
    •  事先找到程序的真正入口(OEP)或IAT的偏移和大小

      

    这里使用堆栈平衡原理找OEP,由于找OEP不是本文重点,这简单点说明过程:

    1,OD载入,在执行完pushad后,看到各个寄存器被压进

    0012FFA4h~0012FFC0h中,如图:

     

    2,在OD中下硬件访问断点:

    hr 12FFA4

    3,按F9运行程序,外壳代码处理结束后,调用popad恢复现场环境,将访问这些堆栈。OD就会中断,此时离OEP不远了。中断如图:

     

    其实如果了解其原理,可以在PE文件开始运行时,记下当时的ESP,假设是 12FFC4h,大多数程序第一句都是push 指令,就是对12FFC0h进行写入操作,因此对其设置硬件写断点,(hr 12FFC0),就可以方便地来到OEP附近了。

    4,回到正题,跟到Retn后发现程序来到

    00401700 /.  55            PUSH EBP

    这里,按Ctrl+A让OD分析一下,发现这里就是真正入口点了,记录之。

    好像有点离体了。。。。回到刚才正题,运行ImportREC,在下拉框中选择dumpdemo进程,然后在右边OEP中填入我们获取的OEP的RAV,这里我们输入1700(由于映像基质是00400000),然后点击 自动搜寻(IAT AutoSearch),让其自动检测IAT大小和偏移

    如果出现如图对话框,表示输入的OEP发挥作用了

    单击 【获取输入表】(Get Imports)按钮,让其自动分析IAT结构得到基本信息,如图:

    这里有一个无效的,经过尝试右键菜单中的Trace level 1,2,3命令修复均无效,而且由图中数据也可以看出这个指针式无效的,我们展开,右键【删除指针数据】,现在全部都是有效的了。

    5,修复已脱壳的Dumped.exe,选保证选中【增加新区段】(默认选中),再点击【修复转存文件】,打开Dumped.exe,此时不需要手工备份,程序将创建文件Dumped_.exe,此时OEP也被修正。我们运行Dumped_.exe,已经没有刚才那个错误提示了。功能完全正确,确定就是比刚才的大了点(原文件11.5k,这个修正后的36.0k),中间多了外壳数据和新增区段(.mackt)的输入表数据。

    6,如果不舍得新增一段区段的空间,也可以在.rdata中选取一段空白,这里输入000029C0,在单击修复转存文件即可,这次修复后体积是32.0k,节省了4k  O__O”…

  • 相关阅读:
    English 2
    速算24点
    心理学1
    从微服务到函数式编程
    034 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 01 流程控制概述
    033 01 Android 零基础入门 01 Java基础语法 03 Java运算符 13 运算符和表达式知识点总结
    032 01 Android 零基础入门 01 Java基础语法 03 Java运算符 12 运算符和if-else条件语句的综合案例——闰年问题
    031 01 Android 零基础入门 01 Java基础语法 03 Java运算符 11 运算符的优先级
    030 01 Android 零基础入门 01 Java基础语法 03 Java运算符 10 条件运算符
    029 01 Android 零基础入门 01 Java基础语法 03 Java运算符 09 逻辑“非”运算符
  • 原文地址:https://www.cnblogs.com/Fightingbirds/p/3172905.html
Copyright © 2011-2022 走看看