Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18
  1. #1
    Trojaner Avatar von SleiZer
    Registriert seit
    27.10.2008
    Beiträge
    81

    Standard Access Violation unterdrücken

    Hallo,
    ich bin grad dabei einen Hex Dupe zuschreiben mit Ansi-C
    Mein Problem ist es wenn ich versuche nicht nur Datein auszulesen, sondern z.B. den Arbeitsspeicher.

    Ich hab schon Programme gefunden die sowas können z.B. Winhex, aber ich würde gerne wissen wie man sowas umgeht, sodass man keinen Access Violation erhält.

    Hoffe auf Antwort
    grüße!

  2. #2
    Der mit Anatidaephobie Avatar von blackberry
    Registriert seit
    11.07.2008
    Beiträge
    2.350

    Standard

    Ich gehe jetzt mal davon aus, dass du einen virtuellen Speicherbereich auslesen möchtest und nicht den physikalischen Speicher (für diesen würdest du erhöhte Rechte benötigen - dh. einen eigenen Treiber oÄ.).

    Um sicherzustellen, dass ein Fehler abgefangen wird und nicht das Programm beendet sollte try-catch ausreichen.

    Bei mir hat das jedoch nicht funktioniert (Bug in MinGW??), also habe ich kurzerhand meinen eigenen Exception-Handler geschrieben (deshalb hat meine Antwort auch so lange gedauert, sorry):


    In diesem Beispiel wird versucht Daten von der Speicheradresse 0 auszulesen (was verständlicherweise zu einem Fehler führt).
    Dieser wird von dem _CATCH-Block abgefangen - hier könnte z.B. die Variable die du einlesen wolltest auf 0 gesetzt werden um zu indizieren, dass ihr Wert unbestimmt ist!
    Nach _ENDTRY kommt der Code, der in beiden Fällen ausgeführt werden soll. (also egal ob ein Fehler auftrat, oder nicht)

    Ich hoffe das hilft dir weiter

    PS: die { }-Klammern sind nicht nötig, ich habe sie jedoch eingefügt um den Code übersichtlich zu halten!


    mfG. BlackBerry

    PDFTT cr3w a.E. — ReiDC0Re, lindor, Sera, berry
    please do feed the trolls crew and elk
    Ehrenwerte Mitglieder im Ruhestand: OpCodez, SFX.
    "Was sich blackberry gerade denkt" — Vorsicht! Frei laufender Wahnsinn!
    Zitat von fuckinghot19: "PS: Blackberry ist auf FH der Trollkönig ^^."
    An dieser Stelle danke ich all meinen Fans und Hatern gleichermaßen ^.^

  3. #3
    Trojaner Avatar von SleiZer
    Registriert seit
    27.10.2008
    Beiträge
    81

    Standard

    Blick ich nicht ganz durch der Wille zu Kommentieren war da

    Leider bin ich nur richtig in Ansi-C geschult und verstehe nur die Hälfte von dem was du mir geschrieben hast.

    Ich hatte mir das so vorgestellt, dass ich damit den Speicher anderer Programme einlesen kann. Ich hab mir das so gedacht, dass wenn ich über den Access Bereich des Programmes rüber komme ich im nächsten Programm lande. Seh ich das falsch?

    danke für deine Antwort

  4. #4
    Der mit Anatidaephobie Avatar von blackberry
    Registriert seit
    11.07.2008
    Beiträge
    2.350

    Standard

    Code:
    #include <stdio.h>
    
    #define ADDR_START 0x400000
    #define ADDR_END   0x401000
    
    #define _TRY                            \
        asm(                                \
            "pushl $_catch;"                \
            "pushl %fs:(0);"                \
            "movl %esp, %fs:(0);"            \
            "_try:"                            \
            "pusha;"                        \
        );
    #define _CATCH                            \
        asm(                                \
            "jmp _endtry;"                    \
            "_catch:;"                        \
            "pusha;"                        \
        );
    #define _ENDTRY                            \
        asm(                                \
            "popa;"                            \
            "movl 12(%esp), %eax;"            \
            "movl $_endtry, 0xB8(%eax);"    \
            "xorl %eax, %eax;"                \
            "ret;"                            \
            "_endtry:;"                        \
            "popl %fs:(0);"                    \
            "addl $4, %esp;"                \
        );
    
    int main(void)
    {
        unsigned char chr;
        int addr;
        
        for(addr = ADDR_START; addr < ADDR_END; addr++)
        {
            _TRY
            {
                chr = *((unsigned char *) addr);
                printf("%.02X ", chr);
            }
            _CATCH
            {
                printf("-- ");
            }
            _ENDTRY
        }
        
        getc(stdin);
        return 0;
    }
    Klappt doch.
    Syntaktisch: Ansi-C.
    Inhaltlich: W32 gebunden.

    PDFTT cr3w a.E. — ReiDC0Re, lindor, Sera, berry
    please do feed the trolls crew and elk
    Ehrenwerte Mitglieder im Ruhestand: OpCodez, SFX.
    "Was sich blackberry gerade denkt" — Vorsicht! Frei laufender Wahnsinn!
    Zitat von fuckinghot19: "PS: Blackberry ist auf FH der Trollkönig ^^."
    An dieser Stelle danke ich all meinen Fans und Hatern gleichermaßen ^.^

  5. #5
    Trojaner Avatar von SleiZer
    Registriert seit
    27.10.2008
    Beiträge
    81

    Standard

    gibt mir 3 Errors...

    Assembler: Label expected in function 'main';
    Duplicate label 'asm' in function 'main';
    Duplicate label 'asm' in function 'main';

    welchen compiler benutzt du, stellt sich meiner einfach nur an?

  6. #6
    OpCodeKiddy Avatar von EBFE
    Registriert seit
    30.03.2009
    Beiträge
    442

    Standard

    Zitat Zitat von SleiZer Beitrag anzeigen
    Ich hatte mir das so vorgestellt, dass ich damit den Speicher anderer Programme einlesen kann. Ich hab mir das so gedacht, dass wenn ich über den Access Bereich des Programmes rüber komme ich im nächsten Programm lande. Seh ich das falsch?
    Das wäre das Prinzip von DOS .

    In modernen Betriebssystemen hat jeder Prozess einen eigenen virtuellen Speicherbereich : http://de.wikipedia.org/wiki/Virtuel...cherverwaltung
    kurz gesagt: das Programm kann auf den gesamten Speicher (theoretisch auf 32-Bit Rechnern auf 4GB, praktisch ist es durch OS interna auf 2-3 GB begrenzt) zugreifen, ohne einem anderen in die Quere zu kommen - die Umrechnung zwischen virtuellem und physikalischen wird durch MMU (memory managment unit) und OS bewerkstelligt und davon bekommt das Programm nichts mit.

    Um auf den Speicher anderer Programme zuzugreifen muss man entwerder selbst in den "niedrigsten" Modus Ring0 wechseln oder sich mit Betriebssystemfunktionen behelfen. Unter Windows wären das OpenProcess und ReadProcessMemory.

    Um gezielt den kompletten Speicher lesen und darstellen zu können, muss man natürlich vorher auch ein paar Details über den Process herausfinden:
    GetSystemInfo - damit bekommt man
    lpMinimumApplicationAddress und lpMaximumApplicationAddress heraus und dann VirtualQueryEx auf die niedrigste Adresse - liefert einen
    Code:
    typedef struct _MEMORY_BASIC_INFORMATION {
      PVOID  BaseAddress;
      PVOID  AllocationBase;
      DWORD  AllocationProtect;
      SIZE_T RegionSize;
      DWORD  State;
      DWORD  Protect;
      DWORD  Type;}
    Es gibt da 3 Typen eines Speicherbereichs: commited, reserviert und frei. Die freien Bereiche kann man nicht mit ReadProcessMemory einlesen .
    RegionSize sagt dann aus, wie groß der Block ist und damit lässt sich auch berechnen, wo der nächste Block liegt: BaseAddress + REgionSize. Bei dem nächsten Block führt man wieder VirtualQueryEx aus und kann sich so durch den ganzen Programmspeichern hangeln und diesen Anzeigen.
    Geändert von EBFE (15.07.2009 um 20:09 Uhr)
    TrueCrypt/RAR/Zip Passwort vergessen und das Bruten dauert ewig? Oder brauchst du fein abgestimmte Wortlisten? Hilf dir selbst mit WLML - Word List Markup Language
    Gib Stoned/Mebroot/Sinowal und anderen Bootkits keine Chance: Anti Bootkit v 0.8.5

  7. #7
    Der mit Anatidaephobie Avatar von blackberry
    Registriert seit
    11.07.2008
    Beiträge
    2.350

    Standard

    Zitat Zitat von SleiZer Beitrag anzeigen
    welchen compiler benutzt du, stellt sich meiner einfach nur an?
    Bei mir compiliert das unter MinGW32.

    PDFTT cr3w a.E. — ReiDC0Re, lindor, Sera, berry
    please do feed the trolls crew and elk
    Ehrenwerte Mitglieder im Ruhestand: OpCodez, SFX.
    "Was sich blackberry gerade denkt" — Vorsicht! Frei laufender Wahnsinn!
    Zitat von fuckinghot19: "PS: Blackberry ist auf FH der Trollkönig ^^."
    An dieser Stelle danke ich all meinen Fans und Hatern gleichermaßen ^.^

  8. #8
    Trojaner Avatar von SleiZer
    Registriert seit
    27.10.2008
    Beiträge
    81

    Standard

    OpenProcess und ReadProcessMemory
    scheinen mir Funktionen von c++ zusein, eigentlich hatte ich nicht vor
    in c++ einzusteigen aber mir scheint es als hätte ich keine andere Wahl, oder
    gibt es vergleichbares in Ansi-C?

    Wenn ich es richtig verstehe, kann man von einem Prozess die Startaddresse des reservierten Speichers auslesen und die Größe viel Speicher Reserviert wurde, und dahinter fängt der nächste Prozess an?


    Bei mir compiliert das unter MinGW32.
    Ich schau mir den auch mal an, ich gammel hier noch mit einem einfachen C Compiler rum.

  9. #9
    Der mit Anatidaephobie Avatar von blackberry
    Registriert seit
    11.07.2008
    Beiträge
    2.350

    Standard

    Die WinAPI ist nicht notwendigerweise C++.
    Versuch mal windows.h zu inkludieren.

    Wenn der Header nicht vorhanden sein sollte musst du dir deine Prototypen eben selbst schreiben.

    Für ReadProcessMemory lautet dieser wie folgt: ( http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx )
    Code:
    BOOL WINAPI ReadProcessMemory(
      __in   HANDLE hProcess,
      __in   LPCVOID lpBaseAddress,
      __out  LPVOID lpBuffer,
      __in   SIZE_T nSize,
      __out  SIZE_T *lpNumberOfBytesRead
    );
    Mit nativen Datentypen sollte das wie folgt lauten: (aus dem Gedächtnis übersetzt - muss nicht stimmen)
    Code:
    int __stdcall ReadProcessMemory(
      void *hProcess,
      void *lpBaseAddress,
      void *lpBuffer,
      unsigned int nSize,
      unsigned int *lpNumberOfBytesRead
    );

    PDFTT cr3w a.E. — ReiDC0Re, lindor, Sera, berry
    please do feed the trolls crew and elk
    Ehrenwerte Mitglieder im Ruhestand: OpCodez, SFX.
    "Was sich blackberry gerade denkt" — Vorsicht! Frei laufender Wahnsinn!
    Zitat von fuckinghot19: "PS: Blackberry ist auf FH der Trollkönig ^^."
    An dieser Stelle danke ich all meinen Fans und Hatern gleichermaßen ^.^

  10. #10
    OpCodeKiddy Avatar von EBFE
    Registriert seit
    30.03.2009
    Beiträge
    442

    Standard

    Zitat Zitat von SleiZer Beitrag anzeigen
    scheinen mir Funktionen von c++ zusein, eigentlich
    siehe BlackBerry - das sind Betriebssystemfunktionen (WinAPIs). Denn Prozessmanipulation ist Betriebssystemabhängig, man muss also die Schnittstellen/Funktionen nutzen, die das OS bietet - da bringt dich ANSI leider nicht weiter

    Wenn ich es richtig verstehe, kann man von einem Prozess die Startaddresse des reservierten Speichers auslesen und die Größe viel Speicher Reserviert wurde, und dahinter fängt der nächste Prozess an?
    Nope. Eventuell bringt dich das weiter: http://msdn.microsoft.com/en-us/library/ms810616.aspx
    Jeder Prozess hat 4 GB linear adressiertbaren eigenen Speicher, den er quasi nach belieben verändern kann,ohne dass er dabei System oder andere Programme gefährdet (nur sich selbst ). Mit OpenProcess bekommst du ein Handle zu einem Prozess und alles was du ausließt, gehört nur zu diesem. Wenn du alle Prozesse auslesen möchtest (oder dem user eine Liste anbieten) musst du erstmal vom Betriebssystem eine solche Liste anfordern:
    zuerst ein CreateToolhelp32Snapshot mit dem Parameter TH32CS_SNAPPROCESS. Dann kannst du die Rückgabe mit Process32First und Process32Next durchgehen und bekommst alle Infos zu dem Prozess geliefert:
    http://msdn.microsoft.com/en-us/libr...89(VS.85).aspx (createToolhelp)
    http://msdn.microsoft.com/en-us/libr...34(VS.85).aspx (Prozess32First)
    http://msdn.microsoft.com/en-us/libr...39(VS.85).aspx (Processentry Struktur)
    Code:
    typedef struct tagPROCESSENTRY32 { 
        DWORD dwSize; 
        DWORD cntUsage; 
        DWORD th32ProcessID; 
        DWORD th32DefaultHeapID; 
        DWORD th32ModuleID; 
        DWORD cntThreads; 
        DWORD th32ParentProcessID; 
        LONG  pcPriClassBase; 
        DWORD dwFlags; 
        char szExeFile[MAX_PATH]; 
    } PROCESSENTRY32; 
    typedef PROCESSENTRY32 *  PPROCESSENTRY32; 
    typedef PROCESSENTRY32 *  LPPROCESSENTRY32;
    Hier ist ein Beispiel in C
    http://www.google.com/codesearch/p?h...process%20list
    TrueCrypt/RAR/Zip Passwort vergessen und das Bruten dauert ewig? Oder brauchst du fein abgestimmte Wortlisten? Hilf dir selbst mit WLML - Word List Markup Language
    Gib Stoned/Mebroot/Sinowal und anderen Bootkits keine Chance: Anti Bootkit v 0.8.5

Seite 1 von 2 12 LetzteLetzte

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •