标题:对PE文件的结构和数据的分析
只看楼主
tigerdown
Rank: 1
等 级:新手上路
帖 子:63
专家分:3
注 册:2017-8-21
结帖率:69.23%
已结贴  问题点数:20 回复次数:4 
对PE文件的结构和数据的分析
如果我们要对PE文件进行修改,就要对它的结构和数据进行分析,另外,这门技术只有用汇编语言才能实现(例如重定位问题), 如有人认为高级语言,如C,VC++,PYTHON等也能的话,请告诉我,并请给大家展示一下。
 当PE文件从硬盘加载到內存的时候,由于文件和内存的对齐粒度不同,而产生了节(模块)的位置偏移。 为了能定位和访问文件中的数据,我们就要对这偏移量进行换算。
 在换算之前,我们弄清几个概念:
(*这里的节和模块是一回事)

 在硬盘上的文件:
Raw的尺寸(SizeOfRawData)一节(模块)的空间大小
Raw的偏移(PointToRawData)一节(模块)在文件中的位置
文件偏移地址(FOA,FileOffsetAddress)一指节内某点离文件开头位置的偏移量

 在內存里:
节区大小(Virtual Size)一节区大小
虚拟地址(Virtail Address)一节和节内点在内存中的偏移位置,这是一个相对映像基址的地址
相对虚拟地址(RNA,Relative Virtual Address)一节中的某位置相对节的基址的地址,请注意,RNA在硬盘和内存里的偏移量是一样的,这是我们进行换算成FOA的一个重要数据
下面我用图1给大家展示一下:


现在我例举HelloWorld这程序,用各种工具来追踪一下它的导入函数MessageBox的入口地址位置。
>>
        .386
        .model flat,stdcall
        option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include        windows.inc
include        user32.inc
includelib    user32.lib
include        kernel32.inc
includelib    kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .data
szCaption    db    'A MessageBox !',0
szText        db    'Hello, World !',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .code
start:
        invoke    MessageBox,NULL,offset szText,offset szCaption,MB_OK
        invoke    ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        end    star

搜索更多相关主题的帖子: 文件 数据 偏移 位置 地址 
2021-05-29 16:51
tigerdown
Rank: 1
等 级:新手上路
帖 子:63
专家分:3
注 册:2017-8-21
得分:0 
用PEinfo程序查看一下它的内部结构



用W32Dasm查看跳转地址,数据结构,MessageBox函数序例号,并根据起始和目标VA计算RNA
Disassembly of File: Hello.exe
Code Offset = 00000400, Code Size = 00000200
Data Offset = 00000800, Data Size = 00000200


Number of Objects = 0003 (dec), Imagebase = 00400000h

   Object01: .text    RVA: 00001000 Offset: 00000400 Size: 00000200 Flags: 60000020
   Object02: .rdata   RVA: 00002000 Offset: 00000600 Size: 00000200 Flags: 40000040
   Object03: .data    RVA: 00003000 Offset: 00000800 Size: 00000200 Flags: C0000040

Import Module 001: USER32.dll
   Import Module 002: KERNEL32.dll

+++++++++++++++++++ IMPORT MODULE DETAILS +++++++++++++++

   Import Module 001: USER32.dll

Addr:0000205C hint(01BB) Name: MessageBoxA

   Import Module 002: KERNEL32.dll

 Addr:00002076 hint(0075) Name: ExitProcess
* Reference To: USER32.MessageBoxA, Ord:01BBh
                                  |
:0040101A FF2508204000            Jmp dword ptr [00402008]


用OllDbg查看函数的真实地址




用FlexHex查看文件偏移



最后用这图来总结一下


2021-05-29 17:14
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:337
专家分:2462
注 册:2016-5-15
得分:20 
除非是自己搞操作系统(载入程式),或者写个病毒什么的(修改程式入口),才会关心PE的结构.
当然不排除也有像楼主一样不为什么只为兴趣的..

想了一下,也有其他原因,比如EXE加売(或压缩)或解売,PE各种细節是必须了解的,但不同操作系统有不同程式档头,32BIT/64BIT也不一样,甚至晚近的UEFI也是一个小型操作系统,EFI程式结构也不同.....

真是学无止境....
2021-05-30 06:13
tigerdown
Rank: 1
等 级:新手上路
帖 子:63
专家分:3
注 册:2017-8-21
得分:0 
回复 3楼 Valenciax
主要是对一些奇怪现象出现的研究,确实, 不同系统它们的结构不尽相同, 另外,软件本身也采用了各种手段对其进行屏蔽,所以这是一门复杂而又艰难的学科。
2021-05-30 13:51
tigerdown
Rank: 1
等 级:新手上路
帖 子:63
专家分:3
注 册:2017-8-21
得分:0 
为了严谨起见,暂且把01BB称做hint,因为它的中文名有点混乱,没有统一标准。
2021-05-31 15:51



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-505878-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.073543 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved