DX0
Новичок
- Сообщения
- 366
- Реакции
- 71

Вообще, лично я код выравниваю от начала ImageBase или от начала секции ".text", когда работаю с такими адресами и с кодом не выравненым, и при помощи дизассемблера длин обрабатываю такой код. Судя по адресу 0x0044A84D это реальная иснтрукция, тоже самое по адресу 0x00402E23 это тоже реальная инструкция, потому как по опкодам это видно. Я когда исследую код, то я смотрю еще на опкоды, не только на мнемонику, потому как опкод может быть мусор, это и так понятно и без меня. Я понимаю, что есть куча разных jmp-ов, которые указывают на различные куски кода или участки кода, но тут приходит такая мысль, что нужно фильтровать такие jmp-ы на на наличие ret-тов и трассировать код обратно до пролога, ну или по другому алгоритму, тут опять же смотреть нужно и походу писать алгоритм. У каждого свой подход к исследованию защиты, так что это лично мое мнение.Наткнулся тут на самописный плагин для оли, для восстановления наномитов после армадиллы. Расскажу идею, может кому когда пригодится в аналогичных случаях.
Снял я значит протектор армадилло с одного файла. Но там есть такая защита, как наномиты.Это проставленные int 3 в код файла на место где должен быть джамп, условный или безусловный. При попадании на него, армадилла как отладчик смотрит в своей таблице, что это за тип джампа и эмудирует его, анализируя EFlags. После чего задает тот или иной EIP дочернему процессу. Вроде не сложно, но они сделали хитрый ход. В этой таблице все байты CC что есть в коде. Т.е. и те, что в коде всегда были, это и в адресах и в константах и просто int 3 которые компилятор ставит чтобы выровнять функции. А в качестве Условий и куда переходить просто генерят рандомные данные.
Утилиты что снимают армадиллу сохраняют таблицу. Потом есть возможно запустить программу и следить где сработает наномит и запатчить его. После этого в таблице остаются только необработаные наномиты. И сделать с ними ничего нельзя, нет еще такого инструмента который бы по анализу кода 100% говорил может быть тут наномит или нет. Поэтому просто делают инлайн, который ставит обрабочик int 3 и если когда то исключение произойдет, то повторит логику армадиллы. Т.е. кусочек армадиллы будет в файле всегда. Но как бы оно и не страшно.
Но вот в моем случае мне захотелось полностью убрать эти наномиты. Я готов был на это выделить вменяемое время. Покрутив код в оле, примерно понял как можно анализировать. Если мы перейдем на адрес наномита, то оля пытается выводить дизасм с этого адреса, и не понять нормально это или нет. А если прокрутить окно с листингом вверх, то оля выравнивает код и показывает правильно. Т.е. мне нужен плагин, которвый выведет таблицу наномитов в свою таблицу и я по ней буду перемещаться. А плагин будет перемещаться окно дизасма на нужный адрес, прокручивая вверх. Накидал плагин, и вот для сравнения.
Переходим на адрес наномита:
![]()
Не понять, наномит это или нет.
А вот переход с помощью плагина туда же. Это середина процедуры, а не наномит:
![]()
Вот еще интересный адрес:
![]()
Переходим плагином:
![]()
А это банальное выравнивание.
Ну а вот и поганец:
![]()
Сделал, чтобы по Enter в плагине джамп восстанавливался:
![]()
В итоге получилась листалка. Сидишь жмешь вниз, вниз вниз вниз. Enter. Вниз вниз...
Правда появилась проблема, что глаза очень быстро устают от мельтешения экрана. Поэтому пришлось делать перерывы и на восстановление наномитов ушло часа 2. Как то так...
Последнее редактирование: