?? _processpefile.asm
字號:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Export例子的 PE文件處理模塊
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.const
szMsg db '文件名: %s',0dh,0ah
db '------------------------------------------------',0dh,0ah
db '導(dǎo)出表所處的節(jié):%s',0dh,0ah
db '------------------------------------------------',0dh,0ah
db '原始文件名 %s',0dh,0ah
db 'nBase %08X',0dh,0ah
db 'NumberOfFunctions %08X',0dh,0ah
db 'NumberOfNames %08X',0dh,0ah
db 'AddressOfFunctions %08X',0dh,0ah
db 'AddressOfNames %08X',0dh,0ah
db 'AddressOfNameOrd %08X',0dh,0ah
db '------------------------------------------------',0dh,0ah
db '導(dǎo)出序號 虛擬地址 導(dǎo)出函數(shù)名稱',0dh,0ah
db '------------------------------------------------',0dh,0ah,0
szMsgName db '%08X %08X %s',0dh,0ah,0
szExportByOrd db '(按照序號導(dǎo)出)',0
szErrNoExport db '這個文件中沒有導(dǎo)出函數(shù)!',0
.code
include _RvaToFileOffset.asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcessPeFile proc _lpFile,_lpPeHead,_dwSize
local @szBuffer[1024]:byte,@szSectionName[16]:byte
local @dwIndex,@lpAddressOfNames,@lpAddressOfNameOrdinals
pushad
mov esi,_lpPeHead
assume esi:ptr IMAGE_NT_HEADERS
;********************************************************************
; 從數(shù)據(jù)目錄中獲取導(dǎo)出表的位置
;********************************************************************
mov eax,[esi].OptionalHeader.DataDirectory.VirtualAddress
.if ! eax
invoke MessageBox,hWinMain,addr szErrNoExport,NULL,MB_OK
jmp _Ret
.endif
invoke _RVAToOffset,_lpFile,eax
add eax,_lpFile
mov edi,eax
;********************************************************************
; 顯示一些常用的信息
;********************************************************************
assume edi:ptr IMAGE_EXPORT_DIRECTORY
invoke _RVAToOffset,_lpFile,[edi].nName
add eax,_lpFile
mov ecx,eax
invoke _GetRVASection,_lpFile,[edi].nName
invoke wsprintf,addr @szBuffer,addr szMsg,addr szFileName,eax,ecx,[edi].nBase,\
[edi].NumberOfFunctions,[edi].NumberOfNames,[edi].AddressOfFunctions,\
[edi].AddressOfNames,[edi].AddressOfNameOrdinals
invoke SetWindowText,hWinEdit,addr @szBuffer
;********************************************************************
invoke _RVAToOffset,_lpFile,[edi].AddressOfNames
add eax,_lpFile
mov @lpAddressOfNames,eax
invoke _RVAToOffset,_lpFile,[edi].AddressOfNameOrdinals
add eax,_lpFile
mov @lpAddressOfNameOrdinals,eax
invoke _RVAToOffset,_lpFile,[edi].AddressOfFunctions
add eax,_lpFile
mov esi,eax ;esi --> 函數(shù)地址表
;********************************************************************
; 循環(huán)顯示導(dǎo)出函數(shù)的信息
;********************************************************************
mov ecx,[edi].NumberOfFunctions
mov @dwIndex,0
@@:
pushad
;********************************************************************
; 在按名稱導(dǎo)出的索引表中
;********************************************************************
mov eax,@dwIndex
push edi
mov ecx,[edi].NumberOfNames
cld
mov edi,@lpAddressOfNameOrdinals
repnz scasw
.if ZERO? ;找到函數(shù)名稱
sub edi,@lpAddressOfNameOrdinals
sub edi,2
shl edi,1
add edi,@lpAddressOfNames
invoke _RVAToOffset,_lpFile,dword ptr [edi]
add eax,_lpFile
.else
mov eax,offset szExportByOrd
.endif
pop edi
;********************************************************************
; 序號 --> ecx
;********************************************************************
mov ecx,@dwIndex
add ecx,[edi].nBase
invoke wsprintf,addr @szBuffer,addr szMsgName,\
ecx,dword ptr [esi],eax
invoke _AppendInfo,addr @szBuffer
popad
add esi,4
inc @dwIndex
loop @B
_Ret:
assume esi:nothing
assume edi:nothing
popad
ret
_ProcessPeFile endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -