Page 'O Labels 2.8b

http://www.rks-software.com

SoftICE 3.24
Turbo C / C++ ( optional )

oleh

CHuPaCaBRa

 

Pengenalan Program

Berikut adalah penjelasan mengenai Page 'O Labels ( dikutip dari Softseek ) :

"Lets you create and print one or more pages of mailing labels. You can print all the labels the same or print individual labels. It works with all Avery file folder labels, and any other labels having the same Avery label dimensions."

Program ini menyediakan waktu sepanjang 30 hari agar User dapat mengevaluasi program ini, selebihnya User diharapkan untuk membeli program ini secara legal. Setelah User membayar registrasi, User akan mendapat s/n tertentu.

Pada tutorial ini, aku akan menunjukkan bagaimana s/n tersebut diciptakan berdasarkan Nama User dan membuat KeyGenZ untuk program ini.

Essay

Nama dan Serial Number bisa kamu masukan melalui menu Help - Enter Serial Number. Pada dialog box tersebut User dapat memasukan Nama dan S/N yang sudah dibeli.

	Nama : CHuPaCaBRa
	S/N  : 123454321

Seperti biasa, sebelum menekan tombol 'OK', siapkan dulu Breakpoint kita. Untuk program ini, aku pasang Breakpoint pada Hmemcpy ( BPX Hmemcpy ). Setelah semuanya siap, kembali ke Windows dan tekan tombol 'OK'. Kamu bakal terlempar ke dalam fungsi Hmemcpy, tekan F12 selama beberapa kali sampai ketemu baris - baris perintah seperti di bawah ini :

:0043BFC1 call 0041463C            	;Hmemcpy
:0043BFC6 mov eax, dword ptr [ebp-10]   ;Kita sekarang di sini

Tekan F10 untuk melewati Offset 0043BFC6 lalu ketik 'D EAX' untuk meliat isi EAX :

:d eax
017F:00C17E18 43 48 75 50 61 43 61 42-52 61 00 00 24 7E C1 00 CHuPaCaBRa..$~..

Ternyata EAX = Nama yang kita masukan. Pasang Breakpoint di lokasi memory tersebut supaya kita dapat mengawasi apa yang terjadi jika Nama tersebut di-akses. Ketik BPM 017F:00C17E18.

:0043BFC9 lea edx, dword ptr [ebp-04]    
:0043BFCC call 00439944            	

Kalo kamu coba melewati ruton Call di atas dengan menekan F10, kamu akan terjebak ke dalam perintah - perintah di dalam Call tersebut karena rutin Call itu mengakses lokasi memory tempat penyimpanan nama yang tadi telah kita pasang Breakpoint. Rutin Call tersebut, ternyata bertugas untuk mengecek apakah User telah memasukan nama ke dalam DialogBox dan mengcopy-nya ke 2 lokasi memory yang berbeda.

:0043BFD1 mov eax, dword ptr [ebp-04]   

Cek isi EAX lagi :

:d eax
017F:00C17E48 43 48 75 50 61 43 61 42-52 61 00 00 54 7E C1 00 CHuPaCaBRa..T~..

Keliatan bukan.....EAX sekarang berisi nama kita tapi pada lokasi memory yang berbeda. Pasang BreakPoint lagi pada lokasi tersebut.

:0043BFD4 call 00403560            	;Rutin untuk menghitung panjang nama
:0043BFD9 test eax, eax            	
:0043BFDB je 0043C0B2
:0043BFE1 lea edx, dword ptr [ebp-08]
:0043BFE4 mov eax, dword ptr [ebp-0C]
:0043BFE7 mov eax, dword ptr [eax+000001B0]
:0043BFED call 0041463C            	;Hmemcpy untuk mengambil S/N
:0043BFF2 mov eax, dword ptr [ebp-0C]
:0043BFF5 mov ecx, dword ptr [eax+000001D0]
:0043BFFB mov edx, dword ptr [ebp-08]
:0043BFFE mov eax, dword ptr [ebp-04]
:0043C001 call 0043B044            	;Rutin Call yang penting

Rutin Call yang aku tandai di atas sebagai rutin Call yang penting karena di dalam Rutin Call inilah S/N kita akan dihitung. Darimana aku tahu ??? Kalo kamu pasang BPM di setiap lokasi memory yang menyimpan Nama kamu, pada saat kamu menekan F10 untuk melewati rutin call tersebut, kamu akan "terjebak" pada perintah yang mengakses Nama.

Berikut adalah baris - baris perintah yang perlu diperhatikan :

