Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] сплайсинг как восстановить вызов?

Ответить
Настройки темы
C/C++ - [решено] сплайсинг как восстановить вызов?

Новый участник


Сообщения: 1
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: serkamikadze
Дата: 29-12-2011
Доброго всем времени суток.
У меня возникла следующая проблема:
Есть самописная длл которая подключается к чужой программе, после чего сплайсом меняет некоторую функцию на мою, после одного выполнения моей функции надо восстановить родную.
Функция успешно меняется но при попытке восстановить родную ничего не происходит или программа с критом закрывается, прошу вашей поимощи.
Код: Выделить весь код
#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;
}
Пожалуйста подскажите в чем проблема

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

Отправлено: 00:25, 29-12-2011

 


Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] сплайсинг как восстановить вызов?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - [решено] В Windows 7x86 доступна не вся оперативная память Blast Microsoft Windows 7 25 05-08-2015 18:31
xDSL/DialUp - Посоветуйте *DSL модемы для соединения участка 400 м skeletor Сетевое оборудование 1 10-11-2011 19:07
Прочее - как изменить маршрут в обход проблемного участка? hellrised Сетевые технологии 4 25-03-2008 12:39
Разное - Копирование на cd. Миг-29 Microsoft Windows 2000/XP 8 02-11-2007 17:08
Копирование Guest Хочу все знать 7 15-04-2004 19:36




 
Переход