Есть несколько очень конкретных вопросов по работе c OllyDbg: 1) Есть следующий, понятный как день, код: 00595828 /. 55 PUSH EBP 00595829 |. 8BEC MOV EBP,ESP 0059582B |. 83C4 F8 ADD ESP,-8 0059582E |. 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX 00595831 |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX 00595834 |. 33D2 XOR EDX,EDX 00595836 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] 00595839 |. 8B80 BC050000 MOV EAX,DWORD PTR DS:[EAX+5BC] 0059583F |. E8 585EEBFF CALL ccalc.0044B69C 00595844 |. A1 FC6C6000 MOV EAX,DWORD PTR DS:[606CFC] 00595849 |. 8B00 MOV EAX,DWORD PTR DS:[EAX] 0059584B |. 8B40 24 MOV EAX,DWORD PTR DS:[EAX+24] 0059584E |. 80B8 BC000000 CMP BYTE PTR DS:[EAX+BC],0 00595855 74 0F JE SHORT ccalc.00595866 00595857 A1 8C696000 MOV EAX,DWORD PTR DS:[60698C] 0059585C 8B00 MOV EAX,DWORD PTR DS:[EAX] 0059585E 8B10 MOV EDX,DWORD PTR DS:[EAX] 00595860 FF92 F8000000 CALL DWORD PTR DS:[EDX+F8] 00595866 |> 59 POP ECX 00595867 |. 59 POP ECX 00595868 |. 5D POP EBP 00595869 \. C3 RETN Итак, по адресу 0059584E идет проверка. Если в ячейке по адресу DS:[EAX+BCh] не ноль, то прога, предположим, считает что не зарегистрирована. Значит, все что нужно сделать – это по DS:[EAX+BCh] записать зеро, а кусок кода с 00595855 по 00595866 (POP ECX, естественно, оставляем ) занопить. Вопрос: если в природе что-то типа калькулятора, который при вводе команды MOV BYTE PTR DS:[EAX+BCh],0 выдавал опкод этой команды? И вообще, как быстро генерить опкод, не заглядывая в справочник и не прибегая к очевидному: «Набери код на ассемблере, откомпилируй в фасме и посмотри в отладчике»? 2) Как правильно поставить бряк на чтение-запись ячейки, адрес которой в EAX+BCh (он конкретно известен при отладке, предположим: 01234567h), чтобы отследить в какой момент прога записывает туда чего-то (если записывает, конечно) или читает? Проблема в том, что как поставить бряк не совсем понятно (RM 01234567 ???) и, вдобавок, бряк нужно ставить после инициализации данного куска памяти, т.е. уже после того, как прога начала работу и, например, выделила память под нашу переменную. 3) В чем отличие «хардварного» бряка на доступ к памяти от стандартного бряка на чтение-запись? «Хардварный» ослеживает обращение к ФИЗИЧЕСКОЙ ячейке памяти или ….? Поясните плиз. 4) Есть следующая ситуация: основной код программы вызывает ПРОЦЕДУРУ1, а та в свою очередь ПРОЦЕДУРУ2, причем ПРОЦЕДУРА2 так «корявит» стек, что по завершению вываливается в основной блок программы. Бряк срабатывает в ПРОЦЕДУРЕ2. Каким образом, мне попасть в ПРОЦЕДУРУ1 не возясь со стеком? («EBP или какой там регистр при начале работы ПРОЦЕДУРЫ2 содержит адрес возврата в ПРОЦЕДУРУ1», - скажет эксперт: « Вот тебе и адрес!» ). Другими словами, как посмотреть откуда был прыжок в ПРОЦЕДУРУ2 (например, что-то типа: Olly ведет лог прыжков и я как бы «отматываю» назад выполнение программы)? 5) Почему в командной стоке Olly не работает команда: bc*? Неудачный плагин или несовместимость версий? Или руки кривые ?
или следующий JE заменить на JMP, тогда и нопить ничего не придется. Если вариант с изучением формата команд и генерированием опкода в уме не подходит можно создать тестовый ехе в котором N нопов и ExitProcess, открываешь его в Olly и "режешь по живому"
SoLa Т.е. кратчайший эквивалент данной мнемоники в шестнадцатеричном формате? Двойной клик в колонке мнемоников в окне CPU. Вводим MOV BYTE PTR DS:[EAX+0BC],0. Жмём Assemble. Получаем: С680 BC000000 00. Вычисляем адрес этой ячейки в рантайме. Предположим, что адрес 01234567h. В дампе (окно dump) в контекстном меню задаём Go to -> Expression. Вводим 01234567. Смотрим нашу ячейку в окне дампа. Опять в контекстном меню Breakpoint -> Hardware. В зависимости от задачи, выбираем on access или on wright и размер ячейки. Если таких бряков будет много, вместо hardware задаём memory.
А хэлп почитать и потыкаться по менюшкам - наверное тяжело 1) По правой кнопке вызываешь Assemble и вводишь что угодно. Если не нужно сохранять делаешь Undo selection или View\Patches и т.д. 2) А в чем проблема ? Ставишь хардварный бряк и ждешь 3) Насчет "физической" ты ес-но загнул. Хардварные бряки работают через отладочные регистры процессора DR0-DR3 и соответсвенно позволяют ослеживать обращение к 4-м областям памяти размером 1, 2, 4 байта. А вот как ты говоришь "стандартный" бряк - вовсе и не стандартный, а скорее извращенный - отладчик изменяет атрибуты защиты всей страницы памяти и обрабатывает все исключения, которые могут при этом возникнуть - отлавливая то, которое соответсвует заданному тобой диапазону адресов. 4) View\Call stack 5) не знаю
Двойной клик в колонке мнемоников в окне CPU. Вводим MOV BYTE PTR DS:[EAX+0BC],0. Жмём Assemble. Получаем: С680 BC000000 00. То что нужно! Я пробовал, кстати, так делать но просто не ожидал что ноль надо ставить перед BCh. Спасибо! А что по поводу 4 вопроса?