Entfernen ASProtect 1,22-1,23 Beta 21 und brechen Lemonade Tycoon v1.1.6


Entfernen ASProtect 1,22-1,23 Beta 21 und brechen Lemonade Tycoon v1.1.6
Autor: Proteus [[email protected]]

Ziel: Lemonade Tycoon v1.1.6 (2100kb)
Was Sie brauchen:
1. OllyDbg + Plugin OllyDump
2. ImpRec 1.6 Finale
3. IDA
4. Hiew oder jeder andere Editor shestnadtsyatirichny
4. Beer "Becks", 0,5;)

Opfer

Unser Ziel ist eine unkomplizierte igrashka. Aber am wichtigsten ist, dass es zaprotekchena "ASProtect 1,22-1,23 Beta 21", wie gesagt, uns freundlich PEiD:


Das Opfer ist außer Reichweite für die grausamen Machenschaften eines Disassembler;)



Suchen OEP

Verwenden Sie autounpacker wir nicht mögen und warum AsprStripperXP OllyDbg laufen und ein Programm in dem Debugger ausführbare Datei öffnen.


Entry Point

Der erfolgreiche Standort der ursprünglichen Opfer des Eintrittspunktes, müssen wir in Olka Ausnahmebehandlung (Speicherzugriff voilation, Zugriffsverletzung) umfassen. Gehen Sie auf die Debug-Option (Alt + O drücken) und setzen die Fahnen, wie unten dargestellt:


Aktivieren Sie die Ausnahmebehandlung

Rückkehr zum Fenster "CPU" OllyDbg inachinaem nehmen Ausnahme (mit Shift + F9 drücken). Nach 27 Zeit (auch wenn einmal Sie Shift + F9 drücken, wird das Programm unsere Start- und OEP nehmen) werden wir auf .D405CC erscheinen


Fenster "CPU" 27 nach der Behandlung Ausschlüsse

Als nächstes müssen Sie durch erneutes Drücken der Shift + F9 auf dem RETN Befehl (.D40609) und um Olka "zu Fuß", um es einen Haltepunkt zu setzen. Der letzte Schritt bei der Suche nach OEP wird Haltepunkt auf Aspro Zugriff auf Anwendungscodeabschnitt installieren schützte sie. Um dies zu tun, drücken Sie Alt + M (öffnen Sie das Fenster "Memory Map") und drücken Sie F2 auf dem zweiten Abschnitt des Kontos gegebenen Prozesses. In unserem Fall ist dies Limonade codesection bei 00.401.000.


Trinket Zugang zum Code-Abschnitt

Letzte zhmyakaem durch Shift + F9 und ALLE !!! Wir sind auf dem OEP. Immerhin, zu glauben, es können Sie Strg + A drücken, und Olka Codeanalyse durchführen und zerlegt anstelle des Single-Byte-Auflistung obskuren Ausdrücke "menschlich" Art =) erwerben


Und hier ist der OEP!



Dumps


Wählen Sie aus dem Hauptmenü Plugins-OllyDump-Dump ausgetestet Prozess und in dem sich öffnenden Fenster klicken Sie auf "Dump" erscheint (vor, dass nicht zu vergessen die Flagge "Rebuild-Import" zu entfernen, allein zu OllyDump nicht versucht, den Dump Import wiederherstellen).


Machen Sie einen Dump mit OllyDump Plugin

Über Adressen von Eintrittspunkten und Abschnitte können nicht überleben, weil ihrer OllyDump selbst berechnet.

Erhebung von Einfuhr


Genau wie ein Dump (I genannt dumped.exe-Datei) wird nicht gestartet - er die Tabelle der importierten Funktionen wiederherstellen muss. Um dies zu tun, die ImpRec laufen und wählen sie aus unserem suchten Prozess Lemonade.exe (er ist nach wie vor "stehen" auf der OEP, Olly, weil mit ihm haben wir noch nicht geschlossen). In der "OEP", geben Sie die Adresse unserer OEP (die 4FB6B gleich ist) und klicken Sie auf den "IAT Autosuchen" - "Get Imports" - "Show ungültig". Wir bekommen ein paar hundert auf undefinierte Funktionen. Um sie wiederherzustellen, versuchen, eine Spur in 2 Stufen zu machen. Die erste der rechten Maustaste auf eine der wichtigsten Eigenschaften von unsicheren und wählen Sie mich "Trace Level1 (DISASM)". In der zweiten Stufe klicken, wieder auf die "Show ungültig", und dann die Funktion über das Plugin Plugin Tracers wiederherstellen - 1.22 ASProtect.


