首页
社区
课程
招聘
导入表问题
发表于: 2010-1-13 16:23 4925

导入表问题

2010-1-13 16:23
4925
我用静态注入的方法把导入表修改了后用LordPe查看导入表能看到我的dll在导入表内
但是运行时却没有加载我的Dll,求高手指点一下
附件的导入表最后一个是我加进去的,没有这个dll照样可以运行

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 95
活跃值: (419)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
2
你的附件里没有你的DLL文件啊,怎么试啊
2010-1-13 19:51
0
雪    币: 231
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
没有Dll照样可以运行的,所以我才觉得奇怪
2010-1-13 20:21
0
雪    币: 95
活跃值: (419)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
4
真的好奇怪哦,没觉得哪儿有错,为什么执行时不报 找不到该dll文件错误呢
2010-1-13 20:39
0
雪    币: 95
活跃值: (419)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
5
难道根本没用到输入表???尝试把”msvcrt.dll“改为”msvcra.dll",执行会报错啊,又把新加的IMAGE_IMPORT_DESCRIPTOR与其他正常的对换位置,仍然如此,我都迷糊了。。。。期待高手解答
2010-1-13 20:52
0
雪    币: 231
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
如果用LordPE随便增加一个Dll进去,再把增加的DLL干掉,就会报错了。
2010-1-13 21:04
0
雪    币: 231
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
增加一个DLL时LordPE会增加一个新节,其它数据还是会如实拷贝过去的,再把增加的DLL干掉也就是原来的数据并没有改变呀,为什么这样做就可以正确加载我原来的DLL了呢
2010-1-13 21:08
0
雪    币: 95
活跃值: (419)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
8
呵呵,好奇怪啊,把lordpe增加的节删除,然后把输入表地址改回原来的136B0,居然正常了,好晕,为什么之前会无视那个IMAGE_IMPORT_DESCRIPTOR,后面还原后反而又看到了呢。。。
2010-1-13 21:28
0
雪    币: 95
活跃值: (419)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
9
经过反复对比,发现问题出在目录表里,用lordpe将"目录信息"里的“输入范围”清0,就会找到你的dll文件了
输入范围的RVA为260,在文件260的地方比一般的EXE文件多一些内容如下:这个输入范围可能汉化不准确,应该叫绑定输入表
上传的附件:
2010-1-13 22:15
0
雪    币: 95
活跃值: (419)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
10
搜索绑定输入表会发现很多计算器字眼,哈哈,又学到一点
下面摘自http://hi.baidu.com/ylywyn/blog/item/7ae5992bb967aaf3e7cd4003.html
绑定输入目录表(The Bound Import Directory)。它包含了可以让加载器判断绑定的地址是否合法的信息。描述它的数据结构是IMAGE_BOUND_IMPORT_DESCRIPTOR,目录表就是这种结构的数组,每一项都对应一个被绑定过的DLL。先看下这个结构:

typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR {

    DWORD TimeDateStamp;

    WORD OffsetModuleName;

    WORD NumberOfModuleForwarderRefs;

} IMAGE_BOUND_IMPORT_DESCRIPTOR,*PIMAGE_BOUND_IMPORT_DESCRIPTOR;

    TimeDateStamp。这个成员必须和要引用的DLL的文件头信息相吻合,否则就会加载器去手动计算新IAT,这种情况一般发生在DLL版本不同时或者DLL映像被重定位时。

    OffsetModuleName。包含了以第一个IMAGE_BOUND_IMPORT_DESCRIPTOR为基址,DLL名称字符串(ASCII且以null结束)的偏移(非RVA)。

    NumberOfModuleForwarderRefs。是紧接着本结构后的另一个IMAGE_BOUND_FORWARDER_REF结构数组的元素个数。

typedef struct _IMAGE_BOUND_FORWARDER_REF {

    DWORD TimeDateStamp;

    WORD OffsetModuleName;

    WORD Reserved;

} IMAGE_BOUND_FORWARDER_REF,*PIMAGE_BOUND_FORWARDER_REF;

    这个结构与IMAGE_BOUND_IMPORT_DESCRIPTOR好像一样嘛。。。噢就最后一个字是保留的。这个结构数组干什么用的?你一定已经注意到ModuleForwarder这个词了,还记得我们在输出表中讲到的,函数的输出转送么?就是一个函数自己不实现而是把调用请求转发给另一个DLL中的函数。这里的IMAGE_BOUND_FORWARDER_REF结构就是用来记录接受转发的另一个DLL的校验信息,如果这个DLL还有输出转送,那么在该DLL中也有IMAGE_BOUND_FORWARDER_REF结构描述第三个DLL的校验信息。
2010-1-13 22:36
0
雪    币: 231
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
回答的真仔细,非常感谢WXXW的细心和耐心
2010-1-14 10:44
0
雪    币: 231
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
我再仔细看一下LordPE把绑定输入表和IAT表都清空了。
2010-1-14 11:21
0
游客
登录 | 注册 方可回帖
返回
//