Сбой приложения при подключении с помощью 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», который предоставляется самой библиотекой detours, для создания процесса с внедренной в него 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.

Прошу помощи в устранении проблемы.


person Faheem    schedule 18.05.2013    source источник


Ответы (1)


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

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

person Steve    schedule 18.05.2013