Imprec wieder importieren ...

Im Anschluss an die Manipulation dieser erscheint im Log-Fenster


Import erfolgreich wiederhergestellt ...

Dies deutet darauf hin, dass die Einfuhr wieder hergestellt und kann durch einen Klick auf den Button "Fix Dump" eine Modifikation unserer dump (dumped.exe) produzieren


Dump erfolgreich geändert ...

So haben wir eine voll funktionsfähige Datei entpackt wird (dumped_.exe)!


PEiD bestätigt, dass ASPR erfolgreich entfernt

Fahren Sie mit ihrer Analyse ...

Debuggen und Hacking-Opfer mit einem Patch


Laden ausgepackt, ein Programm im Debugger. Da für die Registrierung eingeben, verwendet es Standardeingabefenster,

Registrierungsdateneingabebildschirm

und Standardfehler Fenster, war es in den alten Reshin eingestellten Grenzwerte auf MessageBoxA Funktionsaufrufe (das gibt eine Fehlermeldung) oder GetDlgItemTextA (Leseeingabetext).


Setzen Sie Haltepunkte auf der Anruffunktionen MessageBoxA

Durch Drücken von "Lizenzinformation Enter" führte zu einem solchen Stück Code in Olka:


Unterbrochen in Fehler Aktivierung Name Ausgabelänge (es sollte bis 20 gleich sein)

Was war meine Überraschung, als protrassiruya Websites Längen eingegeben Registrierungsdaten (.0042563A), ein Bündel von String und arithmetische Transformationen ihnen (0,00425692) und fragwürdigen Satzschlüssel Überprüfung ich sie später fand das Lesen von Stützpunkten an geeigneten api Einstellung, entweder über RegMon'a (natürlich alle nach dem erneuten Laden des Programms getestet)! Es stellte sich heraus, dass der Grund dafür die folgenden Stück Code war:

  seg000: 00425D99 Anruf esi;
  DialogBoxParamA;
  Erstellen eines modalen Dialogfeld ein
 
  seg000: 00425D99;
  Dialogfeld Template - Ressourcen
 
  seg000: 00425D9B mov edi, EAX seg000 : 00425D9D 
  seg000: 00425D9D loc_425D9D :;
  CODE XREF: sub_425C59 + 12Dj
 
  seg000: 00425D9D cmp edi, 3EBh seg000 : 00425DA3 jnz kurz loc_425DAA;  JMP wenn nicht verabreicht reg.dannye
 seg000: 00425DA5 Anruf sub_425228;
  CreateProcessA
 seg000: 00425DAA
 
  seg000: 00425DAA loc_425DAA :;
  CODE XREF: sub_425C59 + 14Aj
 
  seg000: 00425DAA mov eax, edi seg000 : 00425DAC 
  seg000: 00425DAC loc_425DAC :;
  CODE XREF: sub_425C59 + 178j
 
  seg000: 00425DAC pop edi seg000: 00425DAD pop esi seg000: 00425DAE pop ebx seg000: 00425DAF verlassen 
  seg000: 00425DB0 retn
 

Das heißt, nach reg.dannyh Eingabe, das Programmhauptfenster und einfach deaktivieren die Anwendung geschlossen wird. Aber das Interessante ist, dass vor (.00425DA5) ein Funktionsaufruf war, die einen neuen Prozess erstellt eine Kopie des neu das Opfer gestarteten Prozess Kontakt (ala CopeMemII Armagh, obwohl der Prozess, den Trick zu brechen, meiner Meinung nach, wird keine Schwierigkeiten nicht hinzugefügt außer Singularität). Das Stück Code sub_425228 Verfahren Courtyard umgibt es bestätigt.

  seg000: 00425278 lea eax, [EBP + ProcessInformation]
 
  seg000: 0042527B mov [ebp + StartupInfo.cb ] 44h seg000: 00425282 mov [ebp + StartupInfo.dwFlags] 40h seg000: 00425289 Push eax;
  lpProcessInformation
 seg000: 0042528A lea eax, [EBP + Startup] 
  seg000: 0042528D Push eax;
  lpStartupInfo
 seg000: 0042528E Push esi;
  lpCurrentDirectory
 seg000: 0042528F schieben esi;
  lpEnvironment
 seg000: 00425290 Push esi;
  dwCreationFlags
 seg000: 00425291 Push esi;
  bInheritHandles
 seg000: 00425292 Push esi;
  lpThreadAttributes
 seg000: 00425293 Push esi;
  lpProcessAttributes
 seg000: 00425294 lea eax, [EBP + Application] seg000: 0042529A Push esi;  lpCommandLine
 seg000: 0042529B Push eax;
  lpApplicationName
 seg000: 0042529C Aufruf ds: CreateProcessA seg000 : 004252A2 pop esi seg000: 004252A3 Urlaub 
  seg000: 004252A4 retn
 
  seg000: 004252A4 sub_425228 endp

 seg000: 004252A4
 

