Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] сплайсинг как восстановить вызов? (http://forum.oszone.net/showthread.php?t=224014)

serkamikadze 29-12-2011 00:25 1824487

сплайсинг как восстановить вызов?
 
Доброго всем времени суток.
У меня возникла следующая проблема:
Есть самописная длл которая подключается к чужой программе, после чего сплайсом меняет некоторую функцию на мою, после одного выполнения моей функции надо восстановить родную.
Функция успешно меняется но при попытке восстановить родную ничего не происходит или программа с критом закрывается, прошу вашей поимощи.
Код:

#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;
}

Пожалуйста подскажите в чем проблема

Все разобралса....


Время: 09:55.

Время: 09:55.
© OSzone.net 2001-