首页
社区
课程
招聘
对Iczelion所写PE文件格式文章的几点错误质疑
发表于: 2005-12-2 19:03 15207

对Iczelion所写PE文件格式文章的几点错误质疑

qduwg 活跃值
35
2005-12-2 19:03
15207

对Iczelion所写PE文件格式文章的几点质疑(原文见Crack Tutorial 2001,PE文件格式,GUFENG翻译,原作是Iczelion)

在译文中IMAGE_OPTIONAL_HEADER成员SizeOfHeaders的使用前后矛盾,我又对比着阅读了英文原文,里面的描述竟然也是矛盾的。我认为太误导我们这些初学者,所以特指出来,纠正错误就可以进步。如果不搞清这个关键问题,对PE的概念肯定是模糊的,错误的。而搞破解是需要扎实的功底的!要从点滴积累!

问题如下:

我在阅读“Crack Tutorial 2001”中关于第八章压缩与脱壳第一节PE文件格式的时候,发现这里面对SizeOfHeaders成员的阐述出现前后矛盾的现象,第四个小节阐述Optional Header,在本节里面对SizeOfHeaders的说明如下(第一个说法):

“SizeOfHeaders 所有头+节表的大小,也就等于文件尺寸减去文件中所有节的尺寸。可以以此值作为PE文件第一节的文件偏移量。”  //注意此处表述的是“头+节表”,不只是“头”的尺寸。另外,我看了一下LUEVELSMEYER 的英文文章《PE文件格式》,里面给出了一个简单的具体例子,其中SizeOfHeaders的值就是所有头及节表的尺寸总和,当然也是第一个节的文件偏移量了。也就是说符合这个说法。

我经过查MSDN发现这个说法正确,我的理解就是SizeOfHeaders的值就是PE文件第一个“节”的偏移量,注意是真正的节的内容的开始,不是“节表”的开始,可是到了下一节的“Section Table(节表)
”,说法变了,其中一段描述如下:

=============================================
现在我们已知晓 IMAGE_SECTION_HEADER 结构,再来模拟一下 PE装载器的工作吧:
1.读取 IMAGE_FILE_HEADER 的 NumberOfSections域,知道文件的节数目。
2.SizeOfHeaders 域值作为节表的文件偏移量,并以此定位节表。//问题在这句上,第二个说法,怎么又成了节表的偏移量了????不是节的偏移量吗?如果想得到节表的偏移量,必须用一个式子计算:节表的偏移量=SizeOfHeaders的值-(NumberOfSections*单个节表的长度40)//
3.遍历整个结构数组检查各成员值。
4.对于每个结构,我们读取PointerToRawData域值并定位到该文件偏移量。然后再读取SizeOfRawData域值来决定映射内存的字节数。将VirtualAddress域值加上ImageBase域值等于节起始的虚拟地址。然后就准备把节映射进内存,并根据Characteristics域值设置属性。
5.遍历整个数组,直至所有节都已处理完毕。
==============================================

请看上面的第二条所说的,他又说把SizeOfHeaders 域值作为节表的文件偏移量,并以此定位节表。本来这个值是所有节头字节总和,当然根据前面的描述也包括节表在内了,怎么可以用他来定位节表呢。如果想得到节表的偏移量,必须用一个式子计算:节表的偏移量=SizeOfHeaders的值-(NumberOfSections*单个节表的长度40)
后面的例子作者没有使用SizeOfHeaders 定位节表,所以我也无法确定怎么使用这个域。

在原文这一节的最后,更离奇的说法来了,请看:

-----------------------------------------------
遍历节表的步骤:

1.PE文件有效性校验。
2.定位到 PE header 的起始地址。
3.从 file header 的 NumberOfSections域获取节数。
4.通过两种方法定位节表: ImageBase+SizeOfHeaders 或者 PE header的起始地址+ PE header结构大小。 (节表紧随 PE header)。如果不是使用文件映射的方法,可以用SetFilePointer 直接将文件指针定位到节表。节表的文件偏移量存放在 SizeOfHeaders域里。(SizeOfHeaders 是 IMAGE_OPTIONAL_HEADER 的结构成员)
5.处理每个 IMAGE_SECTION_HEADER 结构。
-------------------------------------------------

