August 1999

"Uninstall Manager V3.0"

Win Code Reversing

 

Serial Fishing

 

(c) Instructor

   

Programm-Name: um300.exe

Programm-Typ:    Uninstaller

          Programm- URL:   Hier

          Programm-Größe: 489K  

                    Tools:                       Softice, W32Dasm 8.93

Level

Leicht (  )  Mittel ( X )  Schwer (   ) 

 


 

Die Einleitung

 Der Autor von Uninstall Manager V3.0 sagt:  
"Überflüssige Dateien vom System zu entfernen ist schwieriger als sie zu installieren. Megabyte von zurückgebliebenen Dateien befinden sich auf den Festplatten und machen das System langsamer und sorgen für Fehlerquellen.' Uninstall Manager' ist das Programm, um unerwünschte Software sicher zu entfernen... "

Das Sicherungssystem

 
" Uninstall Manager V3.0 " ist ein  Sharewareprogramm, das eine 30 - tägige Nutzungsdauer ermöglicht. Nach jedem Programmstart wird ein Nag mit der bereits vergangenen Anzahl der genutzten Tage angezeigt. Um das Programm zu registrieren, gehen wir in  Help / About / Register. Dort sind diese Angaben erforderlich:

Registration Name:

Registration Key:

Die Angaben werden unter  HKCU\Software\NoktaSoftware\UninstallManager in der Registierung abgelegt.

Bei richtiger Eingabe der Serial wird ein codierter Schlüssel "Reg" in diesem Pfad eingetragen und ein weiterer Schlüssel ' SetKey ' in HKCU\software\microsoft\windows\currentversion\explorer\.

Das Programm erzeugt auf der Basis des eingegebenen Registrierungs - Namen eine Seriennummer und vergleicht sie mit dem eingegebenen Registrierungs - Key. Bei Übereinstimmung wird es freigeschalten.       

Die Lösung

Wir gehen in den Registrierungsdialog und geben unsere gefakten Daten ein, erhalten nach Druck auf den 'OK' - Button eine Fehlermeldung "Sorry, not a correct Key". Den Text der Fehlermeldung schreiben wir uns auf und starten ein Deadlisting der 'um300.exe',dort suchen wir nach dem Text.Vergebens, wir finden aber einige andere interessante Strings wie:

< Reg > / < SetKey > / < software\microsoft\windows\currentversion\expl >


Jetzt starten wir mal
RegMon und FileMon, um zu sehen,was beim Programmstart so alles abläuft.

RegMon zeigt uns folgende interessante Einträge:

Uninsman OpenKey HKCU\software\NoktaSoftware\UninstallManager                                    SUCCESS
Uninsman QueryValueEx HKCU\software\NoktaSoftware\UninstallManager\Reg                   NOTFOUND
Uninsman CloseKey HKCU\software\NoktaSoftware\UninstallManager                                   SUCCESS 

Uninsman OpenKey HKCU\software\microsoft\windows\currentversion\explorer\SetKey       NOTFOUND

Wir sehen, daß das Programm nach einem Schlüssel " Reg " sucht, der nicht gefunden  wurde. Der Schlüssel liegt erst vor, wenn unsere Serial richtig eingegeben wurde und automatisch abgespeichet wird.Weiterhin fehlt der Schlüssel " SetKey".

Wir wollen uns an die Lösung des Problems herantasten, starten ein Deadlisting und suchen den String  "Reg". Dieser kommt nun gleich 5 mal vor, bevor wir uns hier verzetteln, versuchen wir mal 'SetKey'. Na, das sieht doch schon viel besser aus. Wir scrollen ein bißchen nach oben, sehen hier auch den dritten String und etwas drüber finden wir eine interessante Stelle. (Der magische Call)

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047AA13(C)
|
:0047AA27 8B45FC mov eax, dword ptr [ebp-04]
:0047AA2A E851F9FFFF call 0047A380                                                                                Der magische Call
:0047AA2F 3C01 cmp al, 01                                                                                                      Serial richtig?

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047A9B3(C)
|
:0047AA31 0F8551020000 jne 0047AC88                                 Wenn nein, dann Sprung zur Fehlermeldung
:0047AA37 B201 mov dl, 01
:0047AA39 A1709C4600 mov eax, dword ptr [00469C70]
:0047AA3E E8D9F3FEFF call 00469E1C
:0047AA43 8945F8 mov dword ptr [ebp-08], eax
:0047AA46 33C0 xor eax, eax
:0047AA48 55 push ebp
:0047AA49 68A4AA4700 push 0047AAA4
:0047AA4E 64FF30 push dword ptr fs:[eax]
:0047AA51 648920 mov dword ptr fs:[eax], esp
:0047AA54 BA01000080 mov edx, 80000001
:0047AA59 8B45F8 mov eax, dword ptr [ebp-08]
:0047AA5C E853F4FEFF call 00469EB4

* Possible StringData Ref from Code Obj ->"software\microsoft\windows\currentversion\explorer"

Wir wollen uns diesen "magischen Call" mal etwas näher anschauen. Softice gestartet, Breakpoint gesetzt auf BPX Hmemcpy, einmal F11 und 6 mal F12 gedrückt, dann bis an die entsprechende Stelle mit F10 gesteppt.

* Referenced by a CALL at Address:
|:0047AA2A
|
:0047A380 55 push ebp                                            Hier beginnt das Unterprogramm zur Erzeugung der Serial
:0047A381 8BEC mov ebp, esp
:0047A383 33C9 xor ecx, ecx
:0047A385 51 push ecx
:0047A386 51 push ecx
:0047A387 51 push ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047A312(C)
|
:0047A388 51 push ecx
:0047A389 53 push ebx
:0047A38A 56 push esi
:0047A38B 57 push edi
:0047A38C 8BF0 mov esi, eax
:0047A38E 33C0 xor eax, eax
:0047A390 55 push ebp
:0047A391 685BA44700 push 0047A45B
:0047A396 64FF30 push dword ptr fs:[eax]
:0047A399 648920 mov dword ptr fs:[eax], esp
:0047A39C 33DB xor ebx, ebx
:0047A39E 8D55F4 lea edx, dword ptr [ebp-0C]
:0047A3A1 8B86F4020000 mov eax, dword ptr [esi+000002F4]
:0047A3A7 E8BC6AFBFF call 00430E68
:0047A3AC 837DF400 cmp dword ptr [ebp-0C], 00000000
:0047A3B0 747E je 0047A430
:0047A3B2 8D55FC lea edx, dword ptr [ebp-04]
:0047A3B5 8B86F4020000 mov eax, dword ptr [esi+000002F4]
:0047A3BB E8A86AFBFF call 00430E68
:0047A3C0 8B45FC mov eax, dword ptr [ebp-04]
:0047A3C3 E8CC9AF8FF call 00403E94
:0047A3C8 8BF8 mov edi, eax
:0047A3CA 8D55F0 lea edx, dword ptr [ebp-10]
:0047A3CD 8B45FC mov eax, dword ptr [ebp-04]
:0047A3D0 E8E7E1F8FF call 004085BC
:0047A3D5 8B55F0 mov edx, dword ptr [ebp-10]
:0047A3D8 8D45FC lea eax, dword ptr [ebp-04]
:0047A3DB E8D098F8FF call 00403CB0
:0047A3E0 33DB xor ebx, ebx
:0047A3E2 85FF test edi, edi
:0047A3E4 7E20 jle 0047A406
:0047A3E6 B801000000 mov eax, 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047A404(C)
|
:0047A3EB 8B55FC mov edx, dword ptr [ebp-04]
:0047A3EE 8A5402FF mov dl, byte ptr [edx+eax-01]  Zeichenweises Einlesen unseres Reg Namens in dl
:0047A3F2 80FA20 cmp dl, 20                                                                           Leerzeichen? = letztes Zeichen
:0047A3F5 740B je 0047A402                                                                           Wenn ja, dann Sprung zu ...
:0047A3F7 8B4DFC mov ecx, dword ptr [ebp-04]
:0047A3FA 81E2FF000000 and edx, 000000FF
:0047A400 03DA add ebx, edx                                                                           Hier erfolgt die Summierung der
                                                                                                                                  Hex Codes unserer Zeichen
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047A3F5(C)
|
:0047A402 40 inc eax                                                                                           EAX+1
:0047A403 4F dec edi                                                                                          EDI-1                  
:0047A404 75E5 jne 0047A3EB                                                                         Wenn nicht 0, dann Schleife >

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047A3E4(C)
|
:0047A406 81F389000000 xor ebx, 00000089                                               EBX xor 89
:0047A40C 83F333 xor ebx, 00000033                                                            EBX xor 33
:0047A40F 43 inc ebx                                                                                          EBX + 1
:0047A410 8D55F8 lea edx, dword ptr [ebp-08]
:0047A413 8B86F8020000 mov eax, dword ptr [esi+000002F8]
:0047A419 E84A6AFBFF call 00430E68
:0047A41E 8B45F8 mov eax, dword ptr [ebp-08]
:0047A421 E8EEE4F8FF call 00408914
:0047A426 3BD8 cmp ebx, eax                  ? ebx = Richtige Serial!             Vergleich richtige mit fake Serial
:0047A428 7504 jne 0047A42E                                                                       Wenn falsch, Sprung zu Bad Boy   
:0047A42A B301 mov bl, 01
:0047A42C EB02 jmp 0047A430

Ich habe in der Tabelle zum besseren Verständnis noch mal die Erzeugung der Serial zusammengefaßt.

Original Zeichen

Konvertierung

Neues Zeichen

ASCII Dezimal

ASCII Hex

I

Konvertiert zu =>

i

105 69

n

Konvertiert zu =>

n

110 6E

s

Konvertiert zu =>

s

115 73

t

Konvertiert zu =>

t

116 74

r

Konvertiert zu =>

r

114 72

u

Konvertiert zu =>

u

117 75

c

Konvertiert zu =>

c

99 63

t

Konvertiert zu =>

t

116 74

o

Konvertiert zu =>

o

111 6F

r

Konvertiert zu =>

r

114 72
------------------- ------------------ ------------------ -------------------- ---------------
      Summe in Hex  =>

45D(hex)

      Ergebnis xor 89=>

4D4(hex)

      Ergebnis xor 33=> 4E7(hex)
      Ergebnis + 1     => 4E8(hex)
Unsere Serial: --------------------- --------------------> Ergebnis           => 1256(dezimal)

 

 

Das Finale

 Das war schon ein bißchen komplizierter, ich hoffe, ich konnte euch weiterhelfen.

-- Mein Dank geht an 'Sandman' für seine hervorragenden Tutorials --


Tutorial von:          Instructor
Page gestaltet:      27.August 1999