Rambler's
Top100

Исследование защиты Internet Maniac 1.2a

Автор: FEUERRADER
Дата: 12.05.2003
Раздел: Reverse Engineering

КейГен для Internet Maniac 1.2

Программа: Internet Maniac 1.2a Размер: 114688 байт Язык: C++ Защита: Имя/Код Цель: Создание ключегена Инструменты: SoftIce, WinDasm32, любой удобный компилятор (здесь Delphi)

Предисловие: Internet Maniac служит для разных там фич с интернетом: пинг, traceroute, whois и др. Итак, ограничений у программы нет, exeшник ничем не защищен. Что еще нужно? Можно ломать 2 способами: 1) изменить условный переход 2) проанализировать код и создать кейген.

1 способ. Я не буду объяснять этот способ подробно, т.к. здесь даже самый начинающий кракер сообразит что надо делать. Ищем строки в WinDasm32 о неверном рег. номере: "Incorrect Registration code!", где перед ними видим:

016F:004051B7  CALL     00407FD0      //процедура проверки РН
016F:004051BC  ADD      ESP,BYTE +08
016F:004051BF  TEST     EAX,EAX
016F:004051C1  JZ       0040520D

Тут все понятно 4051C1: 74 75. Дальше найдем

016F:00404BBB 51                      push ecx
016F:00404BBC E80F340000              call 00407FD0        //процедура проверки РН
016F:00404BC1 83C408                  add esp, 00000008
016F:00404BC4 85C0                    test eax, eax
016F:00404BC6 0F859B030000            jne 00404F67
016F:00404BCC 68A0004300              push 004300A0
016F:00404BD1 50                      push eax

заменим 404BC7: 85 84 и все. Правильный РН будет неправильным и наоборот. Но это все слишком просто. Хочу сам создавать рег. номера!

2 способ. Запускаем SoftIce. Ставим bpx 4051B7 т.к. этот адрес используется в обоих случаях (см. выше). Вводим в поле имени: 12345, код: 1111111111111. Жмем OK. Прерываемся. Нажимаем F8. Попали в процедуру генерации верного РН для нашего имени 12345. Вот эта процедурка с моими комментариями:

016F:00407FD0  SUB      ESP,BYTE +20        // В ESI адрес
016F:00407FD3  PUSH     ESI                 // введенного нами
016F:00407FD4  MOV      ESI,[ESP+28]        // имени 12345
016F:00407FD8  PUSH     ESI                 // сохраняем ESI
016F:00407FD9  CALL     `KERNEL32!lstrlenA` // Получаем длину строки имени
016F:00407FDF  CMP      EAX,BYTE +04        // Сверяем ее с 4
016F:00407FE2  JNL      00407FEB            // Если больше прыгаем и продолжаем
016F:00407FE4  XOR      EAX,EAX             // Если меньше, возвращаемся из этой
016F:00407FE6  POP      ESI                 // процедуры и показываем, что
016F:00407FE7  ADD      ESP,BYTE +20        // наш РН - неверный
016F:00407FEA  RET     
016F:00407FEB  MOVSX    EAX,BYTE [ESI+01]   // EAX=2 символу имени="2"=32h
016F:00407FEF  MOVSX    ECX,BYTE [ESI+02]   // ECX=3 символу имени="3"=33h
016F:00407FF3  SHL      EAX,1               // EAX=EAX*2
016F:00407FF5  PUSH     EAX                 // Сохраняем EAX
016F:00407FF6  MOVSX    EAX,BYTE [ESI+03]   // EAX=4 символу имени="4"=34h
016F:00407FFA  SHL      ECX,02              // ECX=ECX*4
016F:00407FFD  PUSH     ECX                 // Сохраняем ECX
016F:00407FFE  MOV      ECX,0A              // ECX=0Ah
016F:00408003  CDQ                          // значение EAX=34h делится на два байта
016F:00408004  IDIV     ECX                 // и помещается в EAX=3h и EDX=4h
016F:00408006  MOV      EAX,FA34C6A0        // EAX=FA34C6A0h
016F:0040800B  MOV      ECX,EDX             // ECX=EDX
016F:0040800D  SHL      EAX,CL              // EAX=EAX*2^ECX
016F:0040800F  LEA      ECX,[ESP+0C]        // Дальше идут неинтересные строки
016F:00408013  PUSH     EAX
016F:00408014  PUSH     DWORD 00413B38
016F:00408019  PUSH     ECX
016F:0040801A  CALL     `USER32!wsprintfA`  // Собираем из кусочков РН
016F:00408020  MOV      EDX,[ESP+40]
016F:00408024  ADD      ESP,BYTE +14
016F:00408027  LEA      EAX,[ESP+04]
016F:0040802B  PUSH     EDX
016F:0040802C  PUSH     EAX                 // EAX=адресу, где хранится верный РН!

Фишка в том, что остановившись по адресу 40802C ввести d eax, высветится верный РН! Итак, что мы знаем. Для создания РН используются 2,3,4 символы имени. Код 2 символа умножается на 2, код 3 символа на 4, а код 4 символа делится на два значения и последняя часть является показателем степени двух, умноженной на статическое FA34C6A0h=4197762720. Вот так все "сложно"!

Создание КейГена: вот мой РАБОТАЮЩИЙ набросок создания кейгена к Internet Maniac 1.2a, созданный в Дельфи. Где name:TEdit - строка имени, code:TEdit - собственно код.

procedure TForm1.nameChange(Sender: TObject);
const stg:cardinal=$FA34C6A0;
var
by1,by2,par:string;
ch,ch3 :string;
p,p2,p3,x,l:integer;

begin

if length(name.Text)>3 then
begin
ch:=pchar(name.Text);

p:=ord(ch[2]);
by1:=inttostr(p);

p2:=ord(ch[3]);
by2:=inttostr(p2);

p3:=ord(ch[4]);
ch3:=inttostr(p3);

l:=length(ch3);
x:=strtoint(ch3[l]);

par:=inttostr(stg shl x);

if length(par)<10 then begin
repeat
par:='0'+par;
until length(par)=10;
end;

code.Text:=par+'-'+inttostr(p2 shl 2) + inttostr(p shl 1);
end else
code.Text:='Имя введено неверно';

end;

Заключение: Это достаточно простой пример генерации РН для программы. Создатели почему-то не побеспокоились о защите своего продукта.


Примечание: Расшифрую несколько слов:

       РН = Регистрационный номер
FA34C6A0h = Число в шестнадцатиричной системе счисления



Все права защищены ©  2003 
...::FEUERRADER::...




Rambler's Top100