Seite 1 von 1

CRC32 API Search

Verfasst: 21.06.2006 08:35
von myself
Ich habe hier mal die CRC32 Methode zum suchen von API adressen zur laufzeit versucht in PB zu coden. Anstatt den namen der API die man aufrufen will in die exe zu speichern wird einfach der CRC32 Fingerprint gespeichert und zur laufzeit durch Vergleich die adresse gesucht!

Code: Alles auswählen

Procedure GetAdressCRC32(library.s,crc32.l)
  If OpenLibrary(0,library.s) ; Library öffnen
    ExamineLibraryFunctions(0) 
    While(NextLibraryFunction()) ; Funktionen auflisten
      tmp$ = LibraryFunctionName() 
      crcapi = CRC32Fingerprint(@tmp$,Len(tmp$)) ; Den CRC32 Fingerprint des API Namens berechnen
      If crcapi = crc32 ; Mit dem Gesuchten vergleichen
        CloseLibrary(0)
        ProcedureReturn LibraryFunctionAddress() ; Wenn gefunden -> adresse zurückliefern und methode beenden.
      EndIf
    Wend
    CloseLibrary(0)
  EndIf
EndProcedure


;CRC32 von string "MessageBoxA" -> 1462590862
;Einfach zu bekommen durch diesen Code
;
;function2get$ = "MessageBoxA"
;Debug CRC32Fingerprint(@function2get$, Len(function2get$)) 
;

CallFunctionFast(GetAdressCRC32("user32.dll",1462590862),0,"hello world!","Found Messagebox",0)
Vorteile:
Funktionen werden nicht im IAT (Import Adress Table) aufgeführt was es
zum ersten crackern schwerer macht bestimmte codeteile zu finden und ausserdem bleibt durch den kleinen IAT auch die exedatei auf dauer echt klein! Achtung: Durch die ständige suche ist diese Methode nicht für Projekte oder Codeteile geeignet bei denen es auf Geschwindigkeit ankommt!

mfg My-Self

Verfasst: 21.06.2006 09:27
von edel
Die Funktion bringt so nicht den gewuenschten Erfolg. Den
Einstiegspunkt kann ich sehr leicht mit z.b. ollydbg auslesen.
stack hat geschrieben: EAX 77E5D8DE user32.MessageBoxA
Ausserdem ist die Procedure fehlerhaft da du die DLL schliesst, das geht
frueher oder spaeter in die Hose, spaetestens bei einer eigenen Dll die
Windows nicht automatisch geladen hat.

Verfasst: 21.06.2006 09:45
von myself
kann man ja umschreiben so das man als 1. parameter nicht den namen sondern das handle einer dll hat :)