Irfanview 2.98

http://stud1.tuwien.ac.at/~e9227474/

Wdasm 8.9

oleh

BlackZ

 

Pengenalan Program

Irfanview adalah software picture viewer dan editor yang sederhana namun fasilitasnya cukup memuaskan. Anda dapat melihat kumpulan gambar, slideshow, ataupun mengedit gambar.

Tutorial ini melakukan pencarian S/N yang tepat sesuai dengan nama yang diinginkan. Software ini merupakan freeware full function namun memliki menu untuk register yang akan mencantumkan nama ke jendela About. Tapi karena kita jangan berarti karena freeware kita tidak belajar. Metode perhitungan serial number-nya cukup panjang, sehingga lumayan lama membuat tutroial ini.

Essay

Sebelum memulai kita tes dulu bagaimana tingkah laku program ini dalam pengisian 'register code' nya. Jalankan program Irfanview 2.98 lalu pilih menu About dan klik menu Register dan anda akan di minta mengisi nama dan kode registrasi. Coba dulu dengan :

	Name     			: BlackZ
	Registration Code		: 123456

akan muncul pesan error yang bertuliskan "Invalid code!" ingat pesan itu.

Sekarang kita jalankan Wdasm, lalu pilih file I_VIEW.EXE untuk di disassemble. Lalu kita cari kata-kata pesan error tadi, maka anda akan mendapatkannya pada rutin bagian ini :

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004402D1(C)
|
:004402FD 85DB       	test ebx, ebx
:004402FF 742C       	je 0044032D

* Possible StringData Ref from Data Obj ->"Incorrect code !"
                                  |
:00440301 8B15C80B4B00	mov edx, dword ptr [004B0BC8]
:00440307 A190E14C00   	mov eax, dword ptr [004CE190]
:0044030C 6830200000   	push 00002030
:00440311 68C0F24C00   	push 004CF2C0
:00440316 52           	push edx
:00440317 50           	push eax

* Reference To: USER32.MessageBoxA, Ord:0195h
                                  |
:00440318 FF15B4D84D00	Call dword ptr [004DD8B4]
:0044031E 33C0         	xor eax, eax
:00440320 5F           	pop edi
:00440321 5E		pop esi
:00440322 5D           	pop ebp
:00440323 5B           	pop ebx
:00440324 81C430090000 	add esp, 00000930
:0044032A C21000       	ret 0010

ketika melihat rutin diatas string "Incorrect code !" saya merasa bahwa saya mulai dari rutin di atasnya, jadi saya ingat-ingat alamatnya pada 004402FD. Lalu kita klik menu Debug - Load process dan klik menu Goto - Code Location (Shift F12) dan isi dengan 004402FD. Kita akan dibawa ke alamat tersebut lalu breakpoint disana (F2). Setelah itu klik tombol Run (F9) maka program akan dijalankan, lalu pilih menu About - Registration dan isi nama dengan code yang seperti di atas (BlackZ - 123456), lalu klik tombol OK. Proses akan berhenti di rutin yang kita breakpoint tadi.
Setelah tekan F7 2 kali kita kamu akan menemukan rutin seperti ini :

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004402FF(C)
|
:0044032D 8D8C2434070000	lea ecx, dword ptr [esp+00000734] 		; serial kita
:00440334 8D942434060000       	lea edx, dword ptr [esp+00000634] 	; nama kita
:0044033B 51                   	push ecx
:0044033C 52                   	push edx
:0044033D E8DEF9FDFF           	call 0041FD20			; masuk di sini
:00440342 83C408              	add esp, 00000008
:00440345 85C0                 	test eax, eax
:00440347 752C                 	jne 00440375		    	; lompat kalau sama

* Possible StringData Ref from Data Obj ->"Incorrect registration !"
                                  |
:00440349 A1CC0B4B00       	mov eax, dword ptr [004B0BCC]
:0044034E 8B0D90E14C00         	mov ecx, dword ptr [004CE190]
:00440354 6830200000           	push 00002030
:00440359 68C0F24C00           	push 004CF2C0
:0044035E 50                   	push eax
:0044035F 51                   	push ecx

* Reference To: USER32.MessageBoxA, Ord:0195h
                                  |