Blättern Sie durch den Code ein wenig höher, wurde mir klar, warum die aufgezeichneten Informationen im Register reg.dannye beim Start nicht lesen. Es stellt sich heraus, dass eine eindeutige Mutex erstellt, die "gab das zu wissen," Eltern-Prozess, ob das Kind Prozess gestartet wird, wenn ein Prozess erstellt wird, als "ein Spielzeug laufen", oder als "validieren reg.dannyh". Da der Test nach Eingabe des Codes waren bereits dotsernem Prozess und OllyDbg ihren Fang nicht möglich war (für die Zeit der Verbindung alle Prüfungen zu tolkochto ein Prozess bereits durchlaufen wurde erstellt, und die Möglichkeit, einen anständigen ring0-Modus Debugger war nicht zu verwenden), habe ich beschlossen, zu gehen durch einen Trick: die Binärdatei des Tests zu ändern, so dass die ersten Zeilen seiner ausführbaren Funktionen (zB WinMain) wurde (oppkody EBFE) Radfahren. Somit wird durch die besessen Prozess erstellt und ich konnte poissledovat gewünschten Bereiche, um es in der Zeit und die Wiederherstellung des ursprünglichen 2-Byte-Code leise verbinden. Leider hat sich das beschriebene Verfahren zu implementieren versuchen, eine halbe Stunde lang wurde, wird der Kind-Prozess nicht aufgehängt werden! Viele wollen nicht mehr Zeit zu verbringen, um die Ursachen zu finden (was anscheinend Hauptfunktionen in dem Opfer zu duplizieren war), entschied ich mich zu einer "traditionellen" Methode zu gehen und Haltepunkte in dem übergeordneten Prozess um den Anruf Funky TerminateProcess und Exitprocess;)


Setzen Sie Haltepunkte an der Fertigstellung der Anwendung Funktionen aufruft

Ausführen, in unserer Datei, geben Sie die erforderlichen reg.dannye (I getippt Name: Proteus und Code: 1234567890abcdeABCDE) und erhalten den gewünschten Punkt ohne Probleme (.44A841)


Erfassungspunkt Funktionsaufruf Abschluss-Anwendungen

