首页
社区
课程
招聘
[求助]关于PE文件中IMAGE_IMPORT_BY_NAME结构读取的疑问
发表于: 2009-7-22 16:56 10476

[求助]关于PE文件中IMAGE_IMPORT_BY_NAME结构读取的疑问

2009-7-22 16:56
10476
关于PE文件中IMAGE_IMPORT_BY_NAME结构读取的疑问

PE文件中IMAGE_IMPORT_BY_NAME结构,在winnt.h中定义如下:

typedef struct _IMAGE_IMPORT_BY_NAME {
    WORD    Hint;
    BYTE    Name[1];
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;

该结构第二个成员 BYTE    Name[1] 占用的空间大小是可变的,
那怎么设置ReadFile函数的读入的数据大小呢?

已反复观看http://bbs.pediy.com/showthread.php?t=64701此贴,
仍不解,希望高手指点明示。。
原文如下:

typedef struct _IMAGE_IMPORT_BY_NAME {
    WORD    Hint;
    BYTE    Name[1];
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;

Hint, 就是那个019d 了,BYTE Name[1], 这个变量定义看起来很奇怪,是吗?
代学生: 是的,我很少见到这种定义。
  通常我们会定义 char buffer[256], BYTE data[8]; 等类型。
  BYTE Name[1], 只包含一个元素的数组,它也装不下后面的"MessageBoxA"字符串啊。
代老师:这种定义是一种指针的变通用法。
  如果你真要定义成数组来包含后面的字符串,你定义成多大呢?定义成100,短字符串浪费,
  长字符串可能就真能碰到一个101个字符的名字,你定义的还是占不下。
  所以说,这个Name[1], 不是要你往里面装东西的,C 语言里,你可以借助这个Name 变量访问到它对应的地址。
  这种用法通常是很少用的。因为它毛病很多,例如结构后面不能再定义其它变量了,必须是最后一个,定义了
  数组又不用它装东西,也不符合数组的初衷. 所以你只有明白这个道理就可以了。
  
代学生:既然它那么不好用,为什么还那样定义呢。
代老师:还是那句话,是变通。
  你看,它简洁,它完成了使命。否则你就要把结构变一变,例如按常规估计应该是这样子。
  WORD Hint; BYTE *pName; 然后你要求微软说,Hint 后面不要跟字符串,要跟一个地址。这样C语言好写。
  好比说大部分人沿着盘山路往山上走,也有人愿意盘着荆棘往山上爬,后者绕了近路,但风险也大。
  
代学生:讲了这么多,其实我看一个word 后面跟着一个0字终结符字符串,还是很好理解的吗。
代老师:C 语言以其简洁,高效,使我们受益良多。但在某些特殊的情况下,它也会力不从心。有时刻当你看着一堆堆
  结构套结构,一堆堆宏套宏令你头晕时,而看看它最终的list 表或二进制输出反而能令你豁然开朗。
  哦,有点扯远了。 我还是最喜欢C的。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 179
活跃值: (26)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
这种定义是一种指针的变通用法。
既然文章中这么说,楼主可以把它当成指针使用。我用C语言写过这样的程序,访问函数名字的时候的确是用指针的方式访问的。
楼主为什么用ReadFile去访问函数名呢?函数名的地址定位了吗。如果定位了地址就直接用指针的方式去读取就行了。
2009-7-22 17:46
0
雪    币: 94
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
TO SJQIANG:

很感谢您的回帖;

这个情况是在我要编程读取(位于硬盘上的)pe文件中IMAGE_IMPORT_BY_NAME结构的数据时遇到的,

该结构在文件中的偏移量已经知道了,

然后SetFilePointer-->ReadFile来获得数据啊。。
2009-7-23 09:33
0
雪    币: 243
活跃值: (179)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
当指针使用吧,碰到\0就认为字符串结束了
2009-7-23 09:46
0
雪    币: 179
活跃值: (26)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
我是使用C语言的文件操作函数写的,定位到字符串位置以后,用(char*)做一个强制类型转换,直接当成字符串指针访问就可以了。
2009-7-23 11:12
0
雪    币: 94
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
感谢     
SJQIANG;
xicao;
感谢  
PEDIY
感谢 ..
2009-7-23 16:54
0
游客
登录 | 注册 方可回帖
返回
//