Так что я вставляю DLL в программу. Я могу проверить, что DLL инъецируется с помощью Process Explorer. После инъекции я перебираю все модули из процесса, сравнивая имена и возвращаю инъецированную dll как HMODULE.Введенные DLL не верны HMODULE
Затем я GetProcAddress() этот HMODULE, чтобы найти внешнюю функцию внутри него, но по какой-то причине это не работает должным образом.
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");
Breakpointing проверить dllAddress:
Возвращенный HMODULE из списка HMODULES не то же самое, как HMODULE от LoadLibrary. Хотя адрес указателя тот же.
Список всех модулей процесса выполняется с помощью кода 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
Вы можете создавать потоки из 'DllMain', как указано MSDN (и сделано мной несколько раз). Единственное различие заключается в том, что поток начинается не сразу, а после загрузки DLL. Вы пробовали очень простой поток для тестирования (например, некоторое время (1) с MessageBox/MessageBeep каждую секунду)? –
Я пробовал бесконечный цикл while из DllMain, программа, которая запустила DLL, зависает до тех пор, пока цикл while не будет экранирован. Я попробовал CreatThread() и убил программу. Редактировать: DllMain запускается во время блокировки загрузчика. – user616396