Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #57, АВГУСТ 2005 г.

"Временная" защита

GL#0M (gl00m-crk@yandex.ru)

Спецвыпуск: Хакер, номер #057, стр. 057-036-5


004018EF|. 8D95 E4FBFFFFlea edx, dword ptr [ebp-41C] ; |

004018F5|. 52 pushedx; |Arg4

004018F6|. 8D85 DCFBFFFFlea eax, dword ptr [ebp-424] ; |

004018FC|. 50 pusheax; |Arg3

004018FD|. 8D4D F0lea ecx, dword ptr [ebp-10]; |

00401900|. 51 pushecx; |Arg2

00401901|. 8D95 F0FBFFFFlea edx, dword ptr [ebp-410] ; |

00401907|. 52 pushedx; |Arg1 = 0012FB00 ASCII "125-1-125125"

00401908|. E8 B3BE0100call0041D7C0 ; \CvrtMate.0041D7C0

0040190D|. 83C4 14add esp, 14

00401910|. 8B45 F0mov eax, dword ptr [ebp-10]

00401913|. 3385 DCFBFFFFxor eax, dword ptr [ebp-424]

00401919|. 3985 E4FBFFFFcmp dword ptr [ebp-41C], eax

0040191F|. 75 10jnz short 00401931

Даже невооруженному глазу заметно, что call 0041D7C0 - процедура проверки серийного номера ;). Немного подправив ее, мы получим полнофункциональную версию. "А почему бы не найти верный серийный номер?" – спросишь ты. Дело в том, что в самой последней проверке действительности нашего номера от него берется хэш MD5, а затем поочередно сверяется с элементами массива хэшей, который хранится в теле программы =/. Перебрать хоть один из них за разумное время не представляется возможным из-за размера ключа.

Остается только один, он же идеальный, вариант:

1. разобрать структуру серийного номера;

2. взять от него хэш MD5;

3. заменить полученной хэш-суммой один из элементов массива...;

4. дерзать ;)!

3. Online-проверка

Вот чего я не люблю, так это Online-тест. Найдешь верный серийный номер, вроде бы все отлично, так нет же - еще эту чертову проверку патчить. Ничего не поделаешь...

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

Итак, я лично встречал два типа online-проверок:

1. с помощью API-функций: InternetGetConnectedStateEx, InternetOpenUrlA;

2. посредством MFC-функции - CHttpFile::SendRequest.

На первом способе я останавливаться не буду, потому что не нашел подходящей цели... Одна упакована, вторая написана на VB и откомпилирована в псевдокод. Пришлось бы рассказать еще и про распаковку или, еще хуже, про исследование VB-PCode, а это выходит за рамки статьи =/. Поэтому покажу метод борьбы лишь со вторым типом.

Пример:

Цель: EzDNS

Сайт: www.ezdns.com.

Что тут говорить? Для регистрации программы вводится имя GL#0M и номер 4BB19HWLA7FF6JFP. Теперь у нас вроде бы полностью рабочая программа... Ах нет, не пройдет и трех секунд, как вылетит MessageBox с надписью "Invalid Product Key" и программа закроется.

ОК, загрузим цель в IDA и найдем все вызовы функции ?SendRequest@CHttpFile. Их всего-то два, вот один из них:

.text:0041BA65 push0

.text:0041BA67 push0

.text:0041BA69 push0

.text:0041BA6B push0

.text:0041BA6D mov ecx, esi

.text:0041BA6F call?SendRequest@CHttpFile@@QAEHPBDKPAXK@Z ; CHttpFile::SendRequest

.text:0041BA74 lea ecx, [ebp+var_7C]

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

Назад на стр. 057-036-4  Содержание