Выгрузить dll из процесса - PullRequest
       1

Выгрузить dll из процесса

0 голосов
/ 24 февраля 2019

Здравствуйте, я хочу выгрузить эту DLL из процесса, которому она вводится, как я могу это сделать?вот как я внедряю dll в процесс:

это просто я показываю, как я внедряю свою dll в процесс, но как мне РАЗГРУЗИТЬ / ОТКЛЮЧИТЬ эту dll из процесса, если мой метод ввода это

HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, false, GetProcessIdByName("csgo.exe"));
if (h)
{
    LPVOID LoadLibAddr = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
    //cout << "[!] Initialized Library\n";
    LPVOID dereercomp = VirtualAllocEx(h, NULL, strlen(dllName), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    //cout << "[!] Initialized memory allocation\n";
    WriteProcessMemory(h, dereercomp, dllName, strlen(dllName), NULL);
    //cout << "[!] Wrote dll name to memory: " << strlen(dllName) << " byte(s)\n";
    HANDLE asdc = CreateRemoteThread(h, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddr, dereercomp, 0, NULL);
    //cout << "[!] Created remote thread: " << asdc << endl;
    //cout << "[!] Waiting for Dll exit...\n";
    WaitForSingleObject(asdc, INFINITE);
    VirtualFreeEx(h, dereercomp, strlen(dllName), MEM_RELEASE);
    //cout << "[!] Freeing memory\n";
    CloseHandle(asdc);
    CloseHandle(h);
    //cout << "[!] Closed all handles\n";
    //cout << "[!] Complete!\n";
}

1 Ответ

0 голосов
/ 24 февраля 2019

Вы используете CreateRemoteThread для запуска потока в целевом процессе, который запускает «LoadLibraryA».

Я не знаю, почему комментаторам не понравился ваш код внедрения.Выглядит хорошо для меня.Я думаю, что вы правильно закрываете этот поток, однако я рекомендую добавить вызов GetExitCodeThread после WaitForSingleObject, это даст вам код возврата от LoadLibrary, чтобы вы могли проверять наличие ошибок.Вы не можете вызвать FreeLibrary для этого дескриптора, потому что разные процессы.GetLastError также не будет работать.Но, по крайней мере, вы можете сравнить с nullptr для обнаружения сбоя.

Причина, по которой DLL остается загруженной, заключается в том, что никто не назвал FreeLibrary.

Один шаблон здесь, в DllMain вашегоВ случае DLL_PROCESS_ATTACH DLL создайте еще один удаленный поток.На этот раз нет необходимости использовать CreateRemoteThread, просто вызовите обычный CreateThread, потому что этот код уже выполняется в целевом процессе.Вызовите CloseHandle сразу по возвращенному дескриптору (это не убьет новый поток, просто освободите дескриптор).Теперь, во втором удаленном потоке, делайте все, что хотите, в целевом процессе, а когда закончите, вызовите FreeLibraryAndExitThread API.Это завершит работу второго удаленного потока, одновременно выгружая вашу DLL из целевого процесса.

Дополнительная информация: Точка входа DllMain Для DLL HINSTANCE такой же, как HMODULE, просто приведитепервый аргумент HMODULE и сохранить этот аргумент в некоторой переменной для передачи в FreeLibraryAndExitThread.

Update : как сказал комментатор, в идеале вам нужно выделить и скопировать один дополнительный символ,Просто замените strlen(dllName) на strlen(dllName)+1 в обоих случаях.

Обновление 2 : Кстати, часто неплохо вызывать DisableThreadLibraryCalls первым делом в обработчике DLL_PROCESS_ATTACH.Особенно, если вы затем запускаете новые темы с вашего DllMain.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...