:0043AFB4 call 004059F0			;Merubah huruf kecil -> huruf besar
:004059F0 push ebx
:004059F1 push esi
:004059F2 push edi
:004059F3 mov edi, edx
:004059F5 mov esi, eax
:004059F7 mov eax, esi
:004059F9 call 00403560
:004059FE mov ebx, eax
:00405A00 mov eax, edi
:00405A02 mov edx, ebx
:00405A04 call 00403834
:00405A09 mov edx, esi
:00405A0B mov esi, dword ptr [edi]
:00405A0D test ebx, ebx
:00405A0F je 00405A26
:00405A11 mov al, byte ptr [edx]	;AL = Karakter dari Nama
:00405A13 cmp al, 61			;Apakah AL = 61h ( = 'a' ) ???
:00405A15 jb 00405A1D			;Jika AL < 61h, lompat !!!
:00405A17 cmp al, 7A			;Apakah AL = 7Ah ( = 'z' ) ???
:00405A19 ja 00405A1D			;Jika AL > 7Ah, lompat !!!
:00405A1B sub al, 20			;AL = AL - 20h
:00405A1D mov byte ptr [esi], al	;[ESI] = AL
:00405A1F inc edx
:00405A20 inc esi
:00405A21 dec ebx
:00405A22 test ebx, ebx
:00405A24 jne 00405A11
:00405A26 pop edi
:00405A27 pop esi
:00405A28 pop ebx
:00405A29 ret
:0043AFB9 mov eax, dword ptr [ebp-0C]	;EAX = 'CHUPACABRA'
:0043AFBC call 00403560			;Call untuk menghitung panjang nama
:0043AFC1 mov edx, eax			;EDX = Panjang Nama
:0043AFC3 test edx, edx
:0043AFC5 jle 0043AFE7
:0043AFC7 mov ecx, 00000001		;ECX = 01h
:0043AFCC mov eax, dword ptr [ebp-0C]	;EAX = 'CHUPACABRA'
:0043AFCF mov al, byte ptr [eax+ecx-01]	;AL = Karakter dari nama
:0043AFD3 cmp al, 20			;Apakah AL = 20h ???
:0043AFD5 je 0043AFE3			
:0043AFD7 and eax, 000000FF		;EAX = EAX and FFh
:0043AFDC imul eax, dword ptr [ebp-10]	;EAX = EAX imul [EBP-10]
:0043AFE0 dec eax			;EAX = EAX - 1
:0043AFE1 add esi, eax			;ESI = ESI + EAX
:0043AFE3 inc ecx			
:0043AFE4 dec edx
:0043AFE5 jne 0043AFCC			;Looping

Pada Offset 0043AFDC terdapat perkalian antara EAX dengan [EBP-10], berapakah nilai [EBP-10] ??? Untuk melihatnya, ketik '? *(EBP-10)'

:? *(ebp-10)
00000905 0000002309 "	"

Ini berarti [EBP-10] = 905 hexa = 2309 decimal

Setelah semua karakter Nama diproses, kita akan keluar dari proses looping :

:0043AFE7 lea edx, dword ptr [ebp-14]
:0043AFEA mov eax, esi            	;EAX = ESI = s/n dalam decimal

Ketik '? ESI' untuk melihat hasil perhitungan s/n :

:? ESI
001927E8 0001648616 "'è"

Jadi ESI = 1648616 decimal

:0043AFEC call 00405CA4            	
:0043AFF1 mov ecx, dword ptr [ebp-14]   

Perhatikan kembali isi ECX :

:d ecx
017F:00C1990C 31 36 34 38 36 31 36 00-5C 14 48 00 EC 59 C1 00 1648616.\.H..Y..

Dari sini bisa dilihat bahwa pada Rutin Call sebelumnya, nilai decimal dalam ESI  dirubah menjadi karakter ASCII yang kemudian disimpan dalam ECX.

:0043AFF4 mov eax, dword ptr [ebp+08]
:0043AFF7 mov edx, 0043B03C        	;EDX = 'RKS-'
:0043AFFC call 004035AC            	

Pada rutin Call di atas, s/n yang sudah selesai dihitung tersebut digabungkan dengan 'RKS-' yang menjadi default dari s/n yang harus dimasukan. Jadi lengkapnya, s/n yang tepat untuk namaku adalah 'RKS-1648616'

Dari sini sebenarnya kamu sudah bisa menghentikan tracing, kembali ke Windows dan memasukan s/n yang sesuai...tapi kalo kamu mo meneruskan tracing untuk program ini, kamu akan menemukan hal yang menarik. Ternyata perhitungan s/n berdasarkan Nama User yang ada pada program tersebut, tidak hanya menghasilkan satu s/n saja tetapi menghasilkan s/n lain yang sama - sama valid.

Perhitungan tersebut melewati baris - baris perintah yang sama dengan di atas, tetapi yang membedakan adalah nilai [EBP-10] yang akan dikalikan dengan EAX. Pada perhitungan kedua ini, [EBP-10] = 245D hexa9309 decimal

Pada akhirnya akan menghasilkan s/n kedua yaitu : 'RKS-6646616'

K R A K

#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>

void main()
{
  unsigned long EAX, ESI = 0;
  int I;
  char Name[20];

  clrscr();
  textcolor(10);
  cputs(">>>>>>>>>>>>>>><<<<<<<<<<<<<<<\r\n");
  cputs(">> 			     <<\r\n");
  cputs(">>   Page 'O Labels 2.8b    <<\r\n");
  cputs(">> 			     <<\r\n");
  cputs(">>   Kraked by CHuPaCaBRa   <<\r\n");
  cputs(">>   http://chupa.cjb.net   <<\r\n");
  cputs(">> 			     <<\r\n");
  cputs(">>>>>>>>>>>>>>><<<<<<<<<<<<<<<\r\n");
  puts("");
  puts("");

  textcolor(11);
  cprintf("Masukan Nama Anda : ");
  gets(Name);
  strupr(Name);

  for ( I = 0; I < strlen(Name); I++ )
  {
    EAX = Name[I];
    EAX *= 2309;
    EAX -= 1;
    ESI += EAX;
  }

  cprintf ( "S/N Pertama : RKS-%ld",ESI);
  ESI = 0;
  puts("");

  for ( I = 0; I < strlen(Name); I++ )
  {
    EAX = Name[I];
    EAX *= 9309;
    EAX -= 1;
    ESI += EAX;
  }

  cprintf ( "S/N Kedua : RKS-%ld",ESI);
}

Catatan

Ini adalah program kedua, setelah Winzip, yang aku liat  punya 2 s/n yang sama - sama valid. Aku ngak tau apa maksud dari program ini menciptakan 2 s/n dari satu Nama.

 

chupacabra@softhome.net

© Mei1999