:00440360 FF15B4D84D00       	Call dword ptr [004DD8B4]
:00440366 33C0                 	xor eax, eax
:00440368 5F                   	pop edi
:00440369 5E                   	pop esi
:0044036A 5D                   	pop ebp
:0044036B 5B                   	pop ebx
:0044036C 81C430090000         	add esp, 00000930
:00440372 C21000               	ret 0010

dari rutin diatas tampaknya kita harus masuk ke rutin call 0041FD20 karena disitu proses nama dan code kita dan harus menghasilkan nilai eax selain nol yang merupakan tanda bahwa kita memasukkan nama dan code yang benar. Kita masuk saja ke call 0041FD20 tekan F7, maka kamu akan temui rutin ini :

* Referenced by a CALL at Addresses:
|:00420840   , :00440240   , :0044033D   
|
:0041FD20 8B442408          	mov eax, dword ptr [esp+08] 	;serial kita
:0041FD24 83EC14               	sub esp, 00000014
:0041FD27 53                   	push ebx
:0041FD28 55                   	push ebp
:0041FD29 56                   	push esi
:0041FD2A 57                   	push edi
:0041FD2B 50                   	push eax
:0041FD2C 33DB                 	xor ebx, ebx
:0041FD2E E8ED030700           	call 00490120			;proses serial kita
:0041FD33 8B74242C            	mov esi, dword ptr [esp+2C]		;nama kita di load ke esi
:0041FD37 8BE8                 	mov ebp, eax			;hasil = 1E240h disimpan di esi
:0041FD39 8BFE                 	mov edi, esi			
:0041FD3B 83C9FF               	or ecx, FFFFFFFF		
:0041FD3E 33C0                 	xor eax, eax			
:0041FD40 83C404               	add esp, 00000004	
:0041FD43 33D2                 	xor edx, edx
:0041FD45 F2                   	repnz
:0041FD46 AE                   	scasb
:0041FD47 F7D1                 	not ecx
:0041FD49 49                   	dec ecx				;ecx=panjang nama kita
:0041FD4A 85C9                 	test ecx, ecx
:0041FD4C 7E17                 	jle 0041FD65			

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041FD63(C)
|
:0041FD4E 0FBE0C32          	movsx ecx, byte ptr [edx+esi]	;karakter nama diload ke ecx
:0041FD52 03D9                 	add ebx, ecx			;ebx = ebx + ecx
:0041FD54 8BFE                 	mov edi, esi			
:0041FD56 83C9FF               	or ecx, FFFFFFFF
:0041FD59 33C0                 	xor eax, eax
:0041FD5B 42                   	inc edx				;edx=edx+1
:0041FD5C F2                   	repnz
:0041FD5D AE                   	scasb
:0041FD5E F7D1                 	not ecx
:0041FD60 49                   	dec ecx
:0041FD61 3BD1                 	cmp edx, ecx			;apakah edx sudah= panjang nama
:0041FD63 7CE9                 	jl 0041FD4E			;kalau belum teruskan

di atas merupakan proses looping yang menjumlahkan kode ascii dari nama kita sehingga jika nama = "BlackZ" kode asciinya = 42 6c 61 63 6b 5a maka ebx=42+6c+61+63+6b+5a=237h. Setelah selesai kita akan lompat ke alamat 0041FD4E dan kita melihat rutin panjang ini :

