[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. Nachwort

    1 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 codeablauf

    Da 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.


Anmelden zum Antworten