Распаковка ASProtect 1. 35 (на примере Reactive MYCOP Cleaner 1. 2), часть 2. Восстановление ASProtect IAT:. Теперь переходим к восстановлению таблицы IAT. При поиске VOEP мы использовали метод, связанный с раскриптовкой пакером таблицы IAT, которая расположена в программе в секции 00481000.
и имеет размер 3000 байтов. Сначала нам надо найти начало и конец IAT. Следует отметить, что вся секция 00481000. помимо элементов IAT, содержит массу мусорного кода, который затрудняет определить границы таблицы IAT, особенно для неопытных cracker’s.
ALT - код — код, символы которого вызываются посредством кнопки Alt и цифры на NUM-PAD'е. На персональных компьютерах под управлением.
Поэтому, чтобы очистить IAT от мусорного кода, мы сделаем следующее. Загружаем программу в отладчик, и выполняем все те действия, когда мы искали VOEP программы. Переходим в Memory Map, нажав клавиши Alt + M.
Полная таблица Alt - кодов. Alt- код, Символ, Alt- код, Символ, Alt- код, Символ, Alt- код, Символ, Alt- код, Символ, Alt- код, Символ, Alt- код, Символ. Alt+1.
и устанавливаем BPM on write на область памяти 00481000. После нескольких остановок программы на BP. которые мы устанавливали на выходе из цикла раскриптовки, и BPM on write. мы окажемся здесь:. Удаляем BPM on write. и проходим до инструкции RET с F8. Переходим в окне dump на адрес начала секции IAT - 00481000.
выделяем всю эту секцию, и выполняем команду Binary → Fill witch 00’s :. Нажимаем клавишу F9. чтобы запустить программу, и программа нормально запускается:. Этот фактор для нас очень важен; ASProtect очень сильно засоряет таблицу IAT мусорным кодом, поэтому мы можем убрать весь мусорный код из таблицы IAT, что намного облегчит нам ее восстановление. Посмотрим, вся ли таблица IAT заполнена реальными адресами API; запускаем ImpREC, и вводим значения начала IAT и ее размер (значение OEP оставляем таким, каким его определил ImpREC):.
Нажимаем кнопку Get Imports :. Мы видим, что ImpREC не распознал два элемента, т. два элемента ссылаются на область памяти, которую создал Asprotect во время загрузки программы. И мы видим, что таблица IAT содержит 1AA распознанных элементов, и 2 нераспознанных элемента. Теперь выполним еще одну проверку. Запускаем ImpREC на программе с секцией IAT, которая не заполнена нолями.
Скопируйте в свою рабочую папку полученные файлы SGM2014Trud. rar с помощью клавиатуры (одновременным нажатием клавиш Alt + Стрелка Вниз). Таблицы 8.2-8.4 начинаются с графы « код по ОКВЭД», в ниспадающем. Промежуточные пароли в цепочке отбрасываются и в таблицу записывается. На домашнем компе с XP — нет проблем Alt + 1 = ☺, Alt + 2 = ☻.. Пятничный формат: Как писать код, который никто не сможет. Таблица Alt - кодов для Windows. Вы можете вставлять символы в это поле, нажимая клавишу "Alt" плюс цифровой код из таблицы ниже: Внимание!
Зачем нам нужно это делать? Дело в том, что когда программа остановлена на Entry Point, таблица IAT заполнена мусором. Затем пакер начинает записывать в нее значения переадресованных API, и, в последнюю очередь, пакер записывает реальные адреса API. Когда мы заполнили таблицу IAT нолями, перед записью реальных адресов API, мы тем самым удалили все переадресованные API, после чего пакер записал только реальные адреса API. ImpREC, в таком случае, не видит переадресованные API, и показывает нам неверные параметры таблицы IAT - ее начальный адрес и размер. Давайте посмотрим результат:. Мы видим, что значения не изменились, а это означает, что таблица IAT не содержит переадресованные API (кроме двух), что существенно упрощает нашу работу. Но у нас осталось два нераспознанных элемента таблицы IAT, которые находятся по адресам 004811A0 и 00481308.
В этих адресах записано одно значение - 00987574. которое мы должны перевести в реальный адрес API, чтобы получить полностью восстановленную таблицу IAT. Перезагружаем программу в отладчике, проходим на VOEP с помощью скрипта, и устанавливаем BP на адрес 00987574.
и нажимаем клавишу F9. Программа останавливается на BP:. Трассируем с помощью клавиши F8 до инструкции RET 8, и смотрим, что у нас происходит. Сначала в регистр EDX записывается имя API - GetDiskFreeSpaceExA :. После этого производится сравнение значения регистра EAX с содержимым адреса 00996458 :. Затем в стек вводятся значения регистров EDX и EAX (инструкции PUSH EDX и PUSH EAX ), программа останавливается на инструкции CALL 0097584C :.
Выполнив API GetProcAddress. программа получает реальный адрес API GetDiskFreeSpaceExA. Таким образом, пакер эмулирует инструкцию API GetProcAddress. Поэтому мы можем записать по адресам 004811A0 и 00481308 реальный адрес API GetProcAddress - 7C80AC28 :. Теперь нам нужно восстановленную секцию таблицы IAT скопировать в файл. Для этого выделяем всю секцию Таблицы IAT, и выбираем команду binary copy :.
Запускаем HexWorkshop, и повторяем все те действия, которые мы делали при создании файла таблицы INIT. Сохраняем полученный файл с именем Recovery_IAT. 5.
Восстановление прыжков на IAT. Перезагружаем программу в Olly, проходим на VOEP с помощью скрипта, переходим в секцию.
code на адрес 00401000. и выполняем команду Search for → all intermodular calls. В окне ссылок выбираем команду Сортировать по → Назначению.
и здесь мы видим много calls типа CALL 00AA0000 :. Теперь наша задача заключается в восстановлении всех этих CALL 00AA0000 в их оригинальный формат. Сначала мы сделаем это вручную, чтобы понять идею восстановления этих прыжков. Выполняем поиск всех CALL 00AA0000.
выбрав команду Serch for → All commands :. Итак, последняя инструкция CALL 00AA0000 находится по адресу 00434638.
Переходим на любой из этих CALL, например, по адресу 00401250 :. Этот CALL мы восстановим вручную; поэтому выделяем CALL 00AA0000.
и нажимаем клавиши CRTL + * (команда “New origin here”). Для получения адреса API, Asprotect последних версий использовал API VirtualAlloc вместо API GetProcAddress.
однако в данной версии ASProtect v1. 35 build 06. 26 не применяет ни первую, ни вторую API. Попытка установить BP на API VirtualAlloc или API GetProcAddress. не вызывает остановку программы. Возникает вопрос, как же нам узнать, какую API вызывает этот CALL? Ведь должен же ASProtect использовать какую-либо API для определения реального адреса API, которая вызывается этим CALL. Поскольку API VirtualAlloc и API GetProcAddress входят в библиотеку kernel32.
dll. то давайте установим BPM on access на секцию кода библиотеки kernel32.
dll :. Это - API GetCurrentProcessId. которая нам ничего не дает, поэтому еще раз нажимаем клавишу F9. Программа останавливается здесь:.