1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Andy

Beiträge von Andy

  • AutoIt & ASM

    • Andy
    • 10. Mai 2014 um 09:00

    Hi,
    ich konnte leider das Script nicht starten.

    Code
    "C:\Program Files (x86)\AutoIt3\Include_Eigene\FASM.au3" (127) : ==> Subscript used on non-accessible variable.:
    Func FasmGetLastError()
    Func FasmGetLastError^ ERROR

    Vermutlich benutze ich nicht die aktuelle FASM.AU3 (warum wohl^^). Daher würde ich die von dir verwendete FASM.AU3 mit in die Zip packen.

    Was mir sofort aufgefallen ist, wieso benutzt du nicht AutoIt-Variablen für die Pointer usw. innerhalb des ASM-Codes zur Vereinfachung?

  • Übersetzer gesucht

    • Andy
    • 1. Mai 2014 um 15:38
    Zitat von Tweaky

    Falls ihr mal wieder eine aktualisierte Deutsche Hilfe wollt

    die 3.3.8.1-Hilfe (und die von früheren Versionen) ist für mich ausreichend....passend zur "damals" aktuellen AutoIt-Version. Dafür möchte ich dir, und auch den anderen "Hilfe"-Protagonisten, herzlich danken!

  • GrooveLoad - ein Grooveshark Downloader

    • Andy
    • 28. April 2014 um 21:41

    ...wird immer besser :thumbup:
    Und das Jammern erfolgt auf immer höherem Niveau!s.u. 8)

    Wenn in der Msgbox von "GR_MSG_CANNOTDOWNLOAD=kann nicht heruntergeladen werden und wird deshalb ausgelassen.", ein Timer sitzen würde, dann könnte das Script sogar nach einigen Sekunden selbstständig mit dem download der anderen Titel fortfahren :rolleyes:

  • Revision Demoparty 2014 Streams'n'Tools (und allgemeine Demoparty Diskussion)

    • Andy
    • 27. April 2014 um 23:01
    Zitat von minx

    Es versteckt sich manchmal zwischen anderen Fenstern.

    wegen mir, solange der Prozess wenigstens existieren würde, oder versteckt der sich dann auch?
    Der Prozess existiert ca. 3 Sekunden, dann wird er beendet.
    Ich kann ja wg dem blöden Packer nicht mal die EXE debuggen...bzw. will nicht!

  • Revision Demoparty 2014 Streams'n'Tools (und allgemeine Demoparty Diskussion)

    • Andy
    • 27. April 2014 um 20:58

    minx,
    die EXE läuft bei mir nicht Win7/64 + AMD A6
    Wird geladen und gestartet, bricht aber dann ohne Fehlermeldung nach ca. 2-3 Sekunden ab. Bild/Fenster ist dabei keins zu sehen.

    UEZ,
    gerade die prozeduralen Grafiken sind recht einfach zu vergrößern/verkleinern, wenn man die Grenzen innerhalb der Funktionen beachtet!
    ich versuche das Script mal umzuschreiben

  • Revision Demoparty 2014 Streams'n'Tools (und allgemeine Demoparty Diskussion)

    • Andy
    • 27. April 2014 um 15:41

    Danke!

    Die einzelnen Funktionen nun per Wasweisich-Compilersprache als bspw. DLL-Funktion zur Verfügung gestellt (dort kann man den ASM-Code am einfachsten extrahieren), erweitert durch "bewegtes" Wasser :P , dazu noch ein aus der Sonne auf den Betrachter zukommendes, drehendes 3D-Autoitlogo, und fertig ist die erste 1k-Demo :D

    Los gehts :rock:

  • Revision Demoparty 2014 Streams'n'Tools (und allgemeine Demoparty Diskussion)

    • Andy
    • 27. April 2014 um 13:10

    Ja, natürlich ist die 4K-Grenze nur mit einem compilierten und ggf. auch noch gepacktem Code möglich.
    Die Frage ist, wie man dort hin kommt....

    Natürlich haben wir einige AutoIt/ASM-Varianten am Start, welche davon letztendlich benutzt wird, bliebe jedem natürlch selbst überlassen!
    Diese AutoIt/ASM-Umgebung würde ich allerdings fürs Testen der Funktionen verwenden, einfach aufgrund der problemlosen Entwicklung.
    Genausogut könnte man Blitz/Power/Free-Basic oder C++ / Pascal usw. verwenden.
    Zur Not die HLL-Entwicklung mit diesen Programmen durchführen, und den vom Compiler erstellten Code handoptimieren! Wobei DAS natürlich eine Möglichkeit wäre :D

    Das letztendliche Programm müsste dann sowieso als "Standalone" durch den Assembler gejagt werden!
    Mir geht es in erster Linie darum, möglichst viele Leute mit unterschiedlichsten Vorlieben einer Entwicklungsumgebung/Sprache zusammen EIN Programm erstellen zu lassen!
    Gerade die Erstellung prozeduraler Grafiken kann in VIELE kleinere Funktionen (Filter usw) aufgeteilt werden.
    Jede diese Funktionen könnte von jedem Mitglied des Teams verändert/optimiert werden, ohne dass die anderen in ihrer Arbeit eingeschränkt werden.
    So könnte derjenige, der gerade eine tolle Idee für "Nebel" hat, diese Funktion abändern/erweitern, mit seiner individuellen Umgebung bearbeiten und diese Funktion allen anderen zur Verfügung stellen.
    Alle Funktionen liegen online und werden einzeln geladen und vom fertigen Programm zusammengefügt und ausgeführt.
    Zur Not kann man natürlich auch AutoIt native für die Programmierung einer Funktion verwenden, dann dauert der Aufbau der Grafiken etwas länger ;)

    minx, stell doch mal bitte diese tolle Grafik (Sonnenuntergang) online, damit klar wird, wie ich mir das mit den "vielen Funktionen" so vorstelle^^. Ich denke, dieses Beispiel ist als AHA-Effekt geeignet..

  • StdoutRead Fehler

    • Andy
    • 27. April 2014 um 12:29

    Hi,
    StdoutRead funktioniert entgegen deiner Threadüberschrift einwandfrei!
    Auch dein Script funktioniert mit einigen von mir ausprobierten "Programmen" fehlerlos!

    Spoiler anzeigen
    [autoit]

    #include <Constants.au3>
    ;~ #include <MsgBoxConstants.au3>
    #include <Array.au3>
    Local $iPID = Run(@ComSpec & " /c sc query", "", @SW_SHOW, $STDOUT_CHILD)
    ProcessWaitClose($iPID)
    Local $sOutput = StdoutRead($iPID, 1)
    Local $aArray = StringSplit(StringTrimRight(StringStripCR($sOutput), StringLen(@CRLF)), @CRLF)
    _ArrayDisplay($aArray)

    [/autoit]


    Zitat

    und gibt mir dann die ersten 8 Zeilen des Streams aus aber eben nicht die folgenden die vom Programm erzeugt werden.

    welche Zeilen werden ausgegeben, welche nicht?
    Du hast weder gepostet, was du in deiner "Programm.exe" versteckst, noch welche Ausgaben von diesem Programm getätigt werden.
    Ich gehe also davon aus, dass wieder einmal halbseidene Software verwendet oder erstellt werden soll.

    Da bleibt wieder mal nur, einen Modcall bzgl. Threadclose abzusetzen wegen
    - unqualifizierter, weil nicht zutreffender Überschrift
    - absichtlichen Vorenthaltens explitit nötiger Informationen, welche zur Lösung des Problems unumgänglich sind
    - hoffentlich eintretendem Lerneffekt

  • Revision Demoparty 2014 Streams'n'Tools (und allgemeine Demoparty Diskussion)

    • Andy
    • 27. April 2014 um 11:27

    Hi,
    die Konzepte sind (soweit ich das beurteilen kann) durchaus fähig, eine Demo zu erstellen. Ich habe bei "Demo" aber maximal das 4K-Format im Auge.
    Das was definitiv fehlt, ist ein COMPILER!
    Und das nicht mal für sämtliche API-Funktionen, sondern lediglich für die Berechnungen.
    Denn das, was die Zeit kostet, ist der von mir auch bei der Entwicklung von AssembleIt()/OpenCL-Wrapper angepeilte "inner Loop". Was GDI(+)/OpenGL/Direct3D können, sollte man damit auch machen. AutoIt ist ideal, die "Umgebung" bereitzustellen, d.h. Darstellung der Fenster usw.
    Auch die Syntax ist simpel.
    Klar könnte man als Zwischenschritt die Berechnungs-Funktionen in Assembler/C(++)/FreeBasic-Dll´s auslagern, aber das ist, ehrlich gesagt, eine Krücke!
    Viel schöner wäre doch, wirklich EINFACHE Schleifen und Berechnungen im AutoIt-Code direkt in den Speicher zu compilieren und dort auszuführen, ein "Mini-Compiler" sozusagen. Aber das ist wohl etwas viel verlangt, aber was meint ihr?
    Wobei ein Compiler, welcher CPU-Code erzeugt, um Grafiken darzustellen, imho völlig daneben ist.... ;(

    Also doch OpenCL/GL in C++?

  • maleware warnung bei der neuen scite version

    • Andy
    • 26. April 2014 um 16:29

    Hi,

    Zitat

    ist das nur n fehlalarm meines scanner oder habt ihr auch diese meldung bekommen?

    Denk mal GENAU darüber nach, was du hier überhaupt fragst...
    Bzw. was du gedenkst, hier als Antwort zu erhalten.

    Mal zum Nachdenken:
    20 User sagen "Schaff dir nen ordentlichen Virenscanner an!"
    20 User sagen "Hab keinen Alarm bekommen"
    20 User sagen "Hab nen Alarm bekommen"
    20 User sagen "Scite braucht kein Mensch"
    20 User sagen "Auch wenn alle Virenscanner KEINEN Virus anzeigen, kann trotzdem ein Virus enthalten sein"

    Somit hast du 100 Antworten und ALLE haben Recht! Und nun? Hilft dir das nur ansatzweise bei deinem Problem weiter?
    Und wenn nicht, wieso startest du dann hier diesen Thread?
    Mit dem Hintergrund, dass die ca.3000 Ergebnisse bei google nach "scite4autoit virus" das Thema mehr als eindeutig beantworten!

  • Label nachträglich dynamisch hinzufügen

    • Andy
    • 26. April 2014 um 11:21

    Hi,

    in einer OnEvent-Umgebung könnte man @GUI_CtrlId als Index des Contol-Array´s nutzen.
    Rechtsklicks, Linksklicks und Doppelklicks fange ich bei vielen Controls in etwa so ab:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>

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

    $hGui = GUICreate("LabelClick", 400, 400)

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

    Opt("GUIOnEventMode", 1)
    GUISetOnEvent($GUI_EVENT_SECONDARYDOWN, "_ClickEvent");rechte Maustaste
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_ClickEvent");linke maustaste
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit") ;Fenster schließen

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

    Global $iTimer = TimerInit() ;für doppelklick
    Global $iDoubleClickSpeed = RegRead('HKCU\Control Panel\Mouse', 'DoubleClickSpeed');thx Oscar http://www.autoit.de/index.php?page…5316#post355316

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

    Dim $idlabel[100]
    For $i = 0 To 99
    $idLabel[$i] = GUICtrlCreateLabel(Chr($i + 35), Mod($i, 10) * 30 + 10, Int($i / 10) * 30 + 10, 20, 20)
    GUICtrlSetBkColor(-1, Random(0xF0f0F0, 0xFFFFFF, 1))
    Next

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

    GUISetState()

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

    While Sleep(100)
    WEnd

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

    Func _ClickEvent() ;Mausklicksklick abfangen
    $Taste = ""
    $pos = GUIGetCursorInfo($hGui)
    Switch @GUI_CtrlId
    Case $GUI_EVENT_PRIMARYDOWN ;linksklick
    If TimerDiff($iTimer) < $iDoubleClickSpeed Then
    $Taste = "!Doppelklick"
    $doubleclickflag = 0
    Else
    $Taste = "Linksklick"
    $doubleclickflag = 1
    EndIf
    $iTimer = TimerInit()

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

    Case $GUI_EVENT_SECONDARYDOWN ;rechtsklick
    $Taste = "Rechtsklick"
    EndSwitch

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

    ConsoleWrite($Taste & @CRLF & "Label Nummer=" & $pos[4] & @CRLF & "Inhalt=" & GUICtrlRead($pos[4]) & @CRLF)
    EndFunc ;==>_ClickEvent

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit]
  • Revision Demoparty 2014 Streams'n'Tools (und allgemeine Demoparty Diskussion)

    • Andy
    • 25. April 2014 um 20:21

    unkommentiert....http://hugi.scene.org/online/hugi35/…0was%20born.htm

  • Revision Demoparty 2014 Streams'n'Tools (und allgemeine Demoparty Diskussion)

    • Andy
    • 25. April 2014 um 18:06

    AutoIt wäre natürlich der Knaller :rock:
    Man müsste nur die Demo von der Idee her so gestalten, dass sie problemlos in AutoIt machbar wäre. Beispielsweise eine kleine Geschichte mit sich bewegenden/tanzenden Strichmännchen, die während der Demo eine sich im Hintergrund aufbauende prozedurale Landschaft kommentieren....ein "umpft umpft umpft-Sound" in einer Handvoll Bytes,der im Hintergrund dudelt, sollte dabei auch noch machbar sein.

  • Revision Demoparty 2014 Streams'n'Tools (und allgemeine Demoparty Diskussion)

    • Andy
    • 25. April 2014 um 17:43
    Zitat

    wobei es dafür auch noch ASM gibt, aber dann am besten gleich richtig).

    eben....da nämlich sowieso nur Shader bzw die GPU über deren Treiber bzw. Direct3D/OpenGL/CL programmiert werden, fällt eine "normale" Programmiersprache imho raus, da selbst für einfachste float-Berechnungen (sin, cos, sqrt usw.) nicht die nativen und schnellen CPU-Befehle benutzt werden, sondern die "sicheren" Bibliotheken.

    Und wenn einer sagt, _intrinsic-functions wäre die Lösung, ja dann muss ich lachen....eine "Hochsprache" zu verwenden, in der dann Prozessorbefehle gewrappert werden...DAS ist der echte Fortschritt!!! Die Frage bleibt, warum ich als Programmierer solche Krücken benutzen muss, und der Compiler das nicht von sich aus hinbekommt 8)
    Für 1K bis 4k ist Assembler imho eine sehr gute Wahl, darüber wird es dann wieder aufwändiger und spezielle Bibliotheken für "Hochsprachen" gibts ja mittlerweile auch schon 8o

  • Revision Demoparty 2014 Streams'n'Tools (und allgemeine Demoparty Diskussion)

    • Andy
    • 25. April 2014 um 10:10
    Zitat von YaeroxXO

    aber was ich noch nicht ganz verstanden habe, was macht man dort.

    Genau dasselbe, wie in einem Fussballstadion, einem Zirkus/Zoo, auf einer Rennstrecke, beim Skatturnier uswusf...
    All das hat absolut keinen sittlichen Nährwert! :D Trotzdem machen das Millionen Leute...

    Sinn ist, die Leistungsfähigkeit der Hardware zu DEMOnstrieren! Und da ist völlig egal, um welche Hardware es sich handelt! Hauptsache, man erstellt grafische/musikalische Effekte, die niemand diesen Geräten zugetraut hat(te).
    Wenn man vor 20 Jahren die von UEZ verlinkten VIDEOS gezeigt hätte, wäre niemand auf die Idee gekommen, dass das eben keine Videos, sondern in Echtzeit gerenderte Full-HD- Grafiken mit lediglich 64kB Code seien! Damals war man froh, mit einigen FPS die Grafiken eines Spiels mit 256 Farben in 640x480 Pixel darstellen zu können....
    Jedes einzelne Frame der heute in Millisekunden erzeugten Grafiken hätte damals genauso "prozedural" berechnet werden können, allerdings in Monaten!

    Die Zeit der Berechnung bzw. die "Rechenvorschrift/Formel" einer prozeduralen Grafik (hier, hier, oder auch hier (die mathematischen Hintergründe ( ! )) ist abhängig von der verwendeten Hardware. Und da muss man schauen, was man in Echtzeit ( ! ) aus dem jeweiligen Gerät herausbekommt.

  • Text finden und ersetzen

    • Andy
    • 25. April 2014 um 09:27

    Hi,

    [autoit]

    StringRegExp()

    [/autoit]

    wird dir weiterhelfen!
    Allerdings ist es aussichtslos, anhand deiner Beschreibung ein Muster und somit ein Suchpattern zu erstellen!
    Poste eine Testdatei und gib an, welche Daten gelöscht werden sollen, bzw. wie das Endergebnis auszusehen hat!

  • Revision Demoparty 2014 Streams'n'Tools (und allgemeine Demoparty Diskussion)

    • Andy
    • 25. April 2014 um 00:49
    Zitat

    Vielleicht lässt sich ja auch mal die eine oder andere Demo aufstellen, gemeinsam!

    Meine Rede^^
    Aus dem Bauch raus würde ich sagen, eine gute Idee wird vom Publikum stärker honoriert als die technische Umsetzung, Chance für frischen Wind, hehe 8o

    Zitat

    und auch nur wenige der 4k/8k (8k ist ne MENGE Platz) konnten überzeugen.

    Von 8K war ich auch enttäuscht, nicht von den technischen Möglichkeiten, sondern von den Ideen.
    Übrigens wurde imho in diesem Jahr SEHR vielmehr auf Sound Wert gelegt wie sonst, da hab ich allerdings keinerlei Plan von.....
    Aber einige haben doch gezeigt, wo der Hammer hängt! Kein Wunder, alles "alte Hasen" :rock:

  • Steganografie mit ASM und AutoIt

    • Andy
    • 23. April 2014 um 09:53

    Hi,
    es geht natürlich NOCH kürzer/schneller, aber wen juckt das... 8o

    Anbei Kodierer/Dekodierer (der Dekodierer besteht aus 25 BYTES Code :thumbup: )

    Spoiler anzeigen
    [autoit]

    #include <assembleit.au3>
    #include <GDIPlus.au3>

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

    ; Variablen
    Local $Locked, $Scan0, $hImage
    Local $iWidth, $iHeight

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

    ; GDIPlus lädt das Bild
    _GDIPlus_Startup()
    $hImage = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\desert.jpg") ;"\test.bmp")
    $iWidth = _GDIPlus_ImageGetWidth($hImage)
    $iHeight = _GDIPlus_ImageGetHeight($hImage)

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

    ; An die Pixeldaten gelangen
    $Locked = _GDIPlus_BitmapLockBits($hImage, 0, 0, $iWidth, $iHeight, $GDIP_ILMWRITE, $GDIP_PXF32ARGB)
    $Scan0 = DllStructGetData($Locked, "Scan0")

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

    $sString = "Hallo 123 AutoIt :o) !"
    $StructPic = DllStructCreate("byte[" & StringLen($sString) + 1 & "]") ; DLL-Struct für den String erstellen (für jeden Pixel ein Byte) und ein int für die Länge der Datei
    $bBinary = StringToBinary($sString) ; String, der versteckt werden soll
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $bBinary = ' & $bBinary & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    DllStructSetData($StructPic, 1, $bBinary) ; DLL-Struct füllen (Binäre Nachricht)

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

    ; ASM-Code auführen
    $_ASSEMBLEIT_FLAG = 1
    $return = _assembleit("int", "HideTextInPic", "ptr", $Scan0, "ptr", DllStructGetPtr($StructPic))

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

    ; Neues Bild speichern
    _GDIPlus_BitmapUnlockBits($hImage, $Locked)
    _GDIPlus_ImageSaveToFile($hImage, @ScriptDir & "\output.bmp")
    _GDIPlus_BitmapDispose($hImage)

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

    ;auslesen und dekodieren
    $hImage = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\output.bmp") ;"\test.bmp")
    $iWidth = _GDIPlus_ImageGetWidth($hImage)
    $iHeight = _GDIPlus_ImageGetHeight($hImage)

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

    ; An die Pixeldaten gelangen
    $Locked = _GDIPlus_BitmapLockBits($hImage, 0, 0, $iWidth, $iHeight, $GDIP_ILMWRITE, $GDIP_PXF32ARGB)
    $Scan0 = DllStructGetData($Locked, "Scan0")

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

    $struct_text = DllStructCreate("char[" & $iWidth * $iHeight & "]") ;struct, in die der Text geschrieben wird

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

    $return = _assembleit("int", "ShowTextInPic", "ptr", $Scan0, "ptr", DllStructGetPtr($struct_text))

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

    $text = DllStructGetData($struct_text, 1)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $text = ' & $text & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

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

    _GDIPlus_BitmapDispose($hImage)
    _GDIPlus_Shutdown()

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

    Func ShowTextInPic() ;25 Byte :o)

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

    _("use32")
    _("mov esi, [esp+4]") ; Pointer-Position für die Pixeldaten in edi speichern
    _("mov edi, [esp+8]") ; EDI = pointer auf den String
    _("Pixel:") ; Beginn der Schleife für jeden Pixel
    _("lodsd") ; EAX = dword[ESI] = Pixel , ESI=ESI+4 (binär EAX: -------- -----RRR -----GGG ------BB)
    _("shl al,6") ;(binär EAX: -------- -----RRR -----GGG BB------) nur lowbyte shiften bits zu einem byte zusammenschieben
    _("shl ax, 5") ;(binär EAX: -------- -----RRR GGGBB--- --------)
    _("shr eax, 11") ;(binär EAX: -------- -------- -------- RRRGGGBB)
    _("stosb") ; text nach [EDI] , edi=edi+1
    _("cmp al,0") ;Ende erreicht?
    _("jne Pixel")
    _("ret")

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

    EndFunc ;==>ShowTextInPic

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

    Func HideTextInPic()

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

    #cs

    Kommentar zur Funktionsweise:

    - es werden die letzten drei Bits vom Rot- und Grün-Wert eines jeden Pixels, sowie zwei Bit vom Blau-Wert durch
    insgesamt 8 Bit (ein Byte) des Geheimtextes ersetzt (bei Blau nur 2 Bit, damit man auf 1 Byte kommt)

    #ce

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

    _("use32")
    _("mov edi, [esp+4]") ; Pointer-Position für die Pixeldaten in edi speichern
    _("mov esi, [esp+8]") ; esi = ptr String

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

    _("Pixel:") ; Beginn der Schleife für jeden Pixel
    _("movzx edx, byte[esi]") ; edx ist das erste Byte des Strings, wird nur 1x aus dem Speicher gelesen
    _("mov bl,dl") ;byte zwischenspeichern, später test, ob stringende
    ;(binär EDX: 00000000 00000000 000000000 RRRGGGBB)
    _("shl edx, 11") ;(binär EDX: 00000000 00000RRR GGGBBB000 00000000) komlett nach links schieben
    _("shr dx, 5") ;(binär EDX: 00000000 00000RRR 00000GGG BB000000) nur DX shiften
    _("shr dl, 6") ;(binär EDX: 00000000 00000RRR 00000GGG 00000BB) nur lowbyte shiften

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

    _("mov eax, dword [edi]") ; Farbe des Pixels (= Wert an edi-Position) in edx Form: #AARRGGBB
    _("and eax, 0xFFF8F8FC") ; Pixelfarbe mit 11111111 11111000 11111000 11111100 verknüpfen -> die Bits, die überschrieben werden auf 0 setzen
    _("or eax, edx") ; und mit den neuen Daten per OR verknüpfen

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

    _("stosd") ;ersetzt _("mov [edi], eax") und add edi,4 ; Farbwert in der Bitmap speichern

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

    _("add esi, 1") ; ebx um 1 Byte erhöhen (es wird pro Pixel 1 Byte Text versteckt)
    _("cmp bl,0") ;Ende erreicht?
    _("jne Pixel")

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

    _("ret")

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

    EndFunc ;==>HideTextInPic

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

    AssembleIt braucht man natürlich nicht mehr, wenn man per $_ASSEMBLEIT_FLAG = 0 assembliert und den Code direkt ausführt.
    Dann sieht das so aus...

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>

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

    ; Variablen
    Local $Locked, $Scan0, $hImage
    Local $iWidth, $iHeight

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

    ; GDIPlus lädt das Bild
    _GDIPlus_Startup()
    $hImage = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\desert.jpg") ;"\test.bmp")
    $iWidth = _GDIPlus_ImageGetWidth($hImage)
    $iHeight = _GDIPlus_ImageGetHeight($hImage)

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

    ; An die Pixeldaten gelangen
    $Locked = _GDIPlus_BitmapLockBits($hImage, 0, 0, $iWidth, $iHeight, $GDIP_ILMWRITE, $GDIP_PXF32ARGB)
    $Scan0 = DllStructGetData($Locked, "Scan0")

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

    $sString = "Hallo 123 AutoIt :o) !" ;der zu versteckende String

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

    $StructPic = DllStructCreate("byte[" & StringLen($sString) + 1 & "]") ; DLL-Struct für den String erstellen (für jeden Pixel ein Byte) und ein int für die Länge der Datei
    $bBinary = StringToBinary($sString) ; String, der versteckt werden soll
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $bBinary = ' & $bBinary & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    DllStructSetData($StructPic, 1, $bBinary) ; DLL-Struct füllen (Binäre Nachricht)

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

    ; ASM-Code auführen, kodieren
    Global $tCodeBuffer = DllStructCreate("byte[42]") ;reserve Memory for opcodes
    DllStructSetData($tCodeBuffer, 1, "0x8B7C24048B7424080FB61688D3C1E20B66C1EA05C0EA068B0725FCF8F8FF09D0AB83C60180FB0075DFC3") ;write opcodes into memory
    $ret = DllCall("user32.dll", "int", "CallWindowProcW", "ptr", DllStructGetPtr($tCodeBuffer), "ptr", $Scan0, "ptr", DllStructGetPtr($StructPic), "int", 0, "int", 0)

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

    ; Neues Bild speichern
    _GDIPlus_BitmapUnlockBits($hImage, $Locked)
    _GDIPlus_ImageSaveToFile($hImage, @ScriptDir & "\output.bmp")
    _GDIPlus_BitmapDispose($hImage)

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

    ;auslesen und dekodieren
    $hImage = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\output.bmp") ;"\test.bmp")
    $iWidth = _GDIPlus_ImageGetWidth($hImage)
    $iHeight = _GDIPlus_ImageGetHeight($hImage)

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

    ; An die Pixeldaten gelangen
    $Locked = _GDIPlus_BitmapLockBits($hImage, 0, 0, $iWidth, $iHeight, $GDIP_ILMWRITE, $GDIP_PXF32ARGB)
    $Scan0 = DllStructGetData($Locked, "Scan0")

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

    $struct_text = DllStructCreate("char[" & $iWidth * $iHeight & "]") ;struct, in die der Text geschrieben wird

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

    ;dekoder
    Global $tCodeBuffer = DllStructCreate("byte[25]") ;reserve Memory for opcodes
    DllStructSetData($tCodeBuffer, 1, "0x8B7424048B7C2408ADC0E00666C1E005C1E80BAA3C0075F0C3") ;write opcodes into memory
    $ret = DllCall("user32.dll", "int", "CallWindowProcW", "ptr", DllStructGetPtr($tCodeBuffer), "ptr", $Scan0, "ptr", DllStructGetPtr($struct_text), "int", 0, "int", 0)

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

    $text = DllStructGetData($struct_text, 1) ;text auslesen
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $text = ' & $text & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

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

    _GDIPlus_BitmapDispose($hImage)
    _GDIPlus_Shutdown()

    [/autoit]

    Errorhandling sollte man tunlichst hinzufügen, denn wenn der Text länger ist, als das Bild Pixel hat, gibts nen Crash^^
    Aber das kann jeder selbst zusammenpfriemeln ;)

    Es bleibt natürlich offen, die Textbits statt -------- -----RRR -----GGG ------BB bspw. als -------- ------RR -----RGG -----GBB abzuspeichern, oder nur in jedem 5. Pixel. Oder nur 1 Bit in jedem 7. Pixel...
    Sehr einfach in ASM zu realisieren ist das tauschen der Bits, das käme noch einer internen Verschlüsselung gleich, also aus -------- ------RR -----RGG -----GBB würde dann bspw. -------- ------RB -----GRG -----BRG
    Der Phantasie sind keine Grenzen gesetzt!

    Zur Not kann man die Bilder auch als PNG speichern, dann sind sie etwas kleiner, aber immer noch verlustfrei komprimiert ;) Oder man verwendet libjpeg um verlustfrei in jpg zu transformieren.
    Btw. wird mit ca. 500MB/Sekunde kodiert/dekodiert! Was bedeutet, dass 500KB Text in einer Millisekunde in einem Bild verschlüsselt/entschlüsselt werden! Das entspricht ca. 6 Prozessortakten pro verschlüsseltem Buchstaben!

    Wer mag, kann natürlich auch binäre Dateien "verstecken", ich würde dann einfach einen Integer mit der Länge der Daten in die ersten 4 Pixel packen, und so lange kodieren/dekodieren, bis dieser Wert erreicht ist! Oder direkt Base64 verwenden...

    In diesem kleinen Kerl steckt übrigens auch ein Text -> Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    Beschränkt man sich auf Bitmap-Dateien (*.BMP), kann man sogar komplett auf GDI(+) verzichten und direkt in die "Pixel"-Daten schreiben.
    Das wäre extrem leicht in jeder anderen Computersprache (und jedem anderen Gerät) umzusetzen!

    Bilder

    • wOOt.png
      • 1 kB
      • 17 × 17
  • Revision Demoparty 2014 Streams'n'Tools (und allgemeine Demoparty Diskussion)

    • Andy
    • 22. April 2014 um 11:08

    Den "Aufkleber" hatte ich, infolge mangelden Druckers, von Hand auf der Fahrt nach Saarbrücken gekritzelt.
    Davon ausgehend, dass das Schild auf dem Bauzaun eine "normale" Größe hat, dachte ich, die Breite einer DIN A4-Seite sei ausreichend....
    Vor Ort angekommen hat UEZ die Security abgelenkt und ich den Zettel auf dem RIESENGROSSEN Schild (ca. 50x20cm) plaziert :rolleyes:
    Leider war der Stream meistens offline...

    Trotz allem wars klasse! Kaffee gabs in SEHR guter Qualität in beliebiger Menge umsonst, Futter und Getränke zu SEHR gemäßigten Preisen und die Stimmung war (auch bei Massen von angetüdelten Nordländern :D ) entspannt.
    Das was als "Musik" bezeichnet wurde (eigentlich gabs nur BASSSSSS) , kam in voller Lautstärke auf die Ohren, Gehörschutz in Form von den (guten) Einweg-Ohrstöpseln gabs kostenlos dazu^^
    Von Neugeborenen über (grösstenteils mit Gehörschutz ausgestatteteten) kleine Kindern war das Publikum (auch erstaunlicherweise ca. 10% davon Mädels) in allen Altersklassen (auch >60 ) vertreten :rock: )

    Letztendlich bleibt als Fazit:
    Es müssen mehr Leute von uns zusammen dorthin, mindestens 2 Tage, und natürlich Rechnerequipment als MUSS!
    Und T-Shirts mit AutoIt-Logo natürlich :thumbup:

  • Steganografie mit ASM und AutoIt

    • Andy
    • 22. April 2014 um 08:45

    Seeehr schick^^
    Dein Code ist jetzt kürzer, es geht aber noch wesentlich einfacher. Du musst nicht immer das Byte aus dem Speicher laden, mit den Schiebebefehlen kannst du einfach die RRR GGG BB trennen...

    [autoit]

    _("Pixel:") ; Beginn der Schleife für jeden Pixel

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

    _("movzx edx, byte[esi]") ; edx ist das erste Byte des Binärstrings, wird nur 1x aus dem Speicher gelesen
    ;(binär EDX: 00000000 00000000 000000000 RRRGGGBB)
    _("shl edx, 11") ;(binär EDX: 00000000 00000RRR GGGBBB000 00000000) komlett nach links schieben
    _("shr dx, 5") ;(binär EDX: 00000000 00000RRR 00000GGG BB000000) nur DX shiften
    _("shr dl, 6") ;(binär EDX: 00000000 00000RRR 00000GGG 00000BB) nur lowbyte shiften

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

    _("mov eax, dword [edi]") ; Farbe des Pixels (= Wert an edi-Position) in eax Form: #AARRGGBB
    _("and eax, 0xFFF8F8FC") ; Pixelfarbe mit 11111111 11111000 11111000 11111100 verknüpfen -> die Bits, die überschrieben werden auf 0 setzen
    _("or eax, edx") ; und mit den neuen Daten per OR verknüpfen
    _("mov [edi], eax") ; Farbwert in der Bitmap speichern

    [/autoit]


    Genauso kannst du natürlich auch beim "Auslesen" die Bits zusammenfassen....
    -------- -----RRR -----GGG ------BB
    low-byte 6 nach links shiften
    -------- -----RRR -----GGG BB-----
    high- und lowbyte zusammen (AX,BX, usw) 5 nach links
    -------- -----RRR GGGBB--- --------
    alles 11 nach rechts
    -------- -------- -------- RRRGGGBB
    voila :D


    Insgesamt könnte man noch einige Zeilen sparen, aber so ist es lesbarer :thumbup:

    Weiterhin läuft dein Programm nun alle Pixel der gesamten Grafik durch, du könntest beim Ende des Strings abbrechen!
    Die Struct, in der dein zu verbergender String steckt, müsste nur ein Byte (= NULL) größer sein als der String.

    Auch beim Aufrufen per Call reicht es, wenn du die Adresse des Bildes und die Adresse des Strings übergibst! Abbruchbedingung ist das Nullbyte am Ende des Strings!
    Die Abfrage, ob der String größer als die Anzahl der Pixel des Bildes ist, würde ich in eine Zeile AutoIt packen^^


    Zitat

    Also ich habe auch Win7/64 Bit und die Version 3.3.10.2, aber zumindest folgendes Debug-Beispiel von dir funktioniert bei mir:

    Natürlich funktioniert bei mir der Debugger auch, man sollte seine eigenen Programme auch bedienen können... :rolleyes:

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™