29 Nisan 2020 Çarşamba

Webdata Pro Cracked Tutorial

Webdata Pro is the relational version of Webdata with a MySQL backend. It offers the power and flexibility previously available only in packages which cost 10 times as much and require programming skills to administrate. Our web database software requires no programming experience. All administration functions are performed with a web browser and a mouse. The simple point-and-click interface for building tables, designing search pages, and managing data is easy and intuitive.








26 Nisan 2020 Pazar

NinjaGram By Mobile46 Cracked Tutorial


DotNET Tracer x86 ve MegaDumper gerekli. 
Program .net olduğu için basit ancak c++ vs olsaydı bu kadar basit değil onlar çok farklı.



Grim Reaper Dumped by Mobile46 decompile.us

Bunu indirin https://github.com/ZrCulillo/JIT-Freezer/releases
Exeyi bu programın üstüne sürükleyin. Bu program şimdi dump edebilirsiniz diye bir mesaj verecek onu verince megadumper ile dump edin.
Ardından Universal Fixer ile dumpe ettiğiniz exeyi fixleyin.

Softlic64.dll hatası verirse;
Dnspydaki mor yazılı kısma sağ tıklayıp "Edit Module..."e tıklayın ve aşağıdaki resimdeki gösterdiğim yerleri işaretleyip kaydedin.
Bu şekilde düzgün dump edilmiş ve çalışmış olması gerekiyor.

[Resim: VaWyFo.png]

25 Nisan 2020 Cumartesi

.Net Dump ederken dikkaet edilmesi gereken yollar Modul editlemek


Burada modulu kaydederken neden bunları işaretliyorsunuz






Paketlenmiş exelerde bu işaretlerdiğim seçenekler kayıt yaparken değişebiliyor ve değişirse program hata verip düzgün çalışmayabiliyor o yüzden paketliyken olan veriler değişmesin aynı kalsın diye buraları işaretliyoruz.


21 Nisan 2020 Salı

ConfuserEX Dump iki dosya birleştirme

Resource kısmı ayrılmışsa o zaman birleştirme yapıyorum. Ayrı olunca confuserex, farklı bir dllden rame yükleme yaptırıyor hemen belli oluyor zaten.


Merhaba 

ConfuserEx Proxy Call Fixer 1.2

Dup Pop Patcher

String Decyrpter

ConfuserEx 5.0 Switch Killer

En son iki dosyayı birleştir



Yaptığım adımlar :

1.) AntiTamp Killer 

2.) Modül Sel ve MD5'i Manuel Olarak Kaldırma 

3.) Manuel Olarak Gizleme Yöntemlerini Kaldırma 

4.) ProxyCall Fixer 

5.) Calli Fixer 

6.) ConfuserEx Unpacker 2.0 

7.) De4dot 8 ile Yeniden Adlandırın .) Kullanılmayan Yöntemi Manuel Olarak Kaldırma & Kontrol akışı





4 Nisan 2020 Cumartesi

Keygenme 9




Keygen nasıl yazılır serimizin sonuna gelmişken güzel bir örnek ile bitiriyoruz serimizi. yazar bu crackmesin de FPU komutlarını da kullanmış. Aslında FPU konusu başlı başına ayrı bir olay. "Real Numbers" denilen gerçel sayılar ile işlem yapabilmenizi, trigonometrik ve aritmetik işlemleri kolaylıkla yapabilmenizi sağlıyor FPU komutları. Demek ki dergiden sonra bu konuya da girmeliyim. Ama siz FPU konusunda bilgi sahibi olmak istiyorsanız RAY isimli arkadaşın web sayfasını incelemelisiniz.
Aslında önceki incelediyseniz yapmanız gereken extra birşey yok farenizin scroll tuşuyla aşağıya doğru inerseniz serial kontrolünün yapıldığı yere gelirsiniz. Ama ben genede anlatayım: Crackmeyi Ollydebugger ile açın, CODE penceresine sağ tıklayın ve "Search For > All referenced Text Strings" Seçin açılan pencereden, doğru serial mesajına çıft tıklayın. Serial kontrolünün yapıldığı yerdesiniz biraz daha yukarı çıkıp "GetDlgItemTextA" apisinin olduğu yere gelin:
4011D3|.PUSH 19                                 ; /Count = 19 (25.)
4011D5|.PUSH crackme_.00403096                  ; |Buffer = crackme_.00403096
4011DA|.PUSH 66                                 ; |ControlID = 66 (102.)
4011DC|.PUSH [ARG.1]                            ; |hWnd = 00401000
4011DF|.CALL <JMP.&USER32.GetDlgItemTextA>      ; \GetDlgItemTextA ---->seriali alan api
4011E4|.MOV DWORD PTR DS:[4030C4],EAX  ;serialin  uzunluğunu 4030C4 adresine yazıyor
4011E9|.PUSH 1E                                 ; /Count = 1E (30.)
4011EB|.PUSH crackme_.00403078                  ; |Buffer = crackme_.00403078
4011F0|.PUSH 65                                 ; |ControlID = 65 (101.)
4011F2|.PUSH [ARG.1]                            ; |hWnd = 00401000
4011F5|.CALL <JMP.&USER32.GetDlgItemTextA>      ; \GetDlgItemTextA--->ismimizi alan api
4011FA|.MOV DWORD PTR DS:[4030C0],EAX  ;ismin uzunluğu 4030C0 adresine yazılıyor
4011FF|.ADD EAX,21    ;eax=eax+21h(eaxde ismin uzunluğu vardı)
401202|.CMP EAX,27    ;eax 27h ile kontrol ediliyor
401205|.JB SHORT crackme_.0040124C  ;altındaysa dallanıyor(ismimiz en az altı karakter olmalı 27h-21h)
401207|.MOV ECX,EAX    ;ecx=eax
401209|.PUSH EDI                                ;  ntdll.7C900228
40120A|.PUSH crackme_.00403051                  ; /Arg2 = 00403051
40120F|.PUSH crackme_.00403061                  ; |Arg1 = 00403061
401214|.CALL crackme_.00401269                  ; \crackme_.00401269 serialin hesaplandığı CALL F7 ile dalalım
F8 komutu Trace Over, F7 ise Trace Into anlamına gelir. Türkçeleştirirsek, Trace Over o komutu izler, Trace into izlemek için içine girer. F7 ile call'a daldık aşağıda isme göre serialin hesaplandığı kodları görüyorsunuz. Şimdi inceleyelim:
401269/$ PUSH EBP
40126A|. MOV EBP,ESP
40126C|. ADD ESP,-4
40126F|. XOR EBX,EBX    ;yazmaçlar sıfırlanıyor
401271|. XOR EDX,EDX
401273|. XOR ECX,ECX
401275|. XOR ESI,ESI
401277|. LEA EDX,DWORD PTR DS:[403078]  ;ismimizin bulunduğu adres değeri edx'e yazılıyor
40127D|. PUSH EDX                               ; /StringOrChar = FFFE48D5 ???
40127E|. CALL <JMP.&USER32.CharLowerA>          ; \CharLowerA varsa ismimizdeki büyükharfler küçültülüyor
401283|. MOV EDX,EAX    ;edx'e eax değeri atanıyor
401285|. XOR EAX,EAX    ;eax=0
401287|. XOR ECX,ECX    ;ecx=0
401289|> /MOVSX EAX,BYTE PTR DS:[ECX+403078] ;ismimizin her bir karakterinin hex değeri sırayla eax'e atılıyor
401290|. |XOR EBX,EAX    ;ebx=ebx XOR eax
401292|. |IMUL EBX    ;eax=ebx*eax , edx=0
401294|. |MOV EDX,EBX    ;edx=ebx
401296|. |SHL EDX,4    ;edx=edx SHL 4
401299|> |SUB EDX,133337h   ;edx=edx-133337h
40129F|. |CMP EDX,3434478h   ;edx ile 3434478h karşılaştırılıyor
4012A5|.^|JA SHORT crackme_.00401299  ;edx büyükse yukarı dallanarak edxteki çıkartma işlemi yapılıyor
      ;edx değeri 3434478h'den küçük olana kadar dallanacak