我持有怀疑态度的是上面的第四点,通过2种方法可以定位节表,但我对ImageBase+SizeOfHeaders表示怀疑,这个地址是内存虚拟地址,怎么能够来定位磁盘文件位置呢?拿着这个地址值能够找到什么呢?去寻址节表吗?根本不可能的。原来文件内的节都被影射进内存去了,当然影射进内存之前就必须定位节表,根据节表的信息把节影射进内存的。现在却用ImageBase+SizeOfHeaders来定位节表,我认为实在荒唐之极!上面原文说的第二种方法是可信的,PE header的起始地址+ PE header结构大小,这些都是用的文件地址,而并非虚拟地址。因为是拿着这些地址去找磁盘文件的相关内容的。

你还可以看到第四点的最后一句话:节表的文件偏移量存放在 SizeOfHeaders域里。这怎么可能成了节表的偏移量了呢?跟第二个说法相同的错误。第一个说法是“节的偏移量”(注意是“节”,不是“节表”)。如果按照这个说法,SizeOfHeaders域里的数值是不包括节表的尺寸的。也就是只有前面2种头的尺寸。可是这跟第一个说法矛盾。通过我查找资料发现第一种说法是正确的,所以后两种说法不正确。

重复一遍:如果想得到“节表”的偏移量,必须用如下公式计算才能够得到:节表的偏移量=所有头的总和-节数*节表长度=SizeOfHeaders的值-(NumberOfSections*单个节表的长度40)

通过我研读上述文章,竟然3处地方对前后描述不一致,刚好3页文章3个说法。我看完这篇资料,我对原文作者的水平发生怀疑。

谨以此文抛砖引玉,希望您多抛点玉过来哟!!本人刚刚接触破解不久,欢迎批评指正!

qduwg  12月1日


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

收藏
免费 7
支持
分享
最新回复 (21)
雪    币: 234
活跃值: (104)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
支持一下!!!
2005-12-2 21:32
0
雪    币: 50161
活跃值: (20645)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
qduwg学习态度很严谨。
这个问题以前没注意过。用LordPE看了几个EXE文件实际的SizeOfHeaders值,其值是第一个区块的偏移地址(磁盘文件中).
2005-12-3 19:39
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
“SizeOfHeaders 所有头+节表的大小,也就等于文件尺寸减去文件中所有节的尺寸。可以以此值作为PE文件第一节的文件偏移量。”
这里SizeOfHeaders的数据是已经对齐过的,并不是精确的"所有头+节表的大小".

PE格式的不严谨也表现在Windows的系统上,
从Win2000的源码也能看出Windows对PE格式的判断并不严格.
对SizeOfHeaders的合法性判断也不精确.
节表的偏移量靠SizeOfHeaders的值来计算是不可行的.
PE基址+SizeOfOptionalHeader才是节表的偏移量.
2005-12-3 22:53
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
5
对你的研究精神表示赞赏,但对你的学习办法不敢恭维。PE文件头只不过是一个普通的数据结构,拿过来用就可以了,需要花时间去学吗?Windows操作系统像这样的结构不下几万个,比这PE结构复杂的多神秘的多的结构有的是,就我个人而言,一天PE结构也没有研究过,每天编程,拿过来使用就完了。我一只不明白就这么一个最普通的数据结构,为什么会有这么多人要去学,照这样下去,那还有几千个几万个更复杂的结构,按学PE文件头的进度和难道去度量,要多少时间?
这个结构出于微软,本来就是最普通的东西,你什么时候想使用了,到微软网站上去查一下,用就是了,需要学吗?有疑问更要到微软去查,以微软的MSDN的定义为准,值得花那么大的精力去研究?要研究,研究点有深度的东西,而不是去研究一个固定不变的数据结构。
下面是微软的权威解释:
DWORD  SizeOfHeaders
The combined size of the MS-DOS header, PE headers, and section table. All of these items will occur before any code or data sections in the PE file. The value of this field is rounded up to a multiple of the file alignment.
看望了微软的定义,你觉得有必要去研究吗?
另外,对于类似的知识和理论,我希望你以后不要再看所谓第三方的专家写的东西,最好看来源的东西。
上面的观点,也是我一贯学习的方法,我一直从事汇编的开发工作,前些日子学了一下Delphi,看来看去,也就是那个F1键,我觉得足够了,一是省事,而是绝不会被误导。
2005-12-4 12:24
0
雪    币: 221
活跃值: (100)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
象这位大哥学习
2005-12-4 23:38
0
雪    币: 475
活跃值: (1130)
能力值: ( LV9,RANK:1410 )
在线值:
发帖
回帖
粉丝
7
感谢你的指教和建议。我只是想借此机会提醒许多人注意一些关键的细小问题,如果按你所

