Трассировка с адреса с помощью SEH or VEH

Тема в разделе "WASM.WIN32", создана пользователем punxer, 21 июн 2010.

  1. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    Да, когда надоест трассировать, то сбросить TF.
     
  2. punxer

    punxer Андрей

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

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Теперь вопрос как с по помощью сех и вех обработать этот экзепшн?
    сех:
    Код (Text):
    1. __except(GetExceptionCode() == STATUS_SINGLE_STEP)
    а вех

    также (GetExceptionCode() )?
     
  4. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    Вам необходимо ознакомиться со статьей по VEH/msdn. Там есть прототип хендлера.
    Код (Text):
    1. LONG CALLBACK VectoredHandler(
    2.   __in  PEXCEPTION_POINTERS ExceptionInfo
    3. );
    ExceptionInfo->ExceptionRecord->ExceptionCode.
     
  5. punxer

    punxer Андрей

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

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    любой маленький рабочий исходник и все. дальше я сам разберусь.
     
  7. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    вот, на fasm-е, выводит на консоль адреса, на которых останавливается(трассировка через SEH с пропуском call-ов):
    Код (Text):
    1. format PE console
    2. entry start
    3. include 'win32a.inc'
    4.  
    5. SIZE_OF_80387_REGISTERS          = 80
    6. MAXIMUM_SUPPORTED_EXTENSION      = 512
    7.  
    8. struct FLOATING_SAVE_AREA
    9.   ControlWord   dd      ?
    10.   StatusWord    dd      ?
    11.   TagWord       dd      ?
    12.   ErrorOffset   dd      ?
    13.   ErrorSelector dd      ?
    14.   DataOffset    dd      ?
    15.   DataSelector  dd      ?
    16.   RegisterArea  db  SIZE_OF_80387_REGISTERS dup(?)
    17.   Cr0NpxState   dd      ?
    18. ends
    19.  
    20. struct CONTEXT
    21.   ContextFlags  dd      ?
    22.   iDr0          dd      ?
    23.   iDr1          dd      ?
    24.   iDr2          dd      ?
    25.   iDr3          dd      ?
    26.   iDr6          dd      ?
    27.   iDr7          dd      ?
    28.   FloatSave     FLOATING_SAVE_AREA <>
    29.   regGs         dd      ?
    30.   regFs         dd      ?
    31.   regEs         dd      ?
    32.   regDs         dd      ?
    33.   regEdi        dd      ?
    34.   regEsi        dd      ?
    35.   regEbx        dd      ?
    36.   regEdx        dd      ?
    37.   regEcx        dd      ?
    38.   regEax        dd      ?
    39.   regEbp        dd      ?
    40.   regEip        dd      ?
    41.   regCs         dd      ?
    42.   regFlag       dd      ?
    43.   regEsp        dd      ?
    44.   regSs         dd      ?
    45.   ExtendedRegisters db MAXIMUM_SUPPORTED_EXTENSION dup(?)
    46. ends
    47.  
    48. section 'qweasd' readable writeable executable
    49. data import
    50. library kernel32,'kernel32.dll'
    51. include 'api\kernel32.inc'
    52. end data
    53.  
    54. k32 db 'kernel32.dll',0
    55.  
    56. start:
    57.  
    58. invoke GetStdHandle,STD_OUTPUT_HANDLE
    59. mov [_out],eax
    60.  
    61. push 0
    62. push handler
    63. push dword [fs:0]
    64. mov [fs:0],esp
    65.  
    66. push k32
    67. int3
    68. call [GetModuleHandleA]
    69.  
    70. pop dword [fs:0]
    71. add esp,8
    72.  
    73. invoke GetStdHandle,STD_INPUT_HANDLE
    74. push eax
    75. mov edx,esp
    76. invoke ReadConsoleA,eax,0,0,edx,0
    77. pop eax
    78.  
    79. retn
    80.  
    81. handler:;[ebp+8]=exception record;[ebp+12]=establisher frame;[ebp+16]=context;[ebp+20]=dispatcher context
    82. push ebp
    83. mov ebp,esp
    84.  
    85. mov edx,[ebp+16];context
    86. or [edx+CONTEXT.regFlag],100h;взводим TF
    87.  
    88. test [edx+CONTEXT.iDr6],1;сработала hadrware breakpoint (выход из call-а)
    89. je .nohardware
    90.  
    91. and [edx+CONTEXT.iDr7],0;очищаем регистр управления отладкой
    92.  
    93. .nohardware:
    94.  
    95. and [edx+CONTEXT.iDr6],0;очищаем регистр состояния отладки
    96. mov eax,[ebp+12];establisher frame
    97. cmp dword [eax+8],0;останов внутри функции(=1)?
    98. je .noincall
    99.  
    100. dec dword [eax+8];следующий останов-после выхода из функции
    101.  
    102. mov eax,[edx+CONTEXT.regEsp];запись адреса возврата в Dr0
    103. push dword [eax]
    104. pop [edx+CONTEXT.iDr0]
    105.  
    106. mov [edx+CONTEXT.iDr7],1 or (0 shl 17) or (0 shl 19);включение локальной точки останова 0 (размер=1байт останов при исполнении)
    107.  
    108. and [edx+CONTEXT.regFlag],not 100h;сбрасываем TF
    109.  
    110. xor eax,eax;возврат=0
    111. leave
    112. retn
    113.  
    114. .noincall:
    115.  
    116. mov eax,[ebp+8];exception record
    117. cmp dword [eax],EXCEPTION_BREAKPOINT;останов на int3(CCh)
    118. jne .nobreak
    119.  
    120. inc [edx+CONTEXT.regEip];пропускаем int3
    121.  
    122.  
    123. xor eax,eax;возврат=0
    124. leave
    125. retn
    126.  
    127. .nobreak:
    128. cmp dword [eax],EXCEPTION_SINGLE_STEP;останов из-за TF или hardware
    129. je .single_step
    130.  
    131. and [edx+CONTEXT.regFlag],not 100h;сбрасываем TF
    132.  
    133. xor eax,eax;возврат=1(передаём управление следующему обработчику)
    134. inc eax
    135.  
    136. leave
    137. retn
    138.  
    139. .single_step:
    140. pusha;здесь вывод адреса интрукции (для примера)
    141.  
    142. mov eax,[edx+CONTEXT.regEip]
    143. mov ebx,16
    144. mov edi,the_str
    145. call IntToStr
    146.  
    147. invoke lstrlenA,the_str
    148. mov ebx,eax
    149. mov word [ebx+the_str],0A0Dh
    150. add ebx,2
    151.  
    152. push eax
    153. mov edx,esp
    154. invoke WriteConsoleA,[_out],the_str,ebx,edx,0
    155. pop eax
    156.  
    157. cld
    158. mov ecx,ebx
    159. mov edi,the_str
    160. xor al,al
    161. rep stosb
    162.  
    163. popa
    164. mov eax,[edx+CONTEXT.regEip];возврат из функции?
    165. cmp byte [eax],0C3h
    166. jne .noret0
    167.  
    168. and [edx+CONTEXT.regFlag],not 100h;сбрасываем TF
    169.  
    170. xor eax,eax;возврат=0
    171. leave
    172. retn
    173.  
    174. .noret0:
    175. cmp byte [eax],0C2h;возврат из функции?
    176. jne .noretn
    177.  
    178. and [edx+CONTEXT.regFlag],not 100h;сбрасываем TF
    179.  
    180. xor eax,eax;возврат=0
    181. leave
    182. retn
    183.  
    184. .noretn:
    185. cmp byte [eax],0E8h;вызов? call near
    186. je .call
    187. cmp byte [eax],0FFh
    188. jne .nocall
    189.  
    190. mov al,[eax+1];call r/m32 ?
    191. and al,00111000b
    192. cmp al,2 shl 3
    193. jne .nocall
    194.  
    195. .call:
    196.  
    197. mov eax,[ebp+12];establisher frame
    198. inc dword [eax+8];следующий останов-внутри функции
    199.  
    200. .nocall:
    201. xor eax,eax;возврат=0
    202. leave
    203. retn
    204.  
    205. IntToStr:
    206. ; eax = number, ebx = base, edi = buffer
    207. push    ecx edx
    208. xor ecx,ecx
    209.   .new:
    210. xor edx,edx
    211. div ebx
    212. push    edx
    213. inc ecx
    214. test    eax,eax
    215. jnz .new
    216.  .loop:
    217. pop eax
    218. add al,30h
    219. cmp al,'9'
    220. jng .ok
    221. add al,7  
    222.  .ok:
    223. stosb
    224. loop    .loop
    225. mov al,0
    226. stosb
    227. pop edx ecx
    228. ret
    229.  
    230. _out dd ?
    231. the_str db 256 dup (?)
     
  8. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    сложно для понимания. Может кто нить набросать на СИ. Плиз. Что то подобное.
    qwe8013 Зачем дебаг регистры?
     
  9. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    "Если у человека нет головы, ему не нужна и шляпа." © Туве Янссон.

    Что сложного в том, чтобы поставить и обработать __asm int 3;? Какие проблемы с установкой TF в CONTEXT.EFlags?
     
  10. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    чтобы не трассировать те функции, которые вызывает внутри себя трассируемая функция.
    Вобщем ставим hardware бряк на следующую инструкцию после call-а,сбрасываем TF, после чего следующий останов
    происходит там, куда указывает Dr0.
     
  11. punxer

    punxer Андрей

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

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Маршаллинг - один из способов трассировки кода, при котором число исключений минимально (c).
    Реализуется исходя из понятия цепочки стековых фреймов(Stack Frame Chain). Вводятся несколько методов обработки исключений, при которых следующее исключение отлаживается. Это например TraceInto как в отладчиках - выполняется процедурное ветвление, после чего адрес возврата захватывается и сохраняется в TLS. Бактрейс с захватом адреса возврата и пр. Хардварные брейки применяться не должны.
     
  13. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    Clerk

    А как тогда остановиться после вызова процедуры не ставя бряк на адрес возврата (из неё)?
     
  14. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
  15. punxer

    punxer Андрей

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

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    wsd
    Одним термином могут описываться различные понятия. Старый глупый троллинг.
     
  17. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Clerk
    просто не надо называть новые понятия хорошо известными терминами, обозначающими
    совсем другое)
     
  18. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    wsd
    Не вам решать. Те термины что я ввёл останутся. Не нравится не читайте. Думаю начать одну доку писать, сделаю приватной, ибо нефиг придираться к терминам :P
     
  19. IceCrashLdr

    IceCrashLdr New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2010
    Сообщения:
    193
    THREAD#1(Трасируемый)
    CreateThread(, SetTFFlagAndGo, );
    SuspendThread(GetCurrentThread())

    THREAD#2
    void
    SetTFFlagAndGo()
    {
    SetThreadContext();
    ResumeThread();
    }

    void * address = &function_tracerter;
    __try {
    __asm {
    goto address;
    }
    }
    __catch(EXCEPTION_POINTERS )
    {
    address = ExceptionAddress; // ExceptionAddress из EXCEPTION_POINTERS
    }

    void
    function_tracerter()
    {
    ///
    // Трассируемый код
    //
    }

    Вот только что бы ни кто не поюзал, SEH. В частности safe crt, ну и конечно всякие InitialzieCriticalSection
     
  20. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Clerk
    не надо приватной!
    придираться к терминам больше не буду, честно-честно