Möglichkeiten externe Scripts in laufende .Exe einzubinden?

  • Hallo,

    ich hatte mal vor ca. einem Jahr gelesen, dass jemand externe AutoIt Scripts in seine kompilierte AutoIt Anwendung eingebunden hat, ich finde das ganz spannend und würde das auch gerne umsetzen. Zwar stand da, dass es nicht wirklich sinnvoll war, weil das die Anwendung verlangsamt hatte, aber seis drum. Den Thread finde ich leider nicht mehr. Soweit ich mich innere, band er lediglich die Zeilen des Scripts ein, nicht die Datei des externen Scripts selbst, so waren diese externen Scripts einfache .txt Datei.

    Ich kann mir vorstellen, dass er also FileRead verwendet hat, und die externen Zeilen in der vorgegebenen Zeile Verwendung fanden. Man stelle sich vor, ihr habt eine Funktion, die 10 Zeilen lang ist, es ist relativ egal was diese Funktion macht. Jetzt entfernt ihr die letzten 5 Zeilen und steckt sie in eine externe Datei, die lediglich diese 5 Zeilen beinhaltet. Beide Scripts, sowohl der Hauptscript der irgendwann diese halbe Funktion aufruft und diese externe Datei. Klar ist, das EndFunc ist natürlich auch weiterhin im Hauptscript, aber eben der halbe Inhalt fehlt. Durch einen Script im Hauptscript, zieht man die Datei beim z.B: Programmstart via FileRead in die Hauptdatei und die Funktion würde dann fehlerfrei ausgeführt werden können.

  • In jedem zur EXE kompilierten AutoIt-Script befindet sich das Script und auch der Interpreter.
    Somit kann der Interpreter jeden externen AutoIt-Source direkt aus der Datei ausführen....

    [autoit]

    Run('"' & @AutoItExe & '" /AutoIt3ExecuteScript "' & @ScriptDir & $Sourcefile & ".au3" & '"')

    [/autoit]

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (5. April 2014 um 13:15)

  • Ich will den externen Script viel weniger ausführen, als ich ihn im Script verwenden möchte. Gutes Beispiel: Die Funktion im Hauptscript kann nur erfolgreich abgeschlossen werden, wenn der externe Script eingelesen und verwendet wird.

    Beispiel im Hauptscript:

    [autoit]

    Func _Funktion1()
    MsgBox(0, "Test", "1")
    MsgBox(0, "Test", "2")
    MsgBox(0, "Test", "3")
    ;Externen Script einbinden
    MsgBox(0, "Test", "7")
    MsgBox(0, "Test", "8")
    MsgBox(0, "Test", "9")
    EndFunc

    [/autoit][autoit]


    MsgBox(0, "Test", "4")
    MsgBox(0, "Test", "5")
    MsgBox(0, "Test", "6")

    [/autoit]
  • In jedem zur EXE kompilierten AutoIt-Script befindet sich das Script und auch der Interpreter.
    Somit kann der Interpreter jeden externen AutoIt-Source direkt aus der Datei ausführen....

    [autoit]

    Run('"' & @AutoItExe & '" /AutoIt3ExecuteScript "' & @ScriptDir & $Sourcefile & ".au3" & '"')

    [/autoit]


    Nicht ganz... Backslash vergessen ;)

    [autoit]

    Run('"' & @AutoItExe & '" /AutoIt3ExecuteScript "' & @ScriptDir & '\' & $Sourcefile & ".au3" & '"')

    [/autoit]

    Außerdem muss beachtet werden, dass die verwendeten Includes des Externen Scriptes vorhanden sein müssen, also sinnigerweise mitgeliefert und korrekt mit relativem Pfad im externen Script referenziert werden müssen. Werden nur native Autoitfunktionen ohne UDF Funktionen benutzt klappt das aber ohne weiteres. Ein kleiner Fallstrick besteht evtl. noch wenn das externe Script nur 64bit kompatibel ist (z.B.Nutzung einer 64bit dll), das Hauptscript aber den 32bit Interpreter enthält. Das selbe Problem besteht natürlich auch umgekehrt.


    Der Thread Autor sprach aber eigentlich mehr vom interpretieren einzelner injizierte Code Abschnitte und nicht von kompletten Scripten. Das kann man durch die vorsichtige Nutzung dieser Funktionen erreichen:


    [autoit]


    fileread()
    isdeclared()
    eval()
    assign()
    execute()
    call()

    [/autoit]

    Die Wahrscheinlichkeit von Scriptabstürzen steigt aber gewaltig wenn man hier nicht sehr gut prüft was da eigentlich eingebunden werden soll.

  • So ich habe das jetzt mal versucht, Execute() zeigt einen leichten Fortschritt.

    [autoit]

    $sFile = @ScriptDir & '\Externe.au3'
    $sRead = FileRead($sFile)

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

    _Funktion()

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

    Func _Funktion()
    MsgBox(0,"",1)
    MsgBox(0,"",2)
    Execute($sRead)
    MsgBox(0,"",6)
    MsgBox(0,"",7)
    EndFunc

    [/autoit]

    Externe.au3:

    [autoit]

    MsgBox(0,"",3)

    [/autoit]

    Das geht aber nur, wenn der externe Code Einzeilig ist. :/

  • Naja du musst eben die Zeilen splitten und einzeln interpretieren.

    Hier deine Möglichkeiten:

    [autoit]


    fileread (in Verbindung mit) stringsplit
    _filereadtoarray (im prinzip das gleiche wie oben, nur bequemer)
    filereadline

    [/autoit]
  • Ich habe mal ein Pluginsystem geschrieben das die autoit3.exe benutzt um sich mit addons selbst zu kompilieren.
    Einfach zu realisieren ist hierbei
    - Einbinden von neuen Funktionen auf vorgegeben weise (Alà Dateimenue optionen o.ä.)

    Schwierigkeit
    - Defekte Addons erkennen oder auch wieder aus dem Script entfernen

    -

  • WIe müsste man das denn angehen?


    Vielleicht erzählst du uns erstmal ein wenig von deinem Script. Was tut es wie sieht es derzeit aus und was willst du einbinden können bzw. was soll damit erreicht werden?

    Deine Beispielschnippsel lassen bisher nicht wirklich erkennen wozu du überhaupt Autoitcode dynamisch parsen oder interpretieren musst. Wenn es nur um die Austauschbarkeit von Text innerhalb einer msgbox geht langt auch eine simple ini oder Text Datei, welche die Texte enthält. Autoitcode bräuchtest du dann überhaupt keinen in diesen externen Dateien.

    Selbst wenn es über Texte in msgboxen hinausgehen sollte bietet sich ggf. immernoch eine eigene Dateistruktur / Zwischensprache an die dein Hauptscript auswerten kann um bestimmte Dinge variabel zu gestalten. Das gibt dir wesentlich mehr Kontrolle darüber was diese Zusatzanweisungen tun können.

  • Zuerst mal brauchst du eine Schnittstelle, über die die Addons mit deinem Hauptprogramm kommmunizieren können. Je nachdem wie umfangreich und flexible die Plugins sein sollen, musst du Daten ausgeben und Daten der Plugins verarbeiten können. Jetzt genau zu sagen, was du genau brauchst ist natürlich schwierig ohne konkreten Anwendungsfall. Das wird der kompliziertere Teil.

    Der einfachere ist eben das Ausführen der Plugins über den Interpreter und das Erstellen von einem bzw. je nach Bedarf mehreren Events im Hauptprogramm, zu denen Plugins geladen werden sollen.

  • Es gibt kein Script, ich finde die Idee an sich interessant, und würde etwas in der Richtung gerne umsetzen.

    Ich bin jetzt etwas weiter gekommen: (Externe.au3 = 3 Msgboxen, erklärt sich von selbst)

    Kennt denn jemand noch eine bessere Methode?

    [autoit]

    #include <File.au3>
    #include <Array.au3>
    Global $sFile = @ScriptDir & '\Externe.au3'
    Global $sRead = FileRead($sFile)
    Global $iCount = _FileCountLines($sFile)
    Global $Plugin[1]

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

    For $i = 1 To $iCount
    _ArrayAdd($Plugin, FileReadLine($sFile, $i))
    Next

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

    _Funktion()

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

    Func _Funktion()
    MsgBox(0,"",1)
    MsgBox(0,"",2)
    For $i = 1 To $iCount
    Execute($Plugin[$i])
    Next
    MsgBox(0,"",6)
    MsgBox(0,"",7)
    EndFunc

    [/autoit]

    Ausgabe: MSgboxen von 1-7

  • Macht so absolut kein Sinn weil sich hier keine Anwendung erschließt.

    Script 1

    [autoit]


    $test = "Test 1 MSGbox"
    Execute(FileReadLine("test2.au3",1))
    MsgBox(0,"",$test)

    [/autoit]


    Script 2

    [autoit]


    $test = "Das hier bekommst du nie zu sehen"

    [/autoit]

    Anwendung nur für MsgBoxen = Sinnlos.
    Und dein Beispiel lässt wieder nicht erkennen für was du das brauchst.
    Es wird dir hier niemand ne Anleitung für geben wie du nachladbare Module in deinen Trojaner einbaust.
    Besser du Postest dein Script - das in dem du es wirklich verwenden willst.

    -

  • ... mehr als mich zu wiederholen kann ich auch nicht: Beispiel
    kA wie du auf Trojaner kommst, lass das bitte sein.

    Es geht einfach um die Möglichkeit an sich, externe Scripts in den Code bestmöglichst ein zu binden, nicht mehr und nicht weniger. Wie du das interpretierst ist mir eigentlich egal. Aber wenn du mit so einer Einstellung kommst, bitte ich dich darum, den Thread einfach zu verlassen und mir nicht zu helfen, das wäre mir deutlich lieber, als so einen Schrott lesen zu müssen.

  • Kennt denn jemand noch eine bessere Methode?


    Wie schon gesagt wurde. Du kennst nun beide Möglichkeiten um Autoitcode zur Laufzeit auszuführen oder zu interpretieren.

    Natürlich gibt es noch etliche andere Möglichkeiten beliebigen Code nachzuladen, das hat dann aber kaum noch mit Autoit zu tun. Du könntest wie gesagt eine Kommandosprache entwickeln und über solche Konfigurations Dateien den Scriptverlauf beeinflußen, du könntest exe oder dll Dateien ausführen/laden und dir Schnittstellen zur Kommunikation mit diesen selbst geschriebenen Addons programmieren, du könntest inline Assembler nutzen und so weiter.

    Ohne konkreten Anwendungsfall macht es aber keinen Sinn da weiter darüber zu reden, denn nur im konkreten Fall kann man dir sagen was geeignet ist oder was bei weitem zu umständlich bzw. wenig praktikabel wäre.

  • Hi,

    Zitat

    Der Thread Autor sprach aber eigentlich mehr vom interpretieren einzelner injizierte Code Abschnitte und nicht von kompletten Scripten. Das kann man durch die vorsichtige Nutzung dieser Funktionen erreichen:

    und genau deshalb habe ich den o.g. Vorschlag gemacht 8)
    Wie man sieht, war ich auf dem richtigen Dampfer....

    Es besteht keine einziger Grund, in einem "normalen" Programm irgendwelche " Funktionen" in ein laufendes Script zu includen! Oder doch? :rofl:

  • Man muss nicht immer sofort diverse Dinge unterstellen. Natürlich gibt es neben Trojanern auch legitime Gründe so vorzugehen. Man könnte darüber zum Beispiel einen Kopierschutz realisieren der auf eine bestehende Internetverbindung mit dem Lizenzserver angewiesen ist. Auch ein Lizenz / Upgrade Model mit erweiterten Funktionen für zahlende Nutzer wäre so realisierbar usw.

    Ist es sinnvoll, zuverlässig genug oder eher schwachsinnig sowas zu tun? Das ist immernoch eine Frage die sich der Programmierer selbst stellen muss.

  • Man könnte darüber zum Beispiel einen Kopierschutz realisieren der auf eine bestehende Internetverbindung mit dem Lizenzserver angewiesen ist. Auch ein Lizenz / Upgrade Model mit erweiterten Funktionen für zahlende Nutzer wäre so realisierbar usw.

    Ist es sinnvoll, zuverlässig genug oder eher schwachsinnig sowas zu tun? Das ist immernoch eine Frage die sich der Programmierer selbst stellen muss.


    Aber für so eine Art Kopierschutz eignet sich AutoIt ja eigentlich garnicht, da eigentlich jeder das ganze dekompilieren kann.

    @TE: Die imho beste Methode, um dein Vorhaben umzusetzen, wäre die, die misterspeed vorgeschlagen hat. Also das du sozusagen eine eigene kleine "Skript-Sprache" machst.

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski