Сейчас на форуме: Slinger (+6 невидимых) |
![]() |
eXeL@B —› Основной форум —› Бряк на команду |
Посл.ответ | Сообщение |
|
Создано: 06 апреля 2006 13:44 · Личное сообщение · #1 |
|
Создано: 06 апреля 2006 14:28 · Личное сообщение · #2 |
|
Создано: 06 апреля 2006 14:47 · Личное сообщение · #3 |
|
Создано: 06 апреля 2006 15:31 · Личное сообщение · #4 |
|
Создано: 06 апреля 2006 15:31 · Личное сообщение · #5 |
|
Создано: 06 апреля 2006 15:51 · Личное сообщение · #6 |
|
Создано: 06 апреля 2006 15:56 · Личное сообщение · #7 |
|
Создано: 06 апреля 2006 16:01 · Личное сообщение · #8 |
|
Создано: 06 апреля 2006 16:22 · Личное сообщение · #9 1) в любом отладчике /soft-ice, olly/ условный бряк на EIP с преркой текущей команды (можно даже проверить значение регистра eax и брякаться на конструкциях типа call ???/test eax,eax где eax == 0, я уже где-то писал об этом, материал пойдет в "хакерские трюки"), но это все равно глючный способ, требущий пошаговой трассировки. 2) сканируем память в поисках jmp eax и если таковая имеется ставим bpm X. минусы - точек останова всего четыре, самомодифицирующий код идет лесом. 3) модифицированный метод (2): если мы имеем все основания считать, что перекртия команд отсуствует, то ставим на jmp eax CCh, в противном случае bpm X если бряков все равно не хватает, делем данной странице no_access, а потом ловим исключение и смотрим: кто, как и куда... короче, в двух словах тут объяснить не получится. сначала надо работать понятие "базового блока" (фундаментального понятия в теории компиляции) ну в общем заменяем трассировку игрой с атрибутами доступа. самомодифицирующийся код. тут все просто. ставим страницы в readonly, когда возникает исключение, возвращаем право записи и повторяем сканирование на jmp eax опять, после чего ставим на него харадварный бряк, а если они уже кончились - то с некоторой осторожностью CCh (понятное дело, чтобы не делать это руками надо писать плагин, что требует времени, зато 2 и 3 способы очень трудно обнаружить с прикладного уровня и противостоять им, 1й спсобо обнраживается практически любой защитой и оччччень медленно работает) p.s. сорри за сумбурность ![]() |
|
Создано: 07 апреля 2006 16:50 · Личное сообщение · #10 |
|
Создано: 07 апреля 2006 17:38 · Личное сообщение · #11 |
|
Создано: 07 апреля 2006 20:18 · Личное сообщение · #12 Vadim ок. поставил статью в план. пока читайте аттач ;) только там ошибок миллион ;) правильная "скользящая" условная точка останова выглядит так: MACRO X66="BPM EIP X IF /* проверяем содержимое команды под EIP, с регистрами */ DO \"x;t;bc bpindex;X66\"; ? /* выводим победоносное сообщение */; bc bpindex" ну еще можно всесто x использовать g. только учите, что по дефлоту soft-ice не дружит с рекурсией и чтобы все работало, необходимо разбить этот код на несколько макросов, вызввающий друг друга. указанная конструкция позволяет брякаться на jmp eax при любом заданном знаечнии eax и прочих дополнительных условиях (если это необходимо) ![]() ![]() |
|
Создано: 08 апреля 2006 00:44 · Личное сообщение · #13 если не заумно и тупо (не со всеми защитами работает), то в Olly CTRL-T, [x] command is one of:jmp eax; <OK> CTRL-F11 и ждать... ;) другой способ (В том olly): CTRL-F (find command) "jmp eax", находим, ждем <F2> (программаная точка останова), или ставим хардварный брек, после чего нажимаем <F9> типа run (плюс - высокая скорость работы, минус - не работает с самомодифицирующимся кодом) ![]() |
|
Создано: 08 апреля 2006 00:55 · Личное сообщение · #14 elraton Извини за небольшое отступление от темы, но меня интересует следующий вопрос по Ольке. При написания скрипта встретился с тем, что я могу остановиться на последнем исключении (указав его точный адрес, который я узнал, запустив предварительно программу), но автоматически перейти дальше уже не могу, почему то даже при установке бряка bp он не останавливается, а запускается прога. Как тут мне поступить со скриптом? P.S. Сорри если не там, укажите перейду.... ----- Есть вопросы ко мне? В личку! ![]() |
|
Создано: 08 апреля 2006 01:09 · Личное сообщение · #15 |
|
Создано: 08 апреля 2006 01:16 · Личное сообщение · #16 elraton Вручную все хорошо я понял ка пройти я имею ввиду в ввиде скрипта, чтобы сразу попасть на место, а то приходиться вначале попадать на поледнее исключение, а затем выставлять бряк на секцию code и перехожу туда и там OEP. Но просто хотелось бы попадать туда сразу. ----- Есть вопросы ко мне? В личку! ![]() |
|
Создано: 08 апреля 2006 11:33 · Личное сообщение · #17 Спасибо, а вот че пишет автор оли: This is possible, but only during the Run trace (step-by-step code execution). From the main menu, select "Debug|Set condition", check "Command is one of" and type in the command, then start run trace into or over. Note that even on the fast computers, run trace executes only about 20,000 commands in a second. И не надо никаких плагинов и скриптов ![]() ![]() |
|
Создано: 08 апреля 2006 20:13 · Личное сообщение · #18 |
|
Создано: 08 апреля 2006 22:04 · Личное сообщение · #19 |
|
Создано: 09 апреля 2006 16:38 · Личное сообщение · #20 elraton Прочитал твой аттач -- весьма интересный материал. Особенно понравился вариант с анимированием выполненных программ ![]() * во-первых,количество точек останова,которые и обуславливают подсвечивание выполненного кода,ограничено количеством в 256 штук * ну,и,во-вторых,выполняется это всё относительно медленно Далее хотел бы обратить внимание на следующую деталь -- использование условной точки останова типа: bpx _some_address IF (*esp->4) == '_some_value' Ты приводил подобный пример ещё в своей книге "Техника защиты компакт-дисков от копирования": bpx CreateFileA if (*esp->4 == '\\\\.\\') Может у нас отладчики отличаются версиями(я так понял,что у тебя стоит DS 2.7),но я вчера пол вечера прибил на то,чтобы понять,почему у меня подобный вариант даже не вводится в отладчике и как заставить это всё нормально работать. Напоминаю,что у меня стоит DS 3.2 build 2485. Итак,на попытку ввода вышеуказанной команды SoftIce ругается,что дескать "Invalid dereference" (dereference -- это символ звёздочки "*" ). Ладно думаю,надо смотреть,что сказано у Айрапетяна,а у него сказано,что: Выражение ESP->4 тождественно равно выражению *(ESP+4) ...и даётся также пример: BPX IsWindow if (esp->4 == 10022) || (esp->4 == 1001E) Значит надо попробовать без звёздочки -- хорошо,такой вариант отладчик молча принимает ![]() Я специально скомпилировал пример,где в диалоге открытия файла используется не lpstrFile(полный путь к файлу),а lpstrFileTitle(только название самого файла),чтобы всё наглядно работало. Тут начнём с того,что подобная точка останова: bpx CreateFileA if (esp->4 == 's') ; файл speed.exe ...ни хрена не срабатывает.В принципе в (ESP+4) должен лежать указатель на имя файла: :dd esp 0023:0012F940 00403D32 0040697C 80000000 00000000 Следующий бряк также отказавается срабатывать: bpx CreateFileA IF (esp->4 == 0040697C) Ладно пойдём по другому пути.Поставим следующий бряк,чтобы проверить,что отладчик вообще считывает-то: bpx CreateFileA do "dd esp->4" Он срабатывает и мы видим: 0023:00403D36 A1006A00 004050B0 ... ... Это что же получается?? Он прочитал память по адресу (ESP) -- адрес возврата -- и там уже сместил свой "глаз" на четыре байта (00403D36 - 00403D32 = 4) !! Получается,что он читает команды,стоящие за адресом возврата... И теперь хрен поймёшь,кто неправ: то ли я чего-то не допонимаю,то ли это ошибка/баг отладчика! Чтобы быть теперь кратким,я покажу,что у меня стопроцентно работает следующий вариант: bpx CreateFileA IF byte(*(*(esp+4))) == 's' ...аналогично: bpx CreateFileA IF *(*(esp+4)) == '\\\\.\\' В общем,комментарии приветствуются ![]() ----- the Power of Reversing team ![]() |
|
Создано: 11 апреля 2006 02:25 · Личное сообщение · #21 DillerInc вот уж не знаю ;( у меня soft-ice 4.0.5 и все работает... я имею ввиду bpx CreateFileA if (*esp->4 == '\\\\.\\') Все _шикарно_ работает. и если какой-то косяк, то это не у меня... > Напоминаю,что у меня стоит DS 3.2 build 2485. у меня 2.7 ![]() > ESP->4 тождественно равно выражению *(ESP+4) все так и есть > bpx CreateFileA if (esp->4 == 's') ; ну и что тыт от него ожидал?! esp->4 тепебе возвращает _адрес_ где записана строка 's' чтобы до нее дотянуться надно еще получить ее содержимое!!!! if (*(esp->4) == if ((esp->4->0) === так еще о функции byte не забывай. по умолчанию отладчик стравнивает dword... >Значит надо попробовать без звёздочки -- хорошо,такой вариант отладчик молча принимает здездочка дает тебе "содержимое" ячейки. хочешь без нее пожалуйста!!! *(esp->4) <-----> (esp->4->0) обе конструкции эквивалентны ![]() |
|
Создано: 11 апреля 2006 06:11 · Личное сообщение · #22 |
|
Создано: 11 апреля 2006 16:15 · Личное сообщение · #23 elraton elraton пишет: ну и что тыт от него ожидал?! esp->4 тепебе возвращает _адрес_ где записана строка 's' ...ну,а я о чём пишу: DillerInc пишет: В принципе в (ESP+4) должен лежать указатель на имя файла: Мне кажется такие расхождения возникают именно из-за версий отладчиков.У меня на подобную запись: bpx CreateFileA IF (byte(esp->4->0) == 's') ...отладчик говорит,что "Invalid expression" . В любом случае я нашёл вариант,который у меня _шикарно_ работает ![]() ----- the Power of Reversing team ![]() |
|
Создано: 12 апреля 2006 00:30 · Личное сообщение · #24 |
|
Создано: 11 февраля 2007 08:25 · Личное сообщение · #25 |
|
Создано: 12 февраля 2007 00:56 · Личное сообщение · #26 |
|
Создано: 12 февраля 2007 02:59 · Личное сообщение · #27 |
|
Создано: 12 февраля 2007 03:09 · Личное сообщение · #28 |
![]() |
eXeL@B —› Основной форум —› Бряк на команду |