Добрый день всем. Решил попробовать перехватить функцию... но не че не получается помогите плиз...если кто знает. Имеется код: Код (Text): #include <windows.h> #include <string> #include <iostream> #include <algorithm> using namespace std; void tf(int first,int second) { int r = first+second; MessageBox(0,".I.","1",MB_OK); } void inf(int fist,int second) { MessageBox(0,"Complite","EEEEEEEEE",MB_OK); } void main() { HMODULE name = GetModuleHandle(NULL); DWORD old; //tf(2,3); void (*p)(int first,int second); p = tf; void (*p2)(int first,int second); p2 = inf; BOOL desss = VirtualProtect(p,5,PAGE_EXECUTE_READWRITE,&old); BYTE *jmp = (BYTE *)p; *jmp = (BYTE)0xE9; jmp++; DWORD temp; DWORD *jmp2 = (DWORD*) jmp; //*jmp2 = temp; *jmp2 = (DWORD)p2; tf(1,2); } но проблема в том что..при загрузки программы выдаёт ошибку....переход на неизвестный адрес. Смотрел в OllyDbg на место первой инструкции пишется jmp с непонятным переходом и в результате видает ошибку, может надо какнить высчитывать адрес функции?... или адрес функции это смешение от точки входа в программу?.... заранее спасибо за помощь!!!
сам код не смотрел, т.к. не знаю си, а вот как составлется переход отвечу: сначала идет опкод дальнего перехода (E9 кажется, но могу ошибаться). Потом идет смещение. Высчитывается оно так: место_прыжка минус адрес_команды, следующей после прыжка. Т.е., если ты записываешь безусловный прыжок в начало перехватываемой функции, то смещение для прыжка делается так: (A-(B+5)), где А - место твоего перехватчика, а B - начало перехватываемой функции (т.е. место, куда будет записан переход).
Можно наглядно сделать пример...? адрес начала перехватываемой функции - 401750h адрес функции перехватчика - 401730h немого понять...извините за тугодумство
401730h-(401750h+5) "+5", т.к. нужно вычесть адрес следующей за прыжком команды, а размер дальнего прыжка ровно 5 байт.
да, можно, например push addr/ret. 0x68, потом 4 байта адреса, потом 0xC3. за 68 не уверен, на память пишу, лучше посмотреть в дизасме. посты MSoft
N47 Стиль кода ужасный. Работай над стилем - понятные имена переменных, отсутствие лишних подключаемых хидеров и лишних коментариев, красивей и понятней для чтения, когда все переменные объявляются в начале функции, или в одном месте. Для твоего случая проще делать Код (Text): push p2 ret - в итоге никаких лишних вычислений. Если хочешь обмануть хук-детектор придется придумывать чего-нить хитрее.
Mental_Mirror иногда еще используют mov reg32, addr/jmp reg или с установкой флага и jXX. Однако один фиг некоторые детекторы используют частичную эмуляцию начал функций, и так ловится большинство хуков.
Mental_Mirror спасибо за критику..учту . но прога было написана за 5 мин файл был взят из другого проекта..потому и лишние хидеры..Все равно всем большое спасибо особенно: Msoft and n0name
Какие напрмиер? Вроде бы я о таких не слышал. И каким образом идет эмуляция? Типа эмулируем до перехода по левому адресу? Я слышал только об анализаторе...
AFAIK в приватной версии rku 4.0 такое хотели ввести, надо у EP_X0FF уточнить. И в safe'n'sec такое должно быть в версии делюкс с рк-детектором. Ну и в парочке приватных детекторов