Keygenerator fr ACiD_BuRN Newbie Crackme
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Finden knnt Ihr diese Crackme bei http://crackmes.cjb.net.

Auerdem bentigt Ihr: 
- SoftIce und Ihr wit wie man damit umgehen kann;
- Deine Lieblingsprogrammiersprache um dann den keygen zu coden;
- ein wenig Menschenverstand
- sowie Cracker Asm-Kentnisse

Starten wir dann die cwcrackme.exe.
Drcken dann denn ' Serial / Name'-Button.

Schreib Deinen Namen rein  (ich schreibe "rubor") und eine fiktive serialnummer.
Breakpoint setzen auf "hmemcpy".
Und ab geht' S !

In SoftIce den  breakpoint lschen  (bc *) und dann 12 mal F12 drcken,
dann bist Du auf den Weg nach Rom, sogut wie angelangt.
Ein wenig tracen mit F8 und Du bist hier:

:0042F9EB 0FB600                  movzx eax, byte ptr [eax]      <------   nimm von dem eingegebenen Namen den 1sten Buchstaben und wandle ihn in ASCII um
:0042F9EE 8BF0                    mov esi, eax		<------   verschiebe das Resultat (bei meinem Namen = "r" = 114 (dez))
:0042F9F0 C1E603                  shl esi, 03		<------   esi = shift logical left = resultat * 8
:0042F9F3 2BF0                    sub esi, eax		<------   esi = esi - ASCII Wert   ( erste Berechnung )
:0042F9F5 8D55EC                  lea edx, dword ptr [ebp-14]
:0042F9F8 8B83DC010000            mov eax, dword ptr [ebx+000001DC]
:0042F9FE E855B0FEFF              call 0041AA58
:0042FA03 8B45EC                  mov eax, dword ptr [ebp-14]
:0042FA06 0FB64001                movzx eax, byte ptr [eax+01]  <----- macht das gleiche wie oben, nur mit dem 2ten Buchstaben
:0042FA0A C1E004                  shl eax, 04		    <----- eax = ascii wert * 16
:0042FA0D 03F0                    add esi, eax		    <-----esi =  resultat von der ersten Berechnung + eax
:0042FA0F 893554174300            mov dword ptr [00431754], esi  <---- speicher nun das Ergebnis in diesem index
:0042FA15 8D55F0                  lea edx, dword ptr [ebp-10]
:0042FA18 8B83DC010000            mov eax, dword ptr [ebx+000001DC]
:0042FA1E E835B0FEFF              call 0041AA58
:0042FA23 8B45F0                  mov eax, dword ptr [ebp-10]
:0042FA26 0FB64003                movzx eax, byte ptr [eax+03] <----- unser 4ter Buchstabe
:0042FA2A 6BF00B                  imul esi, eax, 0000000B	   <----- eax= esi * 11
:0042FA2D 8D55EC                  lea edx, dword ptr [ebp-14]
:0042FA30 8B83DC010000            mov eax, dword ptr [ebx+000001DC]
:0042FA36 E81DB0FEFF              call 0041AA58
:0042FA3B 8B45EC                  mov eax, dword ptr [ebp-14]
:0042FA3E 0FB64002                movzx eax, byte ptr [eax+02]  <----  nimm 3ten Buchstaben 
:0042FA42 6BC00E                  imul eax, 0000000E	    <---- eax = ascii wert * 14
:0042FA45 03F0                    add esi, eax		    <---- nur addieren
:0042FA47 893558174300            mov dword ptr [00431758], esi   <---  speicher esi in diesem index ab
:0042FA4D A16C174300              mov eax, dword ptr [0043176C]
:0042FA52 E8D96EFDFF              call 00406930		<--- liefert die lnge unseres  namens zurck
:0042FA57 83F804                  cmp eax, 00000004      	<--- vergleiche dieses Ergebnis mit  4
:0042FA5A 7D1D                    jge 0042FA79		<--- springe wenn lnge > = 4 oder ................
<------------------------------------------------------------------------------------------------------------------------------------->
:0042FA5C 6A00                    push 00000000

* Possible StringData Ref from Code Obj ->"Try Again!"
                                  |
:0042FA5E B974FB4200              mov ecx, 0042FB74

* Possible StringData Ref from Code Obj ->"Sorry , The serial is incorect "
                                        ->"!"
                                  |
:0042FA63 BA80FB4200              mov edx, 0042FB80
:0042FA68 A1480A4300              mov eax, dword ptr [00430A48]
:0042FA6D 8B00                    mov eax, dword ptr [eax]
:0042FA6F E8FCA6FFFF              call 0042A170
:0042FA74 E9BE000000              jmp 0042FB37
<-------------------------------------------------------------------------------------------------------------------------------------->


Seltsam nicht ? ACiD_BuRN berechnet etwas und dann vergleicht er nach der lnge des eingegebenen Namens und
falls  mein name weniger als vier Zeichen htte, bekme ich die Fuck-Meldung.
Hmmm, was sagt Eurer Verstand ? (Instinkt ist auch gut, aber damit kommt man im Leben auch nicht weiter ....)
Dann la mal weiterschauen.

Ab geht'S in den "zweiten Teil".

<-------------------------------------------------------------------------------------------------------------------------------------->
:0042FA79 8D55F0                  lea edx, dword ptr [ebp-10]
:0042FA7C 8B83DC010000            mov eax, dword ptr [ebx+000001DC]
:0042FA82 E8D1AFFEFF              call 0041AA58
:0042FA87 8B45F0                  mov eax, dword ptr [ebp-10]
:0042FA8A 0FB600                  movzx eax, byte ptr [eax]                <---------das kennen wir ja schon
:0042FA8D F72D50174300            imul dword ptr [00431750]         <--------- eax= eax * dem konstanten Wert '41' (dez)
:0042FA93 A350174300              mov dword ptr [00431750], eax  <--------- speicher das ergebnis
:0042FA98 A150174300              mov eax, dword ptr [00431750]  <--------- damit
:0042FA9D 010550174300            add dword ptr [00431750], eax <--------- sich dieses verdoppeln kann und speicher das Ergebnis ab
:0042FAA3 8D45FC                  lea eax, dword ptr [ebp-04]
:0042FAA6 BAACFB4200              mov edx, 0042FBAC	         <--------- ein konstanter string 'CW'
:0042FAAB E8583CFDFF              call 00403708
:0042FAB0 8D45F8                  lea eax, dword ptr [ebp-08]

...... < snip > .............
                                  |
:0042FAB3 BAB8FB4200              mov edx, 0042FBB8	        <---------ein weiterer konstanter string "CRACKED"
:0042FAC8 A150174300              mov eax, dword ptr [00431750]	<---- unsere errechnete Serial, die ja im index abgespeichert wurde
:0042FACD E8466CFDFF              call 00406718
:0042FAD2 FF75E8                  push [ebp-18]
:0042FAD5 68C8FB4200              push 0042FBC8			<---- konstanter string '-'
:0042FADA FF75F8                  push [ebp-08]
:0042FADD 8D45F4                  lea eax, dword ptr [ebp-0C]
:0042FAE0 BA05000000              mov edx, 00000005
:0042FAE5 E8C23EFDFF              call 004039AC			<----- hier wir unsere richtige Serial berechnet ( schaut Euch das an )
:0042FAEA 8D55F0                  lea edx, dword ptr [ebp-10]
:0042FAED 8B83E0010000            mov eax, dword ptr [ebx+000001E0]
:0042FAF3 E860AFFEFF              call 0041AA58
:0042FAF8 8B55F0                  mov edx, dword ptr [ebp-10]		<----- unsere fiktive serialnummer
:0042FAFB 8B45F4                  mov eax, dword ptr [ebp-0C]                <----- die korrekte serialnummerl
:0042FAFE E8F93EFDFF              call 004039FC			<----- vergleiche
:0042FB03 751A                    jne 0042FB1F			<----- good / bad boy

<-------------------------------------------------------------------------------------------------------------------------------------->

Jetzt wit Ihr warum ich vorhin so stutzig war.
ACiD_BuRN hat im ersten Teil versucht uns zu verarschen, in dem er keygen-verdchtige manahmen eingeleitet hat,
um uns im Endeffekt in eine Falle zu locken.
Clever !

Folgendermaem hat unsere Serial aus zu sehen:

CW-serial_xyz-CRACKED

( rubor / CW-9348-CRACKED)

Jetzt mu man nur noch den keygen schreiben.
Zur Erinnerung:

1. Vergleiche, ob  die Zeichenlnge des eingegeben Namens gleich oder grer vier ist
2. Den ersten Buchstaben in ASCII-Format konventieren
3. Multipliziere diesen Wert mit 41 und  multipliziere jenes Ergebnis mit zwei.

<-------------------------------------------------------------------------------------------------------------------------------------->
Pascal, knnte das z.B. so aussehen:

program ACiD;

uses crt;

var
name:String;
eax:longint;

begin

.......................
  readln(name);
      if length(name) < 4 then
	 begin
   	    writeln('Plz type at least 4 digits !!!');
    	    exit;
 	end;
   eax:=(ord(name[1])*41)*2;
........................
   write(' CW-',eax,'-CRACKED');

end.

<-------------------------------------------------------------------------------------------------------------------------------------->

Wenn Du den 'Serial'-Button whlen solltest, und nicht weit wie die richtige Angabe lautet, dann schreib doch mal
"Hello Dude!".

Anregungen odr Kritik ?
Komm mit einem IRC-Client nach EFNET zu dem Channel 
#GWA oder #CUG, und spich mich an.

Gre gehen (aus zeit-grnden nur knapp gehalten):
an allel GWA / CUG member, prof x und alle die ich verga :)

PS: tC, wer ist Kati ?
<-------------------------------------------------------------------------------------------------------------------------------------->
14.06.1999 									           rubor