4012A7|. |OR DH,24h    ;dh=dh OR 24h
4012AA|. |AND AL,AH    ;al=al OR AH
4012AC|. |XOR EDX,EAX    ;edx=edx XOR eax
4012AE|. |INC ECX    ;ecx'i bir artır
4012AF|. |CMP DWORD PTR DS:[4030C0],ECX  ;ecx ismin uzunluğu ile karşılaştırılıyor
4012B5|.^\JNZ SHORT crackme_.00401289  ;eşit değilse dallan yoksa devam
4012B7|. XOR EBX,EDX    ;ebx=ebx XOR edx
4012B9|. MOV ECX,DWORD PTR DS:[4030C0]  ;ecx=ismin uzunluğu 4030C0 adresinde ismin uzunluğu vardı
4012BF|. SUB CL,3    ;CL=CL - 3
4012C2|. RCL EAX,CL    ;eax=eax RCL cl
4012C4|. MOV DWORD PTR DS:[4030C8],EAX  ;eax değeri 4030C8 adresine yazılıyor
4012C9|. WAIT     ;bu komut FPU(floating point unit) işlem yaparken CPU'nun beklemesini sağlar
4012CA|. FINIT     ;FPU kullanılacağı zaman yazmaçları ilklendirmeye yarar
4012CC|. FLD DWORD PTR DS:[4030C8]  ;Load Real Number, ST0'a yüklendi
4012D2|. MOV DWORD PTR DS:[4030CC],EDX  ;edx'deki değer 4030CC adresine yazıldı
4012D8|. MOV DWORD PTR DS:[4030D0],EBX  ;ebx'deki değer 4030D0 adresine yazıldı
4012DE|. FLD DWORD PTR DS:[4030D0]  ;Load Real Number, ST0'a yüklendi
4012E4|. FXTRACT    ;ST0 içeriğini 2 ye ayırır
4012E6|. FILD DWORD PTR DS:[4030CC]  ;4030CC adresindeki değeri ST0 ya yazar tamsayı olarak
4012EC|. FADD ST,ST(2)    ;ST0=ST0+ST2
4012EE|.>NOT WORD PTR DS:[4030C8]  ;4030C8 adreindeki veriyi ters çevir(1 leri 0'a 0ları 1e)
4012F5|. FIMUL DWORD PTR DS:[4030C8]  ;ST0=ST0*4030C8adresindeki değer
4012FB|. FSQRT     ;ST0'ın kare kökü
4012FD|. FSINCOS    ;ST0 kaynağındaki veriyi açı olarak alır ve ST0 ile ST1e sinüs kosinüs değerlerini yazar
4012FF|. F2XM1     ;2 üssü ST0-1 'i hesaplar ve ST0'a yazar, naapmış lan bu herif :D
401301|.>AND WORD PTR DS:[4030D0],4321h  ;4030D0 adresindeki değer ile 4321h AND işlemine tabi tut
40130A|. MOV EAX,DWORD PTR DS:[4030C8]  ;eax=4030C8 adresindeki değer
40130F|. FIMUL DWORD PTR DS:[4030D0]  ;ST0 daki değer ile 4030D0 adresindeki değr çarpılır sonuç ST0'a yazılır
401315|. FMUL ST(3),ST    ;ST3=ST3 * ST0
401317|. FSUBR DWORD PTR DS:[4030C8]  ;ST0=ST0-4030C8 adresindeki değer
40131D|. FST DWORD PTR DS:[4030CC]  ;4030CC adresine ST0'ı yaz
401323|. MOV EBX,DWORD PTR DS:[4030CC]  ;ebx=4030CC adresindeki veri
401329|. XOR EBX,EAX    ;ebx=ebx XOR eax
40132B|. XOR EBX,12340F0Fh   ;ebx=ebx XOR 12340F0Fh
401331|. XOR EBX,EDX    ;ebx=ebx XOR edx
401333|. IMUL EBX    ;eax=eax * ebx
401335|. MOV EBX,EAX    ;ebx=eax
401337|. LEAVE
401338\. RETN 8
Yani bu herif ne yapmış yaw burada :D Bildiği bütün komutları kullanmış adam. En son ebx yazmacına gerçek serialimiz yazılıyor.
401219|.PUSH EAX
40121A|.PUSH crackme_.00403096
40121F|.CALL crackme_.004013CC
401224|.POP ECX                                 ;  kernel32.7C817077
401225|.POP EDI                                 ;  kernel32.7C817077
401226|.CMP EAX,EBX    ;BURADA ise girilen serial ile hesaplanan kontrol ediliyor!
401228|.JNZ SHORT crackme_.0040124C  ;eşitse sıkıntı yok değilse kötü çocuğa dallanıyor!
40122A|.PUSH 40                                 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
40122C|.PUSH crackme_.0040304D                  ; |Title = "wee"
401231|.PUSH crackme_.00403019                  ; |Text = "You did it! Now make a keygen =)"
401236|.PUSH 0                                  ; |hOwner = NULL
401238|.CALL <JMP.&USER32.MessageBoxA>          ; \MessageBoxA
40123D|.PUSH crackme_.0040303A                  ; /Text = "Crackme - cracked!"
401242|.PUSH [ARG.1]                            ; |hWnd = 00401000
401245|.CALL <JMP.&USER32.SetWindowTextA>       ; \SetWindowTextA
Şimdi sıra keygen hazırlamakta. Yine yukarıdaki serial hesaplama kodlarını alıp assembly haline getirip biraz düzenlemek gerekiyor. Aslında bunuda yapmasam siz yapsanız kendinize daha çok şey kadarsınız, uğraşın biraz. Ama ben bu derste de size kaynak kodları hazırladım. Buradan indirebilirsiniz.
Bu yazı bize ne öğretti? Tabiki CPU işlemleri dışında birde FPU işlemleri olduğu :D FPU hakkında en yukarıda bir adres vermiştim. O adrese gidip inceleyin derim. Çünkü bir çok yerde bunlarla karşılaşacaksınız. Özelliklede crpto konusuna gireceğiniz zaman bunları öğrenmiş olmanız sizin için birer artı olacak.
Türk Ters Mühendisliğine gönül veren
Zamanını harcayan herkese

sonsuz TEŞEKKÜRLER ........
Öldürmeyen Her Darbe Güce Güç Katar ::: BlueDeviL // SCT
Bu programı kullanarak para kazanıyorsanız lütfen satın alın. Bu yazının yazılma amacı program yazanlara programlarını daha iyi korumaları konusunda yol göstermektir. Lisanssız kullanımda Dokümanı hazırlayan sorumlu değildir.
Diyeceğim şudurki: Emek verilipde yapılmış bir şeyi çalma, onu satın al.

Blue DeviL
E-Mail: bluedevil@sctzine.com
ICQ: 82503282

Keygenme 8



Önceki örneklere nazaran bir farklı crackme daha. Bunu beğendim. Çünkü bu crackme'yi gerçekren reverse etmemiz gerekecek. Öncekilerde serial hesaplanıp ortaya çıkıp bizimkiyle kontrol ediliyordu. Ancak burada gerçek serial algoritmaya girmiyorsa hata oluyor. Bu sebeple crackme'deki serial kontrol algoritmasının tersine çevireceğiz ki gerçek olan tek seriali bulalım.
Crackme'yi olly ile yükleyin. CTRL + N yapın. Gelen Pencerede programın dallandığı APIleri görüyosunuz. Daha doğrusu windowsdali DLL(dinamik link kütüphanelerinden)den çağırdığı APIleri görüyorsunuz. Bize lazım Olan "GetDlgItemText" APIsi onu bulup sağ tıklayın ve "Set Breakpoint on every reference" seçeneğini seçin. Olly menüsünde B işareti breakpointleri gösterir. Ona tıklarsanız programın breakpointleri koyup koymadığını hangi adreslere koyduğunu görürsünüz. neyse lafı uzattık. Şimdi F9 ile çalıştıralım crackme açılınca isim seriali girelim "check" diyince olly hoop diyecek ve duracağız:
4011D3|.PUSH 19                                 ; /Count = 19 (25.)
4011D5|.PUSH crackme_.00403082                  ; |Buffer = crackme_.00403082
4011DA|.PUSH 66                                 ; |ControlID = 66 (102.)
4011DC|.PUSH [ARG.1]                            ; |hWnd = 000C0764 ('Crackme - not cracked yet',class='FHCF_Crackme')
4011DF|.CALL <JMP.&USER32.GetDlgItemTextA>      ; \GetDlgItemTextA---> serialimiz burada alınıyor (breakpoint buraya konulmuş)
4011E4|.CMP EAX,8    ;serialin uzunluğu 8 ile karşılaştırılıyor
4011E7|.JNZ SHORT crackme_.0040124A  ;8 den farklı ise dalllan yoksa devam et
4011E9|.PUSH 1E                                 ; /Count = 1E (30.)
4011EB|.PUSH crackme_.00403064                  ; |Buffer = crackme_.00403064
4011F0|.PUSH 65                                 ; |ControlID = 65 (101.)
4011F2|.PUSH [ARG.1]                            ; |hWnd = 000C0764 ('Crackme - not cracked yet',class='FHCF_Crackme')
4011F5|.CALL <JMP.&USER32.GetDlgItemTextA>      ; \GetDlgItemTextA---->ismimiz bu api ile alınıyor(diğer breakpoint buraya konulmuş)
4011FA|.TEST EAX,EAX    ;isim var mı yokmu
4011FC|.JE SHORT crackme_.0040124A  ;yoksa dallan 
4011FE|.PUSH EDI
4011FF|.PUSH crackme_.0040303F                  ; /Arg2 = 0040303F
401204|.PUSH crackme_.0040304F                  ; |Arg1 = 0040304F
401209|.CALL crackme_.00401267                  ; \crackme_.00401267
40120E|.PUSH EBX
40120F|.PUSH crackme_.00403082
401214|.CALL crackme_.00401330
401219|.CALL crackme_.00401271   ;hesaplamamın yapıldığı call buraya F7 ile dalıyoruz
40121E|.POP EBX
40121F|.POP EDI
401220|.CMP EDX,91919191
401226|.JNZ SHORT crackme_.0040124A
401228|.PUSH 40                                 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
40122A|.PUSH crackme_.0040303B                  ; |Title = "wee"
40122F|.PUSH crackme_.00403019                  ; |Text = "You did it! =)"
401234|.PUSH 0                                  ; |hOwner = NULL
401236|.CALL <JMP.&USER32.MessageBoxA>          ; \MessageBoxA
40123B|.PUSH crackme_.00403028                  ; /Text = "Crackme - cracked!"
401240|.PUSH [ARG.1]                            ; |hWnd = 000C0764 ('Crackme - not cracked yet',class='FHCF_Crackme')
401243|.CALL <JMP.&USER32.SetWindowTextA>       ; \SetWindowTextA
Aşağıda gerçek serial hesaplanmıyor arkadaşlar eğer sizde olly ile tek tek incelerseniz göreceksiniz. Burada girilen seriali belli komutlar ile test ediyor. Eğer istenen değerler ile bir doğruluk varsa hataya atlama yapılmıyor ve devam ediyor. Şimdi kodları inceleyelim:
401271/$MOV CL,0FD    ;CL=0FDh
401273|.XOR EBX,EBX    ;ebx=0
401275|.MOV BX,AX    ;bx=ax-> serialin en sağ 4baytı
401278|.AND EAX,FFFF0000   ;seriali FFFF0000 ile AND işlemi yap
40127D|.ROR EAX,10    ;eax=eax ROR 10
401280|.ADD BX,0FCDE    ;bx=bx + 0FCDEh
401285|.ROR AX,CL    ;AX=AX ROR CL(0FDh)
401288|.CMP AX,1337    ;burada ax=1337 olmalı
40128C|.JNZ SHORT crackme_.004012A2
40128E|.ROL BX,CL    ;BX=BX ROL CL(0FDh)
401291|.CMP BX,9292    ;burada bx 9292h olmalı
401296|.JNZ SHORT crackme_.004012A2
401298|.MOV EDX,91919191   ;edx=91919191h eğer doğru serial grildiyse
      ;buraya kadar devam ediyor ve edx'e bu değer atanıyor
      ;sonrada mesajdan önce bununla karşılaştırma yapılıyor
40129D|.SUB EAX,3897    ;eax=eax-3897h bunun neden yaptığını anlamadım
Sanırım keygeni nasıl yazmamız gerektiğini biraz detaylı anlatmalıyım. Yukarıdaki döngüyü olly ile incelediğinizde herhangi bir serialin hesaplanmadığını anlamış olmalısınız. Anlamadıysanız, bilgisayarı kapatıp televizyonu açın. Anladıysanız Ters mühendislik şimdi başlıyor, çünkü yukarıdaki kodu tersten çalıştırmazsak gerçek seriali bulamayız, şimdi inceleyelim:
SerialUret PROC uses ebx edi esi,hWin:DWORD;keygenimiz açılır açılmaz bu işlemi çalıştırıp
;bize gerçek seriali verecek

xor eax,eax  ;eax=0
xor ecx,ecx  ;ecx=0
xor ebx,ebx  ;ebx=0
mov cl,0FDh  ;CL=0FDh->CL değeri döngü boyunca değişmiyor 
mov bx,9292h  ;BX=9292h-&en son işlem bx mutlaka 9292h olmalı
ror bx,cl  ;BX=BX ROR CL-> ROL işleminin tersi
mov ax,1337h  ;AX=1337h-> AX'de mutlaka 1337h olmalı
rol ax,cl  ;AX=AX ROL CL->ROR'un terside ROL
sub bx,0FCDEh  ;BX=BX-0FCDEh->toplamanın tersi çıkartma ilkokul matematiği :D
rol eax,10h  ;EAX=EAX ROL 10h->bununla axte yazılı olan değeri eax'in en soluna yazıp ax'i boş bırakıyoruz
mov ax,bx  ;ax=bx->boşalan ax değerine bx'i yazıyoruz
mov [serial],eax ;eax=doğru serial

;Crackme için tek bir serial var
;bizim girdiğimiz seriali bir döngüden geçirerek
;bazı kontroller yapıyor ve arada hata bulunca döngüden çıkıyor
;biz döngüyü inceleyip ters çevirdik
;ve gerçek seriali hesapladık

invoke wsprintf,addr serial,addr format,serial;seriali olduğu gibi alır hex hali ile
invoke SetDlgItemText,hWin,edtSerial,ADDR serial
 
xor eax,eax
ret

SerialUret endp
basit olmasına rağmen en beğendiğim yazı bu oldu. Algoritma basit ama öğrenilmesi gereken bir konu ezber yok kafa çalıştırma var.
Birde aşağıdaki resmi incelemenizi istiyorum:

Türk Ters Mühendisliğine Gönül vermiş
zamanını harcamış herkese

sonsuz TEŞEKKÜRLER ........
Öldürmeyen Her Darbe Güce Güç Katar ::: BlueDeviL // SCT
Bu programı kullanarak para kazanıyorsanız lütfen satın alın. Bu yazının yazılma amacı program yazanlara programlarını daha iyi korumaları konusunda yol göstermektir. Lisanssız kullanımda Dokümanı hazırlayan sorumlu değildir.
Diyeceğim şudurki: Emek verilipde yapılmış bir şeyi çalma, onu satın al.

Blue DeviL
E-Mail: bluedevil@sctzine.com
ICQ: 82503282

Keygenme 7



Yazı dizimizin 7nci serisinde yine bir isme göre hesaplanan crackme ile karşınızdayız. Farkındayım bazılarına öff geliyor. Ancak bundan sonraki 2 yazıda altın vuruş yapacağız! O sebeple sabırlı olalım. Okuduğumuz her yazı yazdığımız her asm kodu bizim için tecrübe olacak. Uzatmadan lafı devam edelim.
Programı Ollydebugger ile açalım CTRL+N yapıp Names penceresini görelim. GetDlgItemText apisine sağ tıklayarak "Set breakpoint on every reference" seçelim. Programı çalıştırıp isim serial girin. "Check Serial" tuşuna basınca crackme break pointte duracak. Bizde incelemeye başlıyacağız.
4011D7|.PUSH 19                                 ; /Count = 19 (25.)
4011D9|.PUSH crackme_.0040309A                  ; |Buffer = crackme_.0040309A
4011DE|.PUSH 66                                 ; |ControlID = 66 (102.)
4011E0|.PUSH [ARG.1]                            ; |hWnd = 000E06F8 ('Crackme - not cracked yet',class='FHCF_Crackme')
4011E3|.CALL <JMP.&USER32.GetDlgItemTextA>      ; \GetDlgItemTextA--->girdiğimiz serialin alındığı yer
4011E8|.PUSH 1E                                 ; /Count = 1E (30.)
4011EA|.PUSH crackme_.0040307C                  ; |Buffer = crackme_.0040307C
4011EF|.PUSH 65                                 ; |ControlID = 65 (101.)
4011F1|.PUSH [ARG.1]                            ; |hWnd = 000E06F8 ('Crackme - not cracked yet',class='FHCF_Crackme')
4011F4|.CALL <JMP.&USER32.GetDlgItemTextA>      ; \GetDlgItemTextA-->girdiğimiz ismin alındığı ger
4011F9|.CMP EAX,6    ;ismin uzunluğu burada kontrol ediliyor
4011FC|.JB SHORT crackme_.00401251  ;eğer 6dan küçükse dallan yoksa devam
4011FE|.MOV ECX,EAX    ;ismin uzunluğu ecx'e yazılıyor
401200|.MOV EBX,0F    ;ebx=0Fh
401205|.SUB ECX,4    ;ecx=ecx-4
401208|.MOV DWORD PTR DS:[4030C4],ECX           ;ecx değeri 4030C4 adresine taşınıyor
40120E|.PUSH EDI
40120F|.PUSH crackme_.00403051                  ; /Arg2 = 00403051
401214|.PUSH crackme_.00403061                  ; |Arg1 = 00403061
401219|.CALL crackme_.0040126E                  ; \crackme_.0040126E--> hesaplama yapılan call F7 ile dalalım
Yukarıdaki call 40126E adresine dallanıyor:
40126E/$ PUSH EBP
40126F|. MOV EBP,ESP
401271|. ADD ESP,-4
401274|. XOR EDX,EDX    ;yazmaçlar sıfırlanıyor
401276|. XOR EAX,EAX
401278|. XOR ECX,ECX
40127A|. XOR ESI,ESI                            ;  crackme_.00401180
40127C|. XOR EDI,EDI
40127E|> MOVSX EAX,BYTE PTR DS:[ECX+403080] ;girdiğimiz ismin 5nci hanesinden itibaren her karakterin
      ;hex değeri eax'e atılıyor.
401285|. IMUL EBX,EAX    ;ebx=ebx*eax
401288|. INC ECX    ;ecx değerini bir artır
401289|. CMP DWORD PTR DS:[4030C4],ECX  ;4030C4 adresindeki değer ile ecx'i karşılaştır
40128F|.^JNZ SHORT crackme_.0040127E  ;eşit değillerse dallan
401291|. LEA ECX,DWORD PTR DS:[EBX*2+1337] ;ecx=(ebx*2)+1337h
401298|. XOR CX,CX    ;cx=0
40129B|. LEA ECX,DWORD PTR DS:[ECX+EBX*4] ;ecx=ecx+(ebx*4)
40129E|. XOR EBX,ECX    ;ebx=ebx XOR ecx = gerçek serial
4012A0|. LEAVE
4012A1\. RETN 8
Yukarıda görüldüğü gibi ismimizi baz alarak elde ettiği bir sayı ile yapılan aritmetik ve mantıksal işlemlerden sonra bir serial üretiliyor. Aşağıda da göreceksiniz bu serial ile bizim girdiğimiz serial karşılaştırılıyor.
40121E|.PUSH EBX
40121F|.PUSH crackme_.0040309A                  ;  ASCII "11223344"->girdiğimiz serial
401224|.CALL crackme_.00401330
401229|.POP EBX                                 ;  0013FC78
40122A|.POP EDI                                 ;  0013FC78
40122B|.CMP EAX,EBX    ;iyi ve kötü serialler burada karşılaştırılıyor
40122D|.JNZ SHORT crackme_.00401251  ;dallanan jump komutu
40122F|.PUSH 40                                 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
401231|.PUSH crackme_.0040304D                  ; |Title = "wee"
401236|.PUSH crackme_.00403019                  ; |Text = "You did it! Now make a keygen =)"
40123B|.PUSH 0                                  ; |hOwner = NULL
40123D|.CALL <JMP.&USER32.MessageBoxA>          ; \MessageBoxA
401242|.PUSH crackme_.0040303A                  ; /Text = "Crackme - cracked!"
401247|.PUSH [ARG.1]                            ; |hWnd = 000E06F8 ('Crackme - not cracked yet',class='FHCF_Crackme')
40124A|.CALL <JMP.&USER32.SetWindowTextA>       ; \SetWindowTextA
Keygeni yazarken ollyden aldığınız kodlardaki değerlerin hexadesimal yani 16lık olduğunu unutmayın. Şimdi aşağıda yukarda serial algoritmasının keygene dönüştürdüğümüz halini inceleyin:
SerialUret PROC uses ebx edi esi,hWin:DWORD

;GetDlgItemText ile girilen isim ve isim uzunluğunu elde ederiz
invoke GetDlgItemText,hWin,edtAD,ADDR isim,30h
mov uznIsim,eax     ;isim uzunluğu bir değişkende
cmp eax,6     ;ismin uzunluğunu 6 ile karşılaştır
jb _isimhata     ;eğer 6dan küçükse hata ver yoksa devam
mov ecx,eax     ;isin uzunluğu ecx'e atılıyor
mov ebx,0Fh     ;ebx=0Fh
sub ecx,4     ;ismin uzunluğundan 4 çıkart
mov uznIsim,ecx     ;uznIsim değişkenine ecx değeri yazdır


xor edx,edx     ;edx=0
xor eax,eax     ;eax=0
xor ecx,ecx     ;ecx=0
xor esi,esi     ;esi=0
xor edi,edi     ;edi=0
mov edx,offset isim    ;edx=ismimizin adresi
_dongu1:
MOVSX EAX,BYTE PTR DS:[4+edx+ecx]  ;ismin 5nci hanesinden itibaren 
      ;bir karakter alınıp hex değeri eax'e yazılır
IMUL EBX,EAX     ;ebx=ebx*eax
INC ECX      ;ecx değerini 1 artır
CMP DWORD PTR DS:[uznIsim],ECX   ;ecx ve uznIsim değişkenini karşılaştır
JNZ _dongu1     ;eşit değilse dallan yoksa devam
LEA ECX,DWORD PTR DS:[EBX*2+1337h]  ;ecx=(ebx*2)+1337h
XOR CX,CX     ;cx=0
LEA ECX,DWORD PTR DS:[ECX+EBX*4]  ;ecx=ecx+(ebx*4)
XOR EBX,ECX     ;ebx=ebx XOR ecx = gerçek serial
mov [serial],ebx
invoke wsprintf,addr serial,addr format,serial
invoke SetDlgItemText,hWin,edtSerial,ADDR serial
 
_Son:
xor eax,eax
ret

_isimhata:
invoke SetDlgItemText,hWin,edtSerial,ADDR isimHata
jmp _Son

SerialUret endp
Türk Ters Mühendisliğine gönül vermiş
zaman harcamış herkese

sonsuz TEŞEKKÜRLER ........
Öldürmeyen Her Darbe Güce Güç Katar ::: BlueDeviL // SCT
Bu programı kullanarak para kazanıyorsanız lütfen satın alın. Bu yazının yazılma amacı program yazanlara programlarını daha iyi korumaları konusunda yol göstermektir. Lisanssız kullanımda Dokümanı hazırlayan sorumlu değildir.
Diyeceğim şudurki: Emek verilipde yapılmış bir şeyi çalma, onu satın al.

Blue DeviL
E-Mail: bluedevil@sctzine.com
ICQ: 82503282

Keygenme 6



Bu da orijinal bir crackme. Bu yazıda ve sonundaki keygen örneğinde nasıl random(rassal) sayı üreteceğimizi öğreneceğiz. Zaten 2 yolu var(benim bildiğim) assembly de burada bir tanesini göreceğiz. Yazıya başlamadan önce konu hakkında araştırma yapmak isteyen arkadaşlar "GetTickCount" APIsini internetten araştırsınlar bakalım ne işe yarıyormuş.
Programı Ollydebugger ile açalım CTRL+N yapıp Names penceresini görelim. GetDlgItemText apisine sağ tıklayarak "Set breakpoint on every reference" seçelim. Programı çalıştırıp isim serial girin. "Check Serial" tuşuna basınca crackme break pointte duracak. Bizde incelemeye başlıyacağız.
4011D7|.PUSH 19                                 ; /Count = 19 (25.)
4011D9|.PUSH crackme_.00403096                  ; |Buffer = crackme_.00403096
4011DE|.PUSH 66                                 ; |ControlID = 66 (102.)
4011E0|.PUSH [ARG.1]                            ; |hWnd = 000406A6 ('Crackme - not cracked yet',class='FHCF_Crackme')
4011E3|.CALL <JMP.&USER32.GetDlgItemTextA>      ; \GetDlgItemTextA-->bu api serialimizi almaya yarıyor
4011E8|.PUSH 1E                                 ; /Count = 1E (30.)
4011EA|.PUSH crackme_.00403078                  ; |Buffer = crackme_.00403078
4011EF|.PUSH 65                                 ; |ControlID = 65 (101.)
4011F1|.PUSH [ARG.1]                            ; |hWnd = 000406A6 ('Crackme - not cracked yet',class='FHCF_Crackme')
4011F4|.CALL <JMP.&USER32.GetDlgItemTextA>      ; \GetDlgItemTextA-->burada ise ismimiz alınıyor
4011F9|.CMP EAX,5    ;ismin uzunluğu 5 ile karşılaştırılıyor
4011FC|.JB SHORT crackme_.00401255  ;5ten haneden küçük bie isim girilmişse hata veriyor
4011FE|.MOV ECX,EAX    ;ismin uzunluğu ecx'te
401200|.MOV DWORD PTR DS:[4030C0],ECX           ;ecx'teki değer 4030C0 adresine yazılıyor
401206|.PUSH EDI
401207|.PUSH crackme_.00403051                  ; /Arg2 = 00403051
40120C|.PUSH crackme_.00403061                  ; |Arg1 = 00403061
401211|.CALL crackme_.00401272                  ; \crackme_.00401272
401216|.PUSH EBX
401217|.PUSH crackme_.00403096                  ;  ASCII "11223344"
40121C|.CALL crackme_.00401310
401221|.CMP EAX,3838    ;eaxte serialimiz var ve 3838h ile karşılaştırılıyor
401226|.JBE SHORT crackme_.00401255  ;3838h'dan daha küçük ve eşitse dallanıyor yoksa devam
401228|.CALL crackme_.0040127C   ;seriali kontrol algoritması burada F7 ile dalalım içine
Aşağıda seriali konrtol eden döngüde serialimizi 3838h 'a bölüyor. Önemli olan kalanın 0 olması. DIV, IDIV işleminde kalan her zaman edx değişkenine yazılır. Zaten serialin doğruluğunu kontrol eden test komutuyla edx = 0 olmadığı sürece hata verecektir.
40127C/$MOV EBX,3838    ;ebx=3838h
401281|.CDQ     ;convert double to quad
401282|.IDIV EBX    ;eax=eax / ebx, kalan=edx
401284\.RETN
Döngü bitti son kontrol için devam ediliyor:
40122D|.POP EBX                                 ;  0013FC78
40122E|.POP EDI                                 ;  0013FC78
40122F|.TEST EDX,EDX    ;edx = 0 'mı
401231|.JNZ SHORT crackme_.00401255  ;0 değilse hata mesajına dallan yoksa iyi çocuk ;)
401233|.PUSH 40                                 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
401235|.PUSH crackme_.0040304D                  ; |Title = "wee"
40123A|.PUSH crackme_.00403019                  ; |Text = "You did it! Now make a keygen =)"
40123F|.PUSH 0                                  ; |hOwner = NULL
401241|.CALL <JMP.&USER32.MessageBoxA>          ; \MessageBoxA
401246|.PUSH crackme_.0040303A                  ; /Text = "Crackme - cracked!"
40124B|.PUSH [ARG.1]                            ; |hWnd = 000406A6 ('Crackme - not cracked yet',class='FHCF_Crackme')
40124E|.CALL <JMP.&USER32.SetWindowTextA>       ; \SetWindowTextA
Yukardan ne anladık? öyle bir sayı olmalı ki, eax bölü ebx sonucundan kalan 0 olmalı. İsmimizle ilgili gördüğünüz gibi her hangi bir işlem yapılmıyor. Olay tamamen serialle ilgili. O zaman bu sayı bir çok sayı olabilir. EBX'teki değer 3838h olduğuna göre bu sayının katları bizim serialimiz olabilir, manuel bile hesaplayabilirsiniz. Şimdi biz bunu rassal bir sayı hesaplayıp 3838h ile çarpıcaz ve sonuç bizim serialimiz olacak. Peki rassal sayı assembly'de nasl hesaplanıyor? aslında basit. win32 de "GetTickCount" apisi adı altında bir api var. Bu api windowsun başlamasından beri geçen zamanı milisaniye olarak eax'e yazar. Yani biz bu apiyi her çalıştırdığımızda bize farklı bir rakam verecek :D Ama bana öyle kocaman bir sayı gerekmiyor. O yüzden ben keygeni yazarken eax'in sadece AH ve AL kısmındaki rakamları alıp işlem yapacağım. Keygen kaynak kodları BURADAN indirebilirsiniz. Buraya yapıştırma gereği duymuyorum.
Neymiş peki Win32 Programmer's reference dosyasını yanımızdan ayırmıyor muşuz değil mi. Şu an bazıları "onu nereden bulucam ben" diyo sanki. Birçok yerden bulabilirsiniz. Eğer MASM32 paketini indirip kurduysanız zaten içerisinde birçok help dosyasıyla beraber geliyor. Yok kurmadıysanız size internetten araştırın demiyorum. Manyak mısın kardeşim 6 derstir ne anlatıyorum ben keygen yazıyoruz :D Bunun için RadASM programı lazım demedikmi? Assembly derlemek için MASM32 kullancaz demedik mi? Hemen http://www.sctzine.com/ adresine gidiyorsun araçlar sayfasından Masm32 ve RadASM dosyalarını indirip kuruyorsun.
Türk Ters Mühendisliğine adanmış her saniyenin sahiplerine