说的方法,等用的时候去看看就行,我认为是不够的。也许你是高手,你可以看看就行,对

于我们这些初学者就算看10遍也恐怕难以理解,因为每个人的知识结构不同,学习背景不同

,所以同样的知识在很多看来是很难理解的。如果没有第三方写的一些文章,我们有时是无法得到一手资料的。

我想请教你几个问题,可执行文件是怎么被映射进内存的,那个PE文件内的各个RVA又是怎么

使用的?我看了一个程序,里面的一个数据目录的RVA比如是F123,而实际文件长度才1000

,到哪里去找那个引入文件呢?怎么把这个地址转换为文件地址呢?
2005-12-5 21:39
0
雪    币: 1334
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
最初由 gzgzlxg 发布
对你的研究精神表示赞赏,但对你的学习办法不敢恭维。PE文件头只不过是一个普通的数据结构,拿过来用就可以了,需要花时间去学吗?Windows操作系统像这样的结构不下几万个,比这PE结构复杂的多神秘的多的结构有的是,就我个人而言,一天PE结构也没有研究过,每天编程,拿过来使用就完了。我一只不明白就这么一个最普通的数据结构,为什么会有这么多人要去学,照这样下去,那还有几千个几万个更复杂的结构,按学PE文件头的进度和难道去度量,要多少时间?
这个结构出于微软,本来就是最普通的东西,你什么时候想使用了,到微软网站上去查一下,用就是了,需要学吗?有疑问更要到微软去查,以微软的MSDN的定义为准,值得花那么大的精力去研究?要研究,研究点有深度的东西,而不是去研究一个固定不变的数据结构。
下面是微软的权威解释:
DWORD SizeOfHeaders
The combined size of the MS-DOS header, PE headers, and section table. All of these items will occur before any code or data sections in the PE file. The value of this field is rounded up to a multiple of the file alignment.
........


学这个只有是为了脱壳和写壳, 不精通这个当你遇到vm类的壳或是SDK的时候,根本无法修复PE文件头, 或许你没遇到,但不要根据你的过往经验否定别人的学习方向, 在逆向分析中汇编语言的地位是排在最末的, 只需要掌握几句就可以了, 对于当今的壳加密流行技术发展, PE和数学算法是最需要细致学习的
2005-12-6 11:43
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
9
最初由 Ivanov 发布


学这个只有是为了脱壳和写壳, 不精通这个当你遇到vm类的壳或是SDK的时候,根本无法修复PE文件头, 或许你没遇到,但不要根据你的过往经验否定别人的学习方向, 在逆向分析中汇编语言的地位是排在最末的, 只需要掌握几句就可以了, 对于当今的壳加密流行技术发展, PE和数学算法是最需要细致学习的

