Ergebnis 1 bis 6 von 6
  1. #1
    Der mit Anatidaephobie Avatar von blackberry
    Registriert seit
    11.07.2008
    Beiträge
    2.350

    Standard [C] kernel32.dll!GetProcAddress Finder

    Was macht das?
    Es findet die Adresse der Funktion GetProcAddress. Diese kann dann dazu verwendet werden weitere Funktionen (LoadLibrary, ...) zu laden.

    Wie funktioniert das?

    Windows speichert eine Liste aller geladenen Module (das Programm selber, benötigte DLLs, ...), deren Startelement von der PEB_LDR_DATA Struktur referenziert wird. Die Adresse dieser Struktur befindet sich im Process Enviroment Block (PEB). Ein Zeiger zum PEB befindet sich in fs:[30h].
    Danke dieser Vorraussetzungen ist es möglich, die Position von kernel32.dll im Speicher (welche bei verschiedenen Versionen/Servicepacks/Windows Versionen und Relocations variiert und somit nicht hardcoded werden sollte) zu lokalisieren.
    Von dort an kann man ganz normal kernel32.dll parsen (--> PE Format) und den ExportTable "durchlaufen".
    Dort findet man schlussendlich die RVA (Adresse die relativ zur momentanen Position von kernel32.dll ["ImageBase"] ist).
    Zu dieser addiert man dann noch die über den PEB gefundene Adresse von kernel32.dll und schon hat man die Adresse von GetProcAddress, welche man anschließend über Funktionszeiger (ich liebe C ) aufrufen kann.

    Wozu ist das gut?

    Import verstecken, Heuristiken austricksen und natürlich einfach zum Spaß

    Wieso ist das entstanden?
    Das ich das implementiert habe ist ursprünglich schon etwas länger her (die originale Version ist in MASM), doch jetzt habe ich das ganze auf Anfrage auch nach C portiert.

    Genaueres - Siehe:
    http://free-hack.com/showpost.php?p=419081&postcount=5
    http://free-hack.com/showthread.php?t=52835

    gpa.h:


    gpa.c:


    Quellen für die Strukturdefinitionen:
    Microsoft's MSDN und undocumented.ntinternals.net.

    Anmerkung:
    In gpa.h finden sich auskommentierte Strukturen. Diese sind da, weil sie für die anderen Strukturen, oder sogar im Programm selber wichtig sind, jedoch bereits definiert wurden.
    MSDN sagt z.B., dass die Struktur _PEB bzw. das dazugehörige Typedef in "Winternl.h" definiert sein sollten.
    Da MinGW diesen Header jedoch nicht besitzt habe ich mir das Zeug zusammengeschustert und die überflüssigen Strukturen da gelassen, für den Fall, dass jemand diese nicht hat.


    MfG. BlackBerry
    Geändert von blackberry (13.04.2010 um 15:04 Uhr)

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

  2. Folgende Benutzer haben sich für diesen Beitrag bedankt:

    br00_pwn (13.04.2010)

  3. #2
    emo-destroyer.* Avatar von br00_pwn
    Registriert seit
    27.10.2008
    Beiträge
    1.318

    Standard

    Gute Arbeit, Black

  4. #3
    Macht&Ehre
    Registriert seit
    24.07.2008
    Beiträge
    657

    Standard

    Sehr schön, jedoch würde ich gleich Uppercase('kernel32.dll') nehmen, das war bei mir in Windows 7 der Fall wodurch sowas nicht geklappt hat :/

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

    Standard

    Ich nutze auch Windows 7 und es hat bei mir sehr gut funktioniert.
    Dennoch habe ich noch einen kleinen Fehler gefunden und dabei gleich noch ein tolower() bei dem Vergleich der Zeichen eingefügt.

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

  6. #5
    DateMake Dialer Avatar von jojoomgasd
    Registriert seit
    17.05.2010
    Beiträge
    100

    Standard

    dafür muss aber GetProcAddress aber in der ImportTable sein oder?

    wenn nicht dann ist das hammer

    man kann ja auch noch 'GetModuleHandleA' laden und somit alle api's zur laufzeit laden

  7. #6
    I'm in ur VM. Avatar von l0dsb
    Registriert seit
    23.07.2007
    Beiträge
    1.038

    Standard

    Zur Erwähnen wäre noch, dass diese Vorgehensweise auch sehr oft in Malware (siehe 29A) und Softwareschutzsystemen (ASProtect, EXECryptor, Themida und ähnliche) verwendet wird.

    Dort werden aber nicht komplette Funktionsnamen verglichen, sondern lediglich deren Hashes (üblicherweise in dword-Größe). Das mag schneller sein, einleuchtend ist jedoch, dass die Funktionsnamen der gesuchten Funktionen nicht sofort ersichtlich sind.

    Zum Vorposter: Nein, GetProcAddress muss nicht in der IT sein, aber kernel32.dll im Speicher. LoadLibrary wäre da auch noch eine Idee, um auch APIs nachladen zu können, deren DLL noch nicht geladen ist.

    Ach ja: Ich warte auf ein neues UnpackUs, BlackBerry! Hoffentlich mit regerer Beteiligung. :/
    I can haz RCE?

Stichworte

Berechtigungen

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