Обходной крючок 3.0 GetProcAddresss ()

Я использую:

MS VS 10

Detours v3.0 Экспресс

Полный исходный код DLL:

#include <windows.h>
#include <detours.h>
ofstream prclist ;
#pragma comment(lib,"detours.lib")
FARPROC (WINAPI * pGetProcAddress)(HMODULE hModule,LPCSTR lpProcName) = GetProcAddress;
FARPROC WINAPI  myGetProcAddress(HMODULE hModule,LPCSTR lpProcName);
FARPROC WINAPI  myGetProcAddress(HMODULE hModule,LPCSTR lpProcName)
{
prclist << lpProcName << endl; // <- ACCESS_VIOLATION READ
return pGetProcAddress( hModule, lpProcName);
}

BOOL APIENTRY DllMain(HINSTANCE hDLL, DWORD reason, LPVOID reserved)
{

switch(reason)
{
case DLL_PROCESS_ATTACH:
{
prclist.open("proclst.log",ios::out | ios::app );
DisableThreadLibraryCalls(hDLL);
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)pGetProcAddress, myGetProcAddress);
DetourTransactionCommit();
break;
}
case DLL_PROCESS_DETACH:
{
prclist.close();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)pGetProcAddress, myGetProcAddress);
DetourTransactionCommit();
break;
}
}
return TRUE;
}

Я пытаюсь просмотреть список функций, полученных GetProcAddress. Но после запуска программа закрывается с ошибкой: «НАРУШЕНИЕ ДОСТУПА, UNABLE_TO_READ«

Кто-нибудь может подсказать, как это исправить?

0

Решение

От GetProcAddress () справочная страница, для lpProcName:

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

Это значит может быть не быть указателем на строку, но функция замены всегда обрабатывает его при таком. Это является возможной причиной нарушения прав доступа, так как будет использоваться целочисленное значение (182 например) в качестве начального адреса памяти строки с нулевым символом в конце.

использование HIWORD() исправлять:

if (HIWORD(lpProcName))
{
prclist << "name: " << lpProcName << std::endl;
}
else
{
prclist << "ordinal: " << reinterpret_cast<DWORD>(lpProcName) << std::endl;
}
2

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

Смотрите мой комментарий. Похоже, что поток просто нужно проверить на открытость перед операторами вставки (<<) используются на нем.

0

По вопросам рекламы [email protected]