![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] сплайсинг как восстановить вызов? |
|
C/C++ - [решено] сплайсинг как восстановить вызов?
|
Новый участник Сообщения: 1 |
Доброго всем времени суток.
У меня возникла следующая проблема: Есть самописная длл которая подключается к чужой программе, после чего сплайсом меняет некоторую функцию на мою, после одного выполнения моей функции надо восстановить родную. Функция успешно меняется но при попытке восстановить родную ничего не происходит или программа с критом закрывается, прошу вашей поимощи. #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 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Разное - [решено] В 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 |
|