<< Все статьи по взлому КейГен для Internet Maniac 1.2x Обсудить эту статью >>
Автор:FEUERRADER [AHTeam]
Уровень:Для начинающих
Программа:Internet Maniac 1.2x
Размер:115 Кб
Язык: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 = Число в шестнадцатиричной системе счисления

<< Все статьи по взлому Обсудить эту статью >>

ALIEN Hack Team - http://ahteam.org
Только для образовательных целей