Сейчас на форуме: Slinger (+6 невидимых)

 eXeL@B —› Основной форум —› Бряк на команду
Посл.ответ Сообщение

Ранг: 25.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 06 апреля 2006 13:44
· Личное сообщение · #1

Может глупый вопрос, но все же:
Как (и можно ли вообще) поставить бряк на исполнение какой-нибудь команды (например jmp eax).



Ранг: 4.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 06 апреля 2006 14:28
· Личное сообщение · #2

Не как!



Ранг: 384.1 (мудрец)
Активность: 0.250
Статус: Участник
www.int3.net

Создано: 06 апреля 2006 14:47
· Личное сообщение · #3

RaiN
В ольке можно оттрейсить

-----
Подписи - ЗЛО! Нужно убирать!




Ранг: 52.6 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 06 апреля 2006 15:31
· Личное сообщение · #4

можно
находиш через олю все jmp eax и ставишь на них бряки
search for -> all commands



Ранг: 25.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 06 апреля 2006 15:31
· Личное сообщение · #5

Очень жаль
А то очень часто бывает нужен такой бряк, например когда вручную долго трейсить.

Ну все-таки я думаю, что такая проблема бывает не только у меня - может кто-нибудь че-нибудь придумал (ну плагин к оле и т.п.), потому что теоретически-то это кажется возможным!
В инете искал - тоже ничего




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 06 апреля 2006 15:51
· Личное сообщение · #6

Скрипт напиши.



Ранг: 500.5 (!), 8thx
Активность: 0.230
Статус: Участник

Создано: 06 апреля 2006 15:56
· Личное сообщение · #7

WarrioR пишет:
находиш через олю все jmp eax и ставишь на них бряки

Это только когда код не многослойный

А так - либо скрипт, либо плагин...

-----
"Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels





Ранг: 116.9 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 06 апреля 2006 16:01
· Личное сообщение · #8

пиши скрипт, имхо это быстрее и универсальнее, чем плагин...

-----
Nothing just happens. You choose it to happen.




Ранг: 15.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 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. сорри за сумбурность



Ранг: 4.3 (гость)
Активность: 0.010
Статус: Участник

Создано: 07 апреля 2006 16:50
· Личное сообщение · #10

elraton
Блин, ту ты и закрутил, я лично ничего не понял...
Напиши более детально о своих мыслях, чтобы всем окружающим было понятно....



Ранг: 60.4 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 07 апреля 2006 17:38
· Личное сообщение · #11

Vadim, а он об этом писал... Причём неоднократно.
Словосочетание "Техника и отладка программ без исходных текстов" тебе ниочем не говорит?



Ранг: 15.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 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
и прочих дополнительных условиях (если это необходимо)

c3d3_07.04.2006_CRACKLAB.rU.tgz



Ранг: 15.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 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
(плюс - высокая скорость работы, минус - не работает с самомодифицирующимся кодом)




Ранг: 108.4 (ветеран)
Активность: 0.060
Статус: Участник

Создано: 08 апреля 2006 00:55
· Личное сообщение · #14

elraton
Извини за небольшое отступление от темы, но меня интересует следующий вопрос по Ольке.
При написания скрипта встретился с тем, что я могу остановиться на последнем исключении (указав его точный адрес, который я узнал, запустив предварительно программу), но автоматически перейти дальше уже не могу, почему то даже при установке бряка bp он не останавливается, а запускается прога.
Как тут мне поступить со скриптом?

P.S. Сорри если не там, укажите перейду....

-----
Есть вопросы ко мне? В личку!




Ранг: 15.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 08 апреля 2006 01:09
· Личное сообщение · #15

YoriCH
э.... извини не понял...
shift-F9 нажимал? или ты о другом говоришь?




Ранг: 108.4 (ветеран)
Активность: 0.060
Статус: Участник

Создано: 08 апреля 2006 01:16
· Личное сообщение · #16

elraton
Вручную все хорошо я понял ка пройти я имею ввиду в ввиде скрипта, чтобы сразу попасть на место, а то приходиться вначале попадать на поледнее исключение, а затем выставлять бряк на секцию code и перехожу туда и там OEP. Но просто хотелось бы попадать туда сразу.

-----
Есть вопросы ко мне? В личку!




Ранг: 25.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 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.

И не надо никаких плагинов и скриптов



Ранг: 18.2 (новичок)
Активность: 0.010
Статус: Участник

Создано: 08 апреля 2006 20:13
· Личное сообщение · #18

Подскажите. В SIce при bpx виснет система. Что делать ?



Ранг: 15.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 08 апреля 2006 22:04
· Личное сообщение · #19

FockuS
гонять soft-ice из под vm-ware,
так удобнее, да и надежнее...




Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 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




Ранг: 15.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 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)
обе конструкции эквивалентны



Ранг: 136.5 (ветеран)
Активность: 0.030
Статус: Участник

Создано: 11 апреля 2006 06:11
· Личное сообщение · #22

YoriCH пишет:
Как тут мне поступить со скриптом?

Как вариант, разбей скрипт на две части. Не очень удобно, но гарантировано не "проскочит" последнее исключение.




Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 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




Ранг: 15.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 12 апреля 2006 00:30
· Личное сообщение · #24

DillerInc
возможно, это версии отладчиков,
возможно настойки...
благо у меня VM
сейчас скачал кучу разных айсов,
буду тестить их всех, чтобы понять где косяк.




Ранг: 199.9 (ветеран), 4thx
Активность: 0.120.02
Статус: Участник

Создано: 11 февраля 2007 08:25
· Личное сообщение · #25

Ламерский вопрос по сабжу: нужно в Сайсе поставить условнй бряк на запись по определенному адресу с проверкой записанного значения. К примеру: брякнуться при записи по адресу 015BFDC6 байта 33.
Пишу такое:
bpmb 015BFDC6 w if(byte(015BFDC6)==33)
не работат? Как надо?




Ранг: 199.9 (ветеран), 4thx
Активность: 0.120.02
Статус: Участник

Создано: 12 февраля 2007 00:56
· Личное сообщение · #26

Интерес уже пошел чисто спортивный: кто-нибудь может быть все-таки знает, как поставить в Айсе бряк на запись определенного байта по определенному адресу? (мой предыдущий вопрос).




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 12 февраля 2007 02:59
· Личное сообщение · #27

bpmb 015BFDC6 w if byte(*(15BFDC6))==33
Стареете, коллега. Надо было потыкать команды типа ? byte(15bfdc6)




Ранг: 199.9 (ветеран), 4thx
Активность: 0.120.02
Статус: Участник

Создано: 12 февраля 2007 03:09
· Личное сообщение · #28

Archer
Thks! Попробую.


 eXeL@B —› Основной форум —› Бряк на команду
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати