所以我正在注入一个DLL到程序中。我可以通过Process Explorer的帮助来验证DLL是否被注入。注入后,我正在循环进程中的所有模块,比较名称并将注入的dll作为HMODULE返回。注入DLL不正确HMODULE
然后我GetProcAddress()这个HMODULE在里面找到一个extern函数,但是由于某些原因这个工作不正常。
HMODULE dllAddress = getModuleAddressFromProc(pid, "NewDll.dll");
externCreateThread createThread = (externCreateThread)GetProcAddress(dllAddress, "createThread");
当我断点和检查dllAddress它说:
当我使用LoadLibrary来加载DLL在我现有的程序和使用,作为一个HMODULE,它的工作。
HMODULE dllAddress = LoadLibrary(L"C:\\NewDll.dll");
externCreateThread createThread = (externCreateThread)GetProcAddress(dllAddress, "createThread");
设置断点检查dllAddress:
从HMODULES列表返回HMODULE是不一样的,从调用LoadLibrary的HMODULE。尽管指针地址是相同的。
列出过程中的所有模块是使用Microsoft提供的代码完成的。我修改了一下它来处理字符串比较,但这不影响HMODULE类型。
HMODULE getModuleAddressFromProc(DWORD pid, string moduleName) {
HMODULE hMods[1024];
DWORD cbNeeded;
HMODULE output;
unsigned int i;
HANDLE newHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
if (EnumProcessModules(newHandle, hMods, sizeof(hMods), &cbNeeded)) {
for (i = 0; i < (cbNeeded/sizeof(HMODULE)); i++) {
TCHAR szModName[MAX_PATH];
if (GetModuleFileNameEx(newHandle, hMods[i], szModName, sizeof(szModName)/sizeof(TCHAR))) {
string s2 = charToString(szModName);
if (s2.find(moduleName) != string::npos) {
output = hMods[i];
break;
}
}
}
}
return output;
}
是的,我最初尝试过,但似乎你不能从DllMain创建一个线程,因为它打破了程序。所以我去寻找一种方法。 – user616396
您可以按照MSDN的规定(由我多次完成)在'DllMain'内创建线程。唯一的区别是线程不会立即启动,而是在完成dll的加载之后。您是否尝试过一个非常简单的线程进行测试(例如每秒钟用MessageBox/MessageBeep进行一次(1))? –
我试过从DllMain的一个不结束的while循环,注入DLL的程序冻结直到while循环被转义。我尝试了CreatThread()并杀死了程序。 编辑:DllMain在装载机锁持有时运行。 – user616396