Как внедрить DLL, делая крюк с поддержкой Detours? - PullRequest
0 голосов
/ 07 октября 2019

Мне нужен совет, как продолжить перехват CreateFile () после получения кода следующим образом:

#include<windows.h>
#include "C:\Detours\Detours-4.0.1\include\detours.h"

static HANDLE(WINAPI* TrueCreateFileW)(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile) = CreateFileW;

__declspec(dllexport) HANDLE WINAPI MyCreateFileW(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD 
dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile)
{
if ((LPCTSTR)lpFileName == (LPCTSTR)L"C:\TestHook\file.txt")
{
    return TrueCreateFileW((LPCTSTR)L"C:\TestHook\file.txt", dwDesiredAccess, dwShareMode, lpSecurityAttributes,
        dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
}
return TrueCreateFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes,
    dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
}


BOOL APIENTRY DLLMain(HMODULE hModule, DWORD reason_for_call, LPVOID lpReserved)
{

LONG error;
switch (reason_for_call)
{
case DLL_PROCESS_ATTACH:
    OutputDebugString(L"Attaching HookingDLL.dll");
    //OutputDebugString(strInfo);
    DetourRestoreAfterWith();
    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    DetourAttach(&(PVOID&)TrueCreateFileW, MyCreateFileW);
    error = DetourTransactionCommit();

    if (error == NO_ERROR)
    {
        OutputDebugString(L"Hooking attempt succeeded");
    }
    else
    {
        OutputDebugString(L"Hooking attempt failed");
    }
    break;
case DLL_THREAD_ATTACH:
    break;
case DLL_THREAD_DETACH:
    break;
case DLL_PROCESS_DETACH:
    OutputDebugString(L"Detaching HookingDLL.dll");
    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    DetourAttach(&(PVOID&)TrueCreateFileW, MyCreateFileW);
    error = DetourTransactionCommit();

    if (error == NO_ERROR)
    {
        OutputDebugString(L"Successfully detached hook");
    }
    else
    {
        OutputDebugString(L"Hook removal has failed");
    }
    break;
}
return TRUE;
}

Мне нужен вызов перехвата MyCreateFileW при создании нового файла .txt в Notepad ++. Скорее всего, я должен добавить DLL-инжектор, чтобы применить этот хук, но в Интернете я не нашел никакого понятного пошагового руководства для начинающих (стоит сказать, что я студент). Не могли бы вы подсказать, как поступить с DLL-инжектором в моем случае? Позвольте мне заметить, что я использую Microsoft Detours для более плавного и последовательного изучения перехватов API.

1 Ответ

0 голосов
/ 08 октября 2019

Вы уже подготовили обходной DLL. Что вам нужно сделать, это создать новый процесс и загрузить в него DLL с помощью DetourCreateProcessWithDlls. Примерно так:

DetourCreateProcessWithDll(NULL, "C:\\windows\\notepad.exe", NULL,
        NULL, FALSE, CREATE_DEFAULT_ERROR_MODE, NULL, NULL,
        &si, &pi, DetourPath, DLLPath, NULL);

Вы можете обратиться к этому руководству " Перехват API с MS Detours " для получения более подробной информации.

...