|
AutoPlayer2000 v3.0.1.4 |
|
amois |
|
Program Tipi: Keyboard Macro |
|
Araçlar:
SoftICE, DeDe |
|
|
|
|
Autocad2000 icin kisayol tuslari tanimlamamizi sagliyor.
|
Yazı |
Delphi ile yazilmis, ve DeDe’den yardim alacagiz.
Procedure --> Ureg , Tfreg --> Edtsn1Change -->
00451DF4 push ebp
<-- Buradan basliyor.
00451DF5 mov ebp, esp
...
Programi SoftIce Loader ile yukleyip --> [bpx 451DF4]
--> ve hemen disable edelim [bd*]
User Name bolumune “amois_fb” yazalim. Serial Number 2 bolumden olusuyor ve normalde OK butonu
“Disable” olarak geliyor. Dogru serial girersek
“Enable” olacak tabii ki. “123456” ve
“1907” olarak girelim. En son rakami girmeden once а breakpoint enable
[be*] --> [F10] ile ilerlerken Memory kontrolunu ihmal etmiyoruz.
...
* Reference to: controls.TControl.GetText(TControl):System.String;
|
00451E80 call 00429E24
00451E85 mov edx, [ebp-$10]
<-- [d edx] --> “amois_fb”
00451E88 mov ecx, [ebx+$02F4]
<-- [d ecx] --> “123456-1907”
00451E8E mov eax, [ebx+$02F0]
<-- [d eax] --> “AutoPlayer2000”
00451E94 call 00451BA0
<-- Bu da ne ??
00451E99 mov esi, eax
<-- eax = FFFFFFFF
00451E9B mov [ebx+$02F8], esi
<-- OK butonu enable / disable olacak
00451EA1 test esi, esi
00451EA3 setnle dl
* Reference to control BitBtn2 : TBitBtn
|
00451EA6 mov eax, [ebx+$02E0]
Manual olarak 451E99 da eax degerimizi 1 yaparsak, OK butonu enable oluyor. Daha sonra da program Registered olduk diye tesekkur ediyor. Ama bu kalici bir etki yaratmiyor.
[bpx 451E94] --> [F8]
...
:00451C34 mov edx, dword ptr [ebp-08]
<-- [d edx] --> “amois_fb”
:00451C37 mov eax, dword ptr [ebp-04]
<-- [d eax] --> “AutoPlayer2000”
:00451C3A call 00451B1C
<-- eax = 4910
:00451C3F push eax
:00451C40 mov eax, dword ptr [ebp-14]
<-- [d eax] --> “1907”
:00451C43 call 00407FF8
<-- eax = 1907
:00451C48 mov ebx, eax
<-- ebx = 1907
:00451C4A pop eax
<-- eax = 4910
:00451C4B sub bx, ax
<-- ebx = 1907-4910 = 62533 (F445)
:00451C4E movzx ecx, bx
<-- ecx = 62533
:00451C51 mov edx, dword ptr [ebp-08]
<-- [d edx] --> “amois_fb”
:00451C54 mov eax, dword ptr [ebp-04]
<-- [d eax] --> “AutoPlayer2000”
:00451C57 call 00451A98
<-- eax = ??????
:00451C5C xor edx, edx
:00451C5E push edx
:00451C5F push eax
:00451C60 mov eax, dword ptr [ebp-0C]
<-- [d eax] --> “123456”
:00451C63 call 00407FF8
<-- eax = 123456
:00451C68 cdq
:00451C69 cmp edx, dword ptr [esp+04]
:00451C6D jne 00451C72
:00451C6F cmp eax, dword ptr [esp]
<-- [d esp] --> Gercek serial
Evet, 451C6F de ilk 6 rakamimiz [d esp] deki degerle karsilastiriliyor. Boylece gecerli seriali bulmus olduk. Gerci, 451C57 deki cagri sonucunda eax in aldigi deger, gercek serialin ilk 6 basamagina esit. Ama karsilastirma 451C6F de oluyor.
KeyGen algoritmasina da bir goz atalim. Oncelikle 4910 sayisinin nasil hesaplandigini bulalim.
[bpx 451C3A] --> [F8]
* Reference to: system.@LStrCat3;
|
00451B5C call 00403D58
00451B61 mov eax, [ebp-$0C]
<-- [d eax] --> “AutoPlayer2000amois_fb”
|
00451B64 call 00451A20
<-- ????
00451B69 not eax
00451B6B xor edx, edx
* Reference to: system.@_llmod;
|
00451B6D call 00405D59
00451B72 mov ebx, eax
<-- eax = 4910
00451B74 xor eax, eax
451B64 deki cagri oncesinde User Name, sabit “AutoPlayer2000” ile birlestirildi.
[bpx 451B64] --> [F8]
...
00451A55 movzx edx, ax
<-- ax = 0 1 2 3 4 5 ...
00451A58 mov ecx, [ebp-$04]
00451A5B movzx edi, byte ptr [ecx+edx]
<-- edi = A u t o P l a y e r 2 0 ...
00451A5F add edi, edx
00451A61 and edx, +$03
00451A64 mov ecx, edx
00451A66 shl ecx, $02
00451A69 shl edi, cl
00451A6B xor esi, edi
00451A6D inc eax
00451A6E dec bx
00451A71 jnz 00451A55
<-- Harf kaldi mi ?
Bu bolumde bir donguye giriyoruz. Dongu sonucunda esi = CB38? = 83238?
oluyor. Bu dongunun Visual Basic deki karsiligini su sekilde yapmaya calistim.
isim = "AutoPlayer2000amois_fb "
isim_uzun = Len(isim)
ecx = 0
esi = 0
For i = 0 To (isim_uzun - 1)
edx = i
edi = Asc(Mid(isim, (i + 1), 1))
edi = edi + edx
edx = edx And 3
ecx = edx
edi = edi * (16 ^ ecx)
<-- edi yi CL kadar sola kaydirmak
esi = esi Xor edi
Next i
Dongu sonrasinda esi=83238? oldu.
00451B64 call 00451A20
<-- eax = CB38? = 83238?
00451B69 not eax
<-- eax = FFF34C7E = 4294134910
00451B6B xor edx, edx
* Reference to: system.@_llmod;
|
00451B6D call 00405D59
00451B72 mov ebx, eax
<-- eax = 4910
00451B74 xor eax, eax
Bu noktadan itibaren VB cuvallamaya basliyor. CB38? in
NOT ile sonucunu –83238? olarak veriyor. Neyse bu sorunu, netten yardim alarak hallettim.
:00451C48 mov ebx, eax
<-- ebx = 1907
:00451C4A pop eax
<-- eax = 4910
:00451C4B sub bx, ax
<-- ebx = 1907-4910 = 62533 (F445)
:00451C4E movzx ecx, bx
<-- ecx = F445
:00451C51 mov edx, dword ptr [ebp-08]
<-- [d edx] --> “amois_fb”
:00451C54 mov eax, dword ptr [ebp-04]
<-- [d eax] --> “AutoPlayer2000”
:00451C57 call 00451A98
<-- eax = F445 * CB38?
VB ile devam edersek, 451C4B deki islemin sonucunu 1907 – 4910 = -3003 olarak bulacagiz. Her ne kadar Matematiksel olarak dogru gozukse de, Assembly de bu islem
-->
1907 – 4910 = 0773 – 132E = F445 = 62533
Bu sorun sayilarin isaretli / isaretsiz olmalarindan kaynaklaniyor herhalde. Arastirdigim ve anlayabildigim kadariyla, VB isaretsiz sayilarla islem yapamiyor. Bu sorunu da kismen halledip,
F445 sayisini VB ile bulabildim.
not_esi = Not esi
If not_esi < 0 Then esi = CDbl(not_esi + 4294967296#)
<-- Thanks to onErr0r
esi = esi - (10000 * (Int(esi / 10000)))
fark = Mid((Hex$(son4rakam - esi)), 5, 4) <-- fark = F445
Gecerli serialin ilk 6 basamagi 451C57 deki cagri ile F445 * CB38? seklinde hesaplaniyor. Visual Basic ile bu carpma islemini yapmak, deveye hendek atlatmaktan daha zormus yahu. VB, isaretsiz sayilarla islem yapamasa da, bazi Trick lerle bu isi kivarabiliyoruz.
F445 * CB381 = C1E835??? =
52051531???
<-- Bu sonuc bizim icin yanlis
1E835??? = 511923???
<-- Bu sonuc bizim icin dogru
Carpma isleminin sonucunda bir tasma olayi oluyor ve tasan bolum edx e aktariliyor. Bizi ilgilendiren ise eax de kalan deger. Bu nedenle, carpma islemi sonucunun son 8 basamagi bizi ilgilendiriyor. VB ile 52051531??? sayisini HEX e direkt ceviremezsiniz. Is yine basa dustu.
Call cevir_16(sonuc)
<-- sonuc = 52051531??? = C1E835???
sonuc = Mid(sonuc, 2, 8)
<-- sonuc = 1E835???
Function cevir_16(sayi)
For j = 8 To 0 Step -1
basamak = Int(sayi / (16 ^ j))
sayi = sayi - (basamak * (16 ^ j))
serial = serial + Hex(basamak)
Next j
sayi = serial
End Function
Manual olarak eax deki degeri elde ettik. VB bu degeri decimal’e dogru cevirmesine ragmen, daha buyuk degerleri ceviremiyor. Degisik User Name ve son 4 rakam icin, cikacak degerleri VB ile direkt decimal’e ceviremiyorsunuz. Yukaridaki cevirme mantigina uygun olarak
cevir_10 fonksiyonunu yazmaniz gerekecek. Yani, sayiyi manual olarak decimal’e cevireceksiniz. Ben bunu da yazdim, fakat butun Code’u burada aciklamak olmaz.
Sonucta, zor da olsa VB ile KeyGen isini tamamlayabildik.
Visual Basic de tecrubeli arkadaslar, Key Gen algoritmasini daha guzel bir bicimde yazarlarsa Board’a assinlar.
Not: ??? isaretli yerler seriali direkt kopya cekmemeniz icindir.
|
|
Bir programı kullanarak para kazanıyorsanız, programı satın alın.