知识点:
01 PE结构中IMAGE_DATA_DIRECTORY 的详细解析步骤
[地址(RAW)范围:0x00000170 - 0x000001ef] [长度:80h] [数据目录表(16项,每个成员占8字节).]
[成员] [数据:RVA] [大小] [说明] [结构]
Export Table: 0x00000000 0x00000000 [ 导出表 ] [IMAGE_DIRECTORY_ENTRY_EXPORT]
Import Table: 0x00009D2C 0x000000B4 [ 导入表 ] [IMAGE_DIRECTORY_ENTRY_IMPORT]
Resources Table: 0x0000C000 0x00051070 [ 资源 ] [IMAGE_DIRECTORY_ENTRY_RESOURCE]
Exception Table: 0x00000000 0x00000000 [ 异常 ] [IMAGE_DIRECTORY_ENTRY_EXCEPTION]
Security Table: 0x00000000 0x00000000 [安全证书] [IMAGE_DIRECTORY_ENTRY_SECURITY]
Base relocation Table: 0x0005E000 0x000008E4 [重定位表] [IMAGE_DIRECTORY_ENTRY_BASERELOC]
Debug: 0x000091E0 0x0000001C [调试信息] [IMAGE_DIRECTORY_ENTRY_DEBUG]
Architecture(Copyrught): 0x00000000 0x00000000 [版权所有] [IMAGE_DIRECTORY_ENTRY_ARCHITECTURE(IMAGE_DIRECTORY_ENTRY_COPYRIGHT)]
Global Ptr: 0x00000000 0x00000000 [全局指针] [IMAGE_DIRECTORY_ENTRY_GLOBALPTR]
Tread local storage(TLS): 0x00000000 0x00000000 [ TLS 表 ] [IMAGE_DIRECTORY_ENTRY_TLS]
Load configuration: 0x00009840 0x00000040 [加载配置] [IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG]
Bound Import: 0x00000000 0x00000000 [绑定导入] [IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT]
Import Address Table(IAT): 0x00009000 0x000001C4 [ IAT 表 ] [IMAGE_DIRECTORY_ENTRY_IAT]
Delay Import: 0x00000000 0x00000000 [延迟导入] [IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT]
COM descriptor: 0x00000000 0x00000000 [ COM ] [IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR]
保留: 0x00000000 0x00000000 [ 保留 ] [NULL]
02 编辑框的SendMessage
结果展示
详细实现代码(半夜 写的 眼睛都快花掉了..)
//初始化目录表信息
VOID SetDirectoryInfo(HWND hwndDlg,LPSTR lpszFile)
{
LPVOID pFileBuffer = NULL;
pFileBuffer= ReadPEFile(lpszFile);
if(!pFileBuffer)
{
//printf("文件读取失败\n");
MessageBox(0,TEXT("文件读取失败"),TEXT("读取文件错误"),0);
return;
}
PIMAGE_DOS_HEADER pDosHeader = NULL;
PIMAGE_NT_HEADERS pNTHeader = NULL;
PIMAGE_FILE_HEADER pPEHeader = NULL;
PIMAGE_OPTIONAL_HEADER32 pOptionHeader = NULL;
PIMAGE_SECTION_HEADER pSectionHeader = NULL;
PIMAGE_DATA_DIRECTORY DataDirectory=NULL;
//Header信息
pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer;
pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)pFileBuffer+pDosHeader->e_lfanew);
pPEHeader = (PIMAGE_FILE_HEADER)(((DWORD)pNTHeader)+4);
pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader+IMAGE_SIZEOF_FILE_HEADER);
pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader+pPEHeader->SizeOfOptionalHeader);
//定位Directory_Data;
DataDirectory = pOptionHeader->DataDirectory;
//IMAGE_DIRECTORY_ENTRY_EXPORT
//输出表
HWND hExportRva = GetDlgItem(hwndDlg,IDC_EDIT_EXPOER_RVA);
TCHAR tExporRva[10];
sprintf(tExporRva,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
SendMessage(hExportRva,WM_SETTEXT,0,(long)tExporRva);
HWND hExportSize = GetDlgItem(hwndDlg,IDC_EDIT_EXPOER_SIZE);
TCHAR tExportSize[10];
sprintf(tExportSize,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size);
SendMessage(hExportSize,WM_SETTEXT,0,(long)tExportSize);
//输入表
HWND hInputRva = GetDlgItem(hwndDlg,IDC_EDIT_INPUT_RVA);
TCHAR tInputRva[10];
sprintf(tInputRva,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
SendMessage(hInputRva,WM_SETTEXT,0,(long)tInputRva);
HWND hInputSize = GetDlgItem(hwndDlg,IDC_EDIT_INPUT_SIZE);
TCHAR tInputSize[10];
sprintf(tInputSize,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size);
SendMessage(hInputSize,WM_SETTEXT,0,(long)tInputSize);
//资源表
HWND hResRva = GetDlgItem(hwndDlg,IDC_EDIT_RES_RVA);
TCHAR tReRva[10];
sprintf(tReRva,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress);
SendMessage(hResRva,WM_SETTEXT,0,(long)tReRva);
HWND hResSize = GetDlgItem(hwndDlg,IDC_EDIT_RES_SIZE);
TCHAR tResSize[10];
sprintf(tResSize,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].Size);
SendMessage(hResSize,WM_SETTEXT,0,(long)tResSize);
//异常表
HWND hExceptionRva = GetDlgItem(hwndDlg,IDC_EDIT_EXCEPTION_RVA);
TCHAR tExceptionRva[10];
sprintf(tExceptionRva,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress);
SendMessage(hExceptionRva,WM_SETTEXT,0,(long)tExceptionRva);
HWND hExceptionSize = GetDlgItem(hwndDlg,IDC_EDIT_EXCEPTION_SIZE);
TCHAR tExceptionSize[10];
sprintf(tExceptionSize,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size);
SendMessage(hExceptionSize,WM_SETTEXT,0,(long)tExceptionSize);
//安全
HWND hSecityRva = GetDlgItem(hwndDlg,IDC_EDIT_SECITY_RVA);
TCHAR tSecityRva[10];
sprintf(tSecityRva,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY].VirtualAddress);
SendMessage(hSecityRva,WM_SETTEXT,0,(long)tSecityRva);
HWND hSecitySize = GetDlgItem(hwndDlg,IDC_EDIT_SECITY_SIZE);
TCHAR tSecitySize[10];
sprintf(tSecitySize,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY].Size);
SendMessage(hSecitySize,WM_SETTEXT,0,(long)tSecitySize);
//重定位表
HWND hRelocRva = GetDlgItem(hwndDlg,IDC_EDIT_RELOC_RVA);
TCHAR tRelocRva[10];
sprintf(tRelocRva,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress);
SendMessage(hRelocRva,WM_SETTEXT,0,(long)tRelocRva);
HWND hRelocSize = GetDlgItem(hwndDlg,IDC_EDIT_RELOC_SIZE);
TCHAR tRelocSize[10];
sprintf(tRelocSize,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size);
SendMessage(hRelocSize,WM_SETTEXT,0,(long)tRelocSize);
//调试
HWND hDebugRva = GetDlgItem(hwndDlg,IDC_EDIT_DEBUG_RVA);
TCHAR tDebugRva[10];
sprintf(tDebugRva,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress);
SendMessage(hDebugRva,WM_SETTEXT,0,(long)tDebugRva);
HWND hDebugSize = GetDlgItem(hwndDlg,IDC_EDIT_DEBUG_SIZE);
TCHAR tDebugSize[10];
sprintf(tDebugSize,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size);
SendMessage(hDebugSize,WM_SETTEXT,0,(long)tDebugSize);
//版权
HWND hCopyRightRva = GetDlgItem(hwndDlg,IDC_EDIT_COPYRIGHT_RVA);
TCHAR tCopyRightRva[10];
sprintf(tCopyRightRva,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_ARCHITECTURE].VirtualAddress);
SendMessage(hCopyRightRva,WM_SETTEXT,0,(long)tCopyRightRva);
HWND hCopyRightSize = GetDlgItem(hwndDlg,IDC_EDIT_COPYRIGHT_SIZE);
TCHAR tCopyRightSize[10];
sprintf(tCopyRightSize,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_ARCHITECTURE].Size);
SendMessage(hCopyRightSize,WM_SETTEXT,0,(long)tCopyRightSize);
//全局指针
HWND hGlobalPointRva = GetDlgItem(hwndDlg,IDC_EDIT_POINT_RVA);
TCHAR tGlobalPointRva[10];
sprintf(tGlobalPointRva,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_GLOBALPTR].VirtualAddress);
SendMessage(hGlobalPointRva,WM_SETTEXT,0,(long)tGlobalPointRva);
HWND hGlobalPointSize = GetDlgItem(hwndDlg,IDC_EDIT_POINT_SIZE);
TCHAR tGlobalPointSize[10];
sprintf(tGlobalPointSize,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_GLOBALPTR].Size);
SendMessage(hGlobalPointSize,WM_SETTEXT,0,(long)tGlobalPointSize);
//Tls
HWND hTlsRva = GetDlgItem(hwndDlg,IDC_EDIT_TLS_RVA);
TCHAR tTlsRva[10];
sprintf(tTlsRva,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS].VirtualAddress);
SendMessage(hTlsRva,WM_SETTEXT,0,(long)tTlsRva);
HWND hTlsize = GetDlgItem(hwndDlg,IDC_EDIT_TLS_SIZE);
TCHAR tTlsSize[10];
sprintf(tTlsSize,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS].Size);
SendMessage(hTlsize,WM_SETTEXT,0,(long)tTlsSize);
//导入配置
HWND hConfigRva = GetDlgItem(hwndDlg,IDC_EDIT_LOADCONFIG_RVA);
TCHAR tConfigRva[10];
sprintf(tConfigRva,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG].VirtualAddress);
SendMessage(hConfigRva,WM_SETTEXT,0,(long)tConfigRva);
HWND hConfigsize = GetDlgItem(hwndDlg,IDC_EDIT_LOADCONFIG_SIZE);
TCHAR tConfigSize[10];
sprintf(tConfigSize,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG].Size);
SendMessage(hConfigsize,WM_SETTEXT,0,(long)tConfigSize);
//绑定导入
HWND hBindRva = GetDlgItem(hwndDlg,IDC_EDIT_BINDIMPORT_RVA);
TCHAR tBindRva[10];
sprintf(tBindRva,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress);
SendMessage(hBindRva,WM_SETTEXT,0,(long)tBindRva);
HWND hBindsize = GetDlgItem(hwndDlg,IDC_EDIT_BINDIMPORT_SIZE);
TCHAR tBindSize[10];
sprintf(tBindSize,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size);
SendMessage(hBindsize,WM_SETTEXT,0,(long)tBindSize);
//IAT
HWND hIatRva = GetDlgItem(hwndDlg,IDC_EDIT_IAT_RVA);
TCHAR tIatRva[10];
sprintf(tIatRva,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress);
SendMessage(hIatRva,WM_SETTEXT,0,(long)tIatRva);
HWND hIatsize = GetDlgItem(hwndDlg,IDC_EDIT_IAT_SIZE);
TCHAR tIatSize[10];
sprintf(tIatSize,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].Size);
SendMessage(hIatsize,WM_SETTEXT,0,(long)tIatSize);
//延迟导入
HWND hDelayRva = GetDlgItem(hwndDlg,IDC_EDIT_DELAY_IMPORT_RVA);
TCHAR tDelayRva[10];
sprintf(tDelayRva,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT].VirtualAddress);
SendMessage(hDelayRva,WM_SETTEXT,0,(long)tDelayRva);
HWND hDelaysize = GetDlgItem(hwndDlg,IDC_EDIT_DELAY_IMPORT_SIZE);
TCHAR tDelaysize[10];
sprintf(tDelaysize,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT].Size);
SendMessage(hDelaysize,WM_SETTEXT,0,(long)tDelaysize);
//COM
HWND hCOMRva = GetDlgItem(hwndDlg,IDC_EDIT_COM_RVA);
TCHAR tCOMRva[10];
sprintf(tCOMRva,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].VirtualAddress);
SendMessage(hCOMRva,WM_SETTEXT,0,(long)tCOMRva);
HWND hCOMsize = GetDlgItem(hwndDlg,IDC_EDIT_COM_SIZE);
TCHAR tCOMsize[10];
sprintf(tCOMsize,"%08X",DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].Size);
SendMessage(hCOMsize,WM_SETTEXT,0,(long)tCOMsize);
//保留
HWND hLeftRva = GetDlgItem(hwndDlg,IDC_EDIT_RETAIN_RVA);
TCHAR tLeftRva[10];
sprintf(tLeftRva,"%08X",DataDirectory[15].VirtualAddress);
SendMessage(hLeftRva,WM_SETTEXT,0,(long)tLeftRva);
HWND hLeftsize = GetDlgItem(hwndDlg,IDC_EDIT_RETAIN_SIZE);
TCHAR tLeftsize[10];
sprintf(tLeftsize,"%08X",DataDirectory[15].Size);
SendMessage(hLeftsize,WM_SETTEXT,0,(long)tLeftsize);
//释放内存
free(pFileBuffer);
}