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