sonsuz TEŞEKKÜRLER ........
Öldürmeyen Her Darbe Güce Güç Katar ::: BlueDeviL // SCT
Bu programı kullanarak para kazanıyorsanız lütfen satın alın. Bu yazının yazılma amacı program yazanlara programlarını daha iyi korumaları konusunda yol göstermektir. Lisanssız kullanımda Dokümanı hazırlayan sorumlu değildir.
Diyeceğim şudur ki: Emek verilip de yapılmış bir şeyi çalma, onu satın al.

Blue DeviL
E-Mail: bluedevil@sctzine.com
ICQ: 82503282

Keygenme 5



Keygen nasıl yazılır serimizin 5nci yazısında yine bir isme göre serial hesaplama algosuyla karşı karşıyayız. Pes etmek yeter demek yok bu işi öğreneceğiz. Buyrun kodları inceleyelim.
Programı Ollydebugger ile açalım CTRL+N yapıp Names penceresini görelim. GetDlgItemText apisine sağ tıklayarak "Set breakpoint on every reference" seçelim. Programı çalıştırıp isim serial girin. "Check Serial" tuşuna basınca crackme break pointte duracak. Bizde incelemeye başlıyacağız.
4011D3|.PUSH 19                                 ; /Count = 19 (25.)
4011D5|.PUSH crackme_.00403096                  ; |Buffer = crackme_.00403096
4011DA|.PUSH 66                                 ; |ControlID = 66 (102.)
4011DC|.PUSH [ARG.1]                            ; |hWnd = 000B0652 ('Crackme - not cracked yet',class='FHCF_Crackme')
4011DF|.CALL <JMP.&USER32.GetDlgItemTextA>      ; \GetDlgItemTextA---->serialimiz alınıyor
4011E4|.PUSH 1E                                 ; /Count = 1E (30.)
4011E6|.PUSH crackme_.00403078                  ; |Buffer = crackme_.00403078
4011EB|.PUSH 65                                 ; |ControlID = 65 (101.)
4011ED|.PUSH [ARG.1]                            ; |hWnd = 000B0652 ('Crackme - not cracked yet',class='FHCF_Crackme')
4011F0|.CALL <JMP.&USER32.GetDlgItemTextA>      ; \GetDlgItemTextA-->ismimiz bu api ile alınıyor
4011F5|.CMP EAX,5    ;ismimizin uzunluğu 5 ile karşılaştırılıyor
4011F8|.JB SHORT crackme_.00401245  ;5'ten küçükse dallanıyor yoksa devam
4011FA|.MOV ECX,EAX    ;ismin uzunlupu ecx'e yazılıyor
4011FC|.MOV DWORD PTR DS:[4030C0],ECX  ;ecx değeri 4030C0 adresine yazılıyor
401202|.PUSH EDI
401203|.PUSH crackme_.00403051
401208|.PUSH crackme_.00403061
40120D|.CALL crackme_.00401262   ;serial hesaplama döngüsüne dallanıyor F7 ile içine dalalım

