Внедрение этой DLL ничего не делает. Даже не показывать сообщениеBox - PullRequest
0 голосов
/ 03 ноября 2019

Когда я пытаюсь ввести эту DLL, это ничего не делает. Даже не показывать MessageBox. Также да, это с ASLR, и я использую чит-движок для получения адресов, так как я пока не знаю, как сделать свой собственный инструмент для этого. Я попытался отладить, поместив функции messageBox в начале каждой функции, включая «DllMain», которая ничего не делала. В любом случае вот код.

bool Hook(void* hookAdress, void* ourFunc, int len)
{
    if (len >= 5)
    {
        DWORD protection;
        VirtualProtect(hookAdress, len, PAGE_EXECUTE_READWRITE, &protection);

        DWORD relativeAddress = ((DWORD)ourFunc - (DWORD)hookAdress) - 5;

        *(BYTE*)hookAdress = 0xE9;
        *(DWORD*)((DWORD)hookAdress + 1) = relativeAddress;

        DWORD temp;
        VirtualProtect(hookAdress, len, PAGE_EXECUTE_READWRITE, &temp);

        return true;
    }
    else
        return false;
}

DWORD jmpBack;

_declspec(naked) void ourFunc()
{
    _asm
    {
        sub eax, 0
        jmp[jmpBack]
    }
}

DWORD WINAPI MainThread(LPVOID param)
{
    int hookLength = 8;
    DWORD hookAdress = 0x00DB1047;
    jmpBack = hookAdress + hookLength;

    if (Hook((void*)hookAdress, ourFunc, hookLength))
        MessageBoxA(0, "Successfully Hooked!", "Success!", 0);
    else
        MessageBoxA(0, "Failed To Hook!", "Fail", 0);

    while (true)
    {
        if (GetAsyncKeyState(VK_END))
        {
            break;
        }
        Sleep(40);
    }
    FreeLibraryAndExitThread((HMODULE)param, 0);

    return 0;
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        CreateThread(nullptr, 0, MainThread, hModule, 0, nullptr);
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

Наверное, мне интересно, если это проблема с моим кодом, инструментом для инъекций или конфигурацией свойств моего проекта.

1 Ответ

0 голосов
/ 05 ноября 2019

CreateThread не следует использовать здесь. Если основной поток завершает работу как ExitProcess, все дочерние потоки будут вынуждены выходить при выходе из основного потока. https://devblogs.microsoft.com/oldnewthing/20100827-00/?p=13023

Любая часть функции MainThread может быть прервана.

Вам не нужно создавать тему здесь. Просто для вызова нормальной функции, чтобы сделать это.

РЕДАКТИРОВАТЬ:

DLL_PROCESS_ATTACH:

DLL загружается в виртуальное адресное пространство текущегопроцесс в результате запуска процесса или в результате вызова LoadLibrary.

Когда я внедряю DLL в мой процесс test.exe, мне не нужно вызывать какую-либо dll-функциювыполнить печать в DLL_PROCESS_ATTACH. enter image description here test.exe:

#include <windows.h>
int main()
{
    while (1);
    return 0;
}

DLLMain:

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        printf("DLL_PROCESS_ATTACH ...\n");
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
        break
    case DLL_PROCESS_DETACH:
        printf("DLL_PROCESS_DETACH ...\n");
        break;
    }
    return TRUE;
}
...