Внедренная DLL и вызов функции с использованием CreateRemoteThread вызывает «перестала работать», что происходит?

Я пытаюсь внедрить DLL в процесс и вызвать экспортированную функцию в моей DLL.

DLL вписывается хорошо с этим кодом:

HANDLE Proc;
char buf[50] = { 0 };
LPVOID RemoteString, LoadLibAddy;
if (!pID)
return false;
Proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
if (!Proc)
{
sprintf_s(buf, "OpenProcess() failed: %d", GetLastError());
printf(buf);
return false;
}

LoadLibAddy = (LPVOID)GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA");
// Allocate space in the process for our DLL
RemoteString = (LPVOID)VirtualAllocEx(Proc, NULL, strlen(DLL_NAME), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
// Write the string name of our DLL in the memory allocated
WriteProcessMemory(Proc, (LPVOID)RemoteString, DLL_NAME, strlen(DLL_NAME), NULL);
// Load our DLL
HANDLE hThread = CreateRemoteThread(Proc, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibAddy, (LPVOID)RemoteString, NULL, NULL);

Модуль моей DLL создан хорошо, как вы видите на этом образе Process Hacker (BootstrapDLL.exe):

введите описание изображения здесь

Мои экспортированные функции тоже в порядке, как вы видите в списке функций, экспортированных в Process Hacker (ImplantDotNetAssembly):

введите описание изображения здесь

Я думаю, что проблемы возникают при вычислении смещения для получения адреса «ImplantDotNetAssembly», потому что все выше в порядке, и когда я делаю вычисления, я получаю адрес «ImplantDotNetAssembly», но когда я снова вызываю CreateRemoteThread, чтобы вызвать это, окно «Перестал работать …» из окон показано, и процесс остановился. Что происходит?

Вот код расчета смещения:

DWORD_PTR hBootstrap = GetRemoteModuleHandle(ProcId, L"BootstrapDLL.exe");
DWORD_PTR offset = GetFunctionOffset(L"C:\\Users\\Acaz\\Documents\\Visual Studio 2013\\Projects\\Contoso\\Debug\\BootstrapDLL.exe", "ImplantDotNetAssembly");
DWORD_PTR fnImplant = hBootstrap + offset;

HANDLE hThread2 = CreateRemoteThread(Proc, NULL, 0, (LPTHREAD_START_ROUTINE)fnImplant, NULL, 0, NULL);

Вот функции GetRemoteModuleHandle и GetFunctionOffset:

DWORD_PTR GetFunctionOffset(const wstring& library, const char* functionName)
{
// load library into this process
HMODULE hLoaded = LoadLibrary(library.c_str());

// get address of function to invoke
void* lpInject = GetProcAddress(hLoaded, functionName);

// compute the distance between the base address and the function to invoke
DWORD_PTR offset = (DWORD_PTR)lpInject - (DWORD_PTR)hLoaded;

// unload library from this process
FreeLibrary(hLoaded);

// return the offset to the function
return offset;
}

DWORD_PTR GetRemoteModuleHandle(const int processId, const wchar_t* moduleName)
{
MODULEENTRY32 me32;
HANDLE hSnapshot = INVALID_HANDLE_VALUE;

// get snapshot of all modules in the remote process
me32.dwSize = sizeof(MODULEENTRY32);
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, processId);

// can we start looking?
if (!Module32First(hSnapshot, &me32))
{
CloseHandle(hSnapshot);
return 0;
}

// enumerate all modules till we find the one we are looking for or until every one of them is checked
while (wcscmp(me32.szModule, moduleName) != 0 && Module32Next(hSnapshot, &me32));

// close the handle
CloseHandle(hSnapshot);

// check if module handle was found and return it
if (wcscmp(me32.szModule, moduleName) == 0)
return (DWORD_PTR)me32.modBaseAddr;

return 0;
}

Если кто-то знает, что происходит, я буду очень благодарен!

Я не могу даже отладить ошибку «остановил работу ..». Когда я нажимаю кнопку DEBUG в окне, ошибка выдается снова и все останавливается.

Спасибо.

-3

Решение

НИКОГДА не вводите управляемые сборки. Если по какой-либо причине вам необходимо внедрить код в другой процесс, используйте собственный код либо с библиотекой NO C, либо с библиотекой STATIC C.

0

Другие решения


По вопросам рекламы [email protected]