401262 $  PUSH EBP    ;F7 basıp daldığımız yer burası
401263 .  MOV EBP,ESP
401265 .  ADD ESP,-4
401268 .  XOR EBX,EBX    ;yazmaçlar sıfırlanıyor    
40126A .  XOR EDX,EDX
40126C .  XOR EAX,EAX
40126E .  XOR ECX,ECX
401270 .  XOR ESI,ESI                           ;  crackme_.00401180
401272 .  XOR EDI,EDI    ;buraya kadar
401274 >  MOVSX EAX,WORD PTR DS:[ECX+403078] ;ismimizin+ecx yazmacının ilk iki baytı eax'e yazılıyor
40127B .  IMUL ECX    ;eax=eax * ecx
40127D .  ADD EBX,EAX    ;ebx=ebx+eax
40127F .  ADD ECX,2    ;ecx=ecx+2
401282 . >CMP BYTE PTR DS:[ECX+403078],0 ;ecx+isim 0 ile karşılaştırılıyor
      ;ayrıca ecx 2şer 2şer arttığı için
      ;döngü daha çabuk bitiyor
401289 .^ JNZ SHORT crackme_.00401274  ;0 değilse dallan yoksa devam
40128B .  ROL EBX,99                         ;ebx=ebx ROL 99h
40128E .  XCHG EAX,EBX    ;yer değiştir
40128F .  SHR EAX,CL    ;eax=eax SHR CL
401291 .  MOV ESI,EAX    ;esi=eax=serial :)
401293 .  LEAVE
401294 .  RETN 8



