WinApi перехват

Тема в разделе "WASM.BEGINNERS", создана пользователем mAgoja, 16 июл 2007.

  1. mAgoja

    mAgoja New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    114
    Адрес:
    Ukraine
    Добрый день всем.
    Решил попробовать перехватить функцию... но не че не получается помогите плиз...если кто знает.

    Имеется код:
    Код (Text):
    1. #include <windows.h>
    2. #include <string>
    3. #include <iostream>
    4. #include <algorithm>
    5.  
    6. using namespace std;
    7.  
    8. void tf(int first,int second)
    9. {
    10.     int r = first+second;
    11.     MessageBox(0,".I.","1",MB_OK);
    12. }
    13. void inf(int fist,int second)
    14. {
    15.     MessageBox(0,"Complite","EEEEEEEEE",MB_OK);
    16. }
    17.  
    18. void main()
    19. {
    20.     HMODULE name = GetModuleHandle(NULL);
    21.     DWORD old;
    22.     //tf(2,3);
    23.     void (*p)(int first,int second);
    24.     p = tf;
    25.     void (*p2)(int first,int second);
    26.     p2 = inf;
    27.     BOOL desss = VirtualProtect(p,5,PAGE_EXECUTE_READWRITE,&old);
    28.     BYTE *jmp = (BYTE *)p;
    29.     *jmp = (BYTE)0xE9;
    30.     jmp++;
    31.     DWORD temp;
    32.     DWORD *jmp2 = (DWORD*) jmp;
    33.     //*jmp2 = temp;
    34.     *jmp2 = (DWORD)p2;
    35.     tf(1,2);
    36. }
    но проблема в том что..при загрузки программы выдаёт ошибку....переход на неизвестный адрес. Смотрел в OllyDbg на место первой инструкции пишется jmp с непонятным переходом и в результате видает ошибку, может надо какнить высчитывать адрес функции?... или адрес функции это смешение от точки входа в программу?.... заранее спасибо за помощь!!!
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    после 0xE9 идет _относительное_ смещение от текущей позиции.
     
  3. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    сам код не смотрел, т.к. не знаю си, а вот как составлется переход отвечу:
    сначала идет опкод дальнего перехода (E9 кажется, но могу ошибаться). Потом идет смещение. Высчитывается оно так: место_прыжка минус адрес_команды, следующей после прыжка. Т.е., если ты записываешь безусловный прыжок в начало перехватываемой функции, то смещение для прыжка делается так: (A-(B+5)), где А - место твоего перехватчика, а B - начало перехватываемой функции (т.е. место, куда будет записан переход).
     
  4. mAgoja

    mAgoja New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    114
    Адрес:
    Ukraine
    n0name, а возможен переход по полному адресу.... или как высчитывать этот относительный адрес?
     
  5. mAgoja

    mAgoja New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    114
    Адрес:
    Ukraine
    Можно наглядно сделать пример...?
    адрес начала перехватываемой функции - 401750h
    адрес функции перехватчика - 401730h
    немого понять...извините за тугодумство ;)
     
  6. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    401730h-(401750h+5)
    "+5", т.к. нужно вычесть адрес следующей за прыжком команды, а размер дальнего прыжка ровно 5 байт.
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    да, можно, например push addr/ret. 0x68, потом 4 байта адреса, потом 0xC3. за 68 не уверен, на память пишу, лучше посмотреть в дизасме.
    посты MSoft
     
  8. mAgoja

    mAgoja New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    114
    Адрес:
    Ukraine
    большое спасибо ребят розабрался :)
     
  9. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    N47
    Стиль кода ужасный. Работай над стилем - понятные имена переменных, отсутствие лишних подключаемых хидеров и лишних коментариев, красивей и понятней для чтения, когда все переменные объявляются в начале функции, или в одном месте. Для твоего случая проще делать
    Код (Text):
    1. push p2
    2. ret
    - в итоге никаких лишних вычислений. Если хочешь обмануть хук-детектор придется придумывать чего-нить хитрее.
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Mental_Mirror
    иногда еще используют mov reg32, addr/jmp reg или с установкой флага и jXX. Однако один фиг некоторые детекторы используют частичную эмуляцию начал функций, и так ловится большинство хуков.
     
  11. mAgoja

    mAgoja New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    114
    Адрес:
    Ukraine
    Mental_Mirror
    спасибо за критику..учту ;) . но прога было написана за 5 мин файл был взят из другого проекта..потому и лишние хидеры..Все равно всем большое спасибо особенно: Msoft and n0name :)
     
  12. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Какие напрмиер? Вроде бы я о таких не слышал. И каким образом идет эмуляция? Типа эмулируем до перехода по левому адресу? Я слышал только об анализаторе...
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    AFAIK в приватной версии rku 4.0 такое хотели ввести, надо у EP_X0FF уточнить.
    И в safe'n'sec такое должно быть в версии делюкс с рк-детектором.
    Ну и в парочке приватных детекторов ;)