Access violation error with injected dll C++

Viewed 433

So recently I made my own dll injector to be able to debug my other app by injecting a debug dll in it; Using c++/cli for the interface and c++ for the code.

I tested the same code I used on this project on a C++ console app project and it worked without any problems.

The injection occurs inside the Init.cpp file, which essentially gets the provided dll path under the form of C:\\user\\documents\\debug.dll and checks if it exists. After that it gets the process id by passing the name, in this case myotherapp.exe, as a parameter. If successful it then get's the Handle to the process and store's it in g.h_process, it continues by allocating readable/writable memory in the process and then writing to this memory the path of the dll and finally use's LoadLibraryA to load the dll inside the process.

Init.cpp:

void Injector::Init(void)
{
    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");

    Utils::getProcId(procName, g.proc_id);
    if (!g.proc_id) {
        return Utils::error("Could not find specified process.");
    }

    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");
    }

    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(g.allocatedMemory, dll_path);

    Llib();

    Release(dll_path, g.allocatedMemory);
    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))
        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)
{
    CloseHandle(g.h_process);
    VirtualFreeEx(g.h_process, allocatedMemory, NULL, MEM_RELEASE);
    return true;
}

The g.debug is just a flag which tells us if the console is enabled or not. found in the globals.hpp which just contains global variables. You can also check the Utils namespace here.

The error:

The problem I'm experiencing here is whenever I inject my DLL into the process, my injector works fine with no errors but when I attach vs to the process I want to inject to I get an Access Violation error with the process exiting with an error code.

I don't understand, I can't see where I am accessing invalid memory.

Thanks in advance.

0 Answers
Related