401212|.PUSH EBX
401213|.PUSH crackme_.00403096                  ;  ASCII "11223344"->benim girdiğim serial
401218|.CALL crackme_.00401324   ;bu calldaki işlemden sonra girdiğimiz serial eax'e yazılıyor
40121D|.POP EBX                                 ;  crackme_.00403061
40121E|.POP EDI                                 ;  crackme_.00403061
40121F|.CMP ESI,EAX    ;iyi kötü çocuk burada karşılaştırılıyor
401221|.JNZ SHORT crackme_.00401245  ;eğer yanlış serial girildiyse dallan yoksa devam
401223|.PUSH 40                                 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
401225|.PUSH crackme_.0040304D                  ; |Title = "wee"
40122A|.PUSH crackme_.00403019                  ; |Text = "You did it! Now make a keygen =)"
40122F|.PUSH 0                                  ; |hOwner = NULL
401231|.CALL <JMP.&USER32.MessageBoxA>          ; \MessageBoxA
401236|.PUSH crackme_.0040303A                  ; /Text = "Crackme - cracked!"
40123B|.PUSH [ARG.1]                            ; |hWnd = 000B0652 ('Crackme - not cracked yet',class='FHCF_Crackme')
40123E|.CALL <JMP.&USER32.SetWindowTextA>       ; \SetWindowTextA
Seriali crackme zaten kendisi verdiği ve buraya kadar bununla ilgili buna benzer 4 crackmeyi de çözdüğünüz için keygenin assembly kodlarını buraya yazmıyorum. Ancak kaynak kodları buradan indirebilirsiniz.
Türk Ters Mühendisliğine gönül vermiş herkese

sonsuz TEŞEKKÜRLER ........
Öldürmeyen Her Darbe Güce Güç Katar ::: BlueDeviL // SCT
Bu programı kullanarak para kazanıyorsanız lütfen satın alın. Bu yazının yazılma amacı program yazanlara programlarını daha iyi korumaları konusunda yol göstermektir. Lisanssız kullanımda Dokümanı hazırlayan sorumlu değildir.
Diyeceğim şudurki: Emek verilipde yapılmış bir şeyi çalma, onu satın al.

Blue DeviL
E-Mail: bluedevil@sctzine.com
ICQ: 82503282

Keygenme 4



Keygen Nasıl yazılır serisi kaptanın seyir defteri 4 :) Yine isme göre hesaplama yapılıyor kısa ve basit bir döngü. Canınızı sıkmayın 9 yazılık bu seride ilerideki crackmelerde farklı şeyler var. Şimdi kodlarımızı inceleyelim.
Programı Ollydebugger ile açalım CTRL+N yapıp Names penceresini görelim. GetDlgItemText apisine sağ tıklayarak "Set breakpoint on every reference" seçelim. Programı çalıştırıp isim serial girin. "Check Serial" tuşuna basınca crackme break pointte duracak. Bizde incelemeye başlıyacağız.
4011D3|.PUSH 19                                 ; /Count = 19 (25.)
4011D5|.PUSH crackme_.00403096                  ; |Buffer = crackme_.00403096
4011DA|.PUSH 66                                 ; |ControlID = 66 (102.)
4011DC|.PUSH [ARG.1]                            ; |hWnd = 00401000
4011DF|.CALL <JMP.&USER32.GetDlgItemTextA>      ; \GetDlgItemTextA-->serialin alındığı api
4011E4|.PUSH 1E                                 ; /Count = 1E (30.)
4011E6|.PUSH crackme_.00403078                  ; |Buffer = crackme_.00403078
4011EB|.PUSH 65                                 ; |ControlID = 65 (101.)
4011ED|.PUSH [ARG.1]                            ; |hWnd = 00401000
4011F0|.CALL <JMP.&USER32.GetDlgItemTextA>      ; \GetDlgItemTextA-->ismimizin alındığı api
4011F5|.CMP EAX,5    ;apiden dönen değerin biride ismin uzunluğudur o da eax'e yazılır
      ;burada eax yani ismin uzunluğu 5 ile karşılaştırılıyor
