DLL mit CallBack-Funktionen nutzen

  • Morgen!

    Sicherlich kennen die meisten hier das Tool PEiD mit dem sich die Signaturen von PE-Dateien auslesen und auswerten kann.
    Mir ist jetzt mittlerweile die DLL-Version von diesem Tool in die Hände geraten und ich würde diese gerne in meinem Skript verwenden.
    Allerdings habe ich es trotz guter enthaltener Doku bis jetzt nicht hinbekommen vernünftige Ergebnisse zu erzielen.

    Die Doku findet sich online >>hier<< und die DLL + Beispiele für Delphi und Assembler(!) gibt es >>hier<<.

    Ich möchte konkret eine Datei per Scan-Hard-Methode überprüfen und die Sig bzw. den Typ der PE-Datei zurückgeben lassen.
    Also hab ich es mit der Funktion Scan_Hard probiert.

    In der Form

    [autoit]

    $Test = DllCall("PEiDLL.DLL", "str", "Scan_Hard" , "str", $File)
    ConsoleWrite($Test)

    [/autoit]

    erscheint zwar kurz die PEiD-GUI und verschwindet dann wieder (auch etwas merkwürdig für ne DLL) aber ein Rückgabewert oder so wird nicht geschrieben("str" erschien mir als noch äquivalentester Datentyp zu "char"...).

    Ich hatte aber noch im Hinterkopf das es sich um CallBack-Funktionen handeln könnte und diese ja nicht so ohne weiteres machbar sind in AutoIt oder?

    Mit DLLStructCreate habe ich ebenfalls schon experimentiert aber da fehlt mir eindeutig das Wissen bzw. die Bildung um die Sache wirklich zu verstehen.

    Also wenn einer da einen Ansatz für mich hätte bzw. einen guten Link wo ich das ganze nachlesen könnte würdet ihr mir sehr helfen.
    Ansonsten müsste ich das über das im "Asm Example"-Ordner enthaltene Kommandozeilentool machen bzw. die Sig-Erkennung gleich komplett in AutoIt zu machen (ist sogar schon in Arbeit)

    Danke im Voraus

    • Offizieller Beitrag

    Hallo!

    DllCall gibt immer ein array zurück.. bei der dll ist (wie so oft)die returnvalue bei $dll[0]. Ausserdem wenn dein programm beendet wird wird die dll automatisch geschlossen!
    Ich hab dir mal ein bsp gemacht, du kannst es auch mit einem Puren sleep machen, und ich bin mir auch nicht ganz sicher ob die variante geht.. aber sie sollte eigentlich..

    Spoiler anzeigen
    [autoit]

    $File = "D:\wg.txt"
    $Test = DllCall("PEiDLL.DLL", "str", "Scan_Hard" , "str", $File)
    While $Test[0] = ""
    Sleep(50)
    WEnd
    If $Test[0] = "Unable to open file" Then
    $Test[0] = "!>PEiDLL.dll return: "&$Test[0]
    Else
    $Test[0] = "+>PEiDLL.dll return: "&$Test[0]
    EndIf
    ConsoleWrite($Test[0]&@cRLF)

    [/autoit]

    Mfg Spider

  • Ich danke - an ein Array hab ich überhaupt nicht gedacht.

    Auch gut zu wissen das das standardmäßig immer der Fall ist - kaum mit nem Array durchgeführt schon klappt die Sache wunderbar.

    :klatschen:


    Edit: Es ist doch noch nicht vorbei ;)

    Um die Optionen zum scannen einzustellen gibt es in der DLL den Aufruf SetScanOptions.
    Damit wollen wir einstellen ob eine externe Sig-Datenbank genutzt wird oder nicht.
    Allerdings bekommen wir die Sache nicht zum laufen.
    Was mich daran stört ist das bei den ScanFunktionen in der Doku von einer "Funktion" die Rede ist während bei dieser SetOptions-Sache von einer "Prozedur" gesprochen wird :irre:

    Das Hauptproblem ist wahrscheinlich das es einen Boolischen Datentyp als Parameter gibt.
    Da AutoIt ja keinen entsprechenden expliziten Datentyp kennt hab ich deswegen den Datentyp als Integer gesetzt und anstatt "True" den Wert auf "1" genommen (einmal mit - einmal ohne Anführungszeichen).
    Fazit: Die Funktion lässt sich nicht aufrufen und bricht mit einer Fehlermeldung ab.
    Wenn ich es hingegen so hinschreibe kommt zwar keine Fehlermeldung - aber eine Auswirkung ist auch nicht festzustellen:

    Code
    DLLCall("PEiDLL.DLL", "none", "SetScanOptions", "str", True, "str", "userdb.txt")


    Eigentlich logisch da das nach meinem Verständniss auch irgendwie totaler Quark ist.

    Also jedenfalls ist diese Prozedur in der Doku folgendermaßen vermerkt:

    Code
    Procedure SetScanOptions (UseUserDB : Boolean; UserDB : PChar); Pascal;

    Hoffe ihr könnt mir auch hier weiterhelfen.

    Einmal editiert, zuletzt von AspirinJunkie (29. Oktober 2006 um 11:41)

    • Offizieller Beitrag

    Hallo!

    Es ist zwar schon ein paar Jahre her das ich was in Delphi oder Pascal geschrieben habe aber so ein paar grundlegende Dinge vergisst man ja nie! :schild4:


    Allso zuerstmal der der unterschied zwischen Function und Procedure ist das eine Procedure kein Ergebins zurückliefert, also im prinzip das gleiche wie in C eine Funktion die mit none als Rückgabewert defineirt wird!

    Der Datentype boolean ist wenn ich mich recht erinnere ein ENUM of Bytes hat also nur 8 Bit wohin der Datentype Int in AutoIt 32 bit belegt!

    Beim Datentype PCHAR handelt es sich genau wie bei str um eine nullterminierte Zeichenkette.

    probier mal ob es vllt so:

    [autoit]


    $boolean = DllStructCreate("byte")
    ;~ DllStructSetData($boolean,1,0) ; False
    DllStructSetData($boolean,1,1) ; True

    [/autoit][autoit][/autoit][autoit]

    DLLCall("PEiDLL.DLL", "none", "SetScanOptions", "ptr", DllStructGetPtr($boolean), "str", "userdb.txt")

    [/autoit]

    oder so geht:

    [autoit]


    $strUDB = "userdb.txt"

    [/autoit][autoit][/autoit][autoit]

    $nlenUDB = StringLen($stUDB)
    $SSOStruct = DllStructCreate("byte","char[" & ($nlenUDB + 1) & "]")

    [/autoit][autoit][/autoit][autoit]

    DllStructSetData($SSOStruct,1,1) ; True
    DllStructSetData($SSOStruct,2,$strUDB)

    [/autoit][autoit][/autoit][autoit]

    DLLCall("PEiDLL.DLL", "none", "SetScanOptions", "ptr", DllStructGetPtr($SSOStruct))

    [/autoit]
  • :klatschen:

    Ich wusste es - hier werden sie geholfen.

    Im Studium haben wir jetzt auch mit C angefangen - nur bin ich von dieser Sprache bislang nicht sehr begeistert.
    Finde da AutoIt, trotz der begrenzten Möglichkeiten doch irgendwie intuitiver zu bedienen.
    Beispiel mit dem char-Datentyp - da lob ich mir doch meinen AutoIt Variant als String angesprochen und muss mir keine Gedanken über die Textlänge machen.

    Also dank dir - mittlerweile hab ich auch die DLLStruct-Sache kapiert.
    Hatte das auch so ähnlich schon probiert aber scheinbar irgendwo noch was nicht richtig gehabt.