Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 1 марта!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь


Inline Patch ASProtect 1.56




Массу крэкерских инструментов, видеоуроков и статей вы сможете найти на видеокурсе от нашего сайта. Подробнее здесь.

Inline Patch for SAMInside ASProtect 1.56


Автор: Maximus // Revenge CREW



[Введение]


В данной статье мы попытаемся с вами заинлайнить ASProtect 1.56 на примере программы SamInside 2.6.5.0. Конечная цель инлайна будет запуск программы с ключом, занесенным в блек-лист. Так же я вам дам небольшое домашнее задание с подсказкой :), итак начнем’c



[Очистка Блек-Листа]


В аспре работа с блеклистом находится полностью под виртуальной машиной, поэтому приходится искать обходные маневры. Таким маневром является процедура, которая вычисляет CRC участка байтов в памяти, и выглядит она после запуска программы примерно вот так:


Inline  Patch for SAMInside ASProtect 1.56

Проанализировав этот кусок можно сказать, что если заменить байт по адресу:

 

01D0542D JNB SHORT 01D05435 На: 01D0542D JMP SHORT 01D05435

То CRC будет возвращаться равное нулю, и соответственно забаненный ключ будет работать, потому как его CRC (равное нулю) не будет равно не одному значению из блек-листа. Так же хочу обратить ваше внимание, что на выходе из этой процедуры мы так же можем с вами подменить HWID любой программы, защищенной аспром.

В итоге мы получим примерно следующее…

Было без патча:

Inline  Patch for SAMInside ASProtect 1.56

Стало с патчем:

Inline  Patch for SAMInside ASProtect 1.56

Процедура вычисления CRC не меняется от версии к версии аспра и найти ее можно сделав поиск в памяти по сигнатуре последних байтов.

И теперь осталось сделать самое легкое, заинлайнить аспр…



[InLine AsProtect]

Для инлайна нам нужно свободное место. Я нашел его в секции самого аспра (она предпоследняя по счету и называется ipro) по адресу 1CBF620:

Inline  Patch for SAMInside ASProtect 1.56

Для проверки запустим программу и убедимся, что даже после запуска, туда ничего не пишется.

Стоя на ЕП посмотрим, что находится у нас по адресу процедуры вычисления CRC 1D05414, и с ужасом убеждаемся, что там нули. Что ж, остается нудная распаковка аспра, с традиционным патчем слой за слоем? Неее, нам такой геморрой не нужен, мы пойдем своим путем. Мы переловим путем патча в ИАТ какую-нибудь функцию и в нужный момент пропатчим прогу. Я выбрал первую пришедшую в голову функцию GetModuleHandleA.

Сказано-сделано. Ставим бряк на GetModuleHandleA и запускаем прогу. На втором срабатывании нашего бряка мы обнаруживаем, что аспр распаковал нужный нам для патча кусок (по адресу 1D05414). Смотрим, откуда вызывалось GetModuleHandleA:

 01D274A6 CALL DWORD PTR SS:[EBP+4431EC]; kernel32.GetModuleHandleA

Идем по адресу EBP+4431EC и это и будет ячейка:

[01D278A8]=7C80B741 (kernel32.GetModuleHandleA)

Вот в эту ячейку мы будем писать ссылку на свою процедуру.

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

Inline  Patch for SAMInside ASProtect 1.56

Отлично, этот кусок не запакован при старте программы и доступен для патча. Спустимся чуть ниже к концу этой процедуры и по адресу

01CBF29A CALL DWORD PTR SS:[EBP+3FF]

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

Итак, делаем вход в наш инлайн патч, который будет располагаться по заранее выбранному адресу 1CBF620, про который я писал выше:

01CBF29A JMP 01CBF620

По адресу 01CBF620 пишем:

 ; Процедура изменения адреса вызова GetModuleHandleA
 ; Вызываем процедуру, которую мы затерли своим патчем
 01CBF620 CALL DWORD PTR SS:[EBP+3FF]
 