|:0041FD4C(C)
|
:0041FD65 B804010000 	mov eax, 00000104 			;konstanta eax=104
:0041FD6A 6A0A 		push 0000000A
:0041FD6C 2BC3 		sub eax, ebx 			;eax=eax-ebx=104-237=fffffecd
:0041FD6E 99 		cdq 				;edx=ffffffff
:0041FD6F 33C2 		xor eax, edx 			;eax akan bernilai=132
:0041FD71 2BC2 		sub eax, edx 			;eax=eax-edx=132-ffffffff=133
:0041FD73 054C010000 	add eax, 0000014C 			;eax=eax+14C=27f
:0041FD78 8BD0 		mov edx, eax 			;edx=eax
:0041FD7A C1E203 	shl edx, 03 				;shl-kan edx dengan 3, edx=13f8
:0041FD7D 2BD0 		sub edx, eax 			;edx=edx-eax=13f8-27f=1179
:0041FD7F 8D0C90 	lea ecx, dword ptr [eax+4*edx]		;ecx=eax+4*edx=27f+4*1179=4863
:0041FD82 8D542414 	lea edx, dword ptr [esp+14] 
:0041FD86 52 		push edx
:0041FD87 8D3448 	lea esi, dword ptr [eax+2*ecx]		;esi=eax+2*ecx=27f+2*4863=9345
:0041FD8A C1E603 	shl esi, 03 				;shl-kan esi dengan 3, esi=49a28
:0041FD8D 56 		push esi
:0041FD8E E8EDC20700 	call 0049C080 			;masuk ke sini(F8)
:0041FD93 83C40C 	add esp, 0000000C 				;didapatkan urutan angka
:0041FD96 81FE3F420F00 	cmp esi, 000F423F
:0041FD9C 0F87ED000000 	ja 0041FE8F
:0041FDA2 8A4C2414 	mov cl, byte ptr [esp+14] 		;angka ke-5
:0041FDA6 8A442415 	mov al, byte ptr [esp+15] 		;angka ke-6
:0041FDAA 8A542413 	mov dl, byte ptr [esp+13] 		;angka ke-4
:0041FDAE 884C2416 	mov byte ptr [esp+16], cl 		;angka ke-7 = angka ke-5
:0041FDB2 8A4C2411 	mov cl, byte ptr [esp+11] 		;angka ke-2
:0041FDB6 88442418 	mov byte ptr [esp+18], al 		;angka ke-9 = angka ke-6
:0041FDBA 8A442412 	mov al, byte ptr [esp+12] 		;angka ke-3 ke al
:0041FDBE 884C2412 	mov byte ptr [esp+12], cl 		;angka ke-3 = angka ke-2
:0041FDC2 8B4C2418 	mov ecx, dword ptr [esp+18] 	;angka ke-9 ke ecx
:0041FDC6 88442413 	mov byte ptr [esp+13], al 		;angka ke-4 = al
:0041FDCA 81E1FF000000 	and ecx, 000000FF 			;ecx = angka ke-9
:0041FDD0 88542415 	mov byte ptr [esp+15], dl 		;angka ke-6 = dl
:0041FDD4 8B542414 	mov edx, dword ptr [esp+14] 	;angka ke-5 s/d 8 ke edx
:0041FDD8 8D0489 	lea eax, dword ptr [ecx+4*ecx]		;eax=ecx+4*ecx=5*angka ke-9
:0041FDDB 81E2FF000000 	and edx, 000000FF 			;edx = angka ke-5
:0041FDE1 C1E003 	shl eax, 03 				;shl-kan eax dengan 3
:0041FDE4 2BC1 		sub eax, ecx 			;eax = eax - angka ke-9
:0041FDE6 8BCA 		mov ecx, edx 			;ecx = edx
:0041FDE8 C1E105 	shl ecx, 05 				;shl-kan ecx dengan 5
:0041FDEB 2BCA 		sub ecx, edx 			;ecx = ecx - edx
:0041FDED 8D1449 	lea edx, dword ptr [ecx+2*ecx]		;edx = ecx+2*ecx = 3*ecx
:0041FDF0 2BC2 		sub eax, edx 			;eax = eax - edx 
:0041FDF2 99 		cdq 				;edx = ffffffff
:0041FDF3 8BC8 		mov ecx, eax 			;ecx = eax
:0041FDF5 33CA 		xor ecx, edx 			;ecx = ecx xor edx
:0041FDF7 2BCA 		sub ecx, edx 			;ecx = ecx - edx
:0041FDF9 8D0489 	lea eax, dword ptr [ecx+4*ecx]		;eax = ecx+4*ecx = 5*ecx
:0041FDFC C1E003 	shl eax, 03 				;shl-kan eax dengan 3
:0041FDFF 2BC1 		sub eax, ecx 			;eax = eax - ecx
:0041FE01 B909000000 	mov ecx, 00000009 			;ecx = 9
:0041FE06 99 		cdq 				;edx = 00000000
:0041FE07 F7F9 		idiv ecx 				;eax = eax/ecx, edx = sisa
:0041FE09 8B442413 	mov eax, dword ptr [esp+13] 
:0041FE0D 25FF000000 	and eax, 000000FF 			;eax = angka ke-4
:0041FE12 83C230 	add edx, 00000030 				;edx = edx + 30
:0041FE15 88542417 	mov byte ptr [esp+17], dl 		;angka ke-8 = dl
:0041FE19 8D1440 	lea edx, dword ptr [eax+2*eax]		;edx = eax+2*eax = 3*eax
:0041FE1C C1E204 	shl edx, 04 				;shl-kan edx dengan 4
:0041FE1F 2BD0 		sub edx, eax 			;edx = edx - eax
:0041FE21 8B442415 	mov eax, dword ptr [esp+15] 
:0041FE25 25FF000000 	and eax, 000000FF 			;eax = angka ke-6
:0041FE2A 8D0CC0 	lea ecx, dword ptr [eax+8*eax]		;ecx = eax+8*eax = 9*eax
:0041FE2D 8D0488 	lea eax, dword ptr [eax+4*ecx]		;eax = eax+4*ecx
:0041FE30 8D0442 	lea eax, dword ptr [edx+2*eax]		;eax = edx+2*eax
:0041FE33 99 		cdq 				;edx = 00000000
:0041FE34 33C2 		xor eax, edx 			;eax = eax xor edx
:0041FE36 2BC2 		sub eax, edx 			;eax = eax - edx
:0041FE38 8D0CC0 	lea ecx, dword ptr [eax+8*eax]		;ecx = eax+8*eax = 9*eax
:0041FE3B 8D0488 	lea eax, dword ptr [eax+4*ecx]		;eax = eax+4*ecx
:0041FE3E B909000000 	mov ecx, 00000009 			;ecx = 9
:0041FE43 D1E0 		shl eax, 1 			;shl-kan eax dengan 1
:0041FE45 99 		cdq 
:0041FE46 F7F9 		idiv ecx 				;eax = eax/ecx, edx = sisa
:0041FE48 83C230 	add edx, 00000030 				;edx = edx + 30
:0041FE4B 88542414 	mov byte ptr [esp+14], dl 		;angka ke-5 = dl
:0041FE4F 8B4C2411 	mov ecx, dword ptr [esp+11] 
:0041FE53 81E1FF000000 	and ecx, 000000FF 			;ecx = angka ke-2 
:0041FE59 8BC1 		mov eax, ecx 			;eax = ecx
:0041FE5B C1E003 	shl eax, 03 				;shl-kan eax dengan 3
:0041FE5E 2BC1 		sub eax, ecx 			;eax = eax -ecx
:0041FE60 8B4C2410 	mov ecx, dword ptr [esp+10] 
:0041FE64 81E1FF000000 	and ecx, 000000FF 			;ecx = angka ke-1
:0041FE6A 8D1480 	lea edx, dword ptr [eax+4*eax]		;edx = eax+4*eax = 5*eax
:0041FE6D 8D0449 	lea eax, dword ptr [ecx+2*ecx]		;eax = ecx+2*ecx = 3*ecx
:0041FE70 8D04C0 	lea eax, dword ptr [eax+8*eax]		;eax = eax+8*eax = 9*eax
:0041FE73 D1E0 		shl eax, 1 			;shl-kan eax dengan 1
:0041FE75 2BC1 		sub eax, ecx 			;eax = eax - ecx
:0041FE77 2BC2 		sub eax, edx 			;eax = eax - edx
:0041FE79 99 		cdq 				;edx = 00000000
:0041FE7A 8BC8 		mov ecx, eax 			;ecx = eax
:0041FE7C 33CA 		xor ecx, edx 			;ecx = ecx xor edx
:0041FE7E 2BCA 		sub ecx, edx 			;ecx = ecx - edx
:0041FE80 8D0449 	lea eax, dword ptr [ecx+2*ecx]		;eax = ecx+2*ecx = 3*ecx
:0041FE83 8D04C0 	lea eax, dword ptr [eax+8*eax]		;eax = eax+8*eax = 9*eax
:0041FE86 D1E0 		shl eax, 1 			;shl-kan eax dengan 1
:0041FE88 2BC1 		sub eax, ecx 			;eax = eax - ecx
:0041FE8A E9EE000000 	jmp 0041FF7D

