#&1^#@5, отладка

Тема в разделе "WASM.WIN32", создана пользователем AndreyMust19, 10 фев 2009.

  1. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    пи%#"?ый WinAPI, е@$#ь!!!
    Задо%$@лся я уже писать отладчик.

    Все win-отладчики умеют останавливать процесс. Наверняка они это делают усыпляя все потоки (потому что DebugActiveProcessStop есть только в WinXP).

    Надо уметь усыплять и будить все потоки.
    Можно узнать список всех потоков отлаживаемого приложения через тулхелп, но в API нет ф-ии, которой можно было открыть поток по его ID.
    При создании нового потока система его открывает и возвращает через DEBUG_EVENT его хэндл. Поэтому можно создать динамический список потоков. А вот при завершении потока API не возвращает его хэндла - невозможно узнать - какой поток закончился и выбросить его из списка.
    Вот и спрашивается - как усыпить потоки и потом их разбудить. Неужели процесс НИКАК не может усыпить потоки другого процесса? Придется внедрять туда код и создавать удаленный поток?
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    AndreyMust19
    Смотри:
    Код (Text):
    1. 00590A3F _NtSuspendProcess@4              mov edi,edi
    2. 00590A41                                  push ebp
    3. 00590A42                                  mov ebp,esp
    4. 00590A44                                  push ecx
    5. 00590A45                                  push esi
    6. 00590A46                                  mov eax,dword ptr fs:[124]
    7. 00590A4C                                  mov al,byte ptr ds:[eax+140]
    8. 00590A52                                  push 0
    9. 00590A54                                  mov byte ptr ss:[ebp-4],al
    10. 00590A57                                  lea eax,dword ptr ss:[ebp+8]
    11. 00590A5A                                  push eax
    12. 00590A5B                                  push dword ptr ss:[ebp-4]
    13. 00590A5E                                  push dword ptr ds:[493658]
    14. 00590A64                                  push 800
    15. 00590A69                                  push dword ptr ss:[ebp+8]
    16. 00590A6C                                  call ntoskrnl.ObReferenceObjectByHandle
    17. 00590A71                                  mov esi,eax
    18. 00590A73                                  test esi,esi
    19. 00590A75                                  jl short ntoskrnl.00590A89
    20. 00590A77                                  push dword ptr ss:[ebp+8]
    21. 00590A7A                                  call ntoskrnl._PsSuspendProcess@4
    22. 00590A7F                                  mov ecx,dword ptr ss:[ebp+8]
    23. 00590A82                                  mov esi,eax
    24. 00590A84                                  call ntoskrnl.ObfDereferenceObject
    25. 00590A89                                  mov eax,esi
    26. 00590A8B                                  pop esi
    27. 00590A8C                                  leave
    28. 00590A8D                                  ret 4
    Далее:
    Код (Text):
    1. 00590903 _PsSuspendProcess@4              mov edi,edi
    2. 00590905                                  push ebp
    3. 00590906                                  mov ebp,esp
    4. 00590908                                  push ebx
    5. 00590909                                  push edi
    6. 0059090A                                  mov edi,dword ptr ss:[ebp+8]
    7. 0059090D                                  lea ebx,dword ptr ds:[edi+80]
    8. 00590913                                  mov ecx,ebx
    9. 00590915                                  call ntoskrnl.ExAcquireRundownProtection
    10. 0059091A                                  test al,al
    11. 0059091C                                  je short ntoskrnl.00590944
    12. 0059091E                                  push esi
    13. 0059091F                                  push 0
    14. 00590921                                  jmp short ntoskrnl.0059092C
    15. 00590923                                  /push 0
    16. 00590925                                  |push esi
    17. 00590926                                  |call ntoskrnl._PsSuspendThread@8
    18. 0059092B                                  |push esi
    19. 0059092C                                   push edi
    20. 0059092D                                  |call ntoskrnl._PsGetNextProcessThread@8
    21. 00590932                                  |mov esi,eax
    22. 00590934                                  |test esi,esi
    23. 00590936                                  \jnz short ntoskrnl.00590923
    24. 00590938                                  mov ecx,ebx
    25. 0059093A                                  call ntoskrnl.ExReleaseRundownProtection
    26. 0059093F                                  xor eax,eax
    27. 00590941                                  pop esi
    28. 00590942                                  jmp short ntoskrnl.00590949
    29. 00590944                                  mov eax,C000010A
    30. 00590949                                  pop edi
    31. 0059094A                                  pop ebx
    32. 0059094B                                  pop ebp
    33. 0059094C                                  ret 4
    Тоесть сервис NtSuspendProcess перечисляет все потоки в процессе и суспендит их; далее чтобы вывести один потоков из спящего состояния можно выполнить NtResumeThread, никаких конфликтов с этим нет.
    Насчёт отладчика - можешь забыть про дебугапи, поток вызвавший NtContinue, NtRaiseException или NtSetContextThread выйдет из под отладки, далее он может отключить твой отладчик от своего процесса(NtRemoveProcessDebug) и будет выполняться уже вне отладчика, ИМХО из юзермода подобное словить невозможно :)
     
  3. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    А где мне найти описание ядерных функций?
     
  4. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    NtSuspendProcess и PsSuspendProcess есть только в WinXP. Есть чего-нибудь для совместимости с более ранними системами?
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Описание нативапи тут:
    http://openfile.ru/200609/
    Если не подходит, то делай слепок(системинфо) и перечисляй потоки и вручную суспенди :dntknw:
    Кстати вот скомпилел тестовый пример. Не используется ThreadHideFromDebugger(он тут не нужен)..
    > Не имеет значения трассировка, после вызова первого прерывания поток выйдет из под трассировки.
    > Отключает отладчик; далее завершение отладчика никак не скажется на процессе.
     
  6. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Фу, кое-как работает.
    Отладочный поток (тот, который начал отладку) не попадает в другие cpp-файлы. То есть он только занимается отладкой, а с интерфейсом общается посредством флажков (событий).
    Пока текущая версия умеет следующее:
    1) Начинать / заканчивать отладку
    2) Интерфейс отладчика может заморозить процесс / разморозить его
    Выкладываю проект кому интересно.
    Просьба - советовать по поводу внутреннего устройства dbg_core.cpp. Хочется сделать так, чтобы интерфейс программы (Main.cpp) и отладчик (dbg_core.cpp) были разъединены и интерфейс приказывал отладчику что-то сделать, вызывая его функции, а отладчик сообщал ему о событиях с помощью сообщений.

    Если не качается - скажите.
     
  7. Clerk

    Clerk Забанен

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

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Тогда погоди, надо выйти из интернета.
     
  9. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Все, проект изменен (почему-то архив на целый KB стал меньше!).
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    У меня конпилить это нету чем :dntknw:
    Вобщем как трейс сделоешь потести мою антиотладку, интересно продебажется оно или нет.
     
  11. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    А-а-а! Тогда в уме компильни это.
    А твой OutsideOfDebugger.rar как проверить - надо саму программу трассировать или просто запустить и она расправится с чужой отладкой?

    Вот тебе exe-файл debug-версии моего проекта.
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    AndreyMust19
    Та как хочешь так и проверяй, я так в уме дебажу :))

    [Не работоет, не понятно зачем ты запихал ажно 80 килобайт пустого места в файл..
    Вот почитай тут 3k, но хоть дебажит немного: http://wasm.ru/pub/1/files/tut30.zip ]
     
  13. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    причём давно .D
     
  14. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Фу... прикрутил я все-таки дизассемблер к отладчику! Через dll.
    Теперь у меня такой вопрос:
    - Стоит ли разделить отладчик, код для работы с бряками и дизассемблер.
    Мне кажется что отладчик и код для работы с бряками лучше не разделять - будет больше мороки. А вот дизасм занести в отдельный cpp и h файлы.
     
  15. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    AndreyMust19

    Простите за глупый вопрос, но чем не устраивает OpenThread?
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ты озверел? OpenThread

    Clerk
    Что ж ты ему ядро то советуешь. Оно тут не при чем.
    Из юзермода процесс суспендится перечислением всех тредов, открытием треда и суспендом каждого
     
  17. Clerk

    Clerk Забанен

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

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    _DEN_
    Great
    Проснулись! Теме уже месяц исполнился, а вы только увидели!!!

    _DEN_
    Первый раз слышу о такой функции! Раньше слышал только о OpenThreadToken. Но... гляжу kernel32.dll - в таблице импорта есть OpenThread. Описание скачал. Так что... теперь кроме NtProcessSuspend можно будет суспендить потоки вручную. Ура!

    Вот еще вопрос по поводу срабатывания точек останова. После возникновения сообщения Exception_Breakpoint нужно:
    1) проверить - совпадает ли адрес исключения с одной из установленных bp
    2) Если да, то переместить ее на следующую команду
    3) следующее срабатывание перемещенной bp проигнорировать, переместив ее на старое место
    Пункт 2 означает что без дизассемблера длин отладчику все же не обойтись. Как вариант можно не перемещать bp, а снять ее, войти в режим трассировки и при первом трассировочном исключении поставить bp назад.
    А вот можно ли как-то осуществить срабатывание bp без подобной мороки?
    И еще - в каком Intel Manual'е есть инфа про аппаратные брякпоинты?
     
  19. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    *экспорта
    а вообще, смотреть надо мсдн, а не экспорты
     
  20. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    MSoft
    Мда, описался, просто в просмотрщике написано - Imports/Exports, вот и написал неподумав.
    Описание скачал.