podnyavschis auf mehreren Ebenen die Struktur zerlegt Auflistung in IDA sehen Sie den folgenden Code auf:

  seg000: 004247A0
 
  seg000: 004247A0;
  --------------- SUBROUTINE ---------------------------------- -----
 
  seg000: 004247A0
 
  seg000: 004247A0;
  Attribute: bp-basierten Rahmen
 
  seg000: 004247A0
 
  seg000: 004247A0 sub_4247A0 proc in der Nähe;
  CODE XREF: sub_437940 + 26p
 
  seg000: 004247A0;
  sub_437940 + 3Bp
 
  seg000: 004247A0
 
  seg000: 004247A0 var_200 = dword ptr -200h
 
  seg000: 004247A0
 
  seg000: 004247A0 Push EBP seg000: 004247A1 mov ebp, esp seg000: 004247A3 sub esp, 200h seg000: 004247A9 Push esi seg000: 004247AA Push edi seg000: 004247AB Anruf sub_437940 seg000: 004247B0 mov dword ptr [eax + 20h], aLemonade versetzt;  "Limonade"
 
  seg000: 004247B7 Anruf sub_437940 seg000: 004247BC mov dword ptr [eax + 24h], Offset aLemonadeTycoon;  "Lemonade Tycoon"
 
  seg000: 004247C3 Anruf sub_437940 seg000: 004247C8 mov dword ptr [eax + 28h], Offset a1_1_5;  "1.1.5"
 
  seg000: 004247CF Anruf sub_437940 seg000: 004247D4 mov dword ptr [eax + 28h], Offset a1_1_6;  "1.1.6"
 
  seg000: 004247DB Anruf sub_437940 seg000: 004247E0 mov dword ptr [eax + 1Ch], Offset aB6081ca706b415;  "{B6081CA-706B-415E- AE52-910C4FB06016}" 
  seg000: 004247E7 Anruf sub_437940 seg000: 004247EC mov dword ptr [eax + 10h], Offset a1_0;  "1.0"
 
  seg000: 004247F3 Anruf sub_437940 seg000: 004247F8 mov dword ptr [eax + 14h], Offset a72733b3Ac0f4d4;  "{72733B3-AC0F-4D43- BED1-25EE1194A7BA}" 
  seg000: 004247FF Anruf sub_437940 seg000: 00424804 mov dword ptr [eax + 18h] , Offset a48033dc6A54144;  "{48033DC6-A541-4454-A9CE- 3186C3365B75}" 
  seg000: 0042480B Anruf sub_437940 seg000: 00424810 mov dword ptr [eax + 88h] , 96h seg000: 0042481A Anruf sub_437940 seg000: 0042481F xor edi, edi seg000: 00424821 Push 68h seg000: 00424823 mov [eax + 34h], edi seg000: 00424826 pop esi seg000 : 00424827
 
  seg000: 00424827 loc_424827 :;
  CODE XREF: sub_4247A0 + 98J
 
  seg000: 00424827 Anruf sub_437940 seg000: 0042482C mov [eax + esi], edi seg000: 0042482F hinzufügen esi, 4 seg000: 00424832 cmp esi, 84h seg000: 00424838 jl kurz loc_424827 seg000: 0042483A Anruf sub_4263DD ;  Funktionstest
 seg000: 0042483F Test eax, eax seg000 : 00424841 jz kurz loc_42484A seg000: 00424843 Push - 1;
  int
 seg000: 00424845 Anruf _exit seg000: 0042484A;
  -------------------------------------------------- -------------------------
 
  seg000: 0042484A
 
  seg000: 0042484A loc_42484A :;
  CODE XREF: sub_4247A0 + A1j
 
  seg000: 0042484A Anruf sub_4264BC;
  EAX = ds: dword_57F99C
 seg000: 0042484F Test eax, eax seg000 : 00424851 jz kurz loc_42489B;
  JMP wenn EAX = 1 (in Prozess do4ernem)
 seg000: 00424853 mov esi, ds: GetModuleHandleA seg000: 00424859 lea eax, [EBP + var_200] seg000: 0042485F EAX drücken;  char *
 seg000: 00424860 Push edi;
  lpModuleName
 seg000: 00424861 Anruf esi;
  GetModuleHandleA
 
  seg000: 00424863 Push eax;
  hInstance
 seg000: 00424864 Anruf sub_426404 seg000: 00424869 pop ECX seg000: 0042486A lea eax, [EBP + var_200] seg000: 00424870 pop ECX seg000: 00424871 mov ds: dword_57F988, edi seg000: 00424877 Push eax;
  int
 seg000: 00424878 Push edi;
  lpModuleName
 seg000: 00424879 Anruf esi;
  GetModuleHandleA
 
  seg000: 0042487B Push eax;
  hInstance
 seg000: 0042487C Anruf sub_425C59;
  ReadParametrs
 seg000: 00424881 pop ECX seg000: 00424882 cmp eax, 3EBh seg000: 00424887 pop ECX seg000: 00424888 jnz kurz loc_424891 seg000: 0042488A Taste 1 drücken;
  int
 seg000: 0042488C Anruf _exit;
  schließen Sie die Anwendung nach reg.dannyh Eingabe
 seg000: 00424891;
  -------------------------------------------------- -------------------------
 
  seg000: 00424891
 
  seg000: 00424891 loc_424891 :;
  CODE XREF: sub_4247A0 + E8j
 
  seg000: 00424891 mov ds: dword_57F988, 1 seg000: 0042489B
 
  seg000: 0042489B loc_42489B :;
  CODE XREF: sub_4247A0 + B1j
 
  seg000: 0042489B pop edi seg000: 0042489C pop esi seg000: 0042489D Urlaub;  Wir springen auf .4365C9
 seg000: 0042489E retn
 
  seg000: 0042489E sub_4247A0 endp

 seg000: 0042489E
 

Es ist nicht schwer zu erraten , dass 0042483A Anruf sub_4263DD ist nichts anderes als eine Herausforderung Funktionen zu testen , die den Verlauf der Inspektion bei .0042484F beeinflussen. Es war von ihrem Testergebnisse bestimmen, ob genannte Exitprocess Funktion oder normalen Betriebsverfahren, wenn sie im Falle einer Benutzerregistrierung erholt und Start-up-Spielzeug.
Mit Blick auf die 0042484A Anruffunktion Anruf sub_4264BC sehen , dass in der EAX - Register 1 eingegeben wird, um den Inhalt der Speicherzelle an 57F99C.
  seg000: 004264BC
 
  seg000: 004264BC;
  --------------- SUBROUTINE ---------------------------------- -----
 
  seg000: 004264BC
 
  seg000: 004264BC
 
  seg000: 004264BC sub_4264BC proc in der Nähe;
  CODE XREF: sub_413B78 + 5cp
 
  seg000: 004264BC;
  sub_4157E8 + 531P ...
 
  seg000: 004264BC mov eax, ds: dword_57F99C seg000: 004264C1 retn 
  seg000: 004264C1 sub_4264BC endp

 seg000: 004264C1
 