4011F8|.JB SHORT crackme_.00401249  ;ismimiz 5 handen kısa ise dallan yoksa devam et
4011FA|.MOV ECX,EAX    ;ismin uzunluğu ecx'e yazılıyor
4011FC|.MOV DWORD PTR DS:[4030C0],ECX  ;ecxdeki veri 4030C0 adresine yazılıyor
401202|.PUSH EDI                                ;  ntdll.7C900228
401203|.PUSH crackme_.00403051                  ; /Arg2 = 00403051
401208|.PUSH crackme_.00403061                  ; |Arg1 = 00403061
40120D|.CALL crackme_.00401266                  ; \crackme_.00401266--> bu call serial hesaplanan yeri çağırıyor F7 ile dalalım
CALL 401266 adresini çağırıyor bu adrese F7 (trace into) ile giriyoruz ve orada nelerin döndüğünü öğreneceğiz. Şimdi serilain hesaplandığı yerleri inceleyelim ve ne yapıldığını anlamaya çalışalım:
401266/$PUSH EBP
401267|.MOV EBP,ESP
401269|.ADD ESP,-4
40126C|.XOR EBX,EBX    ;yazmaçlar sıfırlanıyor
40126E|.XOR EDX,EDX
401270|.XOR EAX,EAX
401272|.XOR ECX,ECX
401274|.XOR ESI,ESI                     ;  crackme_.00401180
401276|.XOR EDI,EDI
401278|.MOV ECX,DWORD PTR DS:[4030C0]  ;ecx'e ismin uzunluğu yazılıyor
40127E|.SUB ECX,2    ;ecx=ecx-2
401281|.MOVSX EAX,WORD PTR DS:[ECX+403078] ;ecx+isim ->hangi karaktere denk geliyorsa oradan itibaren
      ;o karakterin hex değeri eax'e yazılıyor
