Сбой приложения при подключении с помощью MS Detours и инъекции с помощью Withdll.exe

Я ловлю FindNextFile() используя MS Detours. Я успешно настроил библиотеку Detours и написал dll с именем "Detuors.dll" и приложение с именем "FNFSend.exe". Ниже приведен код:

DLL:

#include <cstdio>
#include <stdio.h>
#include <windows.h>
#include "detours.h"
#pragma comment (lib,"detours.lib")

//Prototypes
extern "C" __declspec(dllexport) BOOL (WINAPI *pFNF)(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData) = FindNextFile;
extern "C" __declspec(dllexport) BOOL WINAPI MyFNF(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData);

//Log File
FILE* pFNFLogFile;
int counter = 0;

INT APIENTRY DllMain(HMODULE hDLL, DWORD Reason, LPVOID Reserved)
{
    switch(Reason)
    {
        case DLL_PROCESS_ATTACH:
            DisableThreadLibraryCalls(hDLL);
            DetourTransactionBegin();
            DetourUpdateThread(GetCurrentThread());
            DetourAttach(&(PVOID&)pFNF, MyFNF);
            if(DetourTransactionCommit() == NO_ERROR)
                OutputDebugString("FNF() detoured successfully");
            else
                OutputDebugString("FNF() not detoured");
            break;
        case DLL_PROCESS_DETACH:
            DetourTransactionBegin();   //Detach
            DetourUpdateThread(GetCurrentThread());
            DetourDetach(&(PVOID&)pFNF, MyFNF);
            DetourTransactionCommit();
            break;
        case DLL_THREAD_ATTACH:
            DisableThreadLibraryCalls(hDLL);
            DetourTransactionBegin();
            DetourUpdateThread(GetCurrentThread());
            DetourAttach(&(PVOID&)pFNF, MyFNF);
            if(DetourTransactionCommit() == NO_ERROR)
                OutputDebugString("FNF() detoured successfully");
            else
                OutputDebugString("FNF() not detoured");
            break;
        case DLL_THREAD_DETACH:
            break;
    }
    return TRUE;
}

//Open file, write contents, close it
extern "C" __declspec(dllexport) int WINAPI MyFNF(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData)
{
    counter ++;
    fopen_s(&pFNFLogFile, "C:\\FNFLog.txt", "a+");
    fprintf(pFNFLogFile, "%s\n", counter);
    fclose(pFNFLogFile);
    return pFNF(hFindFile, lpFindFileData);
}

Оба кода успешно скомпилированы без ошибок. Приложение вызывает FindNextFile() рекурсивно и DLL перехватывает его и записывает счетчик в файл.

Затем я использовал инструмент с именем withdll.exe, который предоставляется самой обходной библиотекой, чтобы создать процесс с внедренной в него DLL. Поэтому я ввел мою dll в приложение с помощью команды:

withdll /d:Detuors.dll "C: \ FNFSend.exe"

После внедрения функция подключается успешно, т.е. файл создается в каталоге, но приложение внезапно падает. После отладки в Visual Studio, я увидел исключение в "output.c" следующим образом:

Unhandled exception at 0x6265984f (msvcr90d.dll) in FNFSend.exe: 0xC0000005:
Access violation reading location 0x00000001.

Пожалуйста, помогите в устранении проблемы.

1 ответ

Решение

%s не является допустимой строкой формата для печати числа. использование %d вместо.

Указав %s ты говоришь fprintf читать память по адресу counter как строка Первое значение, которое вы пытаетесь вызвать fprintf с 1, поэтому нарушение адреса по адресу 0x00000001,

Другие вопросы по тегам