Сейчас на форуме: hgdagon, asfa, bartolomeo (+6 невидимых) |
![]() |
eXeL@B —› Программирование —› Помогите новичку, я не умею трассировать программы! |
Посл.ответ | Сообщение |
|
Создано: 07 ноября 2006 02:52 · Личное сообщение · #1 Вобщем дело обстоит так, пишу сейчас мини-отладчик(на асме с использованием "Ap0x Unpack Engine"), так вот не могу понять как можно реализовать там функцию трассировки программы, ну что-то типа: Trace proto: :DWORD Trace proc Times:DWORD pushad Some Code popad ret Trace endp Так вот проблема в том, каким макаром это дело реализовать? Переменная Times должна отвечать за количество раз сколько трассировать(типа нажимать на F7 или F8 в Оле). ![]() ----- все багрепорты - в личные сообщения ![]() |
|
Создано: 07 ноября 2006 05:11 · Личное сообщение · #2 |
|
Создано: 07 ноября 2006 10:06 · Личное сообщение · #3 |
|
Создано: 07 ноября 2006 15:09 · Личное сообщение · #4 В твоем SDK слишком много букв и не у всех есть время его смотреть и тем более за тебя писать то, что тебе надо!? Так что буду отталкиваться от написанного товарищами! В отладчике останавливаемся на системном бряке и смотрим память процесса в WinHEX. Переходим на EP и видим, стоит 0ССh естественно в WinHEX в отладчике будет нормальный код, делаем выводы сами, почему так происходит. Запускаем отладчик и останавливаемся на этом EP, где было до запуска 0CCh Смотрим опять память процесса в WinHEX И видим 0CCh, уже нет, жмем F7 и опять смотрим память процесса в WinHEX, видим, 0CCh нет. Значит отладчик при “трассировки” 0CCh не применяет! Берем чистую Олю и что мы видим: Адрес и код начала “трассировки F7” 00433D1D push 0 ; case 0x89D 00433D1F call _Animate ; Call Procedure 00433D24 pop ecx 00433D25 push 1 00433D27 push 0 00433D29 push 3 00433D2B push 0 00433D2D push 0 00433D2F call _Go ; Call Procedure 00433D34 add esp, 14h 00433D37 jmp loc_434212 Дальше методом анализа… используем готовый и полностью рабочий код – ИМХО P. S. Кто не согласен доказательство в студию!!! ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com ![]() |
|
Создано: 07 ноября 2006 16:15 · Личное сообщение · #5 Demon666 стоп, насколько я знаю есть три способа трассировки: 1) software breakpoint - 0xCC 2) hardware breakpoint 3) int 1 1) и 3) делаются очень просто из ring3 - ты получаешь EXCEPTION_BREAKPOINT или EXCEPTION_SINGLE_STEP от debug api. Кста, про твоё заявление "смотрим память процесса в WinHEX, видим, 0CCh нет" это значение будет в начале след. инструкции долю секунды, пока исполняется инструкция и не случится exception. Как только он случается, отладчик сразу меняет байт на который показывает EIP на оригинальное значение. P.S. если конечно оля использует int3 для реализации F7/F8. ![]() |
|
Создано: 07 ноября 2006 18:52 · Личное сообщение · #6 s0larian пишет: Кста, про твоё заявление "смотрим память процесса в WinHEX, видим, 0CCh нет" это значение будет в начале след. инструкции долю секунды, пока исполняется инструкция и не случится exception. Как только он случается, отладчик сразу меняет байт на который показывает EIP на оригинальное значение. Сейчас по CRC32 проверил точно(!) лепит именно 0CCh “на доли секунды”. P. S. Проверял на F8 ![]() ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com ![]() |
|
Создано: 07 ноября 2006 21:33 · Личное сообщение · #7 |
|
Создано: 07 ноября 2006 22:04 · Личное сообщение · #8 StepInto делается либо выставлением Trap флага, либо выставлением трассировочного бита в DR7 регистре. StepOver делается с помощью дизассемблера, проверяются префиксы повторения и всякие call и если совподает, то ставим либо HardWare breakpoint либо INT3 (CC). ВСЁ это легко делается из ring3. ЗЫ Каждый раз лепить бряк на следующюю команду нельзя, иначе мы просто проскочем какой нибудь JCC. ----- Yann Tiersen best and do not fuck ![]() |
|
Создано: 08 ноября 2006 08:03 · Личное сообщение · #9 PE_Kill пишет: проверяются префиксы повторения и всякие call и если совподает, то ставим либо HardWare breakpoint либо INT3 (CC). Да-да именно после call Оля и пихает 0CCh ![]() PE_Kill Ты, наверное, исследовал “трассировку” в Оли, если да(?) то respect! ;) А где автор? Вот, блин, привычка запостил и соскочил. ![]() ![]() P. S. Наверно через месяц появитццо. ![]() ![]() ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com ![]() |
|
Создано: 08 ноября 2006 11:43 · Личное сообщение · #10 |
|
Создано: 09 ноября 2006 00:27 · Личное сообщение · #11 Demon666 пишет: Наверно через месяц появитццо Неправда! Просто я не могу понять метод, предложенный Demon666 - сочетать отладчик и WinHEX... я просто другими хекс-редакторами пользуюсь... и вообще мне кажется, что алгоритм должен быть рекурсивным... Кто-нибудь смотрел мой код? Я там использовал функцию "DebugStep" для трассировки. Как можно вернуться к основному коду после: call DebugStep call [DebugLoopAddr] "Основной код" ----- все багрепорты - в личные сообщения ![]() |
|
Создано: 09 ноября 2006 01:02 · Личное сообщение · #12 |
|
Создано: 09 ноября 2006 01:09 · Личное сообщение · #13 |
|
Создано: 09 ноября 2006 01:10 · Личное сообщение · #14 |
|
Создано: 09 ноября 2006 08:09 · Личное сообщение · #15 PE_Kill пишет: я ничего не исследовал, просто сам писал отладчик... PE_Kill Ну, тогда два вопроса, если не займет много времени, сильно интересно!? 1. Какая причина была написать свой отладчик? 2. Какие статьи читались (ведь начало-то было? (мы не рождены, чтобы все сразу знать)), для того чтобы грамотно организовать работу своего отладчика, ну и на каком языке программирования писался отладчик!? ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com ![]() |
|
Создано: 09 ноября 2006 09:10 · Поправил: Hellspawn · Личное сообщение · #16 |
|
Создано: 09 ноября 2006 09:13 · Личное сообщение · #17 |
|
Создано: 09 ноября 2006 12:04 · Личное сообщение · #18 Hellspawn Да-да, конечно, спасибо! Сорс никогда лишним не бывает, особенно если там можно увидеть грамотную оптимизацию кода, ну и дакучи Delphi, если на чистом API! s0larian Спасибо, но у меня есть MSDN ;) Причина была задать такие вопросы, потому что пишет очень интересно ну и самое главное оригинально! Особенно после: PE_Kill пишет: Ну как как, внук как то плакал, что "игра больше не играет" ну я ипостарался помоч, вот и помог P. S. ???! ![]() ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com ![]() |
|
Создано: 09 ноября 2006 12:29 · Личное сообщение · #19 вот держи ![]() ![]() ----- [nice coder and reverser] ![]() |
|
Создано: 09 ноября 2006 23:50 · Личное сообщение · #20 Все статья которыми я пользовался я уже выкладывал на форуме, да и тема такая уже была поищи. Demon666 пишет: Какая причина была написать свой отладчик? Нужен был быстрый отладчик, задумывался как ядро для распаковки, используется в моем распаковщике ASPack full reconstruct, там еще альфа версия помоему. Писал на Delphi с VCL ибо тут на размер насрать, и грамотный отладчик без OOP хер напишешь ИМХО, первый я писал на Delphi без VCL, потом запутался в коде и грохнул его, потом написал всё с нуля и оформил классом, теперь всё просто... ----- Yann Tiersen best and do not fuck ![]() |
|
Создано: 10 ноября 2006 00:44 · Личное сообщение · #21 Hellspawn, спасибо, будем разбираццо... Может кто ещё подскажет... есть тут у меня сорсы Алекса(Трейсер), хотя вполне подойдёт иксзелионовский трейсер. Так вот там проблема при трассировке, если в коде есть IsDebuggerPresent, то такой трейсер-отладчик негодится, поэтому я как самый большой лентяй на свете и взял Ap0x SDK ----- все багрепорты - в личные сообщения ![]() |
![]() |
eXeL@B —› Программирование —› Помогите новичку, я не умею трассировать программы! |