#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。我的目标是打印某个正在运行的进程- GetModuleHandleA / W的每个dll和它的所有导入函数。每个调用都返回null -打印“Error”,正如我检查的那样,不包括由于某种原因打印“0”的空调用。
1条答案
按热度按时间92dk7w1h1#
除了明显的
(LPCWSTR)prog
转换bug之外,GetModuleHandle
永远不会工作,因为它只处理当前进程中的模块。调用
CreateToolhelp32Snapshot
以获取所有进程的列表,然后再次调用CreateToolhelp32Snapshot
以获取特定进程的模块。注意,您不能直接读取远程进程的DOS/NT头文件,您必须使用ReadProcessMemory
。DataDirectory
是一个数组,您必须指定您感兴趣的目录(资源、导入、导出等)。