Es ist logisch, anzunehmen, dass die vorher, während der Inspektion in diesem Zell Aufzeichnung im Falle der Eingabe fehlerhaften Daten vorgenommen wird. Und wenn die Zelle eine 0 enthält, wird das Programm weiter auf der unterzeichneten stufigen Prüfung zu bestehen und das Spiel sofort zu starten. Für den Ort Überprüfung des Opfers neu starten und einen Haltepunkt auf den Eintrag mit dem angegebenen Speicherplatz gesetzt:

Trinket Schreib auf einen Speicherplatz, Status hryanyaschuyuyu registriert

Hit F9 auf und vor uns ein Stück Code ist:

  seg000: 00426296
 
  seg000: 00426296 Push EBP seg000: 00426297 mov ebp, esp seg000: 00426299 sub esp, 530H seg000: 0042629F schieben esi seg000: 004262A0 xor esi, esi seg000: 004262A2 cmp ds: dword_57F9A0, esi seg000: 004262A8 jnz loc_4263DA seg000: 004262AE lea eax [ebp + KeyName] seg000: 004262B4 push offset a1831;  "183-1"
 
  seg000: 004262B9 Push EAX seg000: 004262BA mov ds: dword_57F99C, 1;
  1 Datensätze im Speicher ya4eyku in slu4ae eingegeben falsche reg.dannyh
 seg000: 004262C4 Aufruf ds: Lstrcpy

Adresse .004262A2 ein interessantes Team sehen im Vergleich der Zelle 57F9A0 auf 0. Dies ist der Ort der Countdown 60 Sekunden seit dem Start des Spiels (klicken Sie auf .4262A2, klicken Sie die rechte Maustaste, um zu überprüfen, wählen Sie "Finden Sie Verweise auf - Konstante Adresse" und die Adresse zu sehen. entsprechenden Code 00426046 MOV DWORD PTR DS :. [57F9A0 ], 1 Es wird nur ausgeführt , wenn Sie registriert Benutzer sind, und "lässt Sie wissen , " Spiel , das nach einer Minute Laufzeit unterbrochen muss nicht sein). Wenn der Inhalt 57F9A0 Zelle 0 ist, stürzt das Spiel auch nach der Statusvariablen registriert Patchen! Also, eine Sicherheitsverletzung zu vervollständigen ist notwendig, um das Ergebnis der Überprüfung bei 004262A2, dass zumindest einer der Operanden zu ändern, und belief sich auf 1, anstelle von Vergleichen des Inhalts 57F9A0 auf 0 (Adresse .4261D6) Zellen verbrennen zu 1. Um nicht eine massive Operation, mit der Modifikation von Speicherzellen verwenden können einfach sein geben Sie 1 in das Register esi. Dazu können Sie den Befehl xor esi ersetzen, esi bei 004262A0 im inc esi und nop (oppkody 46 90). Anstelle von CMP DWORD PTR DS: [57F9A0], 0 sollte geschrieben INC DWORD PTR DS: [57F9A0], da standardmäßig das Programm wird die unregistrierte 0 dort speichern und wir somit die Optimierung des Codes einführen in den Inhalt der Speicherzelle 1. Auf Antrag des nächsten bedingten Verzweigung JNE cracked.00426292 kann durch eine bedingungslose JMP cracked.00426292 ersetzt werden. Dies ist in jedem Hex-Editor. Ich entschied mich für Hiew. Patchen Um es dumped_.exe Datei 2 mal öffnen wir die Eingabetaste drücken, dann die F5, geben Sie .4262A0, klicken Sie auf die F3, geben Sie 46 90. Das gleiche gilt für die anderen Teams durchgeführt wird, das kann oppkody auf dem Screenshot unten sehen werden. F9 Änderungen speichern.


Binary Patching das Spiel im Hex-Editor Hiew

Programa nun voll funktionsfähig. Spielstart erfolgt sofort, ohne von den Nagas und Interrupt in der Mitte des Spiels anzeigt.

Dateien auf den Artikel:

Ziel: Lemonade Tycoon v1.1.6 (2100kb)
Dump Import Erneuerte: dumped_.rar

gl hf 2 alle
05.01.2006