[A]Reverse Engineering: Patchen Teil 2
-
Reverse Engineering: Patchen Teil 2
Inhalt
1. Introduction
2. Anleitung: Finden von Stellen
3. Materie
3.1 If-else-Bedingung aushebeln
3.2 Schleifenbedingung korrigieren
4. Nachwort1 Introduction
Im letzten Teil der Reverse Engineering Reihe haben Sie sich mit den Grundlagen beschäftigt. In diesem Teil geht es um Schleifen und deren Bedingungen. Im Gegensatz zum letzten Teil sollten diesmal grundgelegene Assemblerkenntnisse vorhanden sein.
2 Anleitung: Finden von Stellen
Da es gerade für die Neulinge schwer ist, erkläre ich in diesem Abschnitt, wie man Stellen im Programm ausfindig macht.
Es gibt verschiedene Möglichkeiten die Stellen zu finden:
/*
*/
3 Materie
3.1 If-else-Bedingung aushebeln
Zuerst: Wie wird in Assembly eine If-else-Bedingung ausgedrückt //mit fällt kein Ausdruck ein
Es gibt zwei Möglichkeiten:
Springe zum else-Zweig
oder
Springe zum if-Zweig
Nehmen wir dieses Programm als Beispiel:
//if_else.cpp //--------- #include <iostream> int main(){ std::cout << "Passworteingabe--\n\n"; std::cout << "pw_ "; std::string pw; std::cin >> pw; if(pw == "www.c-plusplus.net"){ std::cout << "Zugriff gewaehrt\n"; } else{ std::cout << "Zugriff verweigert\n"; } }
Zur Erklärung mit der: "Es gibt nur einen Zweig":
;assemblerprgm
schreibe "Passworteingabe--\n\n"
schreibe "pw_ "
lese pw
lade passwortstring
vergleiche passwortstring mit pw
wenn gleich bzw. wenn nicht gleich, dann springe
weiterer codeablaufDa wir dies hätten, suchen unsere Programmstelle und haben dann diesen Code vorliegen:
0040132B . B9 00E04300 MOV ECX,console.0043E000 ; ASCII "Passworteingabe-- " 00401330 . 894C24 04 MOV DWORD PTR SS:[ESP+4],ECX 00401334 . C745 98 FFFFFF>MOV DWORD PTR SS:[EBP-68],-1 0040133B . E8 50890300 CALL console.00439C90 00401340 . C70424 C013440>MOV DWORD PTR SS:[ESP],console.004413C0 00401347 . B8 14E04300 MOV EAX,console.0043E014 ; ASCII "pw_ " 0040134C . 894424 04 MOV DWORD PTR SS:[ESP+4],EAX 00401350 . E8 3B890300 CALL console.00439C90 00401355 . C745 D8 5CD143>MOV DWORD PTR SS:[EBP-28],console.0043D1> 0040135C . 8D55 D8 LEA EDX,DWORD PTR SS:[EBP-28] 0040135F . 895424 04 MOV DWORD PTR SS:[ESP+4],EDX 00401363 . C70424 6014440>MOV DWORD PTR SS:[ESP],console.00441460 0040136A . C745 98 030000>MOV DWORD PTR SS:[EBP-68],3 00401371 . E8 8A9C0300 CALL console.0043B000 00401376 . BA 19E04300 MOV EDX,console.0043E019 ; ASCII "www.c-plusplus.net" 0040137B . 8D7D D8 LEA EDI,DWORD PTR SS:[EBP-28] 0040137E . 895424 04 MOV DWORD PTR SS:[ESP+4],EDX 00401382 . 893C24 MOV DWORD PTR SS:[ESP],EDI 00401385 . E8 060E0100 CALL console.00412190 0040138A . 85C0 TEST EAX,EAX 0040138C . 0F85 7E000000 JNZ console.00401410 00401392 . C70424 C013440>MOV DWORD PTR SS:[ESP],console.004413C0 00401399 . B9 2BE04300 MOV ECX,console.0043E02B ; ASCII "zugriff gewaehrt " 0040139E . 894C24 04 MOV DWORD PTR SS:[ESP+4],ECX 004013A2 > E8 E9880300 CALL console.00439C90 004013A7 . 8B45 D8 MOV EAX,DWORD PTR SS:[EBP-28] 004013AA . 8D58 F4 LEA EBX,DWORD PTR DS:[EAX-C] 004013AD . 81FB 50D14300 CMP EBX,console.0043D150 004013B3 . 895D 88 MOV DWORD PTR SS:[EBP-78],EBX 004013B6 . 0F85 A4000000 JNZ console.00401460 004013BC > 8D55 94 LEA EDX,DWORD PTR SS:[EBP-6C] 004013BF . 891424 MOV DWORD PTR SS:[ESP],EDX 004013C2 . E8 B9BE0000 CALL console.0040D280 004013C7 . 8D65 F4 LEA ESP,DWORD PTR SS:[EBP-C] 004013CA . 31C0 XOR EAX,EAX 004013CC . 5B POP EBX 004013CD . 5E POP ESI 004013CE . 5F POP EDI 004013CF . 5D POP EBP 004013D0 . C3 RETN 004013D1 . 83C5 18 ADD EBP,18 004013D4 . 8B45 98 MOV EAX,DWORD PTR SS:[EBP-68] 004013D7 . 8B55 9C MOV EDX,DWORD PTR SS:[EBP-64] 004013DA . 83F8 01 CMP EAX,1 004013DD . 74 05 JE SHORT console.004013E4 004013DF . 83F8 02 CMP EAX,2 004013E2 . 74 0F JE SHORT console.004013F3 004013E4 > 891424 MOV DWORD PTR SS:[ESP],EDX 004013E7 > C745 98 FFFFFF>MOV DWORD PTR SS:[EBP-68],-1 004013EE . E8 6DC40000 CALL console.0040D860 004013F3 > 8955 90 MOV DWORD PTR SS:[EBP-70],EDX 004013F6 . 8B45 D8 MOV EAX,DWORD PTR SS:[EBP-28] 004013F9 . 8D70 F4 LEA ESI,DWORD PTR DS:[EAX-C] 004013FC . 8975 8C MOV DWORD PTR SS:[EBP-74],ESI 004013FF . 81FE 50D14300 CMP ESI,console.0043D150 00401405 . 75 25 JNZ SHORT console.0040142C 00401407 > 8B4D 90 MOV ECX,DWORD PTR SS:[EBP-70] 0040140A . 890C24 MOV DWORD PTR SS:[ESP],ECX 0040140D .^EB D8 JMP SHORT console.004013E7 0040140F 90 NOP 00401410 > C70424 C013440>MOV DWORD PTR SS:[ESP],console.004413C0 00401417 . BB 3DE04300 MOV EBX,console.0043E03D ; ASCII "zugriff verweigert " 0040141C . 895C24 04 MOV DWORD PTR SS:[ESP+4],EBX 00401420 . C745 98 030000>MOV DWORD PTR SS:[EBP-68],3 00401427 .^E9 76FFFFFF JMP console.004013A2 0040142C > C745 98 020000>MOV DWORD PTR SS:[EBP-68],2 00401433 . BF FFFFFFFF MOV EDI,-1 00401438 . 83E8 04 SUB EAX,4 0040143B . 897C24 04 MOV DWORD PTR SS:[ESP+4],EDI
Dies Analysieren wir nun.
Bedingter Sprung: 0040138C . 0F85 7E000000 JNZ console.00401410
Passwortstring: 00401376 . BA 19E04300 MOV EDX,console.0043E019 ; ASCII "www.c-plusplus.net"
Zur Erklärung:
00401376 . BA 19E04300 MOV EDX,console.0043E019 ; ASCII "www.c-plusplus.net" 0040137B . 8D7D D8 LEA EDI,DWORD PTR SS:[EBP-28] 0040137E . 895424 04 MOV DWORD PTR SS:[ESP+4],EDX 00401382 . 893C24 MOV DWORD PTR SS:[ESP],EDI 00401385 . E8 060E0100 CALL console.00412190
Hier schreiben wir den String "www.c-plusplus.net" in den Speicher und lesen pw ein.
0040138A . 85C0 TEST EAX,EAX 0040138C . 0F85 7E000000 JNZ console.00401410
Hier ist der Test auf Null, der unserer Sprung ist.
In diesem Fall müssen wir unseren Sprung nur noppen[No Operation; Hexcode 90]
Wie man sieht haben wir 6 hexadezimale Befehle.
Diesesmal befindet sich alles in der Codesektion, außer unserem pw-string.
Diese fängt bei mir bei 00401000 an und endet bei 0043D000.
Rechnen wir uns den Offset aus:
/*0040138C - 00401000 = 0x0000038C
0x0000038C + 400 = 0x0000078C
mgw. mit peid erklären.
*/
Unsere Matrix für den Patch sieht also nun so aus:
static const PYTE pytes[6] = { {0x0000078C,0x90}, {0x0000078D,0x90}, {0x0000078E,0x90}, {0x0000078F,0x90}, {0x00000790,0x90}, {0x00000791,0x90}, };
3.2 Schleifenbedingung korrigieren
/*
*/
4 Nachwort
Nun wissen Sie, wie man mit If-else-Bedingungen umgeht. Ein weiterer Artikel über dieses Thema ist nicht geplant.
MFG winexec*
-
Err, wieso hast du die Artikel aufgeteilt? V.a. der erste ist ziemlich kurz, interessant zu lesen, nur etwas zu kurz. Was hältst du davon, beide Artikel zu einen zusammenzuführen? Ein bisschen Volumen muss ein Artikel schon haben...
MfG
GPC
-
Hallo,
Ok, ich führe die dann zusammen. Ist ja fast nur Copy und Paste. Und dann erweiter ich diese noch dementsprechend.
MFG winexec*
-
Danke
-
Ja solche Beiträge treiben einem ein verschmitztes Grinsen ins Gesicht.
Sehr gut.Im übrigen wenn man GUI32bit-Anwendungen reverse entwickeln will
brauchts dann ja auch noch einem nützlichen Tool.wenn man z.B.: Dialoge aushebeln möchte könnte ich mir gut vorstellen
vorher z.B. WinSpy++ oder Winspector auf eine Anwendung anzusetzen.
Dann weiss man wie dier Strukturtypen für Fenster/Dialog heissen.
Mit dem Hintergrund kann man sich dann im ollyDebug auf die Suche nach diesen Daten machen. Müsste prinzipell theoretisch so sein?! Oder bei bestimmten Dialogen das Programm vorher starten und Namen der Titelleiste solcher statischer Dialog aufschreiben. Und dann danach Suchen im Debugger.
Oder nach calls Suchen die LoadImage aufrufen um SystemIcons für Standardsteuerelemente auszutauschen. Ja das wäre damit möglich.
Da könnte man dann z.B. den Explorer in seinem GUI etwas umstricken. Aber das ist dann ja illegal!Aber man müsste sich mit dem ollyDebug erst näher beschäftigen so intuitiv lässt der sich nicht bedienen man wird durch die AddressDatenflut erstmal erschlagen.
!!!Ja ich bin Fan solcher Beiträge!!!
Wie Du schon sagtest man bewegt sich am Rande des gesetzlosen aber der Faktor Zeitersparnis beim Patch ist nicht von der Hand zu weisen. In den Händen von Experten ist es dann wohl das Werkzeug der Wahl.Deshalb wirklich gut das sowas Zugang in den Beitragsbereich findet!!!
Grüsse
-
Gesetzlos ist halt nicht gleich Ungesetzlich
Ich finde die Artikel/den Artikel auch sehr gelungen! Hochinteressant
-
Hier habe noch eine schönen Link für Dich gefunden
Kannst es ja mal angucken und auch als Link in Deinen Beitrag aufnehmen.
Wenn Du willst? Das PDF unterstreicht die Inhalte Deiner Beiträge.Aber um nicht unbedingt illegal zu werden kann man sich ja selbst Beispiele ausdenken wie Deine Beispiele.
So zum Beispiel eine Dll entwickeln die ein Rechenfunktion beinhaltet
die falsch rechnet. Der Einfachheit halber macht man noch damit es für den
Anfang leichter ist MessageBox-Aufrufe der WinAPI rein damit man den disassemblierten Code zu Anfang leichter findet.Ich würde im Beitrag auch noch darauf Hinweisen sich ein gutes Buch über Assembler zu besorgen. Weil da stehen die OP-Codes für gängige Prozessoren der
Desktoprechner drin. Sonst brauch man garnicht erst damit anfangen.
Bei Buchhabel hat ich mal ein kleines schwarzes Buch gesehen gehörte zur Reihe
"Enpackt" "Gepackt" handelte über OP-Codes.
Und vorher immer schön eine Sicherung anlegen von dem Kram den man verbessern will.Man muss halt wissen wie ein ADD EAX, EDX als Hex-String aussieht.
wenn man ein SUB draus machen muss.Mit besten Grüssen
-
Hallo,
Danke :). Ich gucke einmal, ob ich daraus etwas gebrauchen kann.
Ich denke in den Artikel kommt noch viel neues. Ich nehme am besten einen iLoveU-Virus als Beispiel :p.
So wie es aussieht, wird der Artikel noch schön zugehauen.
MFG winexec*
-
wie gesagt dieser Beitrag steckt an!
Hmm ist gut das man schon was von Assembler gehört hat und das man mal damit gespielt hat.Laut Deinem Beitrag kann man sagen, man liesst, man probiert selbst, es wirkt...
Bisher mal immer getestet Offset der zu editierenten Dinge errechnet
und von Hand mit einem Hexeditor an entsprechnter Stelle editiert.
Ja es geht. Aber ohne ein Buch mit OP-Codes wäre ich aufgeschmissen!
Das liegt dann immer gleich parat danneben.So Dein Beitrag fertig ist und ich bei mir soweit mit dem Beitrag rund bin
werde ich Dich sichlerich mal zu dem Thema per ICQ ansprechen.
Aus Interesse zur Materie.Auf alle Fälle ist auf der Basis auch klar wie manche Viren über diese Möglichkeit Anwendungen manipulieren können. Von DLL-Injektion und anderem Zig
mal abgesehen.Grüsse
-
winexec* schrieb:
Hallo,
Danke :). Ich gucke einmal, ob ich daraus etwas gebrauchen kann.
Ich denke in den Artikel kommt noch viel neues. Ich nehme am besten einen iLoveU-Virus als Beispiel :p.
So wie es aussieht, wird der Artikel noch schön zugehauen.
MFG winexec*
Leider ist der Link etwas älter aber um auf eine andere Quelle zu verweisen
sollte er gut sein. Im PDF ist noch ein Link der auf Übungsprogramme verweissen sollte mit Aufgabenbeschreibung was umgebaut werden soll.
Leider führt der Link nichtmehr zu besagten Sachen.