PE文件格式--------------导出表
2012-05-03 11:22
323 查看
一、导出表位置
在数据目录的的第0项,即IMAGE_NT_HEADERS.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]项
二、导出表结构
IMAGE_EXPORT_DESCRIPTRO struc
+00h Characteristics dd
+04h TimeDateStamp dd
+08h MajorVersion dw
+0ah MinorVersion dw
+0ch nName dd ;RVA指向编译时的模块名
+10h nBase dd ;起始序号
+14h NumberOfFunctions dd ;导出函数总数
+18h NumberOfNames dd ;已名字导出的函数数量
+1ch AddressOfFunctions dd ;RVA指向导出函数地址列表
+20h AddressOfNames dd ;RVA指向函数名称地址列表,注意该列表项是指向函数名称的RVA
+24h AddressOfNameOrdinal dd ;RVA指向序号列表,列表项为word型,是联系函数名称与函数地址的桥梁
IMAGE_EXPORT_DESCRIPTOR ends
三、加载器加载过程
1、根据名称查找函数地址
(1)定位导出模块的IMAGE_EXPORT_DESCRIPTOR
(2)以NumberOfNames为循环次数,循环比较AddressOfNames指向的地址项所对应的函数名字符串,如果没找到匹配的名称字符串,则找不到所对应的函数。
(3)如果找到匹配的函数名字符串,则以此为索引号,取出AddressOfNameOrdinal所指向的序号。
(4)取出的序号-nBase=函数地址索引号
(5)以此为索引号,取出AddressOfFunctions指向的函数地址。
2、根据序号查找函数地址
(1)定位导出模块的IMAGE_EXPORT_DESCRIPTOR
(2)序号-nBase=函数地址索引号
(3)以此为索引号,取出AddressOfFunctions指向的函数地址。
四、示例
processpefile_export.asm
;======================
;pe文件导出表
;by 紫陌
;======================
;======================
;数据段
;======================
.const
szExportTable db '导出表IMAGE_EXPORT_DIRECTORY(%08X)', 0dh, 0ah
db 'nName (%08X):%s', 0dh, 0ah
db 'nBase (%08X):%08X', 0dh, 0ah
db 'NumberOfFunctions (%08X):%08X', 0dh, 0ah
db 'NumberOfNames (%08X):%08X', 0dh, 0ah
db 'AddressOfFunction (%08X):%08X', 0dh, 0ah
db 'AddressOfNames (%08X):%08X', 0dh, 0ah
db 'AddressOfNameOrdinal (%08X):%08X', 0dh, 0ah, 0
szTitleAddressOfFunctions db '=========AddressOfFunctions=========', 0dh, 0ah, 0
szAddressOfFunctions db '(索引号%04X)(%08X):%08X', 0dh, 0ah, 0
szTitleAddressOfNames db '=========AddressOfNames=========', 0dh, 0ah, 0
szAddressOfNames db '(索引号%04X)(%08X):%08X->%s', 0dh, 0ah, 0
szTitleAddressOfNameOrdinal db '=========AddressOfNameOrdinal=========', 0dh, 0ah, 0
szAddressOfNameOrdinal db '(索引号%04X)(%08X):%04X', 0dh, 0ah, 0
;======================
;代码段
;======================
.code
_ProcessPeFile_Export proc _lpImageBase
local @szBuf[400h]:BYTE
local @nName
local @NumberOfFunctions
local @NumberOfNames
local @nIndex
local @nIndexOfAddress
pushad
mov edi, _lpImageBase
assume edi:ptr IMAGE_DOS_HEADER
add edi, [edi].e_lfanew
assume edi:ptr IMAGE_NT_HEADERS
mov eax, [edi].OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT * sizeof IMAGE_DATA_DIRECTORY].VirtualAddress
.if !eax
jmp _overpos
.endif
invoke _RvaToOffset, _lpImageBase, eax
mov edi, eax
add edi, _lpImageBase
assume edi:ptr IMAGE_EXPORT_DIRECTORY
;************************
;导出表IMAGE_EXPORT_DIRECTORY
;************************
invoke _RvaToOffset, _lpImageBase, [edi].nName
add eax, _lpImageBase
mov @nName, eax
invoke wsprintf, addr @szBuf, addr szExportTable, \
edi, \
addr [edi].nName, @nName, \
addr [edi].nBase, [edi].nBase, \
addr [edi].NumberOfFunctions, [edi].NumberOfFunctions, \
addr [edi].NumberOfNames, [edi].NumberOfNames, \
addr [edi].AddressOfFunctions, [edi].AddressOfFunctions, \
addr [edi].AddressOfNames, [edi].AddressOfNames, \
addr [edi].AddressOfNameOrdinals, [edi].AddressOfNameOrdinals
invoke lstrcpy, addr szShowMsg, addr @szBuf
invoke SetWindowText, hRichEdit, addr szShowMsg
;***********************
;导出函数地址表
;***********************
invoke lstrcat, addr szShowMsg, addr szTitleAddressOfFunctions
mov ecx, [edi].AddressOfFunctions
invoke _RvaToOffset, _lpImageBase, ecx
add eax, _lpImageBase
mov esi, eax
mov ecx, [edi].NumberOfFunctions
mov @NumberOfFunctions, ecx
xor eax, eax
mov @nIndex, eax
.while ecx
mov @NumberOfFunctions, ecx
invoke wsprintf, addr @szBuf, addr szAddressOfFunctions, \
@nIndex, \
esi, \
DWORD ptr [esi]
invoke lstrcat, addr szShowMsg, addr @szBuf
mov ecx, @nIndex
inc ecx
mov @nIndex, ecx
mov ecx, @NumberOfFunctions
dec ecx
add esi, 4
.endw
invoke SetWindowText, hRichEdit, addr szShowMsg
;**************************
;导出函数名称
;**************************
invoke lstrcat, addr szShowMsg, addr szTitleAddressOfNames
mov ecx, [edi].AddressOfNames
invoke _RvaToOffset, _lpImageBase, ecx
add eax, _lpImageBase
mov esi, eax
mov ecx, [edi].NumberOfNames
mov @NumberOfNames, ecx
xor eax, eax
mov @nIndex, eax
.while ecx
mov @NumberOfNames, ecx
mov ecx, [esi]
invoke _RvaToOffset, _lpImageBase, ecx
add eax, _lpImageBase
invoke wsprintf, addr @szBuf, addr szAddressOfNames, \
@nIndex, \
esi, \
DWORD ptr [esi], \
eax
invoke lstrcat, addr szShowMsg, addr @szBuf
mov ecx, @nIndex
inc ecx
mov @nIndex, ecx
mov ecx, @NumberOfNames
dec ecx
add esi, 4
.endw
invoke SetWindowText, hRichEdit, addr szShowMsg
;**************************
;导出函数名称地址索引表
;**************************
invoke lstrcat, addr szShowMsg, addr szTitleAddressOfNameOrdinal
mov ecx, [edi].AddressOfNameOrdinals
invoke _RvaToOffset, _lpImageBase, ecx
add eax, _lpImageBase
mov esi, eax
mov ecx, [edi].NumberOfNames
mov @NumberOfNames, ecx
xor eax, eax
mov @nIndex, eax
.while ecx
mov @NumberOfNames, ecx
movzx ecx, WORD ptr [esi]
mov @nIndexOfAddress, ecx
invoke wsprintf, addr @szBuf, addr szAddressOfNameOrdinal, \
@nIndex, \
esi, \
@nIndexOfAddress
invoke lstrcat, addr szShowMsg, addr @szBuf
mov ecx, @nIndex
inc ecx
mov @nIndex, ecx
mov ecx, @NumberOfNames
dec ecx
add esi, 4
.endw
invoke SetWindowText, hRichEdit, addr szShowMsg
_overpos:
assume edi:nothing
popad
ret
_ProcessPeFile_Export endp
在数据目录的的第0项,即IMAGE_NT_HEADERS.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]项
二、导出表结构
IMAGE_EXPORT_DESCRIPTRO struc
+00h Characteristics dd
+04h TimeDateStamp dd
+08h MajorVersion dw
+0ah MinorVersion dw
+0ch nName dd ;RVA指向编译时的模块名
+10h nBase dd ;起始序号
+14h NumberOfFunctions dd ;导出函数总数
+18h NumberOfNames dd ;已名字导出的函数数量
+1ch AddressOfFunctions dd ;RVA指向导出函数地址列表
+20h AddressOfNames dd ;RVA指向函数名称地址列表,注意该列表项是指向函数名称的RVA
+24h AddressOfNameOrdinal dd ;RVA指向序号列表,列表项为word型,是联系函数名称与函数地址的桥梁
IMAGE_EXPORT_DESCRIPTOR ends
三、加载器加载过程
1、根据名称查找函数地址
(1)定位导出模块的IMAGE_EXPORT_DESCRIPTOR
(2)以NumberOfNames为循环次数,循环比较AddressOfNames指向的地址项所对应的函数名字符串,如果没找到匹配的名称字符串,则找不到所对应的函数。
(3)如果找到匹配的函数名字符串,则以此为索引号,取出AddressOfNameOrdinal所指向的序号。
(4)取出的序号-nBase=函数地址索引号
(5)以此为索引号,取出AddressOfFunctions指向的函数地址。
2、根据序号查找函数地址
(1)定位导出模块的IMAGE_EXPORT_DESCRIPTOR
(2)序号-nBase=函数地址索引号
(3)以此为索引号,取出AddressOfFunctions指向的函数地址。
四、示例
processpefile_export.asm
;======================
;pe文件导出表
;by 紫陌
;======================
;======================
;数据段
;======================
.const
szExportTable db '导出表IMAGE_EXPORT_DIRECTORY(%08X)', 0dh, 0ah
db 'nName (%08X):%s', 0dh, 0ah
db 'nBase (%08X):%08X', 0dh, 0ah
db 'NumberOfFunctions (%08X):%08X', 0dh, 0ah
db 'NumberOfNames (%08X):%08X', 0dh, 0ah
db 'AddressOfFunction (%08X):%08X', 0dh, 0ah
db 'AddressOfNames (%08X):%08X', 0dh, 0ah
db 'AddressOfNameOrdinal (%08X):%08X', 0dh, 0ah, 0
szTitleAddressOfFunctions db '=========AddressOfFunctions=========', 0dh, 0ah, 0
szAddressOfFunctions db '(索引号%04X)(%08X):%08X', 0dh, 0ah, 0
szTitleAddressOfNames db '=========AddressOfNames=========', 0dh, 0ah, 0
szAddressOfNames db '(索引号%04X)(%08X):%08X->%s', 0dh, 0ah, 0
szTitleAddressOfNameOrdinal db '=========AddressOfNameOrdinal=========', 0dh, 0ah, 0
szAddressOfNameOrdinal db '(索引号%04X)(%08X):%04X', 0dh, 0ah, 0
;======================
;代码段
;======================
.code
_ProcessPeFile_Export proc _lpImageBase
local @szBuf[400h]:BYTE
local @nName
local @NumberOfFunctions
local @NumberOfNames
local @nIndex
local @nIndexOfAddress
pushad
mov edi, _lpImageBase
assume edi:ptr IMAGE_DOS_HEADER
add edi, [edi].e_lfanew
assume edi:ptr IMAGE_NT_HEADERS
mov eax, [edi].OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT * sizeof IMAGE_DATA_DIRECTORY].VirtualAddress
.if !eax
jmp _overpos
.endif
invoke _RvaToOffset, _lpImageBase, eax
mov edi, eax
add edi, _lpImageBase
assume edi:ptr IMAGE_EXPORT_DIRECTORY
;************************
;导出表IMAGE_EXPORT_DIRECTORY
;************************
invoke _RvaToOffset, _lpImageBase, [edi].nName
add eax, _lpImageBase
mov @nName, eax
invoke wsprintf, addr @szBuf, addr szExportTable, \
edi, \
addr [edi].nName, @nName, \
addr [edi].nBase, [edi].nBase, \
addr [edi].NumberOfFunctions, [edi].NumberOfFunctions, \
addr [edi].NumberOfNames, [edi].NumberOfNames, \
addr [edi].AddressOfFunctions, [edi].AddressOfFunctions, \
addr [edi].AddressOfNames, [edi].AddressOfNames, \
addr [edi].AddressOfNameOrdinals, [edi].AddressOfNameOrdinals
invoke lstrcpy, addr szShowMsg, addr @szBuf
invoke SetWindowText, hRichEdit, addr szShowMsg
;***********************
;导出函数地址表
;***********************
invoke lstrcat, addr szShowMsg, addr szTitleAddressOfFunctions
mov ecx, [edi].AddressOfFunctions
invoke _RvaToOffset, _lpImageBase, ecx
add eax, _lpImageBase
mov esi, eax
mov ecx, [edi].NumberOfFunctions
mov @NumberOfFunctions, ecx
xor eax, eax
mov @nIndex, eax
.while ecx
mov @NumberOfFunctions, ecx
invoke wsprintf, addr @szBuf, addr szAddressOfFunctions, \
@nIndex, \
esi, \
DWORD ptr [esi]
invoke lstrcat, addr szShowMsg, addr @szBuf
mov ecx, @nIndex
inc ecx
mov @nIndex, ecx
mov ecx, @NumberOfFunctions
dec ecx
add esi, 4
.endw
invoke SetWindowText, hRichEdit, addr szShowMsg
;**************************
;导出函数名称
;**************************
invoke lstrcat, addr szShowMsg, addr szTitleAddressOfNames
mov ecx, [edi].AddressOfNames
invoke _RvaToOffset, _lpImageBase, ecx
add eax, _lpImageBase
mov esi, eax
mov ecx, [edi].NumberOfNames
mov @NumberOfNames, ecx
xor eax, eax
mov @nIndex, eax
.while ecx
mov @NumberOfNames, ecx
mov ecx, [esi]
invoke _RvaToOffset, _lpImageBase, ecx
add eax, _lpImageBase
invoke wsprintf, addr @szBuf, addr szAddressOfNames, \
@nIndex, \
esi, \
DWORD ptr [esi], \
eax
invoke lstrcat, addr szShowMsg, addr @szBuf
mov ecx, @nIndex
inc ecx
mov @nIndex, ecx
mov ecx, @NumberOfNames
dec ecx
add esi, 4
.endw
invoke SetWindowText, hRichEdit, addr szShowMsg
;**************************
;导出函数名称地址索引表
;**************************
invoke lstrcat, addr szShowMsg, addr szTitleAddressOfNameOrdinal
mov ecx, [edi].AddressOfNameOrdinals
invoke _RvaToOffset, _lpImageBase, ecx
add eax, _lpImageBase
mov esi, eax
mov ecx, [edi].NumberOfNames
mov @NumberOfNames, ecx
xor eax, eax
mov @nIndex, eax
.while ecx
mov @NumberOfNames, ecx
movzx ecx, WORD ptr [esi]
mov @nIndexOfAddress, ecx
invoke wsprintf, addr @szBuf, addr szAddressOfNameOrdinal, \
@nIndex, \
esi, \
@nIndexOfAddress
invoke lstrcat, addr szShowMsg, addr @szBuf
mov ecx, @nIndex
inc ecx
mov @nIndex, ecx
mov ecx, @NumberOfNames
dec ecx
add esi, 4
.endw
invoke SetWindowText, hRichEdit, addr szShowMsg
_overpos:
assume edi:nothing
popad
ret
_ProcessPeFile_Export endp
相关文章推荐
- PE文件和COFF文件格式分析——导出表的应用——一种摘掉Inline钩子(Unhook)的方法
- PE文件和COFF文件格式分析——导出表
- PE文件和COFF文件格式分析——导出表的应用——一种插件模型
- PE文件和COFF文件格式分析——导出表的应用——通过导出表隐性加载DLL
- 流水账笔记:PE文件格式(导出表)
- 根据PE文件格式获取LoadLibraryA()/GetProcAddress()地址
- 深入解析PE文件结构之导出表获取
- 破解软件感悟-PE文件格式之实例总结(五)
- 查看PE文件导出表
- 通过PHPExcel导出Excel文件时,出现“格式与文件扩展名格式不一致”错误!
- PE可执行文件格式
- ALV 导出电子表格的文件格式…
- 破解软件感悟-PE文件格式之实例总结(五)
- 利用pig导出hbase文件为txt或者csv格式
- 支持导出PDF文件并转换成图片格式的PDF查看控件Spire.PDFViewer
- java导出json格式文件
- 字符串常量也能在程序运行后修改 通过修改PE文件格式 跳过其属性,改成可读写属性
- PE文件格式详解,第三讲,可选头文件格式,以及节表 PE文件格式详解,第三讲,可选头文件格式,以及节表
- C#导出到word文件,定位和字体控制和格式
- PE文件格式详解