Сбой приложения при подключении с помощью 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,

1

Другие решения

Других решений пока нет …