Ошибка нарушения прав доступа с внедренной dll C ++ - PullRequest
3 голосов
/ 05 мая 2020

Так недавно я сделал свой собственный инжектор dll, чтобы иметь возможность отлаживать другое приложение путем внедрения в него отладочной dll; Использование c ++ / cli для интерфейса и c ++ для кода.

Я протестировал тот же код, что и в этом проекте, на проекте консольного приложения C ++ , и он работал без каких-либо проблем.

Внедрение происходит внутри файла Init.cpp , который, по сути, получает указанный путь к dll в виде C:\\user\\documents\\debug.dll и проверяет, существует ли он. После этого он получает идентификатор процесса, передавая имя, в данном случае myotherapp.exe, в качестве параметра. В случае успеха он получает дескриптор процесса и сохраняет его в g.h_process, он продолжает, выделяя читаемую / записываемую память в процессе, а затем записывает в эту память путь к dll и, наконец, использует LoadLibraryA для загрузки dll. внутри процесса.

Init.cpp:

void Injector::Init(void)
{
    if (g.debug) {
        cout << "????????????????????? <FrameInjector> ?????????????????????" << endl;
        cout << endl;
    }
    Inject::Checks((char*)g.dll_path, g.procName);//checking for dll validity
}

bool Injector::Inject::Checks(char* dll_path, PCSTR procName)
{
    if (!Utils::file_exists(dll_path))
        return Utils::error("File does not exist.");
    Utils::successInput("Prepared DLL for injection");

    //get process id
    Utils::getProcId(procName, g.proc_id);
    if (!g.proc_id) {
        return Utils::error("Could not find specified process.");
    }
    cout << "[?] Got process! ID: " << (int)g.proc_id << endl;

    g.h_process = OpenProcess(PROCESS_ALL_ACCESS, NULL, g.proc_id);
    if (!g.h_process) {
        return  Utils::error("Failed to open a handle to process");
    }
    Utils::successInput("Attached to process ");

    //void* can point to anything so allocMem is a pointer to anything here to pointed memory
    g.allocatedMemory = VirtualAllocEx(g.h_process, nullptr, MAX_PATH, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);//mem_reserver reserve memory then commit memory to be able to write to that memory

    //allocate memory
    Allocate(g.allocatedMemory, dll_path);

    //create thread and execute LoadLibraryA
    Llib();
    Utils::successInput("Loaded dll into target");

    Release(dll_path, g.allocatedMemory);
    Utils::successInput("Successfully released memory");

    if (g.msgBoxes)
        Utils::msgBox("Successfully injected dll!");
    if (g.closeOnInjection)
        exit(0);
    return 0;
}

bool Injector::Inject::Allocate(void* allocatedMemory, char* dll_path)
{
    if (!allocatedMemory)
        return Utils::error("Failed to allocate memory");

    if (!WriteProcessMemory(g.h_process, g.allocatedMemory, g.dll_path, MAX_PATH, nullptr))//writing dll path in allocated memory
        return Utils::error("Failed to write process");
    return true;
}

bool Injector::Inject::Llib() {
    HANDLE h_thread = CreateRemoteThread(g.h_process, nullptr, NULL, LPTHREAD_START_ROUTINE(LoadLibraryA), g.allocatedMemory, NULL, nullptr);
    if (!h_thread)
        return Utils::error("Failed to create remote thread");
    return true;
}

bool Injector::Inject::Release(PCSTR dll_path, void* allocatedMemory)
{
    //close handle
    CloseHandle(g.h_process);
    VirtualFreeEx(g.h_process, allocatedMemory, NULL, MEM_RELEASE);
    return true;
}

Полный файл: Начальный cpp

g.debug - это просто флаг, который сообщает нам, включена консоль или нет. находится в globals.hpp , который содержит только глобальные переменные. Вы также можете проверить пространство имен Utils здесь .

Ошибка:

Проблема, с которой я здесь сталкиваюсь, заключается в том, что я DLL в процесс, мой инжектор работает нормально без ошибок, но когда я подключаюсь к процессу, который хочу ввести в , я получаю сообщение об ошибке Access Violation с завершением процесса с кодом ошибки.

Я не понимаю, я не вижу, откуда я обращаюсь к недействительной памяти.

Заранее спасибо.

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