IDP Прикручиваю к C++

Тема в разделе "WASM.RESEARCH", создана пользователем СFF, 3 ноя 2010.

  1. СFF

    СFF PP

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    233
    Backtrace делай, там уже часть асма будет, надо же получить ebp, и дальше просто отделать параметры. Ну вообщем не сложно. Но мне этот двиг уже не подходит та как там хук только одной функи, я на базе этого движка, напишу свой с мулти хуком ведь 10000< есть 16 страниц, а это 16 хуков уже не один.
     
  2. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    19841204
    У клерка, как я понял еще есть построитьель графов, который по его утверждениям, способен даже автоматически находить указатели нужные для перехвата, не хочешь тоже на си перевести)
     
  3. СFF

    СFF PP

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    233
    Прям как легенду преподнес :lol: . А нафигу его на с++ переводить, вставляй его в проект и юзай. Этот мне нужно сделать только изза того что там мало возможностей и только.
     
  4. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    19841204
    да мне юзать то это негде) так попробовать только если для интереса.
     
  5. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    19841204
    Захватывать можно 128 областей(точно не помню лимит), это число ограничено лимитом LDT. Также общий размер областей не должен превышать 16 страниц. Этого достаточно для решения любых задач.
     
  6. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    ziral2088
    Портирование под x64 не возможно, так как там не поддерживается LDT.

    Вот бинарь пересобранный, никаких изменений кроме сех - добавил сохранение некоторых регистров http://indy-vx.narod.ru/Bin/Idpe.zip
     
  7. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    небольшой чуть чуть оффтоп
    Код (Text):
    1.     if(e->ExceptionRecord->ExceptionCode==IDP_SINGLE_STEP)
    2.     {
    3.         GetThreadContext(GetCurrentThread(),&ctxt);
    4.         _esp=ctxt.Esp;
    5.         printf("esp=%x\n",_esp);
    6.        
    7.         _asm mov _esp,esp
    8.         printf("esp=%x\n",_esp);
    9.        
    10.         getch();
    11.  
    12.  
    13.  
    14.         MessageBox(0,L"Catched",0,0);
    15.         return EXCEPTION_CONTINUE_EXECUTION;
    16.     }
    почему в первом случае _esp =0
     
  8. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Вы не заполнили ContextFlags. Там следует указать флажки, определяющие какая часть контекста будет обработана. Для текущего потока вызов не имеет смысла, так как будет возвращён немного изменённый контекст при вызове сервиса. Для диспетчера исключений он передаётся параметром.
     
  9. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    CrystalIC
    это глобальная переменная
    флаги были в мэйн заполнены
    Код (Text):
    1.         ctxt.ContextFlags=CONTEXT_INTEGER;
    2.         GetThreadContext(GetCurrentThread(),&ctxt);
    3.         _esp=ctxt.Esp;
    4.         printf("esp=%x\n",_esp);
    5.        
    6.         _asm mov _esp,esp
    7.         printf("esp=%x\n",_esp);
    все равно 0?

    CONTEXT_FULL все решил
     
  10. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    CONTEXT_CONTROL.
     
  11. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    еще вопрос
    смотри, мы находимся в обработчике исключения
    значит повторное исключение не получится обработать (__try,__except)
    Как тогда при бактрейсе не потерять управление?
    до какого уровня углубляться при поиске?
     
  12. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Допустимы рекурсивные вызовы. Вызов из других тредов не пройдёт, пока текущий не возвратится из VEH, так как используется синхронизация на кс. SEH будет раскручен, если VEH не выполнит обработку. Тоесть вы не фильтруете к примеру #AV в VEH, или например если адрес исключения принадлежит вашему коду(избыточный функционал в данном случае).
    На счёт бактрейса не понятно для чего он вам и что за поиск.
     
  13. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    CrystalIC
    мне нужно добраться до параметров функции в которой перехватили управление
     
  14. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Код (Text):
    1. LONG __stdcall MyVEH(PEXCEPTION_POINTERS e)
    2. {
    3.     CONTEXT ctxt;
    4.     DWORD   _esp;
    5.     BOOL ret;
    6.  
    7.     //__asm{int 3}
    8.     if(e->ExceptionRecord->ExceptionFlags!=NULL)
    9.     {
    10.         //non continuable exception
    11.         return 0;
    12.     }
    13.     if(e->ExceptionRecord->ExceptionCode==IDP_BREAKPOINT)
    14.     {
    15.         return EXCEPTION_CONTINUE_EXECUTION;
    16.     }
    17.     if(e->ExceptionRecord->ExceptionCode==IDP_SINGLE_STEP)
    18.     {
    19.  
    20.         __try
    21.         {
    22.             _asm xor eax,eax
    23.             _asm mov eax,[eax]
    24.         }
    25.         __except(filter(GetExceptionCode(), GetExceptionInformation()))
    26.         {
    27.  
    28.             puts("in except");
    29.  
    30.         }
    31.  
    32.        
    33.         getch();
    34.  
    35.  
    36.  
    37.         MessageBox(0,L"Catched",0,0);  
    38.         return EXCEPTION_CONTINUE_EXECUTION;
    39.     }
    40.        
    41.     return 0;
    42. }
    Код (Text):
    1. int filter(unsigned int code, struct _EXCEPTION_POINTERS *ep)
    2. {
    3.  
    4.    puts("in filter.");
    5.  
    6.     return EXCEPTION_EXECUTE_HANDLER;
    7.  
    8.  
    9. }
    вот это не обрабатывается
    падает бесшумно
     
  15. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    punxer
    Необходимо знать разницу NL(SFN) текущей процедуры и целевой, либо адрес возврата и пр., в зависимости от целевого кода. Тут некоторые нюансы расмотрены http://wasm.ru/forum/viewtopic.php?id=39006&p=1. В общем это обширная сложная тема.
     
  16. СFF

    СFF PP

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    233
    А ты врубил в опциях чтобы try SEH обрабатывал. Таб были гдето
     
  17. СFF

    СFF PP

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    233
    Это я понимаю сорсы смотрел, но тогда почему не пашет этот код
    Код (Text):
    1. #include <Windows.h>
    2. #include "idp.h"
    3.  
    4. LONG some1=0x777;
    5. LONG some2=0x777;
    6. PLONG RepSome1;
    7. PLONG RepSome2;
    8.  
    9. LONG __stdcall MyVEH(PEXCEPTION_POINTERS e)
    10. {
    11.     //__asm{int 3}
    12.     if(e->ExceptionRecord->ExceptionFlags!=NULL)
    13.     {
    14.         //non continuable exception
    15.         return 0;
    16.     }
    17.     if(e->ExceptionRecord->ExceptionCode==IDP_BREAKPOINT)
    18.     {
    19.         return EXCEPTION_CONTINUE_EXECUTION;
    20.     }
    21.     if(e->ExceptionRecord->ExceptionCode==IDP_SINGLE_STEP)
    22.     {
    23.         //код обработчика
    24.         //__asm{int 3}
    25.         MessageBox(0,L"Catched",0,0);
    26.         return EXCEPTION_CONTINUE_EXECUTION;
    27.     }
    28.        
    29.     return 0;
    30. }
    31.  
    32. VOID Test1()
    33. {
    34.     int a = 34;
    35.     a /= *RepSome1;
    36.     MessageBox(0,L"End Test1()",0,0);
    37. }
    38.  
    39. VOID Test2()
    40. {
    41.     int a = 34;
    42.     a /= *RepSome2;
    43.     MessageBox(0,L"End Test2()",0,0);
    44. }
    45.  
    46. void main()
    47. {
    48.     IdpInitializeEngine();
    49.     IdpAddVeh(NULL,MyVEH);
    50.  
    51.     RepSome1 = &some1;
    52.     RepSome2 = &some2;
    53.  
    54.     //__asm{int 3}
    55.     DWORD status = IdpAddReference(&RepSome1,0x1000);
    56.     status = IdpAddReference(&RepSome2,0x1000);
    57.  
    58.     Test1();
    59.     MessageBox(0,L"Next",0,0);
    60.     Test2();
    61.  
    62.     IdpRemoveVeh(MyVEH);
    63. }
     
  18. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    ??
     
  19. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    ИМХО без доступа к параметрам грош цена IDP уж очень узкое применение
    хоть и отличное исполнение
     
  20. СFF

    СFF PP

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    233
    Да не все нормуль, дермо что хучит только один референсе