用8086汇编语言编写一个程序,展示PE文件的各个结构体相关的数据;输入输出
时间: 2024-02-25 22:52:42 浏览: 29
8086汇编语言编程软件
好的,以下是一个展示PE文件结构体相关数据的汇编程序:
```
; 段定义
.386
.model flat, stdcall
option casemap:none
; 宏定义
%define IMAGE_DOS_SIGNATURE 0x5A4D
%define IMAGE_NT_SIGNATURE 0x00004550
%define IMAGE_FILE_MACHINE_I386 0x014c
%define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b
%define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
; 数据段
.data
filename db "test.exe", 0
handle dd ?
; 代码段
.code
main proc
; 打开文件
invoke CreateFile, addr filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL
mov handle, eax
cmp handle, INVALID_HANDLE_VALUE
je error
; 读取DOS头
mov eax, handle
add eax, IMAGE_DOS_SIGNATURE
movzx edx, word ptr [eax]
cmp edx, IMAGE_DOS_SIGNATURE
jne error
movzx edx, word ptr [eax+60h]
add eax, edx
movzx edx, word ptr [eax]
cmp edx, IMAGE_NT_SIGNATURE
jne error
; 读取NT头
add eax, 4
movzx edx, word ptr [eax]
cmp edx, IMAGE_FILE_MACHINE_I386
jne error
add eax, 2
movzx edx, word ptr [eax]
cmp edx, IMAGE_NT_OPTIONAL_HDR32_MAGIC
jne error
add eax, 2
movzx edx, word ptr [eax]
add eax, 28h
movzx edx, word ptr [eax]
add eax, edx
add eax, 10h
movzx edx, word ptr [eax]
mov ecx, IMAGE_NUMBEROF_DIRECTORY_ENTRIES
mov edi, eax
add edi, 8
.loop:
movzx ebx, word ptr [edi]
add edi, 8
push ebx
movzx ebx, word ptr [edi]
add edi, 4
push ebx
call print_directory
add esp, 8
loop .loop
; 关闭文件
invoke CloseHandle, handle
jmp exit
error:
; 错误处理
invoke GetLastError
push eax
invoke FormatMessage, FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM, NULL, eax, 0, addr lpBuffer, 0, NULL
invoke MessageBox, NULL, lpBuffer, NULL, MB_OK
jmp exit
exit:
; 退出程序
invoke ExitProcess, 0
main endp
print_directory proc directory, data
; 显示数据
push ebx
push ecx
push edx
push esi
push edi
movzx ebx, word ptr [directory]
invoke StdOut, addr directory_name[ebx*4], 13, 10
mov esi, data
movzx ecx, word ptr [esi+4]
invoke StdOut, addr dword_format, ecx
movzx ecx, word ptr [esi]
mov edx, dword ptr [esi+8]
invoke StdOut, addr dword_format, ecx
invoke StdOut, addr dword_format, edx
pop edi
pop esi
pop edx
pop ecx
pop ebx
ret
print_directory endp
; 相关数据定义
directory_name dd "EXPORT", "IMPORT", "RESOURCE", "EXCEPTION", "SECURITY", "BASERELOC", "DEBUG", "COPYRIGHT", "GLOBALPTR", "TLS", "LOAD_CONFIG", "BOUND_IMPORT", "IAT", "DELAY_IMPORT", "COM_DESCRIPTOR", "RESERVED"
dword_format db "%08X", 0
```
这个程序使用了WinAPI函数来打开文件和显示信息,首先读取DOS头,然后读取NT头,最后循环读取PE文件的各个目录数据并显示。注意,这个程序只适用于32位的PE文件。
输入文件名为test.exe,输出为各个目录的数据。
阅读全文