Ticks for access to page ...0009488 <- data ..00054675 <- code oooooo..ooo3000 <- limit ; What's "ooo" ? IsDebuggerPresent: No win98 P3,800, SoftIce. Если нужно, могу проверить под отладчиком типа Olly, только скажите где взять и что нажать
S_T_A_S_ Полностью согласен IceStudent Спасибо за результаты. С чистой системой и с Олей вроде все понятно, с VMware и WinDbg видимо тоже, хотя я в них ни бум-бум BUGOR Странный результат - видимо и без Оли кто-то совал свой нос в память проги 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 принудительно зануляется, т.к. почему-то дает большие задержки (?)
Ну пока вроде работает, но ложные срабатывания все-равно могут быть Код (Text): На чистой ситеме: --------------------------- Page access time in ticks 000000000000000000000011 <- pe 000000000000000000000027 <- imp 000000000000000000000011 <- ldr 000000000000000000001571 <- new 000000000000000000002454 <- code ________________________ 000000000000000000001500 <- limit IsDebuggerPresent: No Под Olly --------------------------- Page access time in ticks 000000000000000000000011 <- pe 000000000000000000000027 <- imp 000000000000000000000007 <- ldr 000000000000000000001677 <- new 000000000000000000000014 <- code ________________________ 000000000000000000001500 <- limit IsDebuggerPresent: Yes Под Olly c SetProcessWorkingSetSize: --------------------------- Page access time in ticks 000000000000000000002662 <- pe 000000000000000000000005 <- imp 000000000000000000001905 <- ldr 000000000000000000001857 <- new 000000000000000000000005 <- code ________________________ 000000000000000000001500 <- limit IsDebuggerPresent: Yes
Asterix Смотри-ка, оказывается Оля после свапа зачем-то перечитывает секцию импорта и вторую страницу кода (ловится на OEP в конце страницы). Когда я сам в OEP вызывал сброс WorkingSetSize, то без трассировки и бряков получались большие значения для всех страниц, а тут Оля не пойми зачем еще раз читает импорт и код (5 тиков это вообще "свежак" из L1\L2) ? Да твой АМД - рекордсмен, 1600-1900 тиков на отказ страницы это "фантастика", на пеньках никогда такой шустрости не видел
Asterix С секцией импорта меня глюкануло В результате экспериментов с WorkingSetSize и перестановок кода, вызов VirtualAlloc у меня оказался перед обращением к импорту, а нужно после. Сейчас переставил как надо и заодно снизил пороги limit до 1000 и 2000 Проверь еще разок - интересно малые значения для code под Olly c SetProcessWorkingSetSize сохранятся или это было как-то связано с обращением к странице импорта
Код (Text): На чистой системе: --------------------------- Page access time in ticks 000000000000000000000011 <- pe 000000000000000000000011 <- imp 000000000000000000000009 <- ldr 000000000000000000001687 <- new 000000000000000000002385 <- code ________________________ 000000000000000000001000 <- limit IsDebuggerPresent: No под Olly: --------------------------- Page access time in ticks 000000000000000000000274 <- pe 000000000000000000000011 <- imp 000000000000000000000012 <- ldr 000000000000000000001620 <- new 000000000000000000000012 <- code ________________________ 000000000000000000001000 <- limit IsDebuggerPresent: Yes под Olly c SetProcessWorkingSetSize: --------------------------- Page access time in ticks 000000000000000000006620 <- pe 000000000000000000001898 <- imp 000000000000000000001797 <- ldr 000000000000000000001687 <- new 000000000000000000000005 <- code ________________________ 000000000000000000001000 <- limit IsDebuggerPresent: Yes
Asterix Оперативно Т.е. все-таки трюк с размещением OEP в конце страницы срабатывает и при сбросе WorkingSetSize, хотя и не совсем понятно зачем Оля повторно лезет во вторую страницу Видимо этот трюк должен срабатывать и в других дебагерах с ограниченным окном анализа\отображения (по идее и SIce должен засветиться, если его конечно как-то спровоцировать на бряк в конце страницы
Вот ещё результаты. Кстати, судя по тикам на x64, эмуляция таки накладна. Может портировать твою прогу под x64, чтобы она работала там "как родная" 64? Код (Text): Чистая прога: 000000000000000000000011 <- pe 000000000000000000000014 <- imp 000000000000000000000007 <- ldr 000000000000000000001890 <- new 000000000000000000003687 <- code ________________________ 000000000000000000001500 <- limit IsDebuggerPresent: No на 9м экземпляре :) 000000000000000000000011 <- pe 000000000000000000000022 <- imp 000000000000000000000011 <- ldr 000000000000000000005083 <- new 000000000000000000002494 <- code ________________________ 000000000000000000003000 <- limit IsDebuggerPresent: Yes Олли: 000000000000000000000011 <- pe 000000000000000000000022 <- imp 000000000000000000000011 <- ldr 000000000000000000001750 <- new 000000000000000000000015 <- code ________________________ 000000000000000000001500 <- limit IsDebuggerPresent: Yes
Насчет SIce я ес-но загнул, в неинициализированные страницы он конечно не лезет и забивает их FF = INVALID. Оно и понятно - чтобы безопасно заглядывать дальше нужно лезть в PE или во внутренние структуры винды, а оно ему надо ? )
IceStudent Да пути винды неисповедимы При множественных запусках время обработки отказа страницы кода несколько уменьшается, а подготовки чистой страницы - заметно возрастает - обнуленные страницы заканчиваются что-ли ) Хотя в последнем варианте у меня пороги заданы 1000 и 2000, т.е. в данном примере ложного обнаружения не было бы - но все равно это не надежно. Если чересчур занизить порог, то P4 c HT начнут дурить и не обнаруживать отладчик, когда он есть (хотя видимо это менее опасно)
Код (Text): AMD Athlon64 3000, WinXP SP2 32bit 1th: Page access time in ticks 000000000000000000000063 <- pe 000000000000000000000012 <- imp 000000000000000000000011 <- ldr 000000000000000000004794 <- new 000000000000000000003383 <- code ________________________ 000000000000000000002000 <- limit IsDebuggerPresent: No 2th: Page access time in ticks 000000000000000000000011 <- pe 000000000000000000000014 <- imp 000000000000000000000006 <- ldr 000000000000000000004761 <- new 000000000000000000002891 <- code ________________________ 000000000000000000002000 <- limit IsDebuggerPresent: No OllyDbg: Page access time in ticks 000000000000000000000259 <- pe 000000000000000000000012 <- imp 000000000000000000000007 <- ldr 000000000000000000005361 <- new 000000000000000000000014 <- code ________________________ 000000000000000000002000 <- limit IsDebuggerPresent: Yes