Автор: | 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*2ECX 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 = Число в шестнадцатиричной системе счисления
|
|