okey kalau kita masuk ke rutin yang memanggil call 0049C080 terus saja tekan F7 samapai ditemukan rutin dibawah ini dimana program melakukan proses looping menghitung nama kita mengenerate sebuah angka :

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049C058(C)
|
:0049C036 8BC7		mov eax, edi			;eax=49a28
:0049C038 33D2         	xor edx, edx			;ebp=a (konstanta)
:0049C03A F7F5         	div ebp				;eax=eax/ebp, sisanya di edx
:0049C03C 8BC7         	mov eax, edi		
:0049C03E 8BCA         	mov ecx, edx			;ecx=sisa pembagian
:0049C040 33D2         	xor edx, edx
:0049C042 F7F5         	div ebp
:0049C044 83F909       	cmp ecx, 00000009			;bandingkan ecx dengan 9
:0049C047 8BF8         	mov edi, eax			;edi = hasil bagi
:0049C049 7605         	jbe 0049C050			;lompat kalau ecx dibawah 9
:0049C04B 80C157       	add cl, 57		
:0049C04E EB03         	jmp 0049C053

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049C049(C)
|
:0049C050 80C130     	add cl, 30			;cl = sisa pembagian + 30

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049C04E(U)
|
:0049C053 880E 		mov byte ptr [esi], cl		;esi berisi angka yang terbentuk
:0049C055 46           	inc esi
:0049C056 85FF         	test edi, edi
:0049C058 77DC         	ja 0049C036			;ulangi lagi sampai selesai
:0049C05A C60600       	mov byte ptr [esi], 00
:0049C05D 4E           	dec esi

