?? _processpefile.asm
字號(hào):
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Resource例子的 PE文件處理模塊
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.const
szMsg db '文件名: %s',0dh,0ah
db '------------------------------------------------',0dh,0ah
db '資源所處的節(jié):%s',0dh,0ah,0
szErrNoRes db '這個(gè)文件中沒(méi)有包含資源!',0
szLevel1 db 0dh,0ah
db '------------------------------------------------',0dh,0ah
db '資源類型:%s',0dh,0ah
db '------------------------------------------------',0dh,0ah,0
szLevel1byID db '%d (自定義編號(hào))',0
szLevel2byID db ' ID: %d',0dh,0ah,0
szLevel2byName db ' Name: %s',0dh,0ah,0
szResData db ' 文件偏移:%08X (代碼頁(yè)=%04X, 長(zhǎng)度%d字節(jié))',0dh,0ah,0
szType db '光標(biāo) ',0 ;1
db '位圖 ',0 ;2
db '圖標(biāo) ',0 ;3
db '菜單 ',0 ;4
db '對(duì)話框 ',0 ;5
db '字符串 ',0 ;6
db '字體目錄 ',0 ;7
db '字體 ',0 ;8
db '加速鍵 ',0 ;9
db '未格式化資源',0 ;10
db '消息表 ',0 ;11
db '光標(biāo)組 ',0 ;12
db '未知類型 ',0 ;13
db '圖標(biāo)組 ',0 ;14
db '未知類型 ',0 ;15
db '版本信息 ',0 ;16
.code
include _RvaToFileOffset.asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcessRes proc _lpFile,_lpRes,_lpResDir,_dwLevel
local @dwNextLevel,@szBuffer[1024]:byte
local @szResName[256]:byte
pushad
mov eax,_dwLevel
inc eax
mov @dwNextLevel,eax
;********************************************************************
; 檢查資源目錄表,得到資源目錄項(xiàng)的數(shù)量
;********************************************************************
mov esi,_lpResDir
assume esi:ptr IMAGE_RESOURCE_DIRECTORY
mov cx,[esi].NumberOfNamedEntries
add cx,[esi].NumberOfIdEntries
movzx ecx,cx
add esi,sizeof IMAGE_RESOURCE_DIRECTORY
assume esi:ptr IMAGE_RESOURCE_DIRECTORY_ENTRY
;********************************************************************
; 循環(huán)處理每個(gè)資源目錄項(xiàng)
;********************************************************************
.while ecx > 0
push ecx
mov ebx,[esi].OffsetToData
.if ebx & 80000000h
and ebx,7fffffffh
add ebx,_lpRes
.if _dwLevel == 1
;********************************************************************
; 第一層:資源類型
;********************************************************************
mov eax,[esi].Name1
.if eax & 80000000h
and eax,7fffffffh
add eax,_lpRes
movzx ecx,word ptr [eax] ;IMAGE_RESOURCE_DIR_STRING_U結(jié)構(gòu)
add eax,2
mov edx,eax
invoke WideCharToMultiByte,CP_ACP,WC_COMPOSITECHECK,\
edx,ecx,addr @szResName,sizeof @szResName,\
NULL,NULL
lea eax,@szResName
.else
.if eax <= 10h
dec eax
mov ecx,sizeof szType
mul ecx
add eax,offset szType
.else
invoke wsprintf,addr @szResName,addr szLevel1byID,eax
lea eax,@szResName
.endif
.endif
invoke wsprintf,addr @szBuffer,addr szLevel1,eax
;********************************************************************
; 第二層:資源ID(或名稱)
;********************************************************************
.elseif _dwLevel == 2
mov edx,[esi].Name1
.if edx & 80000000h
;********************************************************************
; 資源以字符串方式命名
;********************************************************************
and edx,7fffffffh
add edx,_lpRes ;IMAGE_RESOURCE_DIR_STRING_U結(jié)構(gòu)
movzx ecx,word ptr [edx]
add edx,2
invoke WideCharToMultiByte,CP_ACP,WC_COMPOSITECHECK,\
edx,ecx,addr @szResName,sizeof @szResName,\
NULL,NULL
invoke wsprintf,addr @szBuffer,\
addr szLevel2byName,addr @szResName
.else
;********************************************************************
; 資源以 ID 命名
;********************************************************************
invoke wsprintf,addr @szBuffer,\
addr szLevel2byID,edx
.endif
.else
.break
.endif
invoke _AppendInfo,addr @szBuffer
invoke _ProcessRes,_lpFile,_lpRes,ebx,@dwNextLevel
;********************************************************************
; 不是資源目錄則顯示資源詳細(xì)信息
;********************************************************************
.else
add ebx,_lpRes
mov ecx,[esi].Name1 ;代碼頁(yè)
assume ebx:ptr IMAGE_RESOURCE_DATA_ENTRY
mov eax,[ebx].OffsetToData
invoke _RVAToOffset,_lpFile,eax
invoke wsprintf,addr @szBuffer,addr szResData,\
eax,ecx,[ebx].Size1
invoke _AppendInfo,addr @szBuffer
.endif
add esi,sizeof IMAGE_RESOURCE_DIRECTORY_ENTRY
pop ecx
dec ecx
.endw
_Ret:
assume esi:nothing
assume ebx:nothing
popad
ret
_ProcessRes endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcessPeFile proc _lpFile,_lpPeHead,_dwSize
local @szBuffer[1024]:byte,@szSectionName[16]:byte
pushad
mov esi,_lpPeHead
assume esi:ptr IMAGE_NT_HEADERS
;********************************************************************
; 檢測(cè)是否存在資源
;********************************************************************
mov eax,[esi].OptionalHeader.DataDirectory[8*2].VirtualAddress
.if ! eax
invoke MessageBox,hWinMain,addr szErrNoRes,NULL,MB_OK
jmp _Ret
.endif
push eax
invoke _RVAToOffset,_lpFile,eax
add eax,_lpFile
mov esi,eax
pop eax
invoke _GetRVASection,_lpFile,eax
invoke wsprintf,addr @szBuffer,addr szMsg,addr szFileName,eax
invoke SetWindowText,hWinEdit,addr @szBuffer
invoke _ProcessRes,_lpFile,esi,esi,1
_Ret:
assume esi:nothing
popad
ret
_ProcessPeFile endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -