Трассировка

Тема в разделе "WASM.WIN32", создана пользователем fadday, 28 июл 2009.

  1. fadday

    fadday New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2009
    Сообщения:
    63
    Доброе время суток. Возник вопрос по трассировке процессов. "Написал" следующий код...
    Код (Text):
    1. .data
    2.  
    3. ofn          OPENFILENAME <>
    4. FilterString db "Exe files",0,"*.exe",0
    5. step         dd 0h
    6. fb           dword 0h
    7. combuffer    dword 0h
    8. bRead        dword 0h
    9. fbuffer      dword 0h
    10. eip_         dword 0h
    11.  
    12. .data?
    13. ho         dword ?
    14. buffer     db 512 dup (?)
    15. startinfo  STARTUPINFO <>
    16. pi         PROCESS_INFORMATION <>
    17. DBEvent    DEBUG_EVENT <>
    18. align dword
    19. tCont CONTEXT <>
    20.  
    21. .code
    22.     start:
    23.  
    24.         mov ofn.lStructSize, sizeof ofn
    25.         mov ofn.lpstrFilter, offset FilterString
    26.         mov ofn.lpstrFile,   offset buffer
    27.         mov ofn.nMaxFile,    512
    28.         mov ofn.Flags,       OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or \
    29.                              OFN_EXPLORER or OFN_HIDEREADONLY
    30.  
    31.         invoke AllocConsole
    32.        
    33.         invoke GetOpenFileName, offset ofn
    34.  
    35.         .if eax!=TRUE
    36.             jmp Exit
    37.         .endif
    38.        
    39.         invoke GetStartupInfo, offset startinfo
    40.         invoke CreateProcess,  offset buffer, NULL, NULL, NULL, FALSE, DEBUG_PROCESS,\
    41.                                    NULL, NULL, offset startinfo, offset pi
    42.  
    43.         .while TRUE
    44.  
    45.             invoke WaitForDebugEvent, offset DBEvent, INFINITE
    46.  
    47.                 .if DBEvent.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT
    48.                     print "--Proc Exit", 0ah
    49.                     .break
    50.  
    51.                 .elseif DBEvent.dwDebugEventCode == CREATE_PROCESS_DEBUG_EVENT
    52.  
    53.                     mov eax, DBEvent.u.CreateProcessInfo.hFile
    54.                     push eax
    55.                     print "hFile   : "
    56.                     pop eax
    57.                     print uhex$(eax), 0ah
    58.                    
    59.                     mov eax, DBEvent.u.CreateProcessInfo.hProcess
    60.                     push eax
    61.                     print "hProcess: "
    62.                     pop eax
    63.                     print uhex$(eax), 0ah
    64.  
    65.                     mov eax, DBEvent.u.CreateProcessInfo.hThread
    66.                     push eax
    67.                     print "hThread : "
    68.                     pop eax
    69.                     print uhex$(eax), 0ah
    70.  
    71.                     mov eax, DBEvent.u.CreateProcessInfo.lpStartAddress
    72.                     push eax
    73.                     print "startAdd: "
    74.                     pop eax
    75.                     print uhex$(eax), 0ah
    76.  
    77.                     invoke ContinueDebugEvent, DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_CONTINUE
    78.                     .continue
    79.                              
    80.                 .elseif DBEvent.dwDebugEventCode == EXCEPTION_DEBUG_EVENT
    81.                
    82.                     .if DBEvent.u.Exception.pExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT
    83.                        
    84.                         mov tCont.ContextFlags, CONTEXT_CONTROL
    85.                         invoke GetThreadContext, pi.hThread, addr tCont
    86.                         or tCont.regFlag, 100h
    87.                         invoke SetThreadContext, pi.hThread, offset tCont
    88.                        
    89.                         invoke ContinueDebugEvent, DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_CONTINUE
    90.                         .continue
    91.                            
    92.                     .elseif DBEvent.u.Exception.pExceptionRecord.ExceptionCode == EXCEPTION_SINGLE_STEP
    93.  
    94.                         inc step
    95.                            
    96.                         print str$(step)," --- eip:"
    97.                         print uhex$(tCont.regEip),0ah                
    98.                
    99.                         mov tCont.ContextFlags, CONTEXT_CONTROL
    100.                        
    101.                         invoke GetThreadContext, pi.hThread, addr tCont
    102.                         or tCont.regFlag, 100h
    103.                            
    104.                         invoke SetThreadContext, pi.hThread, offset tCont
    105.                            
    106.                         invoke ContinueDebugEvent, DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_CONTINUE
    107.                         .continue
    108.                            
    109.                     .endif
    110.                 .endif
    111.                 invoke ContinueDebugEvent, DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_EXCEPTION_NOT_HANDLED
    112.                 .continue
    113.     .endw
    114.  
    115.     mov ebx,input("Exit...")
    116.  
    117.     Exit:
    118.             invoke ExitProcess, 0
    119.     end start
    Трассировка, насколько я понимаю, начинается с организации окружения процесса, загрузки Dll и т.п., и заканчивается на точке входа в программу. А как трассировать саму программу? Или я явно что то недопонимаю...Спасибо
     
  2. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    ResumeThread
     
  3. fadday

    fadday New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2009
    Сообщения:
    63
    То есть я не тот тред трассирую?
     
  4. fadday

    fadday New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2009
    Сообщения:
    63
    Я пытался перехватить создание треда программы, но блин все уходит в глубокий завис.
     
  5. Ox8BFF55

    Ox8BFF55 New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2009
    Сообщения:
    181
    В принципе все делаете правильно.

    Если вы ходите пошаговую трасировку сделать то надо ставить break на выполнения следующих команд(int 3, СС, или моно hardware breakpoint)

    Стандартное api для дебагинга
    http://msdn.microsoft.com/en-us/library/ms679303(VS.85).aspx
    Можно почитать Робинсона "Отладка приложения для .net и Windows"
    И посмотреть Статью "Об упаковщиках в последний раз" часть 3
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Ox8BFF55
    Трассировка исполняется аппаратно посредством 8-го бита регистра флагов. Точки останова ставятся если нужно пропустить некоторый код, например пропустить процедуру.
    Что понимать под программой ?
    Загрузчик это программа, в статически прилинкованных модулях тоже пользовательский код может быть, который есчо до начала исполнения основного экзешника будет выполнен, или например тлс..
     
  7. fadday

    fadday New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2009
    Сообщения:
    63
    Понимать код с первого байта точки входа)
     
  8. fadday

    fadday New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2009
    Сообщения:
    63
    Спасибо за точный пинок в нужном направлении)
     
  9. fadday

    fadday New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2009
    Сообщения:
    63
    Еще маленько поленюсь...то есть здесь трассируется код загрузчика? Который потом создает другой тред, создание которого надо перехватывать?
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Любой юзермодный тред начинается с доставки ядерной апк, для которой контекст пользовательский, для обоих колец защиты рулит редирект на диспетчер исключений посредством трассировки(взвод TF), либо блокирование страницы(страница памяти в которой находится [KeUserApcDispatcher] помечается как сторожевая(GUARD)).
     
  11. Wizard109

    Wizard109 New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    346
    Clerk
    Эт ты борщанул :)
    Тип от нечего делать одну и ту же фразу пишет. Есть все шансы что ты задавил бота интеллектом :)