|
AutoProject |
|
amois |
|
Program Tipi: AutoCAD Plugin |
|
Araçlar:
SoftICE |
|
|
|
|
AutoCAD plugin, 3D --> 2D donusumu yapiyor.
|
Yazı |
Lock Numbers icin Unlock Code girmemizi istiyor. Ornegin, Lock Numbers =
18214-2133512 ve bu numara her bilgisayar icin
degisken. Registery’deki degerleri silerseniz, program Lock Numbers’in sadece
ilk bolumunu degistiriyor. Yani ikinci bolumu 2133512
benim bilgisayarim icin sabit bir deger. Unlock code olarak “1907”
degerini girelim.
:10006E71 call
10003BD0
<-- ??
:10006E76 pop edi
:10006E77 test eax, eax
:10006E79 push 00000040
:10006E7B jne 10006E89
<-- iyi cocuk
:10006E7D push 1000D168
<-- "Registration Error"
:10006E82 push 1000D120
<-- "Registration failed !!"
:10006E87 jmp 10006E93
:10006E89 push 1000D108
<-- "Registration Successful"
:10006E8E push 1000D0E0
<-- "Thank you for registering ..."
:10006E93 push 00000000
:10006E95 Call dword ptr [100091F4]
<-- MessageBoxA
[bpx 10006E71] --> [F8]
...
:10003C1F Call dword ptr [10009098]
<-- GetWindowsDirectoryA
...
:10003C63 Call dword ptr [10009094]
<-- GetVolumeInformationA
...
:10003CA1 mov edx, dword ptr [esp+18] <--
edx = 5141406h
:10003CA5 mov dword ptr [esp+14], ebx
:10003CA9 and edx, 00FFFFFF
<-- edx = 141406h
10003C63 deki cagri sonucunda 10003CA1 de edx 5141406h
oldu ve 10003CA9 da son 6 basamagi alinarak 141406h
oldu.
...
:10003D6B mov eax, dword ptr [esp+18] <--
eax = 141406h
:10003D6F mov ecx, dword ptr [esp+24] <--
ecx = 4726h = 18214 :)
:10003D73 push eax
:10003D74 push ecx
:10003D75 call 10003540
<-- eax = 131CA2h oldu
:10003D7A mov ecx, dword ptr [esp+30] <--
ecx = 0
:10003D7E add esp, 00000008
:10003D81 cmp eax, ecx
:10003D83 jne 10003DB7
<-- kotu cocuk
10003D6F deki ecx degerimiz 18214 oldu. Yani, bize verilen Lock Numbers’in ilk
bolumu. Cagri sonrasinda eax ile ecx karsilastiriliyor. Burayi patch
yaptigimizda kalici olarak “Registered” oluyoruz. Ama gecerli serial bulmak daha
guzel olacak. Yalniz, ecx degerimiz 0. Normalde bizim girdigimiz serial ile veya
islem gormus hali ile karsilastirilmasi gerekirdi. Bu noktada programin
Registry’den neler okuduguna bakarsak; RC ve
RN olarak 2 deger bulacagiz. Bunlardan RN, Lock
Numbers’in ilk bolumu ve biz bunu manual olarak degistirebiliyoruz. Peki RC
nedir? Manual olarak buraya 773h=1907 degerini atayip 10003D81 deki
karsilastirmaya bakalim. Evet, ecx=773h ve olmasi gereken serial eax’de duruyor.
Bunun anlami su; girdigimiz Unlock Code bir islemden geciyor ve eax’e esit ise
Registry’ye yaziliyor. Esit degilse RC bolumumuz 0 olarak kaliyor. Yani,
10003D7A da ecx’e atanan deger Registry’den geliyor. Ayrica, gercek
karsilastirmanin oldugu yer 10003D81 den daha once olmali. Baska turlu
Registered olamayiz zaten. [bc*] --> [bpx
hmemcpy] -->
...
:10006E4A lea ecx, dword ptr [esp+0C] <-- [d
ecx] = 1907
:10006E4E push ecx
:10006E4F Call dword ptr [100091E0]
<-- ascii to long <-- eax = 773h = 1907
:10006E55 sub eax, 000009DE
<-- eax = 773-9DE = FFFFFD95
:10006E5A lea edx, dword ptr [esp+0C]
:10006E5E push eax
:10006E5F push edx
:10006E60 call 10003560
<-- ??
:10006E65 add esp, 0000000C
:10006E68 lea ecx, dword ptr [esp+08]
:10006E6C Call 10007F8A
:10006E71 call 10003BD0
:10006E76 pop edi
:10006E77 test eax, eax
Evet, ise yarar ipuclari bulduk. 10006E71 deki cagriyi yukarida incelemistik
zaten. Peki, 10006E60 daki cagrida neler oluyor ? [bpx
10006E60] --> [F8]
...
:1000369F Call dword ptr [10009094]
<-- GetVolumeInformationA
...
:100036BF mov edi, dword ptr [esp+7C] <--
edi = FFFFFD95 :)
:100036C3 cmp edi, ebx
:100036C5 je 10003905
:100036CB mov eax, dword ptr [esp+20] <--
eax = 141406
:100036CF mov ecx, dword ptr [esp+28] <--
ecx = 4726
:100036D3 push eax
:100036D4 push ecx
:100036D5 call 10003540
<-- eax = 131CA2 oldu
:100036DA add esp, 00000008
:100036DD cmp edi, eax
<-- :)
:100036DF mov dword ptr [esp+2C], eax
:100036E3 jne 100038F0
Artik tam anlamiyla olayi cozduk. Keygen yazabilmek icin 100036D5 deki cagriya
da bakmak gerekse de basit birkac XOR dan olustugunu gorecegiz. Peki, firma
bizim VolumeInformation bilgimizi nasil elde ediyor ? Tabii ki
2133512 den. Bunu
da cozdugumuz zaman, herhangi bir Lock Numbers icin Unlock Code bulabilecegiz.
[bpx GetVolumeInformationA] --> 2 kez break
yapacak. [F12] ile donup trace ederseniz su bolume
geleceksiniz. Trace sirasinda elimizdeki ipuclarinin
141406 ve 208E08 oldugunu
unutmayin ve registerlerin aldiklari degerlere dikkat edin.
...
:10003986 mov ecx, dword ptr [esp+20] <--
ecx = 141406h
:1000398A add ecx, 000C7A02
<-- ecx = 208E08h = 2133512
Keygen yazabilmemiz icin herseye sahibiz. Oncelikle 10003540 da neler olduguna
da bakalim.
:10003540 mov
eax, dword ptr [esp+04] <-- eax = 4726
:10003544 mov ecx, dword ptr [esp+08] <--
ecx = 141406
:10003548 xor eax, ecx
<-- eax = 145320
:1000354A xor eax, 00074F82
<-- eax = 131CA2
:1000354F and eax, 00FFFFFF
<-- eax = 131CA2
:10003554 ret
ASM kodu su sekilde olabilir.
.data
lock_1 dd 18214
; Lock Number 1
lock_2 dd 2133512
; Lock Number 2
sonuc db 32h dup(?)
; Unlock Code buraya yazilacak
tur db "%lu",0
; long unsigned number
.code
start:
mov ecx, lock_2 ; ecx = 2133512
sub ecx, 0c7a02h ; ecx = 141406h = VolumeInformation’in son 6 basamagi
mov eax, lock_1 ; eax = 18214
xor eax, ecx ; eax = 145320h
xor eax, 074F82h ; eax = 131CA2h
and eax, 00FFFFFFh ; eax = 131CA2h
add eax, 09Deh
; eax = :)
@yaz:
invoke wsprintf, offset sonuc, offset tur, eax
invoke MessageBoxA, 0, offset sonuc, offset sonuc, 0
@cikis:
invoke ExitProcess, 0
end start
|
|
Bir programı kullanarak para kazanıyorsanız, programı satın alın.