注册 登录
编程论坛 汇编论坛

对PE文件的结构和数据的分析

tigerdown 发布于 2021-05-29 16:51, 7277 次点击
如果我们要对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

4 回复
#2
tigerdown2021-05-29 17:14
用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查看文件偏移

只有本站会员才能查看附件,请 登录


最后用这图来总结一下

只有本站会员才能查看附件,请 登录

#3
Valenciax2021-05-30 06:13
除非是自己搞操作系统(载入程式),或者写个病毒什么的(修改程式入口),才会关心PE的结构.
当然不排除也有像楼主一样不为什么只为兴趣的..

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

真是学无止境....
#4
tigerdown2021-05-30 13:51
回复 3楼 Valenciax
主要是对一些奇怪现象出现的研究,确实, 不同系统它们的结构不尽相同, 另外,软件本身也采用了各种手段对其进行屏蔽,所以这是一门复杂而又艰难的学科。
#5
tigerdown2021-05-31 15:51
为了严谨起见,暂且把01BB称做hint,因为它的中文名有点混乱,没有统一标准。
1