汇编本来按名称就是排在最末的,汇编被称为低级语言,而C被称为中级语言,其他的像非程序员语言,“Basic" 才被称为高级语言。
被称为低级和中级的语言,本来就只有少数人掌握,尤其是那个低级语言。
我不想和你再争论什么,你认为什么最重要就学什么。
过去、现在、也许将来,对加密解密,可能都不会有什么太大的兴趣,不过能用那最低级的语言也是你认为最不重要的语言开发系统级程序的人,如果想去破解什么东西,可能不会遇到你们这样的困难,你信也好,不信也好,那是事实。在我心中,天下无壳,以我对计算机的熟悉和理解,只要我想破,没有破不了得。再多说一句,我除了汇编语言外,没有认真学过第二门比它高级的语言,包括C。我从事系统级和普通应用程序的开发25年,几乎使用过所有流行的语言(用户需要什么语言就使用什么语言)。但在心中唯有汇编。只有汇编才是我唯一学会和理解的语言,其他语言,用的时候翻翻手册,用完后,过一个月你在问我,我完全都忘了。
你可以到各软件网站上去查询,我有没有提过一个问题,凡是和计算机有关的问题都算,再说一句,25年我都没有问过任何人一句关于计算机的问题,这是我第一次破解,或许也是最后一次:
ACProtect 1.41 -- 同益起名大师 v3.36、v3.37、vp3.33(专业版)完美脱壳
http://bbs.pediy.com/showthread.php?s=&threadid=16204

正确获得同益起名大师v337 的注册号??解读 moon 帮主的妙文
http://bbs.pediy.com/showthread.php?s=&threadid=18993
2005-12-6 13:45
0
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
10
gzgzlxg从事开发25年,恐怕这里无人能出其右了。“心中唯有汇编”确是至理名言,
不过不是谁都能做到的。

你的功力、口气都让人联想起梁肇新。
2005-12-6 19:18
0
雪    币: 260
活跃值: (81)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
最初由 softworm 发布
gzgzlxg从事开发25年,恐怕这里无人能出其右了。“心中唯有汇编”确是至理名言,
不过不是谁都能做到的。

你的功力、口气都让人联想起梁肇新。

2005-12-6 19:56
0
雪    币: 234
活跃值: (370)
能力值: ( LV9,RANK:530 )
在线值:
发帖
回帖
粉丝
12
最初由 softworm 发布
gzgzlxg从事开发25年,恐怕这里无人能出其右了。“心中唯有汇编”确是至理名言,
不过不是谁都能做到的。

你的功力、口气都让人联想起梁肇新。

真牛!
2005-12-6 20:27
0
雪    币: 245
活跃值: (195)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
13
最初由 softworm 发布
gzgzlxg从事开发25年,恐怕这里无人能出其右了。“心中唯有汇编”确是至理名言,
不过不是谁都能做到的。

你的功力、口气都让人联想起梁肇新。


真是?,25 年...,?我想起以前 APPLE-II 的 6502 遮言....

0100-A9 05 MOV AX,05

磁?,保罪程式...最早 APPLE 是用磁?,SAVE DATA 的...

那?,MS-DOS ??出?...........
2005-12-6 21:40
0
雪    币: 98803
活跃值: (201054)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
14
是的,APPLE当时都从香港进的。
2005-12-6 21:57
0
雪    币: 1334
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
我也使用汇编写程序,也没有任何贬低汇编语言的意思,我说它排在末位是指在壳这个领域它排在末位;

2005-12-6 22:16
0
雪    币: 671
活跃值: (723)
能力值: ( LV9,RANK:1060 )
在线值:
发帖
回帖
粉丝
16
这里的每个帖子怎么这样长,
2005-12-6 22:19
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
17
最初由 Ivanov 发布

回这个帖子不是为了和你吵架,而是看不惯你的口气;
........

