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

Discussion in 'WASM.RESEARCH' started by СFF, Nov 3, 2010.

  1. СFF

    СFF PP

    Blog Posts:
    0
    Joined:
    Jan 16, 2009
    Messages:
    233
    Хотел обратиться к Клерку насчет его движка. В общем, С++ протатипы кривые, но я их подогнал как надо.
    На х64 работать движок не будет, это я открыл америку :)
    Вопросы у меня, их 2.
    1)
    Code (Text):
    1. DWORD status = IdpAddReference(&SomeReference,4);
    Я правильно понимаю, SpaceSize это размер референса ?
    2)
    Code (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

    Blog Posts:
    0
    Joined:
    Jul 26, 2008
    Messages:
    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

    Blog Posts:
    0
    Joined:
    Jan 16, 2009
    Messages:
    233
    Спасибо за подробный ответ, буду обрабатывать данные при IDP_SINGLE_STEP, но еще про SpaceSize вопрос остался
     
  4. CrystalIC

    CrystalIC New Member

    Blog Posts:
    0
    Joined:
    Jul 26, 2008
    Messages:
    500
    Если нужно отслеживать доступ к региону [0x30000 % 0x31000], то размер его SpaceSize = 0x31000 - 0x30000. Это размер структуры адресуемой через ссылку.
     
  5. СFF

    СFF PP

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

    CrystalIC New Member

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

    СFF PP

    Blog Posts:
    0
    Joined:
    Jan 16, 2009
    Messages:
    233
    Ладно, короче достал сорсы завтра маны еще почитаю. Надо этот хитрый вопрос изучить. Клерк его на вирустеч рассматривал, правда там уже все подтерли.
     
  8. CrystalIC

    CrystalIC New Member

    Blog Posts:
    0
    Joined:
    Jul 26, 2008
    Messages:
    500
    Вся суть в равенстве Seg:[Offset] = Offset:[Seg]. Далее логически подумав вы придёте к полному пониманию вопроса.
     
  9. СFF

    СFF PP

    Blog Posts:
    0
    Joined:
    Jan 16, 2009
    Messages:
    233
    Кстате тут пример просили по перехвату на с++. Создал свой простой примерчик, лень искать указатель в user32!MessageBox. Вот он:
    Code (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

    Blog Posts:
    0
    Joined:
    Jan 16, 2009
    Messages:
    233
    В двиге ахуеный минус можно захватывать только один указатель
     
  11. 7mm

    7mm New Member

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

    СFF PP

    Blog Posts:
    0
    Joined:
    Jan 16, 2009
    Messages:
    233
    Ну думаю придется сделать
     
  13. 7mm

    7mm New Member

    Blog Posts:
    0
    Joined:
    Dec 15, 2009
    Messages:
    442
    19841204
    Ну так коммент свой восстанови, а то хрень конечно получается с редактированием..
     
  14. СFF

    СFF PP

    Blog Posts:
    0
    Joined:
    Jan 16, 2009
    Messages:
    233
    Полная хрень надо мой комент удалить, а нельзя блин
     
  15. ziral2088

    ziral2088 New Member

    Blog Posts:
    0
    Joined:
    Aug 16, 2009
    Messages:
    283
    19841204
    то есть? В текущей реализации есть возможность перехватить сразу несколько АПИ функция?

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

    СFF PP

    Blog Posts:
    0
    Joined:
    Jan 16, 2009
    Messages:
    233
    Нету там одно и тоже смещение выдается.
     
  17. punxer

    punxer Андрей

    Blog Posts:
    0
    Joined:
    Oct 16, 2006
    Messages:
    1,327
    Location:
    Ржев
    19841204
    прототипы то новые положи!?)
     
  18. СFF

    СFF PP

    Blog Posts:
    0
    Joined:
    Jan 16, 2009
    Messages:
    233
    На
     
  19. punxer

    punxer Андрей

    Blog Posts:
    0
    Joined:
    Oct 16, 2006
    Messages:
    1,327
    Location:
    Ржев
    19841204
    Thanks
     
  20. punxer

    punxer Андрей

    Blog Posts:
    0
    Joined:
    Oct 16, 2006
    Messages:
    1,327
    Location:
    Ржев
    ок, с работой и применением разобрались хоть и смутно.
    самый главный минус- один референс

    Code (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. }
    а если допустим такой код
    как добраться до параметров тут?
    Code (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.     }