Доброго всем времени суток.
У меня возникла следующая проблема:
Есть самописная длл которая подключается к чужой программе, после чего сплайсом меняет некоторую функцию на мою, после одного выполнения моей функции надо восстановить родную.
Функция успешно меняется но при попытке восстановить родную ничего не происходит или программа с критом закрывается, прошу вашей поимощи.
Код:
#include "windows.h"
#include <process.h>
BYTE buff[5];
bool SetSplicingHook(void* pfnDst, void* pfnHook, BYTE buffer[5])
{
if(IsBadWritePtr(buffer, 5) || IsBadReadPtr(pfnDst, 5)) return false;
memcpy(buffer, pfnDst, 5);
DWORD old = 0;
if(!VirtualProtect(pfnDst, 5, PAGE_READWRITE, &old)) return false;
DWORD offset = (DWORD) pfnHook - (DWORD) pfnDst - 5;
*(BYTE*)pfnDst = 0xE9; // JMP FAR
*(DWORD*)((DWORD)pfnDst+1) = offset;
if(!VirtualProtect(pfnDst, 5, old, &old)) return false;
return true;
}
bool UnsetSplicingHook(void* pfnDst, BYTE buffer[5])
{
DWORD old = 0;
if(!VirtualProtect(pfnDst, 5, PAGE_READWRITE, &old)) return false;
memcpy(pfnDst, buffer, 5);
if(!VirtualProtect(pfnDst, 5, old, &old)) return false;
return true;
}
void destroy()
{
HMODULE DllHandle = GetModuleHandle(TEXT("engine.dll"));
FARPROC Addr = GetProcAddress(DllHandle,"SomeProgramHandle");
if(Addr == NULL)
{
exit(0);
}
UnsetSplicingHook(Addr, buff);
}
void Reply() // функция которой заменяю
{
destroy(); //Установка родной функции
.........
}
extern "C" __declspec(dllexport) void init(void)
{
HMODULE DllHandle = GetModuleHandle(TEXT("some.dll"));
FARPROC Addr = GetProcAddress(DllHandle,"SomeProgramHandle");
if(Addr == NULL)
{
exit(0);
}
if(!SetSplicingHook(Addr, Reply,buff))
exit(0);
DisableThreadLibraryCalls(GetModuleHandle(NULL));
}
BOOL WINAPI DllMain (HANDLE hInst, ULONG ul_reason_for_call,LPVOID lpReserved)
{
init();
return true;
}
Пожалуйста подскажите в чем проблема
Все разобралса....