【PE学习-------导入表】
来源:互联网 发布:ubuntu各个版本的区别 编辑:程序博客网 时间:2024/05/21 11:18
输出 打印 PE文件的 导入表信息
// ImportTable.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Windows.h>
#include <DbgHelp.h>
#pragma comment(lib,"Dbghelp.lib")
PIMAGE_NT_HEADERS g_pNt = NULL;
//判断文件是否为PE文件
BOOL CheckPeFile(LPVOID ImageBase)
{
PIMAGE_DOS_HEADER pDos = (PIMAGE_DOS_HEADER)ImageBase;
if (pDos->e_magic != IMAGE_DOS_SIGNATURE)
{
return FALSE;
}
PIMAGE_NT_HEADERS pNt = (PIMAGE_NT_HEADERS)((DWORD)(ImageBase) + pDos->e_lfanew);
if (pNt->Signature != IMAGE_NT_SIGNATURE)
{
return FALSE;
}
g_pNt = pNt;
return TRUE;
}
//获取导入表的信息
void GetImportInfo(LPVOID ImageBase, PIMAGE_NT_HEADERS pNtHeader)
{
DWORD dwRva = pNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
LPVOID ImportVirtual = ImageRvaToVa(pNtHeader, ImageBase, dwRva, NULL);
PIMAGE_IMPORT_DESCRIPTOR pImport = (PIMAGE_IMPORT_DESCRIPTOR)ImportVirtual;
DWORD dwCount = 0;
while (pImport->FirstThunk)
{
LPVOID name = ImageRvaToVa(pNtHeader, ImageBase, pImport->Name, NULL);
printf("DllName: %s\n", (char*)name);
printf("OriginalFirstThunk: 0x%08X\n", pImport->OriginalFirstThunk);
printf("TimeDateStamp: 0x%08X\n", pImport->TimeDateStamp);
printf("ForwarderChain: 0x%08X\n", pImport->ForwarderChain);
printf("Name: 0x%08X\n", pImport->Name);
printf("FirstThunk: 0x%08X\n", pImport->FirstThunk);
LPVOID thunkRva = ImageRvaToVa(pNtHeader, ImageBase, pImport->OriginalFirstThunk ? \
pImport->OriginalFirstThunk:pImport->FirstThunk, NULL);
PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)thunkRva;
printf(" FunctionAddress Hint FunctionName \n");
while(pThunk->u1.Function)
{
printf(" 0x%08X", pThunk->u1.Function);
LPVOID byName = ImageRvaToVa(pNtHeader, ImageBase, (DWORD)pThunk->u1.AddressOfData, NULL);
PIMAGE_IMPORT_BY_NAME pByName = PIMAGE_IMPORT_BY_NAME(byName);
printf(" 0x%04X", pByName->Hint);
printf(" %s\n", (char*)pByName->Name);
pThunk++;
}
dwCount++;
pImport++;
}
printf("The total Import Table is %d\n", dwCount);
}
int _tmain(int argc, _TCHAR* argv[])
{
if (argc != 2)
{
printf("请输入参数!\n");
return -1;
}
HANDLE hFile = CreateFile(argv[1], GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
printf("Error createfile %d\n", GetLastError());
return -1;
}
DWORD dwFileSize = GetFileSize(hFile, NULL);
HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, dwFileSize, NULL);
if (hMap == NULL)
{
CloseHandle(hFile);
return -1;
}
//映射文件到内存中
LPVOID ImageBase = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, dwFileSize);
if (ImageBase == NULL)
{
CloseHandle(hFile);
UnmapViewOfFile(hMap);
return -1;
}
printf("MapView success !\n");
if (!CheckPeFile(ImageBase))
{
printf("This is not PE file\n");
return 0;
}
printf("-----------------------Import--Information---------------------------\n");
GetImportInfo(ImageBase, g_pNt);
printf("----------------------------End--------------------------------------\n");
CloseHandle(hFile);
UnmapViewOfFile(hMap);
return 0;
}
初学PE文件,有不足的地方请指出;高手飘过
可编译代码下载地址点击打开链接
- 【PE学习-------导入表】
- PE学习1-导入表
- PE学习日记----导入表
- PE文件导入表
- PE导入表
- PE 导入表
- PE--导入表
- PE文件结构详解-PE导入表
- PE导入表(输入表)学习笔记
- PE学习(四)第四章:导入表
- PE文件,导入表定位
- PE增加导入表注入
- PE总结 – 导入表
- PE文件学习笔记(五):导入表、IAT、绑定导入表解析
- PE文件学习笔记(五):导入表、IAT、绑定导入表解析
- PE文件结构详解(四)PE导入表
- PE文件结构详解(四)PE导入表
- PE文件结构详解(四)PE导入表
- Cocos2d-x在win32,android和IOS下的文件读写问题
- 创建多媒体APP 之 音频播放:控制你的APP里面音频的声音大小和播放
- Firefox不再使用缓存 --- 开发时调试有用
- adb 通过wifi进行连接
- Linux中的platform
- 【PE学习-------导入表】
- TCP/IP 协议简单分析
- layout、layout-land和layout-port的区别
- Android.mk 浅析 模块编译Makefile编写
- 【技术名词】liferay
- Android画图 利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)
- android流量统计的小结
- 使用svcutil工具自动生成wcf调用的客户端代码和配置文件
- android49——异步加载