Люди, приведите мне пример таргета (какой-нибудь exe), который использует подобную защиту и пришлите мне его на мыло, если не трудно. Я потом этот топик вообще удалю. Мне просто нужна подобная экзешка.
volodya Ты никак за упаковщиков взялся ?! Не забудь пож-ста про PEB.NtGlobalFlag (Enable heap checking) и IsDebuggerPresent по хипу от bogrus'a (тут или тут) А с rdtsc есть некоторые проблемы на P4 model 15.3.х (Prescott) под XP - о-очень большой разброс результатов, под 9х такого нет (см.rdtsc в wintest)
leo Ты прав, похоже это Hyper-Threading, т.е. один физический процессор предоставляет ОС два своих логических, она об этом не знает и шлет одновременно два потока в эти, по её мнению - физически независимые камни. В нем декодер только один и декодирование выполняется поочередно, а исполнительных частей несколько больше, по-этому многие команды двух разных потоков исполняются действительно одновременно ... многие, но не все, т.ч. для некоторых приложений (последовательностей команд) от этого может быть не польза, а наоборот тормоза, видимо вот и разброс, а 9x не поддерживает многопроцессорность. А вообще, то переключение задач ведь может произойти в любой момент, чтоб использовать rdtsc в антиотладке, нужно брать статистику, но никак не "первый попавшийся" результат
Люди, приведите мне пример таргета (какой-нибудь exe), который использует подобную защиту и пришлите мне его на мыло, если не трудно. Я потом этот топик вообще удалю. Мне просто нужна подобная экзешка. Обработай DotFIx FakeSigner'ом любой файл и в опициях укажи "Antitracing" - будет rtdsk в наглядном виде
Да, сама по себе идея хорошая, но вот можно ли ее реализовать, чтобы и надежно было и не выкладывать механизм контроля на блюдечке для исследования. Понятно, что вариант Max это только тест для иллюстрации возможности. Если брать его в чистом виде, то получается нечто не логичное - генерим исключение и всплываем в отладчике - нате изучайте и раскручивайте клубочек. Такие подставы обычно используются с другим прицелом: заинтересовать исследователя, чтобы он задержался и покапался в этом месте, тогда уж задержка точно будет измеряться секундами и никакие переключения задачи не исказят результат. А для замера времени обработки эксепшена логично было хотя бы замаскировать его вызов (например, делить на 0 в результате правдоподобных вычислений или косить под дурачка, передавая инвалидные указатели в API и т.п.). Но главная проблема здесь все таки - выбор порогового уровня задержки и возможность ложного срабатывания. Кстати многочисленные cpuid вокруг rdtsc по-видимому совершенно никчему - тут все настолько приблизительно, что лишний десяток или сотня тактов никакой роли не играет.
leo Если брать его в чистом виде, то получается нечто не логичное - генерим исключение и всплываем в отладчике - нате изучайте и раскручивайте клубочек согласен, ну а если написать генератор, который выдает килобайт так 100 кода, в котором этак 1000 эксепшенов (в разных местах), и сотня проверок, тут уже получается все не так розово... volodya неужели ты решил добить третью часть?
Так можно написать собиратель тактов для этих проверок: делаем базу, анализируем и заносим туда все rdtsc, потом поочередно запускаем прогу, патча за каждым rdtsc код типа "mov база,eax" и "mov база,edx", давим её и переходим к следующему rdtsc. Как соберем, то готовим плугин к олли, который при трассировании будет делать mov eax,база. Грубо конечно, но можно попытатся додумать
Может быть надёжнее будет "изменить логику работы" чего-нибудь вроде KiUserExceptionDispatcher, пусть корректирует TSC. [edit] Хотя я туплю.. wrmsr обнулит старшие 32 бита :-/
Уж и не знаю, куда заметки по RDTSC строчить. Запостил в продолжение "IsDebuggerPresent?" А то volodya грозился прибить эту тему - жалко будет непосильных трудов и бессонных ночей
Неплохой пример антиотладки с RDTSC -- StarForce Там замеры TSC связаны с таймером (VTD_Get_Real_Time для 9x). Кроме того, используются дублирующие переменные для результатов предыдущих замеров. Если вдруг контролируемый участок выполнялся >1 сек., то ... Могу кинуть кусок откомментированного пкода (SF1) если интересно ...