
Скриншот программы APIS32
APIS32 - утилита для просмотра функций API, используемых тем или иным приложением Windows. Вам достаточно выбирать нужные вам функции из списка, запускаете программу-жертву, а APIS32 выдаст полный отчет о всех вызовах этих функций из нее. Если я не ошибаюсь, это одна из первых программ такого рода, но автор явно погорячился, сделав ее платной. Инструменты для реверса просто обязаны быть бесплатными.
На
официальном сайте разработчика по какой-то причине убраны все упоминания об этой программе, но осталась прямая ссылка на
дистрибутив. Может быть автору стало стыдно, что он по молодости выпустил платную программу, я не знаю. Скачиваем, устанавливаем, смотрим. Исполняемый файл упакован самодельным пакером, по всей видимости прототипом или ранней версией
MPRESS (это упаковщик от автора программы). С ним легко справляется QuickUnpack, но можно без особых проблем распаковать и вручную.

Распаковываем исполняемый файл
Проверяем распакованный файл. Все работает. Признаки триальности долго искать не придется, одних только надписей "UNREGISTERED" в программе как у дурака махорки. С них и начнем. Я надеюсь, вы не забыли отправить распакованный файл в дизассемблер?

Нехорошая строка найдена
Строка о незарегистрированной программе найдена. Теперь посмотрим в дизассемблере на код, в котором выполняется разветвление алгоритма на триальную ветку и зарегистрированную.
...
; Вызвать функцию проверки регистрации
.text:00401711 call sub_405040
.text:00401716 jmp short loc_401719
.text:00401716 ; ----------------------------------------------
.text:00401718 db 0B8h ; Анти-дизассеблерный трюк
.text:00401719 ; ----------------------------------------------
.text:00401719 loc_401719:
; Если функция проверки вернула AL=0, то программа не зарегистрирована
.text:00401719 or al, al
.text:0040171B jz short loc_40171F
.text:0040171D jmp short loc_401754
.text:0040171F ; ----------------------------------------------
.text:0040171F loc_40171F:
.text:0040171F mov edi, offset aUnregistered
; "UNREGISTERED"
.text:00401724 mov edx, offset Filename
.text:00401729 or ecx, 0FFFFFFFFh
.text:0040172C xor eax, eax
.text:0040172E repne scasb
.text:00401730 not ecx
.text:00401732 sub edi, ecx
.text:00401734 mov esi, edi
.text:00401736 mov ebx, ecx
.text:00401738 mov edi, edx
.text:0040173A or ecx, 0FFFFFFFFh
.text:0040173D xor eax, eax
.text:0040173F repne scasb
.text:00401741 add edi, 0FFFFFFFFh
.text:00401744 mov ecx, ebx
.text:00401746 shr ecx, 2
.text:00401749 rep movsd
.text:0040174B mov ecx, ebx
.text:0040174D and ecx, 3
.text:00401750 rep movsb
.text:00401752 jmp short loc_4017BA
.text:00401754 ; ----------------------------------------------
.text:00401754 loc_401754:
.text:00401754 mov edi, offset aRegisteredTo
; "Registered to "
.text:00401759 mov edx, offset Filename
.text:0040175E or ecx, 0FFFFFFFFh
.text:00401761 xor eax, eax
...
Мы видим чистый код с абсолютно прозрачной структурой. Классический трюк против дизассемблера с прыжком внутрь следующей команды может быть и прокатил бы в далеком 2000 году, но сейчас IDA такие конструкции разбирает даже не поморщившись.
Переходим к функции проверки регистрации по адресу
0405040. Там тоже все понятно, из реестра читаются значения ключей с именем и регистрационным номером, затем все это проверяется и возвращается результат. Проверку регистрации обойдем обычным патчем. Записываем пару команд MOV AL,1 и RET в начало функции, сохраняем изменения и APIS32 начинает прекрасно работать вообще без каких-либо регистрационных данных.

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