ID:hx131452
邮箱:hx131452@163.com
特长:喜欢逆向,破解分析
案例:
我对Dump文件的认识
首先我们用od加载upx壳来到oep处,用LordPE dump一下吧
双击我们dump下的文件,程序报错
到底是什么原因啊
首先 用lordPe看一下他的入口点 还是原来的
那么我们修改一下 ,发现还是不行 ,那好我们看一下他的输入表,
还是发一段输入表结构吧
typedef struct _IMAGE_IMPORT_DESCRIPTOR {
union {
DWORD Characteristics; // 0 for terminating null import descriptor
DWORD OriginalFirstThunk; // RVA to original unbound IAT (PIMAGE_THUNK_DATA)
};
DWORD TimeDateStamp; // 0 if not bound,
// -1 if bound, and real date\time stamp
// in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
// O.W. date/time stamp of DLL bound to (Old BIND)
DWORD ForwarderChain; // -1 if no forwarders
DWORD Name;
DWORD FirstThunk; // RVA to IAT (if bound this IAT has actual addresses)
} IMAGE_IMPORT_DESCRIPTOR;
typedef struct _IMAGE_THUNK_DATA32 {
union {
PBYTE ForwarderString;
PDWORD Function;
DWORD Ordinal;
PIMAGE_IMPORT_BY_NAME AddressOfData;
} u1;
} IMAGE_THUNK_DATA32;
typedef struct _IMAGE_IMPORT_BY_NAME {
WORD Hint; //指出函数在所在的dll的输出表中的序号
BYTE Name[1]; //指出要输入的函数的函数名
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
发现dump下的输入表只有二个字段有值 一个是Name 一个是 FristThunk
看看FristThunk 他指向的是内存中函数地址
用od加载脱壳前的程序 和脱壳后的程序 发现调用的函数地址是一样的,但是脱壳前的程序显示函数名称,而脱壳后的程序不显示函数名称
个人猜测程序报错,可能是在读取输入表的时候 读到的是内存中函数的地址,但是加载exe程序的程序想到这个地址去找api的名字,但是又没有这个名字,造成的错误提示
虽然脱壳后的程序的api没有显示,但是我在函数上按enter还是可以进入函数里面的
取值也是对的
现在回到我们的主题 dump,为什么会出现这种情况啊
Dump是把内存中所有的数据全部dump下了,当然为了保证解密完成我们才到oep处的
其实 我们完全可以双击程序,再dump这样没有任何关系的
那么一些牛人为什么要先到oep,因为他们想知道oep是多少
那么为什么dump后输入表里面FirstThunk是一些函数地址
是因为加载程序的程序给一些要用的API加载内存中,再给地址写进FirstThunk里面
当我们dump下后 看到FristThunk里面就是内存中的地址
那么我们怎么修补啊
首先我们要确认输入表的IAT的位置,用od加载脱壳前的程序定位就可以了
再修复脱壳后的程序
手动修复当然首先该一下oep,再定位到输入表位置,重新构造输入表
一些工具就是重新建立一个节,接着再构造
但是有一点要注意:原来IAT的位置一定不能移动
要保存
如果想动这里,那你就不得了啊
|