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

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

  1. СFF

    СFF PP

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    233
    Хотел обратиться к Клерку насчет его движка. В общем, С++ протатипы кривые, но я их подогнал как надо.
    На х64 работать движок не будет, это я открыл америку :)
    Вопросы у меня, их 2.
    1)
    Код (Text):
    1. DWORD status = IdpAddReference(&SomeReference,4);
    Я правильно понимаю, SpaceSize это размер референса ?
    2)
    Код (Text):
    1. LONG __stdcall MyVEH(PEXCEPTION_POINTERS e)
    2. {
    3.     //__asm{int 3}
    4.     if(e->ExceptionRecord->ExceptionFlags!=NULL)
    5.     {
    6.         //non continuable exception
    7.         return 0;
    8.     }
    9.     if(e->ExceptionRecord->ExceptionCode==IDP_BREAKPOINT)
    10.     {
    11.        
    12.         return EXCEPTION_CONTINUE_EXECUTION;
    13.     }
    14.     /*if(e->ExceptionRecord->ExceptionCode==IDP_SINGLE_STEP)
    15.     {
    16.     }*/
    17.        
    18.     return 0;
    19. }
    Если я правильно понимаю IDP_BREAKPOINT будет при исключении, после мне нужно заменить на правильный адресс,передать управление на мою функцию перехватчик, и в конце снова заменить референце, на то что поставил движок?
    И еще когда может сработать IDP_SINGLE_STEP?
     
  2. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    #IDP_BREAKPOINT - возникло исключение при доступе к необходимому региону. Контекст изменён для отката фолта(после перезапуска инструкции она успешно отработает). Ip указывает на адрес инструкции вызвавшей фолт.
    #IDP_SINGLE_STEP - после перезапуска инструкции возникнет трассировочный останов. При этом происходит восстановление контекста(селекторов). Ip указывает на следующую инструкцию за той, которая вызвала фолт.

    Например:
    Ip:
    mov eax,dword ptr ds:[eax]
    Ip':

    В Eax должна быть ссылка на регион, допустим из диапазона [0x30000 % 0x31000], пусть 0x30123. Так как она разбита, то в Eax будет 0x123. Происходит обращение к сегменту с нулевой базой: 0:[0x123]. Это приводит к фолту. Двиг получает управление, определяет к какой области памяти произошло обращение, если к [0x30000 % 0x31000], то выбирает заранее созданный дескриптор необходимого сегмента и загружает его селектор в сегментные регистры. Тоесть Ds будет селектором LDT. Далее выполняется нотификация VEH с событием #IDP_BREAKPOINT. После возврата обращение происходит к исходному сегменту: 0x30000:[0x123], после исполнения инструкции возникает трас. останов и двиг вновь получает управление. Он сбрасывает TF и вызывает снова VEH с событием #IDP_SINGLE_STEP.
     
  3. СFF

    СFF PP

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    233
    Спасибо за подробный ответ, буду обрабатывать данные при IDP_SINGLE_STEP, но еще про SpaceSize вопрос остался
     
  4. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Если нужно отслеживать доступ к региону [0x30000 % 0x31000], то размер его SpaceSize = 0x31000 - 0x30000. Это размер структуры адресуемой через ссылку.
     
  5. СFF

    СFF PP

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    233
    Это мне понятно теперь, но зачем целый регион? Ну допустим мне нужен перехват функи, тогда перехват сработает на IDP_SINGLE_STEP, мне вообще не ебет какой размер там региона брать. Главное перехват, непонятно просто зачем вообще тогда нужно SpaceSize
     
  6. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Ip = f(Ptr), не наоборот. Размер нужен для опредедения целевого региона и создания дескриптора для него.
     
  7. СFF

    СFF PP

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    233
    Ладно, короче достал сорсы завтра маны еще почитаю. Надо этот хитрый вопрос изучить. Клерк его на вирустеч рассматривал, правда там уже все подтерли.
     
  8. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Вся суть в равенстве Seg:[Offset] = Offset:[Seg]. Далее логически подумав вы придёте к полному пониманию вопроса.
     
  9. СFF

    СFF PP

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    233
    Кстате тут пример просили по перехвату на с++. Создал свой простой примерчик, лень искать указатель в user32!MessageBox. Вот он:
    Код (Text):
    1. #include <Windows.h>
    2. #include "idp.h"
    3.  
    4. LONG some=0x777;
    5. PLONG RepSome;
    6.  
    7. LONG __stdcall MyVEH(PEXCEPTION_POINTERS e)
    8. {
    9.     //__asm{int 3}
    10.     if(e->ExceptionRecord->ExceptionFlags!=NULL)
    11.     {
    12.         //non continuable exception
    13.         return 0;
    14.     }
    15.     if(e->ExceptionRecord->ExceptionCode==IDP_BREAKPOINT)
    16.     {
    17.         return EXCEPTION_CONTINUE_EXECUTION;
    18.     }
    19.     if(e->ExceptionRecord->ExceptionCode==IDP_SINGLE_STEP)
    20.     {
    21.         //код обработчика
    22.         //__asm{int 3}
    23.         MessageBox(0,L"Catched",0,0);
    24.         return EXCEPTION_CONTINUE_EXECUTION;
    25.     }
    26.        
    27.     return 0;
    28. }
    29.  
    30. VOID Test()
    31. {
    32.     int a = 34;
    33.     a /= *RepSome;
    34.     MessageBox(0,L"End Test()",0,0);
    35. }
    36.  
    37. void main()
    38. {
    39.     IdpInitializeEngine();
    40.     IdpAddVeh(NULL,MyVEH);
    41.  
    42.     RepSome = &some;
    43.     //__asm{int 3}
    44.     DWORD status = IdpAddReference(&RepSome,4);
    45.  
    46.     Test();
    47.  
    48.     IdpRemoveVeh(MyVEH);
    49. }
     
  10. СFF

    СFF PP

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    233
    В двиге ахуеный минус можно захватывать только один указатель
     
  11. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Ну сделайте список указателей, в чём проблема-то? Кстати, КК как-то предлагал использовать старший бит указателя в качестве признака невалидности: обращение по ядерным адресам из лузер-мода будет также вызывать исключение, но отпадает необходимость хранить сам указатель. Клерку респекты конечно за техники.
     
  12. СFF

    СFF PP

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    233
    Ну думаю придется сделать
     
  13. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    19841204
    Ну так коммент свой восстанови, а то хрень конечно получается с редактированием..
     
  14. СFF

    СFF PP

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

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    19841204
    то есть? В текущей реализации есть возможность перехватить сразу несколько АПИ функция?

    И вопрос к Клерку или КристалИС.
    Планируется порт под х64 системы? Насколько тяжело будет портануть под них?
    А то твой загрузчик длл из памяти помниться портил, было все нормально - возможно и IDP можно портануть?
     
  16. СFF

    СFF PP

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    233
    Нету там одно и тоже смещение выдается.
     
  17. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    19841204
    прототипы то новые положи!?)
     
  18. СFF

    СFF PP

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    233
    На
     
  19. punxer

    punxer Андрей

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

    punxer Андрей

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

    Код (Text):
    1. VOID Test(IN DWORD param1, IN DWORD param2)
    2. {
    3.     int a = 34;
    4.     a /= *RepSome;
    5.     MessageBox(0,L"End Test()",0,0);
    6. }
    а если допустим такой код
    как добраться до параметров тут?
    Код (Text):
    1.     if(e->ExceptionRecord->ExceptionCode==IDP_SINGLE_STEP)
    2.     {
    3.         //код обработчика
    4.         //__asm{int 3}
    5.         MessageBox(0,L"Catched",0,0);
    6.         return EXCEPTION_CONTINUE_EXECUTION;
    7.     }