
Dim_cR -> dim_cr@mail.bg
begin {Късното лято ме радва. Времето е топло. Събраха се накуп три почивни дни(20.09.2003). Аз като никога съм без работа. Дойде му времето и на настоящия урок. Shade се е постарал да напише своето KeygenMe1, което ме вдъхнови да използвам една техника за намиране на верния сериен номер. Да, стига съм писал глупости, а да се хващам за работа}
• Програми, които ще ползваме: OllyDbg – този фантастичен assembler-level analyzing Degugger. 10x to Oleh Yuschuk. Delphi – моята среда за програмиране :). 10x to Borland.
Добре. Отворете keygenme1 с Olly. Ctrl+N за да видим:
Names in KEYGENME Address Section Type ( Name 004010A9 .flat Import ( USER32.CharUpperA 004010A5 .flat Import ( USER32.DialogBoxParamA 004010A1 .flat Import ( USER32.EndDialog 0040105C .flat Import ( KERNEL32.ExitProcess 004010B1 .flat Import ( USER32.GetDlgItemTextA 00401060 .flat Import ( KERNEL32.GetModuleHandleA 00401054 .flat Import ( KERNEL32.lstrcat 00401058 .flat Import ( KERNEL32.lstrcmp 004010AD .flat Import ( USER32.MessageBoxA 004015BC .flat Export <ModuleEntryPoint> 0040109D .flat Import ( USER32.wsprintfA
Ясно – Shade е ползвал GetDlgItemTextA за да вземе текста от EditBox-овете J. За всички на които GetDlgItemTextA не говори нищо или говори малко – Win32.hlp. Докато сме в Names Window, кликваме с десния бутон на мишката в/у GetDlgItemTextA и Set Breakpoint on Every Reference . Я да видим къде сложихме точките на прекъсване – Alt+B.
Breakpoints Address Module Active Disassembly 00401659 KEYGENME Always CALL DWORD PTR DS:[<&USER32.GetDlgItemTextA>] 0040166E KEYGENME Always CALL DWORD PTR DS:[<&USER32.GetDlgItemTextA>]
Готови сме да пуснем програмчето. – F9. Добре Keygenme-то се стартира. Въведете Име и сериен номер: Name : Dim_cR Serial : 1212 OK
Виждаме:
00401659 |. FF15 B1104000 CALL DWORD PTR DS:[<&USER32.GetDlgItemTe>; 0040165F |. 6A 40 PUSH 40 00401661 |. 68 AE134000 PUSH KEYGENME.004013AE 00401666 |. 68 C9000000 PUSH 0C9 0040166B |. FF75 08 PUSH DWORD PTR SS:[EBP+8] 0040166E |. FF15 B1104000 CALL DWORD PTR DS:[<&USER32.GetDlgItemTe>; 00401674 |. 83F8 05 CMP EAX,5 00401677 |. 0F8C B4000000 JL KEYGENME.00401731
Интересна е инструкцията на 00401674 – Сравнява се дължината на името с 5 и ако е по-малко следва –> Лошо момче, така няма да се разбереме J
Е нашето име си е по-дълго от 5 символа така че тук сме си добре. Да продължим постъпково по кода с F8.
00401686 |> 6A 01 /PUSH 1 00401688 |. 53 |PUSH EBX 00401689 |. 68 F3144000 |PUSH KEYGENME.004014F3 0040168E |. 68 AE134000 |PUSH KEYGENME.004013AE 00401693 |. E8 78FAFFFF |CALL KEYGENME.00401110 00401698 |. 0FBE05 F314400>|MOVSX EAX,BYTE PTR DS:[4014F3] 0040169F |. 83C0 14 |ADD EAX,14 004016A2 |. 69C0 04400000 |IMUL EAX,EAX,4004 004016A8 |. C1C0 05 |ROL EAX,5 004016AB |. 8D4400 FB |LEA EAX,DWORD PTR DS:[EAX+EAX-5] 004016AF |. 50 |PUSH EAX 004016B0 |. 68 A7134000 |PUSH KEYGENME.004013A7 004016B5 |. 68 78154000 |PUSH KEYGENME.00401578 004016BA |. FF15 9D104000 |CALL DWORD PTR DS:[<&USER32.wsprintfA>] 004016C0 |. 68 78154000 |PUSH KEYGENME.00401578 004016C5 |. 68 F8144000 |PUSH KEYGENME.004014F8 004016CA |. FF15 54104000 |CALL DWORD PTR DS:[<&KERNEL32.lstrcat>] 004016D0 |. 83C3 01 |ADD EBX,1 004016D3 |. 3B1D B8154000 |CMP EBX,DWORD PTR DS:[4015B8] 004016D9 |.^75 AB \JNZ SHORT KEYGENME.00401686
Това е процедурата, в която се генерира верния сериен номер и ако целта ми беше да правя Keygenerator штях да и отделя доста от вниманието си. Вие може да я минето постъпково и да наблюдавате какво става на 4016C5. Това е единствения важен адрес и за мен в момента. Това е адреса на които се съдържа верния сериен номер, след като се премине loop-a. Да с нашето трасиране се свърши. По надолу следват MesageBox-ове Bad Wrong и Valid, които сами ще си прегледате.
Сега пак да си припомним на адрес 4016C5 след като натиснем OK бутончето се съдържа верния сериен номер за нашето име. Shade малко е позабравил да се погрижи за изтриването му, което е перфектно за нашите цели. Такаааа, горе някъде бях писал че ще ползваме и Delphi. Дойде момента за това. Да се сбогуваме с Olly, да благословим мислено Oleh Yuschuk за прекрасния tool който е създал и да оставим нашия дебъгер да си почива. Време е за кодинг.
Така дали можем да влезем в адресното пространство на програмата и да прочетем съдържащото се на онова адресче. Да можем с използването на три прекрасни API функции, осигурени ни от нашия добър прияте Бил Гейтс :)), а именно:
FindWindow GetWindowThreadProcessId ReadProcessMemory
Никак не обичам да описвам API функции, затова си има Win32.hlp, а който от вас го няма веднага да си го дръпне. Също може да си четете за приспиване и MSDN :)).
Ето и кода на процедурата:
procedure TForm1.GetSerial; var i:integer; Serial:string; begin EditBox1.Text := ' ';
Wnd := FindWindow(nil,WindowTitle); // получаване handle-то на процеса if Wnd = 0 then // ако програмата не е пусната begin MessageBox(0,'Start KeygenMe1, Please!!','Ufff!',MB_OK + MB_ICONERROR); exit; end;
GetWindowThreadProcessId(Wnd, @ProcessId); // получаваме PID ProcHandle := OpenProcess(PROCESS_ALL_ACCESS,false,ProcessId); Begin ReadProcessMemory(ProcHandle,ptr($4014F8),@lpBuf,MAX_TEXT,dwTmp); //четем от адреса Serial:=lpBuf// преобразуваме в Null терминиран стринг End; If length(serial) < 1 then MessageBox(0,'Name is < 5 chars or Press OK button!!','Ei!',MB_OK + MB_ICONERROR) else EditBox1.Text:=Serial; Closehandle(ProcHandle); end;
Надявам се че с помоща на Win32.hlp всичко ще е ясно. Този тутор не е мястото, на което ще се научите да програмирате. Коментарите към кода са достатъчни за осмисляне на това което става. Приложен е source code на прогата.Разгледайе го и ако имате основателни въпроси, може да ми ги зададете в канала #pulse на UniBG мрежата.
Това е засега и мисля че е повече от достатъчно. За ентусиастите предлагам да направят същото и с keygenme2 на Shade. А да и щях да забравя – кодът на Delphi е с използването на KOL - Key Objects Library. Можете да си я свалите от http://bonanzas.rinet.ru . Keygenme-тата на Shade можете да си свалито от http://www.pulse-team.tk a Olly от http://www.anticrack.de . Ето че се свърши това което исках да Ви кажа. Хайде, до следващия урок. Dim_cR -> dim_cr@mail.bg само не ме тормозете с глупави въпроси, който ще ми създават работа за да ги трия :(). end.
P.S. Моля ако някой реши да превежда, долуказанато да не се превежда. 1) До всички които четете това, и по-точно до тези които са се заблудила да го прочетат в търсенията си на определен crack. Моля не засипвайте пощата ми с искания да Ви кракна еди коя си програма. Целта, която си поставям с всичко което съм писал е това да се научите сами да го правите. От друга страна нямам нищо против и да изкарам някой лев. Всички в България плачат че са много бедни, а същевременно никой не иска да плаща за нищо. Първо ако имате пари си купете програмата – крайно време е да Ви хрумне че някой е положил труд за да я направи. Второ ако нямате, което е по-честия случай, Господа аз и който и да е друг отделя от времето си да се научи на определени неща, а сега Вие искате да отделим Време и на Вас, време което може да даде на любимите си хора, на любимите си занимания. "Времето е пари" - Така че ......... :) Освен ако не сте някое хубаво момиче с което ще измислим нещо по интересно. 2) До jeux – ето че това за което говорихме преди време го реализирах. И вземи махни този key(актуално към 20.09.2003г.). Този урок е 50% посветен на теб. Другите са си за мен :)) . 3) Благодарности:
• на първо място към jeux, затова че ми показа че и в България има кракерско общество и успя да ме присъедини към него и че е приятеля на който знам че мога да разчитам • на Shade и Plux че създадоха идеята Pulse и че живеят с нея. • на Nex че застана зад BiOCiDE. • на Pomqara че не спира да търси. • на nre и Sometimes, за безценните съвети които ми дадоха(дано да не спират :-)). • на всички други които не споменах – не съм Ви забравил.
Хайде стига толкова че стана като наградите Oscar, но всичко горенаписано не е празни думи за мен.
До следващата ни среща – Dim_cR |