401288|.XOR EAX,ECX    ;eax=eax XOR ecx
40128A|.IMUL ECX    ;eax=eax * ecx
40128C|.CDQ     ;convert double quad
40128D|.IDIV DWORD PTR DS:[4030C0]  ;eax=eax / ismin uzunluğu, edx=kalan
401293|.NOT EAX     ;eax'i ters çevir
401295|.MOV DWORD PTR DS:[4030C4],EAX  ;eax'deki değeri 4030C4 adresine yaz
40129A|.LEAVE
40129B\.RETN 8
Hesaplama bitince RETN ile içine girdiğimiz CALL değerinden bir sonraki satıra uçuyoruz:
401212|.PUSH EBX
401213|.PUSH crackme_.00403096
401218|.CALL crackme_.00401328   ;eax=girdiğimiz serial
40121D|.POP EBX                                 ;  kernel32.7C817077
40121E|.POP EDI                                 ;  kernel32.7C817077
40121F|.CMP EAX,DWORD PTR DS:[4030C4]  ;eax ile gerçek serial karşılaştırılıyor
401225|.JNZ SHORT crackme_.00401249  ;eşit değilse dallan
401227|.PUSH 40                                 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
401229|.PUSH crackme_.0040304D                  ; |Title = "wee"
40122E|.PUSH crackme_.00403019                  ; |Text = "You did it! Now make a keygen =)"
401233|.PUSH 0                                  ; |hOwner = NULL
401235|.CALL <JMP.&USER32.MessageBoxA>          ; \MessageBoxA
40123A|.PUSH crackme_.0040303A                  ; /Text = "Crackme - cracked!"
40123F|.PUSH [ARG.1]                            ; |hWnd = 00401000
401242|.CALL <JMP.&USER32.SetWindowTextA>       ; \SetWindowTextA
Yukarıda olly ile de incelerseniz daha iyi anlarsınız, döngü dahi yok sadece ismimizin son iki hanesini alıp eax'e yazıp onunla bir kaç mantıksal işlem yapıyor o kadar. Keygenin kaynak kodlarını buradan alabilirsiniz.
Türk Ters Mühendisliğine katkıda bulunan herkese

sonsuz TEŞEKKÜRLER ........
Öldürmeyen Her Darbe Güce Güç Katar ::: BlueDeviL // SCT
Bu programı kullanarak para kazanıyorsanız lütfen satın alın. Bu yazının yazılma amacı program yazanlara programlarını daha iyi korumaları konusunda yol göstermektir. Lisanssız kullanımda Dokümanı hazırlayan sorumlu değildir.
Diyeceğim şudurki: Emek verilipde yapılmış bir şeyi çalma, onu satın al.

Blue DeviL
E-Mail: bluedevil@sctzine.com
ICQ: 82503282