前面我就说过了,我不想和你再争论什么,现在我已经退出这个圈子,回家种红薯去了。这个领域发展是最快的,一旦离开,马上就落伍了,这也没有什么奇怪。说来惭愧,这次脱壳,实在是为了一点小小的误会,否则也不会去脱。
我已经差不多到了知天命的年龄,实在不该再意气用事,而看你的经历,年纪比我也差不了多少了,如果觉得我什么地方得罪了你,我这里道歉。
你和这里的老大认识,你问问这里的老大,从IP地址该知道我大概住在什么地方了。看来我也要和这个论坛说再见了。
这个论坛有许多优秀的人物,你老人家的文言文也玩的不错,另外我也很喜欢Fly,有机会可以喝一起一杯,现在对我来讲,唯有这杯中之物了。
2005-12-6 22:55
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
18
论坛是大家讨论的地方,有讨论就说明意见相左,这很正常,不会冲着谁来的,这是误会,语言语气上的误会而已,大家没必要为此伤了和气,在这个问题上有分歧,在别的帖子上说不定就统一了呢,所以更加没有必要说离开论坛什么的,不至于的.再说相信这里更多的人是希望从经验丰富的前辈们那里学到各个领域的知识,无论是语言, 设计或是系统等,这些对我们这些小菜鸟们可都是求知若渴啊!在我们菜鸟看来,这场讨论其实也让我们长了见识,这更加说明讨论不是坏事, 有讨论才说明人气旺嘛~
2005-12-6 23:07
0
雪    币: 1334
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
呵呵,您又没得罪我,道什么歉, 倒是我无端发难指责,甚是不对,但我想论坛么,就是个论,哈哈

您可比我大10几岁, 我来这里玩发发帖子是因为我闲得难受,我搞的是密码学,密码学文章在这里发不了,只能发些水贴玩,对于破解在我老婆的监管下"戒"了.

说到杯中之物, 我可喜欢了, 因为气候冷,特喜欢喝,酒瓶子就在兜里揣着, 我倒是很想你和你认识, 正好还有一个和你一样大cracker朋友,再拉上fly,明年我来中国一起喝几天, 我的msn是: sphinx677@hotmail.com   Email:  ivanopulo@gmail.com

请你加我,一起聊聊酒和女人
我等待
2005-12-6 23:31
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
20
最初由 Ivanov 发布
请你加我,一起聊聊酒和女人
我等待


MSN:quarktel@hotmail.com
or gzgzlxg@hotmail.com
前面一个使用的多,后面一个使用的少,原因吗,后面一个知道的人太多了。
我住在一个小岛,这里只有我一家是中国人,也只有一家亚洲人,以前不远处有一个日本小姑娘,最近也没有看见了。如有机会,欢迎你前来游玩。可以请你喝小酒,吃野味(自己打的,不过最近一段时间老婆不让杀生,但还有一些存货,如熊掌和鹿肉)。
我和老婆商量,想申请以狩猎为生,政府鼓励这个职业,而且免全部税收,但老婆总以危险为由不同意,以后再磨磨,看能否实现。如果能获得 Hunting game office 的牌照(这个是不免税的,我和一个朋友特别想干这个买卖,因为狩猎是贵族的游戏,收费非常高,如能获取这个牌照,每年从中国弄几个大款,跑几趟深山就够一年生活了,现在你来,我只能带你去狩猎,但你不能动枪,有上面那个牌照,你就可以动我的枪了)。
我加了你的 MSN。
附一张狩猎的照片,老婆手里的是一只 Spruce grouse (松鸡的一种,非常美味)。好像传不上来,以后在msn发给你看。
2005-12-7 01:28
0
雪    币: 475
活跃值: (1130)
能力值: ( LV9,RANK:1410 )
在线值:
发帖
回帖
粉丝
21
gzgzlxg 大侠:

你好!

通过你的口气,看出你是汇编方面的泰斗,经验颇多,希望你把一些经验教训贴出来,让我们这些菜鸟也增加些知识,少走弯路!极快的提高水平!你20多年的开发经验真是一笔财富!为什么不拿出来给大家分享你的财富呢?每个人都希望得到高手的指点!你可能从来没有问过其他人的计算机问题,你实在是聪明!我们非常敬佩!

希望经常指导我们这些菜鸟!

祝你全家幸福!
2005-12-7 14:59
0
雪    币: 260
活跃值: (81)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
最初由 gzgzlxg 发布


MSN:quarktel@hotmail.com
or gzgzlxg@hotmail.com
前面一个使用的多,后面一个使用的少,原因吗,后面一个知道的人太多了。
........

不知道什么时候也能过上这样的日子
2005-12-7 20:37
0
游客
登录 | 注册 方可回帖
返回
//