kalau sudah selesai kita akan mendapatkan urutan angka 806103 untuk nama "BlackZ" dan selanjutnya kita menuju ke rutin ini :


* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049C06A(C)
|
:0049C05E 8A0B                    mov cl, byte ptr [ebx]
:0049C060 8A06                    mov al, byte ptr [esi]
:0049C062 880E                    mov byte ptr [esi], cl
:0049C064 8803                    mov byte ptr [ebx], al
:0049C066 4E                      dec esi
:0049C067 43                      inc ebx
:0049C068 3BDE                    cmp ebx, esi
:0049C06A 72F2                    jb 0049C05E
:0049C06C 5F                      pop edi
:0049C06D 5E                      pop esi
:0049C06E 5D                      pop ebp
:0049C06F 5B                      pop ebx
:0049C070 C3                      ret

proses diatas merupakan proses untuk membalik urutan angka yang kita dapatkan menjadi 301608 lalu kita akan keluar ke alamat :0049C0BA dan terus tekan F7 sampai kita ke alamat 0041FD93. Lalu akan diproses lagi angka tersebut (lihat rutinnya diatas pada alamat 0041FD93). Tekan terus sampai pada alamat 0041FE8A maka kita akan lompat ke rutin dibawah. Rupanya rutin ini merupakan proses terakhir yang :

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041FE8A(U)
|
:0041FF7D 99                      cdq			
:0041FF7E B909000000              mov ecx, 00000009		
:0041FF83 C644241900              mov [esp+19], 00		
:0041FF88 F7F9                    idiv ecx				;edx = sisa pembagian
:0041FF8A 83C230                  add edx, 00000030			;edx = edx + 30
:0041FF8D 88542411                mov byte ptr [esp+11], dl		;angka ke-2 = dl
:0041FF91 8D542410                lea edx, dword ptr [esp+10]
:0041FF95 52                      push edx
:0041FF96 E885010700              call 00490120			;rutin untuk mengkonversi 
:0041FF9B 83C404                  add esp, 00000004			;urutan angka ke hexadesimal 
:0041FF9E 33C9                    xor ecx, ecx			;dan disimpan di regiter eax
:0041FFA0 3BE8                    cmp ebp, eax			;serial kita sedang dibandingkan
:0041FFA2 5F                      pop edi			
:0041FFA3 5E                      pop esi
:0041FFA4 0F94C1                  sete cl
:0041FFA7 5D                      pop ebp
:0041FFA8 8BC1                    mov eax, ecx
:0041FFAA 5B                      pop ebx
:0041FFAB 83C414                  add esp, 00000014
:0041FFAE C3                      ret