; Сохраняем во временную ячейку адрес функции GetModuleHandleA 01CBF626 PUSH EAX 01CBF627 MOV EAX,DWORD PTR DS:[1D278A8] 01CBF62C MOV DWORD PTR DS:[1CBF61C],EAX
; Заносим в ИАТ аспра новое значение, указывающее на начало нашей процедуры «патча CRC блек листа» 01CBF631 MOV DWORD PTR DS:[1D278A8], 01CBF641
; Возвращаемся в программу 01CBF63B POP EAX 01CBF63C JMP 01CBF2A0
; Процедура патча CRC блек листа ; Смотрим, распаковался нужный нам участок или нет 01CBF641 CMP BYTE PTR DS:[1D0542D],73 01CBF648 JNZ SHORT 01CBF651
; Если распаковался, то делаем патч-замену 01CBF64A MOV BYTE PTR DS:[1D0542D],0EB
; Идем на GetModuleHandleA 01CBF651 JMP DWORD PTR DS:[1CBF61C]

Все!!! Готово, сохраняем результат и теперь можно запускать программу и наслаждаться результатом:


Inline  Patch for SAMInside ASProtect 1.56


Нда ((( рано обрадовался, сработала проверка на изменение файла на диске, по этому открываем туторы и ищем как это обойти…



[Обход проверки изменения файла на диске]


Полистав туторы я понял, что единственным приемлемым способом обойти проверку аспра, это переловить функцию MapViewOfFile и изменить уже в памяти байты патча на исходные.

Начнем с того что мы поставим бряк на MapViewOfFile и будем смотреть что она возвращает в память. Эта фанкция вернет в EAX область памяти, в которую она смапировала заданный на входе файл. Со второго раза, протрасировав до RET и перейдя к участку памяти, на который указывает EAX мы увидим это:


Inline  Patch for SAMInside ASProtect 1.56


Очевидно, что аспр только что закачал в память наш exe модуль и готов его проанализировать, на этом этапе нам и нужно сделать подмену вызова функции. Теперь откроем секцию аспра и поищем в памяти, где же хранится адрес процедуры MapViewOfFile, нашли:


Inline  Patch for SAMInside ASProtect 1.56



Дальше все будет по аналогии с процедурой GetModuleHandleA, перезапускаем прогу и ставим бряк на запись на эти ячейки, со второго бряка получаем:

Inline  Patch for SAMInside ASProtect 1.56

Дальше я посмотрел в стек, в стеке был адрес возврата из процедуры, которую вы видите на экране:

0012FF58 01D1214B RETURN to SAMInsid.01D1214B from SAMInsid.01D1CA7C

Переходим туда и там мы видим вызов этой процедуры:

01D12146 CALL SAMInsid.01D1CA7C

Его я и выбрал нашим местом для патча. Теперь все готово, что бы добить прогу:

 ; Процедура патча CRC блек листа
 ; Смотрим распаковался нужный нам участок или нет
 01CBF641 CMP BYTE PTR DS:[1D0542D],73
 01CBF648 JNZ SHORT 01CBF662
 
; Если распаковался, то делаем патч-замену 01CBF64A MOV BYTE PTR DS:[1D0542D],0EB
; Тут мы немного добавим к процедуре патча ; это запишет по адресу 1D12146 вместо CALL SAMInsid.01D1CA7C инструкцию JMP 01CBF668 01CBF651 MOV DWORD PTR DS:[1D12147],FFFAD51D 01CBF65B MOV BYTE PTR DS:[1D12146],0E9
; Идем на GetModuleHandleA 01CBF662 JMP DWORD PTR DS:[1CBF61C]
; Процедура изменения адреса вызова MapViewOfFile ; Выполняем процедуру которую мы затерли патчем. Она же заполнит ИАТ аспра 01CBF668 CALL 01D1CA7C
; Сохраняем во временную ячейку адрес функции MapViewOfFile 01CBF66D PUSH EAX 01CBF66E MOV EAX,DWORD PTR DS:[1D209EC] 01CBF673 MOV DWORD PTR DS:[1CBF618],EAX
; Заносим в ИАТ аспра новое значение, указывающее на начало нашей процедуры «патча в памяти смапированного exe-шника» 01CBF678 MOV DWORD PTR DS:[1D209EC],01CBF688
; Возвращаемся в программу 01CBF682 POP EAX 01CBF683 JMP 01D1214B
; Процедура патча в памяти смапированного exe-шника ; Сохраняем во временную переменную адрес возврата в VM аспра 01CBF688 POP DWORD PTR DS:[1CBF614]
; Изменяем параметры вызова MapViewOfFile что бы возможно было произвести патч ; Было AccessMode = FILE_MAP_READ ; Стало AccessMode = FILE_MAP_COPY 01CBF68E MOV DWORD PTR SS:[ESP+4],1
; Вызов MapViewOfFile. После вызова в EAX лежит адрес на участок памяти, в котором находится копия нашего exe файла 01CBF696 CALL DWORD PTR DS:[1CBF618]
; Пишем в память CALL DWORD PTR SS:[EBP+3FF] с которого мы начали наш патч 01CBF69C MOV DWORD PTR DS:[EAX+3DA9A],3FF95FF 01CBF6A6 MOV BYTE PTR DS:[EAX+3DA9F],0
; Заполняем нулями область памяти, где хранится инлайн патч (в исходном фале на этом месте нули) 01CBF6AD PUSH EAX
; Смещение патча относительно начала файла (выясняется простым сравнением патченного и не патченного файла командой fc) 01CBF6AE ADD EAX,3DE20
; Далее заполняем нулями до тех пор, пока не встретим первый ноль в памяти 01CBF6B3 CMP DWORD PTR DS:[EAX],0 01CBF6B6 JE SHORT 01CBF6C3 01CBF6B8 MOV DWORD PTR DS:[EAX],0 01CBF6BE ADD EAX,4 01CBF6C1 JMP SHORT 01CBF6B3
; Восстанавливаем в программе адрес перехода на процедуру «изменения адреса вызова MapViewOfFile» иначе аспр обнаруживает патч и валится с ошибкой 01CBF6C3 POP EAX 01CBF6C4 MOV DWORD PTR DS:[1D12147],0A931 01CBF6CE MOV BYTE PTR DS:[1D12146],0E8
; Возвращаем в стек адрес возврата в VM и возвращаемся в основную прогу 01CBF6D5 PUSH DWORD PTR DS:[1CBF614] 01CBF6DB RETN

После этого с замиранием сердца запускаем, и о чудо, прога заработала.



[Заключение]

Мы рассмотрели с вами как можно заинлайнить AsProtect, попутно узнали, как заставить заработать ключ из блек-листа и избавится от проверки на целостность файла. Предлагаю Вам в качестве закрепления материала попробовать заинлайнить по данному тутору программу RoboTask 4.2. В ней нет проверки на целостность кода, но придется обойти маленькую хитрость с именем регистрации ;). Удачи!



[Greets to]

PE_Kill’у за его огромнейший вклад в деле уничтожения аспра как протектора и всем REVENGE’ам как самой сильной кряк-группе.



[Exhibit]

SamInside 2.6.5.0

SAMInside.exe - программный модуль

SAMInside.key - забаненный ключ (должен лежать в папке с программой)

SAMInside.2.6.5.0-patch.exe - инлайн патч для программы





RoboTask 4.2

RoboTask.exe - программный модуль

key.reg - забаненный ключ (необходимо запустить его на выполнение что бы ключ попал в реестр)

RoboTask.v4.2-patch.exe - инлайн патч для программы

rtl100.bpl,vcl100.bpl - библиотеки, необходимые для работы программы (должны лежать в папке с программой)



Скачать статью "Inline Patch ASProtect 1.56" в авторском оформление + файлы.
пароль архива на картинке



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS