#include <Windows.h>
int main(){
printf("Enter name of program. n");
char prog[300];
scanf("%s", prog);
HMODULE hModule = GetModuleHandleW((LPCWSTR)prog);
if (hModule){
IMAGE_DOS_HEADER* pIDH = (IMAGE_DOS_HEADER*)hModule;
IMAGE_NT_HEADERS* pNTH =(IMAGE_NT_HEADERS*)((BYTE*)pIDH + pIDH->e_lfanew);
IMAGE_OPTIONAL_HEADER pOPH = (IMAGE_OPTIONAL_HEADER)pNTH->OptionalHeader;
IMAGE_DATA_DIRECTORY* pIDD = (IMAGE_DATA_DIRECTORY*)pOPH.DataDirectory;
printf("%x", pIDD->VirtualAddress);
}
else {
printf("Error");
}
return 0;
}
这是我目前的基本脚本,仅用于检查是否进入了IMAGE_DATA_DIRECTORY。我的目标是打印每个dll和它的所有导入函数的某个运行进程- GetModuleHandleA/W。每次调用都返回null——打印"错误";正如我所检查的,不包括由于某种原因打印'0'的空调用。
除了明显的(LPCWSTR)prog
类型转换错误,GetModuleHandle
永远不会工作,因为它只处理当前进程中的模块。
调用CreateToolhelp32Snapshot
获取所有进程的列表,然后再次调用CreateToolhelp32Snapshot
获取特定进程的模块。请注意,您不能直接读取远程进程的DOS/NT头文件,您必须使用ReadProcessMemory
。
DataDirectory
是一个数组,您必须指定您感兴趣的目录(资源,导入,导出等)。