dari rutin di atas kamu lihat nilai ebp (serial kita dalam hexa ) dan eax (serial asli dalam hexa). Lalu konversikan nilai eax ke desimal nah itulah code yang kita cari. Okey dari sekian rutin yang lumayan panjang ini kita coba buat key generatornya. Saya buat dengan pascal silahkan anda buat dengan bahasa lain.

K R A K

Ini keygenerator yang saya buat. Rupanya serial number berjumlah 9 angka. Untuk serial nama "BlackZ" serial yang saya dapatkan adalah 330176008.

Uses crt;
const 	konst1 = 260 {104h};
	konst2 = 332 {14Ch};
	konst3 = 10 {Ah};
	konst4 = $FFFFFFFF;
Var 	eax, ebx, ecx, edx 	: longint;
	esi, edi, ebp, i 	: longint;
	nama 			: string[25];
	sn 			: string[9];
Procedure proses_nama;
Begin
	ebx := 0;
	for i := 0 to length(nama) do ebx := ebx + ord(nama[i+1]);
	eax := konst1;eax := eax - ebx;eax := eax xor konst4;
	eax := eax - konst4;eax := eax + konst2;edx := eax;
	edx := edx shl 3;edx := edx - eax;ecx := eax + 4*edx;
	esi := eax + 2*ecx;esi := esi shl 3;edi := esi;
	str(edi,sn);
	sn[7] := sn[5]; {serial ke 7}
	sn[9] := sn[6]; {serial ke 9}
	sn[6] := sn[4]; {serial ke 6}
	sn[4] := sn[3]; {serial ke 4}
	sn[3] := sn[2]; {serial ke 3}
{menentukan serial ke 8}
	eax := 5*ord(sn[9]);eax := eax shl 3;eax := eax - ord(sn[9]);
	ecx := ord(sn[5]) shl 5;ecx := ecx - ord(sn[5]);edx := 3*ecx;
	eax := eax - edx;ecx := eax;ecx := ecx xor konst4;
	ecx := ecx - konst4;eax := 5*ecx;eax := eax shl 3;
	eax := eax - ecx;edx := eax mod 9;edx := edx + 48;
	sn[8] := chr(edx);
{menentukan serial ke 5}
	edx := 3*ord(sn[4]);edx := edx shl 4;edx := edx - ord(sn[4]);
	ecx := 9*ord(sn[6]);eax := ord(sn[6]) + 4*ecx;eax := edx + 2*eax;
	eax := eax xor 0;ecx := 9*eax;eax := eax + 4*ecx;
	eax := eax shl 1;edx := eax mod 9;edx := edx + 48;
	sn[5] := chr(edx);
{menentukan serial ke 2}
	eax := ord(sn[2]);eax := eax shl 3;eax := eax - ord(sn[2]);
	edx := 5*eax;eax := 27*ord(sn[1]);eax := eax shl 1;
	eax := eax - ord(sn[1]);eax := eax - edx;ecx := eax xor 0;
	eax := 27*ecx;eax := eax shl 1;eax := eax - ecx;
	edx := eax mod 9;edx := edx + 48;
	sn[2] := chr(edx);
end;
Begin
	clrscr;
	writeln;writeln;writeln;writeln;
	writeln('                         Program perhitungan serial number');
	writeln('                             **** Irfan_view 2.98 ****');
	writeln;writeln;writeln;
	write ('                          Masukkan nama anda : ');read(nama);
	proses_nama;
	write ('                          Serial number : ');
	for i := 1 to 9 do write(sn[i]);
	writeln;writeln;writeln;
	write('                        *** blackZ@copyright-Juni 1999 ***');readkey;
end.
{serial ke 1 tetap.}

Catatan

Sayang sekali pembuat program ini terlalu baik karena walaupun unregister tetap full function sehingga saya bertanya buat apa rutin serial number itu, padahal bisa digunakan untuk proteksi softwarenya.

BlackZ

© Juni1999