Еще один вариант IsDebuggerPresent по RDTSC

Тема в разделе "WASM.WIN32", создана пользователем leo, 7 июл 2006.

  1. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Ticks for access to page
    ...0009488 <- data
    ..00054675 <- code
    oooooo..ooo3000 <- limit ; What's "ooo" ?

    IsDebuggerPresent: No

    win98 P3,800, SoftIce. Если нужно, могу проверить под отладчиком типа Olly, только скажите где взять и что нажать ;)
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Chingachguk
    на 9х от OllyDbg толку мало =)
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    S_T_A_S_
    Полностью согласен

    IceStudent
    Спасибо за результаты. С чистой системой и с Олей вроде все понятно, с VMware и WinDbg видимо тоже, хотя я в них ни бум-бум :)

    BUGOR
    Странный результат - видимо и без Оли кто-то совал свой нос в память проги :dntknw:

    Chingachguk
    limit = 3000 - это фиксированный порог принятия решения Yes\No

    -----------
    Мда, метод вроде бы и "интересный", но практической пользы от него что-то не видать, тем более, что Asterix уже и противодействие в плагине попробовал ;)
    Но чтобы уж не бросать это дело в самом сыром виде, подправил кое-что
    - поставил OEP на конец первой страницы - теперь должны ловиться (некоторые) "скромняги", которые читают память не целиком, а только для отображения в окне
    - кое-как учел возможность меньших задержек на AMD64 и завышенных на P4 HT (два порога, выбираемые исходя из контрольного теста VirtualAlloc - фигня конечно и ошибки все-равно возможны)
    - раз уж обещал, то ввел куцую защиту от SetWorkingSetSize - проверяются еще 3 страницы, которые д.б. инициализированы загрузчиком. Разумеется это фигня, т.к. и Asterix'у ничего не стоит в своем плагине прочитать по одному дворду из этих страниц, да и ненадежно это и в какой-то степени противоречит идее метода (т.к. идет контроль на большие задержки, а не малые)
    Одним словом наворотов много, а толку мало :)))

    Обозначения при выводе результатов: pe - PE-заголовок, imp - секция импорта, ldr - куча LDR, new - страницы, выделенные VirtualAlloc, code - 2-я страница кода, limit - порог Yes/No/??? = 1500 или 3000 (по прежнему от балды ;)
    PS: под 9x результат pe принудительно зануляется, т.к. почему-то дает большие задержки (?)
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Ну пока вроде работает, но ложные срабатывания все-равно могут быть
    Код (Text):
    1. На чистой ситеме:
    2. ---------------------------
    3. Page access time in ticks
    4.  
    5. 000000000000000000000011 <- pe  
    6.  
    7. 000000000000000000000027 <- imp
    8.  
    9. 000000000000000000000011 <- ldr
    10.  
    11. 000000000000000000001571 <- new
    12.  
    13. 000000000000000000002454 <- code
    14.  
    15. ________________________
    16.  
    17. 000000000000000000001500 <- limit
    18.  
    19.  
    20.  
    21. IsDebuggerPresent:   No
    22.  
    23.  
    24.  
    25. Под Olly
    26. ---------------------------
    27. Page access time in ticks
    28.  
    29. 000000000000000000000011 <- pe  
    30.  
    31. 000000000000000000000027 <- imp
    32.  
    33. 000000000000000000000007 <- ldr
    34.  
    35. 000000000000000000001677 <- new
    36.  
    37. 000000000000000000000014 <- code
    38.  
    39. ________________________
    40.  
    41. 000000000000000000001500 <- limit
    42.  
    43.  
    44.  
    45. IsDebuggerPresent:   Yes
    46.  
    47.  
    48.  
    49. Под Olly c SetProcessWorkingSetSize:
    50. ---------------------------
    51. Page access time in ticks
    52.  
    53. 000000000000000000002662 <- pe  
    54.  
    55. 000000000000000000000005 <- imp
    56.  
    57. 000000000000000000001905 <- ldr
    58.  
    59. 000000000000000000001857 <- new
    60.  
    61. 000000000000000000000005 <- code
    62.  
    63. ________________________
    64.  
    65. 000000000000000000001500 <- limit
    66.  
    67.  
    68.  
    69. IsDebuggerPresent:   Yes
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    последний аттач у меня грузится Оперой как html почему-то %)
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Asterix
    Смотри-ка, оказывается Оля после свапа зачем-то перечитывает секцию импорта и вторую страницу кода (ловится на OEP в конце страницы). Когда я сам в OEP вызывал сброс WorkingSetSize, то без трассировки и бряков получались большие значения для всех страниц, а тут Оля не пойми зачем еще раз читает импорт и код (5 тиков это вообще "свежак" из L1\L2) ?
    Да твой АМД - рекордсмен, 1600-1900 тиков на отказ страницы это "фантастика", на пеньках никогда такой шустрости не видел
     
  7. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Asterix
    С секцией импорта меня глюкануло :dntknw:
    В результате экспериментов с WorkingSetSize и перестановок кода, вызов VirtualAlloc у меня оказался перед обращением к импорту, а нужно после.
    Сейчас переставил как надо и заодно снизил пороги limit до 1000 и 2000
    Проверь еще разок - интересно малые значения для code под Olly c SetProcessWorkingSetSize сохранятся или это было как-то связано с обращением к странице импорта
     
  8. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Код (Text):
    1. На чистой системе:
    2. ---------------------------
    3. Page access time in ticks
    4.  
    5. 000000000000000000000011 <- pe  
    6.  
    7. 000000000000000000000011 <- imp
    8.  
    9. 000000000000000000000009 <- ldr
    10.  
    11. 000000000000000000001687 <- new
    12.  
    13. 000000000000000000002385 <- code
    14.  
    15. ________________________
    16.  
    17. 000000000000000000001000 <- limit
    18.  
    19.  
    20.  
    21. IsDebuggerPresent:   No
    22.  
    23.  
    24. под Olly:
    25. ---------------------------
    26. Page access time in ticks
    27.  
    28. 000000000000000000000274 <- pe  
    29.  
    30. 000000000000000000000011 <- imp
    31.  
    32. 000000000000000000000012 <- ldr
    33.  
    34. 000000000000000000001620 <- new
    35.  
    36. 000000000000000000000012 <- code
    37.  
    38. ________________________
    39.  
    40. 000000000000000000001000 <- limit
    41.  
    42.  
    43.  
    44. IsDebuggerPresent:   Yes
    45.  
    46.  
    47. под Olly c SetProcessWorkingSetSize:
    48. ---------------------------
    49. Page access time in ticks
    50.  
    51. 000000000000000000006620 <- pe  
    52.  
    53. 000000000000000000001898 <- imp
    54.  
    55. 000000000000000000001797 <- ldr
    56.  
    57. 000000000000000000001687 <- new
    58.  
    59. 000000000000000000000005 <- code
    60.  
    61. ________________________
    62.  
    63. 000000000000000000001000 <- limit
    64.  
    65.  
    66.  
    67. IsDebuggerPresent:   Yes
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Asterix
    Оперативно ;)
    Т.е. все-таки трюк с размещением OEP в конце страницы срабатывает и при сбросе WorkingSetSize, хотя и не совсем понятно зачем Оля повторно лезет во вторую страницу

    Видимо этот трюк должен срабатывать и в других дебагерах с ограниченным окном анализа\отображения (по идее и SIce должен засветиться, если его конечно как-то спровоцировать на бряк в конце страницы ;)
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Вот ещё результаты. Кстати, судя по тикам на x64, эмуляция таки накладна. Может портировать твою прогу под x64, чтобы она работала там "как родная" 64?

    Код (Text):
    1. Чистая прога:
    2. 000000000000000000000011 <- pe  
    3. 000000000000000000000014 <- imp
    4. 000000000000000000000007 <- ldr
    5. 000000000000000000001890 <- new
    6. 000000000000000000003687 <- code
    7. ________________________
    8. 000000000000000000001500 <- limit
    9. IsDebuggerPresent:   No
    10.  
    11. на 9м экземпляре :)
    12. 000000000000000000000011 <- pe  
    13. 000000000000000000000022 <- imp
    14. 000000000000000000000011 <- ldr
    15. 000000000000000000005083 <- new
    16. 000000000000000000002494 <- code
    17. ________________________
    18. 000000000000000000003000 <- limit
    19. IsDebuggerPresent:   Yes
    20.  
    21. Олли:
    22. 000000000000000000000011 <- pe  
    23. 000000000000000000000022 <- imp
    24. 000000000000000000000011 <- ldr
    25. 000000000000000000001750 <- new
    26. 000000000000000000000015 <- code
    27. ________________________
    28. 000000000000000000001500 <- limit
    29. IsDebuggerPresent:   Yes
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Насчет SIce я ес-но загнул, в неинициализированные страницы он конечно не лезет и забивает их FF = INVALID. Оно и понятно - чтобы безопасно заглядывать дальше нужно лезть в PE или во внутренние структуры винды, а оно ему надо ? :))
     
  12. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    IceStudent
    Да пути винды неисповедимы ;) При множественных запусках время обработки отказа страницы кода несколько уменьшается, а подготовки чистой страницы - заметно возрастает - обнуленные страницы заканчиваются что-ли :))
    Хотя в последнем варианте у меня пороги заданы 1000 и 2000, т.е. в данном примере ложного обнаружения не было бы - но все равно это не надежно. Если чересчур занизить порог, то P4 c HT начнут дурить и не обнаруживать отладчик, когда он есть (хотя видимо это менее опасно)
     
  13. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
    Код (Text):
    1. AMD Athlon64 3000, WinXP SP2 32bit
    2.  
    3. 1th:
    4. Page access time in ticks
    5. 000000000000000000000063 <- pe  
    6. 000000000000000000000012 <- imp
    7. 000000000000000000000011 <- ldr
    8. 000000000000000000004794 <- new
    9. 000000000000000000003383 <- code
    10. ________________________
    11. 000000000000000000002000 <- limit
    12.  
    13. IsDebuggerPresent:   No
    14.  
    15. 2th:
    16. Page access time in ticks
    17. 000000000000000000000011 <- pe  
    18. 000000000000000000000014 <- imp
    19. 000000000000000000000006 <- ldr
    20. 000000000000000000004761 <- new
    21. 000000000000000000002891 <- code
    22. ________________________
    23. 000000000000000000002000 <- limit
    24.  
    25. IsDebuggerPresent:   No
    26.  
    27. OllyDbg:
    28. Page access time in ticks
    29. 000000000000000000000259 <- pe  
    30. 000000000000000000000012 <- imp
    31. 000000000000000000000007 <- ldr
    32. 000000000000000000005361 <- new
    33. 000000000000000000000014 <- code
    34. ________________________
    35. 000000000000000000002000 <- limit
    36.  
    37. IsDebuggerPresent:   Yes