/\ /\ / \_ _/ \ ____/ /__ T E A M . F I F T Y . T H R E E __\ \____ \__ ____\\- ____ -//____ __/ / /_____ ______\ \__________\ \ _/ /_\ \_________________________-// // ____/ /_\ \_ __\ _\ ____ /___ _ \_ \/ // ___\/_ /__ ))______________\_ _______\_|__ /____\/_____\ /gf _/______________(( \___\\- /___//- /____((- TEAM FiFTY THREE TUTORiALS PACK # SEVENTEEN Пишем Keygen Deluxe Автор......: cheekey Перевод....: NightCat//TEAM-53 Цель.......: Target: Media Ripper 32 v1.5 (http://flash.onego.ru/mr32/) Инструменты: Softice, Delphi (для кейгена) Этот туториал был написан после долгого перерыва в релизах... Я уехал из Германии и сейчас я живу в США. Окей, я надеюсь вы умеете работать с Айсом(ставить брейкпоинты и т.д.) Итак, предположим мы поставили брейкпоинт, вылетели в Айс, потрейсились, и по адресу :0045C4CA у нас лежит что-то инетересное! "d eax". Ага, строка которая содержит наше имя+компанию, а чуть ниже есть и наш неправильный серийник. :0045C4CA 8B45F0 mov eax, dword ptr [ebp-10] //тут Далее у нас идёт вызов, а за ним "cmp eax, 00000019", это проверка. Тут проверяется длина имя+компания, должно быть хотя бы 25 символов, если нет, то последующие интрукции вплодь до 0045C4F4 добавят к вашему имени+компания еще и строку "Media Ripper 32 Registr." Например строка "name" теперь будет "Bill GatesMicrosoftMedia Ripper 32 Registr." :0045C4CD E88678FAFF call 00403D58 :0045C4D2 83F819 cmp eax, 00000019 //тут :0045C4D5 7D1D jge 0045C4F4 :0045C4D7 8D55D4 lea edx, dword ptr [ebp-2C] :0045C4DA 8B45F0 mov eax, dword ptr [ebp-10] :0045C4DD E826B7FAFF call 00407C08 :0045C4E2 8B55D4 mov edx, dword ptr [ebp-2C] :0045C4E5 8D45F4 lea eax, dword ptr [ebp-0C] :0045C4E8 B974C74500 mov ecx, 0045C774 :0045C4ED E8B278FAFF call 00403DA4 :0045C4F2 EB0B jmp 0045C4FF Но если name + company содержит более 25-ти символов, программа сразу прыгает к :0045C4F4. Затем по адресу :0045C524 eax превращается в ANSI-код первого символа и ксорится со счётчиком в следующей строчке (ebx). По адресу :0045C542 вы увидите, что два первых символа результата ксора добавляются к строке. Например: если результат = 142, то строка становится = старое значение + "14". По адресу :0045C54E счётчик сравнивается с 26, если всё в порядке, то прыгаем к :0045C51A и снова повторяемся, но уже с другим символом. * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0045C551(C) | :0045C51A 8D45D4 lea eax, dword ptr [ebp-2C] :0045C51D 50 push eax :0045C51E 8D55D0 lea edx, dword ptr [ebp-30] :0045C521 8B45F4 mov eax, dword ptr [ebp-0C] :0045C524 0FB64418FF movzx eax, byte ptr [eax+ebx-01] :0045C529 33C3 xor eax, ebx :0045C52B E858B8FAFF call 00407D88 :0045C530 8B45D0 mov eax, dword ptr [ebp-30] :0045C533 B902000000 mov ecx, 00000002 :0045C538 BA01000000 mov edx, 00000001 :0045C53D E81A7AFAFF call 00403F5C :0045C542 8B55D4 mov edx, dword ptr [ebp-2C] :0045C545 8D45F8 lea eax, dword ptr [ebp-08] :0045C548 E81378FAFF call 00403D60 :0045C54D 43 inc ebx :0045C54E 83FB1A cmp ebx, 0000001A :0045C551 75C7 jne 0045C51A Далее опять не происходит ничего интересно вплодь до адреса :0045C5C9 и последющих строк. eax становится настоящим серийным номером, а edx = нашему введённому серийнику. Вы увидите, что настойщий серийник всегда = "MR32" + строка, которая была высчитана до этого. Вызов на :0045C5CF сравнивает их и затем уже в зависимости от условий прыгаем к хорошему сообщению или к плохому... :0045C5C9 8B45EC mov eax, dword ptr [ebp-14] :0045C5CC 8B55E8 mov edx, dword ptr [ebp-18] :0045C5CF E89478FAFF call 00403E68 :0045C5D4 0F85AD000000 jne 0045C687 Ну вот, теперь у нас есть всё, Что нужно для кейгена. :) Ну а вот и простой делфийский код: (Edit1 = Name ; Edit2 = Serial ; Edit3 = company) //--------------------------------------------------------------------------- procedure TForm1.Edit1Change(Sender: TObject); var i : Integer; var iTemp : Integer; var fTemp : extended; var strblub : String; var strSerial : String; var strSerial2 : String; begin if Edit1.Text = '' then begin Edit2.Text := 'At least 1 char for the name'; end else begin StrSerial := ''; StrSerial2 := ''; Strblub := ''; strSerial := Edit1.Text + Edit3.Text; if length(strSerial) < 25 then strSerial := strSerial + 'Media Ripper 32 Registr.'; for i:= 1 to 26 do begin strblub := inttostr(Ord(strSerial[i]) xor i); StrSerial2 := strSerial2 + strblub[1] + strblub[2]; end; strSerial := 'MR32-' + strSerial2[1] + strSerial2[2] + strSerial2[3] + strSerial2[4] + '-' + strSerial2[5] + strSerial2[6] + strSerial2[7] + strSerial2[8] + strSerial2[10] + strSerial2[11] + strSerial2[12] + strSerial2[13] + '-' + strSerial2[15] + strSerial2[16] + strSerial2[17] + strSerial2[18]; Edit2.Text := strSerial; end; end; //--------------------------------------------------------------------------- А теперь самое интересное. То из-за чего этот туториал и пишется. Мы хотим, чтобы наш кейген автоматически вводил серийник в программу, когда пользователь вводит имя и компанию в Editbox'ы Media Ripper 32. Чтобы это осуществить мы должны получить хэндлы эдитбоксов, а ведь они зменяются каждый раз, как вы запускаете программу. Но! У нас есть Аpi. :) Будем использовать findwindowexa... пример: //--------------------------------------------------------------------------- hwnd:=findwindowexa(0,0,0,'MediaRipper 32 Registration'); //--------------------------------------------------------------------------- Теперь попробуйте получить хэндл следующего чайлда (етить - прим. NCat). В данном случае это "TGroupBox". Можно ипользовать программу "ALDI666 WinNFO". //--------------------------------------------------------------------------- hwnd2:=findwindowexa(hwnd,0,'TGroupBox',0); //--------------------------------------------------------------------------- и т.д... //--------------------------------------------------------------------------- hwndedit1:=findwindowexa(hwnd2,0,'TEdit',0); hwndedit2:=findwindowexa(hwnd2,hwndedit1,'TEdit',0); hwndedit3:=findwindowexa(hwnd2,hwndedit2,'TEdit',0); hwndedit4:=findwindowexa(hwnd2,hwndedit3,'TEdit',0); //--------------------------------------------------------------------------- и т.д... Теперь нам нужно ПОЛУЧИТЬ и ВЫСТАВИТЬ текст в Editboxes... Чтобы получить текст вам сперва нужно заполнить строчку " "(пробелами), чтобы получить длину имени. Затем WM_GETTEXT получит для вас содержание name-Editbox (hwndedit6 = namebox) //--------------------------------------------------------------------------- slength := SendMessage(hwndedit6, WM_GETTEXTLENGTH,0,0) +1; for i:= 1 to slength do begin strgetname := strgetname + ' '; end; SendMessage(hwndedit6,WM_GETTEXT,slength,Longint(Pchar(strgetname))); //--------------------------------------------------------------------------- ТО же самое проделайте и с "company" и произведите вычисления серийника... и введите части вашего сейриника в программу с помощью WM_SETTEXT. //--------------------------------------------------------------------------- SendMessage(hwndedit4,WM_SETTEXT,0,Longint(Pchar('MR32'))); SendMessage(hwndedit3,WM_SETTEXT,0,Longint(Pchar(strserialpart2))); SendMessage(hwndedit2,WM_SETTEXT,0,Longint(Pchar(strserialpart3))); SendMessage(hwndedit1,WM_SETTEXT,0,Longint(Pchar(strserialpart4))); //--------------------------------------------------------------------------- вот и всё. Я не хочу давать весь код, попробуйте сами! У вас есть всё, что нужно, чтобы это осуществить. :) и не забудьте вставить проверку запущена ли программа: //--------------------------------------------------------------------------- if hwnd <> 0 then begin . . . кое-какой код... . . end; //--------------------------------------------------------------------------- - Кейген к Media Ripper 32 Keygen был мной зарелижен под ником cantal/iNTENSiON - вы зарегали программу. Хотите разрегистрировать? Удалите HKEY_CURRENT_USER\Software\MediaRipper32 Вот и всё, ребята... связь: mail :cheekey99@hotmail.com efnet: #learn2crack have phun !