Почему внедрение библиотеки не работает?

153
19 июня 2022, 18:00

Пытался написать код на внедрение библиотеки в только что созданный процесс, но что-то не получается. Функция inject возвращает true, но сама библиотека в процесс не загружается. Пожалуйста, подскажите в чём проблема. Всё x64.

#include <windows.h>
#include <iostream>
bool inject(HANDLE processHandle, const wchar_t* dllPath)
{
    HMODULE module = GetModuleHandle(L"kernel32.dll");
    if (module)
    {
        FARPROC address = GetProcAddress(module, "LoadLibraryA");
        if (address)
        {
            LPVOID memory = VirtualAllocEx(processHandle, NULL, wcslen(dllPath) + 1, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
            if (memory)
            {
                if (WriteProcessMemory(processHandle, memory, dllPath, wcslen(dllPath) + 1, NULL))
                {
                    if (CreateRemoteThread(processHandle, NULL, NULL, (LPTHREAD_START_ROUTINE)address, memory, NULL, NULL))
                    {
                        return true;
                    }
                }
            }
        }
    }
    /* CloseHandle(processHandle);
    VirtualFreeEx(processHandle, memory, 0, MEM_RELEASE); */
    return false;
}
bool fileExists(LPCWSTR name)
{
    return GetFileAttributesW(name) != -1;
}
int main()
{
    const wchar_t APP_NAME[8]  = L"app.exe";
    const wchar_t DLL_64  [12] = L"library.dll";
    STARTUPINFO startupInfo;
    PROCESS_INFORMATION processInfo;
    ZeroMemory(&startupInfo, sizeof(startupInfo));
    wchar_t path[MAX_PATH];
    GetFullPathName(DLL_64, MAX_PATH, path, 0);
    if (CreateProcess(APP_NAME, 0, 0, 0, 0, 0, 0, 0, &startupInfo, &processInfo))
    {
        std::wcout << L"dll path: " << path << std::endl;
        std::wcout << L"inject result: " << inject(processInfo.hProcess, path) << std::endl;
    }
    system("pause");
    return 0;
}
READ ALSO
В каких случаях нужно наследоваться от std :: enable_shared_from_this и зачем это делать?

В каких случаях нужно наследоваться от std :: enable_shared_from_this и зачем это делать?

В каких случаях нужно наследоваться от std :: enable_shared_from_this и зачем это делать? Увидел в примерах boost asio наследование от enable_shared_from_this, что это...

173
Проблема переполнения буфера при выводе одномерного массива С++

Проблема переполнения буфера при выводе одномерного массива С++

Проблема при переполнении памяти в выводе изменённой матрицыЗадача: По указанию пользователя с положительных четных или отрицательных...

230
Сравнение разности двух вещественных чисел с третьим вещественным числом

Сравнение разности двух вещественных чисел с третьим вещественным числом

У меня есть вещественные числа a, b и сНужно чтобы выполнялось выражение c == (b - a), проблема возникает именно с "равно"

122
как реализовать перегрузку оператора &quot;=&quot; для односвязного списка в c ++?

как реализовать перегрузку оператора "=" для односвязного списка в c ++?

Предыстория: мне нужно реализовать алгоритм быстрой сортировки для односвязного списка

136