Assembler Hilfe-Thread

  • Spoiler anzeigen
    [autoit]

    #include "FASM.au3"
    #include <Array.au3>
    $Fasm = FasmInit()
    FasmReset($Fasm)

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

    Fa("use32")
    Fa("org " & FasmGetBasePtr($Fasm)) ;<-----------startadresse des Programms im speicher ,Basisadresse
    fa("mov ebx,1")
    fa("mov [array+ebx*4],2") ;array ist nur der "Abstand" bis zur Basisadresse, also hier ca. 30

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

    fa("mov eax,[array+ebx*4]") ;der assembler macht aus array ---> Basisadresse+30

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

    fa("ret ")

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

    fa("array dd 1 dup(3)") ; hier ist das 30. Byte im Programm, also ist array=30

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

    ConsoleWrite(String(FasmGetBinary($Fasm)) & @CRLF)
    $a = MemoryFuncCall("int", FasmGetFuncPtr($Fasm))
    _ArrayDisplay($a)

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

    Func fa($str) ; Nur für die bequemlichkeit ^^
    FasmAdd($Fasm, $str)
    EndFunc ;==>fa

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

    FasmExit($Fasm)

    [/autoit]
  • @sprenger, wg deinem comfile....guck mal nach, was der INT 20 macht nach dem 1. INT21 :thumbup:

  • Hi, habs gerade gemerkt, der Handle hbmp der _CreateNewBitmap32() ist offensichtlich nicht zu benutzen, ich weiss, dass ich die Funktion ziemlich gekürzt hatte, scheinbar war einiges, was ich rausgeschmissen hatte, doch nicht so überflüssig^^
    Bis auf weiters kann man mit GDI+-DRAW-Befehlen so auf die mit _CreateNewBitmap32() erzeugten Bitmaps zugreifen:

    [autoit]

    local $hbmp_buffer,$ptr_buffer
    $hdc_buffer=_CreateNewBmp32($w, $h,$ptr_buffer, $hbmp_buffer)
    $hGraphic_w = _GDIPlus_GraphicsCreateFromHDC($hdc_buffer)
    _GDIPlus_GraphicsDrawline($hGraphic_w, 10, 10,400,200,$hpen)

    [/autoit]


    Hab Anzeigefunktion geändert ejtzt klappts perfekt :)

    Spoiler anzeigen
    [autoit]


    Func _DCShow($dc,$titel="",$w=-1,$h=-1)
    Local $gui=GUICreate($titel,$w,$h,Default,Default,BitOR(0x00C00000,0x00080000)) ;bitor($WS_CAPTION,$WS_SYSMENU)
    Local $hdc=_WinAPI_GetDC($gui)
    GUISetState(@SW_SHOW,$gui)
    While GUIGetMsg()<>-3 ;$GUI_EVENT_CLOSE
    _winapi_bitblt($hdc,0,0,$w,$h,$dc,0,0,$srccopy)
    Sleep(10)
    WEnd
    GUIDelete($gui)
    Return 1
    EndFunc

    [/autoit]


    Und der neue Aufruf natürlich:

    Spoiler anzeigen
    [autoit]

    _DCShow($dc,"Bild",$w,$h)

    [/autoit]

    Einmal editiert, zuletzt von TheShadowAE (24. August 2010 um 17:48)

  • Ah danke.
    Wenn ich das so verstehe ist dx ein Register für Consolenausgabe. int 21h gibt die ganze sache aus aber was macht mov ah, 09h ??

    Wenn ich das beim ersten mal auskommentiere dann funzt die ganze sache nicht mehr. Wenn ich nur das 2te auskommeniere dann kommt ne Warnung das Laufwerk A nicht gelesen werden kann *gg*

  • AAAAlso, in urseligen DOS-Zeiten bestand das Betriebssystem nur aus einer Handvoll Dateien.
    Das was heutzutage über die WINAPI und Dll´s abgewickelt wird, hat man früher mit den sogenannten Interrupts gemacht. Das war nichts weiter als ein Funktionsaufruf (Interrupt, weil man definiert laufende Programme unterbrechen konnte) welcher alle möglichen Dinge ausführen konnte. Eine der "berühmtesten" ist der INT21h, der sich mit der gesamten Ein- und Ausgabe von Daten (also auch Dateien) befasst. DIESE SEITE sollte genügend informationen liefern^^
    Im AX-Register wird dabei die Funktion(snummer) übergeben, bei INT21h ist AX=09h für "Daten ausgeben" zuständig. In den anderen Registern werden die Eingabeparameter eingetragen und die Register enthalten nach dem "Interrupt" dann die entsprechenden von der Funktion zurückgegebenen Daten. Daher ist es IMMENS wichtig, sorgfältig die entsprechenden Register zu beschreiben, ansonsten kann das ganz schön in die Hose gehen! Die "Mausschubser" von heute würden nicht schlecht gucken, wenn nach einem "verunglückten" INT21 mit falschen Eingabedaten plötzlich die Festplatte nicht mehr richtig lesbar wäre...oder Dateien fehlen oder alles voller Dateien ist die keiner haben wollte^^.
    Den Schnickschnack mit Fensterchen und "Wollen Sie bestimmt die FAT überschreiben bzw die Festplatte formatieren? Ja Nein WeisNicht" gibts erst seit Windows...
    Also aufpassen!
    Und manch einer hat schon gekotzt, nur weil er das "h" (hexadezimal) hinter einer Ziffer vergessen hatte und so statt Daten zu lesen, Datei(en) löschen ausführte 60<>60h :rofl: , aber das lernt man dann SEHR schnell^^

  • Ich hab mal kurz eine Frage:
    Ich hab jetzt eine Funktion erstellt um den Alphakanal mit einem Wert zu beschreiben (GDI+ Bitmaps), mit dem Format $GDIP_PXF32ARGB klappt das mit $GDIP_PXF32RGB wird überall steganographisch der Buchstabe von Alpha hereingeschrieben.
    Natürlich könnte man auch eine ganze Farbe dort reinschreiben. Aber nun zu meiner Frage:
    BitmapLockBits brauch ich für diese Funktion, leider klappt das nicht bei Images. Gibt es irgendetwas wie man bei Images auch die Daten herausfinden kann, dass man es genauso verändern kann? Ich hab nämlich meistens keine Bitmaps, sondern geladene Images (z.B. png)

    Mein Skript:

    Spoiler anzeigen
    [autoit]


    #include "FASM.au3"
    #include <Array.au3>
    #include <Winapi.au3>
    #include <GDIConstants.au3>
    #include <GDIPlus.au3>
    Opt("MustDeclareVars", 1)

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

    ; Initial a fasm object
    Global $Fasm = FasmInit()

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

    ;##########################
    F6()
    ;##########################
    ;FasmCompile($Fasm)

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

    ; Release the asm object
    FasmExit($Fasm)
    Exit

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

    Func F6() ;_TBmpFromBmp
    _new()
    ;
    FasmAdd($Fasm, "mov al,[esp+4]");Parameter auslesen und jeweils in zugehörigen Speicher schieben
    FasmAdd($Fasm, "mov [alpha],al");
    FasmAdd($Fasm, "mov eax,[esp+8]");
    FasmAdd($Fasm, "mov [stride],eax");
    FasmAdd($Fasm, "mov eax,[esp+12]");
    FasmAdd($Fasm, "dec eax");Muss eins weniger sein, weil es bei der Schleife bis 0 geht (wäre nicht nullbasiert)
    FasmAdd($Fasm, "mov [w],eax");
    FasmAdd($Fasm, "mov eax,[esp+16]");
    FasmAdd($Fasm, "dec eax");Muss eins weniger sein, weil es bei der Schleife bis 0 geht (wäre nicht nullbasiert)
    FasmAdd($Fasm, "mov [h],eax");
    FasmAdd($Fasm, "mov eax,[esp+20]");
    FasmAdd($Fasm, "mov [scan],eax");

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

    FasmAdd($Fasm, "mov edx,[h]");Schleifenzähler edx für y, For $edx=$h to 0 Step -1
    FasmAdd($Fasm, "for_y:");Schleifenlabel
    FasmAdd($Fasm, "mov ecx,[w]");Schleifenzähler ecx für x
    FasmAdd($Fasm, "for_x:");Schleifenlabel

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

    FasmAdd($Fasm, "mov ebx,[scan]");Basisadresse der Bitmapdaten in ebx schreiben
    FasmAdd($Fasm, "mov eax,edx");Schleifenzähler edx nach eax kopieren
    FasmAdd($Fasm, "imul eax,[stride]");Zähler mal Offset der Reihen rechnen
    FasmAdd($Fasm, "add ebx,eax");Pointer mit eax höher setzen
    FasmAdd($Fasm, "mov eax,ecx");nächsten Zähler kopieren
    FasmAdd($Fasm, "imul eax,4");mal 4 rechnen (4 bytes pro pixel)
    FasmAdd($Fasm, "add ebx,eax");und wieder den Pointer höher setzen
    FasmAdd($Fasm, "mov al,[alpha]");al (1 byte) mit alpha beschreiben
    FasmAdd($Fasm, "mov byte[ebx+3],al");und den letzten byte von ebx mit alpha beschreiben BBGGRR[AA]

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

    FasmAdd($Fasm, "dec ecx");Zähler dekrementieren
    FasmAdd($Fasm, "jnz for_x");Wenn Zähler <> 0 dann wiederhole Schleife
    FasmAdd($Fasm, "dec edx");Zähler dekrementieren
    FasmAdd($Fasm, "jnz for_y");Wenn Zähler <> 0 dann wiederhole Schleife

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

    FasmAdd($Fasm, "ret 20");Ende, Rückgabewert ist der letzte Wert des ERSTEN! Pixels (Scheife geht Rückwärts)

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

    FasmAdd($Fasm, "alpha db 0");Speicher für Parameter reservieren
    FasmAdd($Fasm, "scan dd 0");
    FasmAdd($Fasm, "stride dd 0");
    FasmAdd($Fasm, "w dd 0");
    FasmAdd($Fasm, "h dd 0");
    ;
    FasmCompile($Fasm)
    If @Error Then
    Local $Error = FasmGetLastError()
    ConsoleWrite("Error Code: " & $Error[$FASMERRINDEX_CODE] & @CRLF)
    ConsoleWrite("Error Message: " & $Error[$FASMERRINDEX_MESSAGE] & @CRLF)
    ConsoleWrite("Error LineNumber: " & $Error[$FASMERRINDEX_LINENUMBER] & @CRLF)
    ConsoleWrite("Error Line: " & $Error[$FASMERRINDEX_LINE] & @CRLF)
    Else
    ConsoleWrite(String(FasmGetBinary($Fasm)) & @CRLF)
    EndIf
    Local $bmp,$lock,$x=100,$y=100,$w=100,$h=100,$alpha=128
    _GDIPlus_Startup()
    $bmp=_GDIPlus_BitmapCreateFromFile("D:\Downloads\zlol.bmp")
    $w=_GDIPlus_ImageGetWidth($bmp)-$x
    $h=_GDIPlus_ImageGetHeight($bmp)-$y
    $lock=_GDIPlus_BitmapLockBits($bmp,$x,$y,$w,$h,BitOR($GDIP_ILMREAD, $GDIP_ILMWRITE),$GDIP_PXF32ARGB)
    Local $Stride = DllStructGetData($lock, "Stride") ; Stride ist der Offset von einer Reihe zur nächsten
    Local $Width = DllStructGetData($lock, "Width") ; Anzahl der Spalten
    Local $Height = DllStructGetData($lock, "Height") ; Anzahl der Reihen
    Local $Scan0 = DllStructGetData($lock, "Scan0") ; Die Bilddaten im Speicher
    Local $timer=TimerInit()
    Local $ret = MemoryFuncCall("int", FasmGetFuncPtr($Fasm), "byte", $alpha, "int", $Stride, "int", $Width, "int", $Height, "ptr", $Scan0)
    Local $diff=TimerDiff($timer)
    _GDIPlus_BitmapUnlockBits($bmp,$lock)
    MsgBox(0,"",$diff)
    _ImageShow($bmp)
    _GDIPlus_BitmapDispose($bmp)
    _GDIPlus_Shutdown()
    EndFunc

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

    Func _new()
    FasmReset($Fasm)
    FasmAdd($Fasm, "use32")
    FasmAdd($Fasm, "org "&FasmGetBasePtr($Fasm))
    EndFunc

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

    Func _ImageShow($img,$titel="",$x=-1,$y=-1)
    If $img=0 Then Return -1
    Local $wx,$wy
    If $x=-1 or $x>@DesktopWidth-50 Then
    $x=_GDIPlus_ImageGetWidth($img)
    if $x>@DesktopWidth-50 Then $x=@DesktopWidth-50
    EndIf
    If $y=-1 or $y>@DesktopWidth-50 Then
    $y=_GDIPlus_ImageGetHeight($img)
    if $y>@DesktopWidth-50 Then $y=@DesktopWidth-50
    EndIf
    $wx=$x
    $wy=$y
    Local $gui=GUICreate($titel,$x,$y,Default,Default,BitOR(0x00C00000,0x00080000)) ;bitor($WS_CAPTION,$WS_SYSMENU)
    GUISetState(@SW_SHOW,$gui)
    Local $gra=_GDIPlus_GraphicsCreateFromHWND($gui)
    Local $buffer=_GDIPlus_BitmapCreateFromGraphics($wx,$wy,$gra)
    Local $backgra=_GDIPlus_ImageGetGraphicsContext($buffer)
    _GDIPlus_GraphicsSetSmoothingMode($backgra,2)
    _GDIPlus_GraphicsClear($backgra)
    _GDIPlus_GraphicsDrawImageRect($backgra,$img,0,0,$wx,$wy)
    While GUIGetMsg()<>-3 ;$GUI_EVENT_CLOSE
    _WinAPI_RedrawWindow($gui, "", "", 1280) ;$RDW_UPDATENOW + $RDW_FRAME
    _GDIPlus_GraphicsDrawImageRect($gra,$buffer,0,0,$wx,$wy)
    Sleep(10)
    WEnd
    _GDIPlus_GraphicsDispose($backgra)
    _GDIPlus_BitmapDispose($buffer)
    _GDIPlus_GraphicsDispose($gra)
    GUIDelete($gui)
    Return 1
    EndFunc

    [/autoit]
  • probier das mal aus,

    Spoiler anzeigen
    [autoit]

    Func getDCfromfile($bmpfile, ByRef $ptr) ;ptr to bitmapdata, it is possible to manipulate one pixel if needed
    $hbitmap = _GDIPlus_BitmapCreateFromFile($bmpfile)
    $hbmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hbitmap)
    $iwidth = _GDIPlus_ImageGetWidth($hbitmap)
    $iheight = _GDIPlus_ImageGetHeight($hbitmap)

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

    $tBMI = DllStructCreate($tagBITMAPINFO)
    DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4)
    DllStructSetData($tBMI, "Width", $iwidth)
    DllStructSetData($tBMI, "Height", -$iheight)
    DllStructSetData($tBMI, "Planes", 1)
    DllStructSetData($tBMI, "BitCount", $iBitCount)
    $hdc = _WinAPI_GetDC(0)
    $hcdc = _WinAPI_CreateCompatibleDC($hdc)
    $adib = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'ptr', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', 1, 'ptr*', 0, 'ptr', 0, 'uint', 0)

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

    ; select object
    _WinAPI_SelectObject($hcdc, $adib[0])

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

    ; copy the content of the bitmap into the buffer ...
    _WinAPI_GetDIBits($hdc, $hbmp, 0, $iheight, $adib[4], DllStructGetPtr($tBMI), 1)

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

    ; create the a dllstruct with the pointer $aDIB[4]
    $stride = 3 * $iwidth + Mod($iwidth, 4) ;number of bytes in one line (filled with some bytes, because it must be a multiple of four!)
    $tBits = DllStructCreate('byte[' & $stride * $iheight & ']', $adib[4])
    $ptr = DllStructGetPtr($tBits)
    _GDIPlus_BitmapDispose($hbitmap)
    _WinAPI_DeleteObject($adib[0])
    Return $hcdc ;MemoryDC of bitmap
    EndFunc ;==>getDCfromfile

    [/autoit]

    damit hast du den dc der grafik und natürlich auch den pointer

    wenn du schon ein img z.b. in einer GUI gezeichnet hast, dann kannst du den DC der GUI nehmen und in deinen Puffer blitten, dort dann ändern und wieder zurückblitten

  • Na was willst du denn ausgeben?
    Zzt hast du Glück, da der INHALT von an der Adresse von EAX irgendetwas ist, ziemlich wahrscheinlich sogar dort "nichts" im Speicher steht...
    Ausserdem werden Strings mit $ abgeschlossen!

    Code
    unser_text db "Hallo", "$"

    so wie in deinem Post#20 ist es richtig^^

    Um INTEGER in einen STRING umzuwandeln gibts reichlich Funktionen, eine hab ich mal im Primzahlenprogramm verwendet...
    Wenn du aber sowieso FASM benutzt, dann kannst du auch die Bibliotheken einbinden, das ist das einfachste!

    Spoiler anzeigen
    [autoit]

    Dim $Fasm = FasmInit()
    FasmReset($Fasm)
    FasmAdd($Fasm, "use32")
    FasmAdd($Fasm, "org " & FasmGetBasePtr($Fasm))
    FasmAdd($Fasm, " mov ebx,[esp+4] ");integer
    FasmAdd($Fasm, " mov edi,puffer ");pointer auf die struct
    ;aus einem integer einen string machen
    FasmAdd($Fasm, " push ebx ");alle benötigten Register sichern
    FasmAdd($Fasm, " push ecx ");alle benötigten Register sichern

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

    FasmAdd($Fasm, " mov eax, ebx ");Zahl laden
    FasmAdd($Fasm, " mov ebx, 10 "); Divisor
    FasmAdd($Fasm, " xor ecx, ecx ");ECX=0 (Anzahl der Ziffern)
    FasmAdd($Fasm, "Schleife_1: ")
    FasmAdd($Fasm, "xor edx, edx ")
    FasmAdd($Fasm, "div ebx "); EDX:EAX / EBX = EAX Rest EDX
    FasmAdd($Fasm, "push dx "); LIFO
    FasmAdd($Fasm, "add cl,1 "); ADD soll schneller sein als INC
    FasmAdd($Fasm, "or eax, eax "); AX = 0?
    FasmAdd($Fasm, "jnz Schleife_1 "); nein: nochmal
    FasmAdd($Fasm, "Schleife_2:")
    FasmAdd($Fasm, "pop ax "); gepushte Ziffern zurückholen
    FasmAdd($Fasm, "or al, 00110000b "); Umwandlung in ASCII
    FasmAdd($Fasm, "stosb "); Nur AL nach [EDI] (EDI ist ein Zeiger auf den String)
    FasmAdd($Fasm, "loop Schleife_2 "); bis keine Ziffern mehr da sind
    FasmAdd($Fasm, "mov byte [edi],0Dh ");CR CarriageReturn, man könnte auch ein Komma (ascii=2C) einsetzen
    FasmAdd($Fasm, "add edi,1 ");ein Byte weiter

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

    FasmAdd($Fasm, " pop ecx ");Register wiederherstellen
    FasmAdd($Fasm, " pop ebx ");Register wiederherstellen
    ;ende integer2string
    ; FasmAdd($Fasm, "mov eax,0")
    FasmAdd($Fasm, "mov eax,puffer") ;rückgabe auf puffer
    FasmAdd($Fasm, "ret 4") ;Funktionsende
    FasmAdd($Fasm, "puffer db 1 dup(10)");integer hat maximal 10 dezimalstellen!
    ; FasmAdd($Fasm, "Nachricht db 'Teststring!$'")

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

    $integer=12345678

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

    $Ret = MemoryFuncCall("str", FasmGetFuncPtr($Fasm), "int", $integer)

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

    _arraydisplay($ret)
    FasmExit($Fasm)
    exit

    [/autoit]

    wenn du diese Funktion mit dem Int21h verwenden willst, musst du statt des CR ein $ an den String anschliessen!

  • Zitat

    Quatsch kann doch die lib nehmen .

    Richtig, und Ausgabe in Fensterchen mit allem pipapo^^


  • Hab mir in der Zwischenzeit schon folgendes gemacht: Trotzdem danke

    Spoiler anzeigen
    [autoit]

    Func _ImgToBmp($img)
    Local $w,$h,$bmp
    $w=_GDIPlus_ImageGetWidth($img)
    $h=_GDIPlus_ImageGetHeight($img)
    Local $gra=_GDIPlus_GraphicsCreateFromHDC(_WinAPI_GetDC(0))
    $bmp=_GDIPlus_BitmapCreateFromGraphics($w,$h,$gra)
    _GDIPlus_GraphicsDispose($gra)
    $gra=_GDIPlus_ImageGetGraphicsContext($bmp)
    _GDIPlus_GraphicsDrawImageRect($gra,$img,0,0,$w,$h)
    _GDIPlus_GraphicsDispose($gra)
    _GDIPlus_ImageDispose($img)
    Return $bmp
    EndFunc

    [/autoit]
  • So, ich schon wieder mit einem Problem :D
    ich versuch Strings per Passwort mit xor zu verschlüsseln und den neuen String zurückzugeben
    Ich benutze eax als Speicherplatz für den Pointer zum Passwort (gerade eben auch herausgekreigt wie das mit dd geht), das klappt auch alles ohne Fehler, naja bis auf die Rückgabe. Ich verschlüssle Hallo mit dem Passwort PW und der Rückgabestring ist ca. 5 mal so lang:
    Hallo,PW -> 6<;?W•Vt_ÛWï ,‘Qî,[esp+4]
    Das [esp+4] zwischendurch seh ich, kann mir aber keinen Reim daraus machen (erster Parameter: String zum verschlüsseln)

    Spoiler anzeigen
    [autoit]

    Func F4() ;Strings mit PW verschlüsseln
    _new()
    ;
    FasmAdd($Fasm, "mov eax,[esp+4]");Parameter abspeichern
    FasmAdd($Fasm, "mov esi,[eax]");Hier wird der String später herausgeholt (Source) (str* to str)
    FasmAdd($Fasm, "mov eax,[esp+8]");
    FasmAdd($Fasm, "mov eax,[eax]");str* zu str, Passwort in eax speichern
    FasmAdd($Fasm, "mov edi,nstr");nstr=Platz für neuen String, Pointer nach edi (Destination)

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

    FasmAdd($Fasm, "mov ecx,0");Passwortzähler, um per Zähler jeden einzelnen Buchstaben zu benutzen
    FasmAdd($Fasm, "schleife:");Schleifenlabel
    FasmAdd($Fasm, "mov bx,word[esi]");aktuellen Stringbuchstaben in bx speichern
    FasmAdd($Fasm, "xor bx,word[eax+ecx]");und mit aktuellem Buchstaben des Passworts verschlüsseln
    FasmAdd($Fasm, "mov word[esi],bx");den Buchstaben wieder zurückschreiben
    FasmAdd($Fasm, "add ecx,2");Passwortzähler um ein Word erhöhen
    FasmAdd($Fasm, "cmp word[eax+ecx],0");Prüfen ob das Ende des Passworts am neuen Ort ist
    FasmAdd($Fasm, "je znull");und wenn es so ist, dann den Zähler bei znull zurücksetzen
    FasmAdd($Fasm, "back:");Label um von der Funktion zurückzukehren
    FasmAdd($Fasm, "movsw");Einen Buchstaben von Surce nach Destination verschieben
    FasmAdd($Fasm, "cmp word[esi],0");Prüfen ob es der letzte Buchstabe war
    FasmAdd($Fasm, "jne schleife");wenn nicht, dann wiederhole Schleife
    FasmAdd($Fasm, "jmp ende");sons springe zum Ende

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

    FasmAdd($Fasm, "znull:");Label für Funktion
    FasmAdd($Fasm, "mov ecx,0");Zähler zurücksetzen
    FasmAdd($Fasm, "jmp back");zurückspringen

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

    FasmAdd($Fasm, "ende:");Label fürs Ende
    FasmAdd($Fasm, "mov eax,nstr");neuen String zurückgeben
    FasmAdd($Fasm, "ret 8");Beenden

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

    FasmAdd($Fasm, "nstr dw 0");Platz für neuen String
    ;
    FasmCompile($Fasm)
    If @Error Then
    Local $Error = FasmGetLastError()
    ConsoleWrite("Error Code: " & $Error[$FASMERRINDEX_CODE] & @CRLF)
    ConsoleWrite("Error Message: " & $Error[$FASMERRINDEX_MESSAGE] & @CRLF)
    ConsoleWrite("Error LineNumber: " & $Error[$FASMERRINDEX_LINENUMBER] & @CRLF)
    ConsoleWrite("Error Line: " & $Error[$FASMERRINDEX_LINE] & @CRLF)
    Else
    ConsoleWrite(String(FasmGetBinary($Fasm)) & @CRLF)
    EndIf
    Local $timer=TimerInit()
    Local $ret = MemoryFuncCall("str", FasmGetFuncPtr($Fasm), "str*", "Hallo", "str*", "PW")
    Local $diff=TimerDiff($timer)
    MsgBox(0,$diff,$ret[0])
    ConsoleWrite($ret[0]&@CRLF)
    EndFunc

    [/autoit]

    Danke schonmal im Vorraus

    EDIT: Frage nebenbei: wie kann man eine Funktion in einer DLL aufrufen? GetProcAdress hilft nicht

    Einmal editiert, zuletzt von TheShadowAE (26. August 2010 um 16:09)

  • Dein Programm funktioniert einwandfrei!

    Spoiler anzeigen
    [autoit]

    ;kann man in einer Zeile mit lea esi,[esp+4] machen
    FasmAdd($Fasm, "mov eax,[esp+4]");Parameter abspeichern
    FasmAdd($Fasm, "mov esi,[eax]");Hier wird der String später herausgeholt (Source) (str* to str)
    ;hier genauso
    FasmAdd($Fasm, "mov eax,[esp+8]");
    FasmAdd($Fasm, "mov eax,[eax]");str* zu str, Passwort in eax speichern

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

    FasmAdd($Fasm, "mov edi,nstr");nstr=Platz für neuen String, Pointer nach edi (Destination)
    FasmAdd($Fasm, "mov ecx,0");Passwortzähler, um per Zähler jeden einzelnen Buchstaben zu benutzen
    FasmAdd($Fasm, "schleife:");Schleifenlabel

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

    ;wenn du words benutzt, dann nur bei unicode! bei ansi ist ein byte = ein Buchstabe!
    ;also beim dllcall wstr für unicode einsetzen
    FasmAdd($Fasm, "mov bx,word[esi]");aktuellen Stringbuchstaben in bx speichern
    FasmAdd($Fasm, "xor bx,word[eax+ecx]");und mit aktuellem Buchstaben des Passworts verschlüsseln
    FasmAdd($Fasm, "mov word[esi],bx");den Buchstaben wieder zurückschreiben
    FasmAdd($Fasm, "add ecx,2");Passwortzähler um ein Word erhöhen
    FasmAdd($Fasm, "cmp word[eax+ecx],0");Prüfen ob das Ende des Passworts am neuen Ort ist
    FasmAdd($Fasm, "je znull");und wenn es so ist, dann den Zähler bei znull zurücksetzen
    FasmAdd($Fasm, "back:");Label um von der Funktion zurückzukehren
    FasmAdd($Fasm, "movsw");Einen Buchstaben von Surce nach Destination verschieben
    FasmAdd($Fasm, "cmp word[esi],0");Prüfen ob es der letzte Buchstabe war
    FasmAdd($Fasm, "jne schleife");wenn nicht, dann wiederhole Schleife
    FasmAdd($Fasm, "jmp ende");sons springe zum Ende

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

    FasmAdd($Fasm, "znull:");Label für Funktion
    FasmAdd($Fasm, "mov ecx,0");Zähler zurücksetzen
    FasmAdd($Fasm, "jmp back");zurückspringen

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

    FasmAdd($Fasm, "ende:");Label fürs Ende
    FasmAdd($Fasm, "mov eax,nstr");neuen String zurückgeben
    FasmAdd($Fasm, "ret 8");Beenden

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

    FasmAdd($Fasm, "nstr dw 100 dup(0)");Platz für neuen String, mit nstr dw 0 reservierst du nur ein! dword...
    ;
    ; FasmCompile($Fasm)
    If @Error Then
    ;~ Local $Error = FasmGetLastError()
    ;~ ConsoleWrite("Error Code: " & $Error[$FASMERRINDEX_CODE] & @CRLF)
    ;~ ConsoleWrite("Error Message: " & $Error[$FASMERRINDEX_MESSAGE] & @CRLF)
    ;~ ConsoleWrite("Error LineNumber: " & $Error[$FASMERRINDEX_LINENUMBER] & @CRLF)
    ;~ ConsoleWrite("Error Line: " & $Error[$FASMERRINDEX_LINE] & @CRLF)
    Else
    ConsoleWrite(String(FasmGetBinary($Fasm)) & @CRLF)
    EndIf
    Local $timer=TimerInit()
    Local $ret = MemoryFuncCall("wstr", FasmGetFuncPtr($Fasm), "wstr*", "Hallo", "wstr*", "PW")
    Local $diff=TimerDiff($timer)
    MsgBox(0,$diff,$ret[0])
    ConsoleWrite($ret[0]&@CRLF)
    $text=$ret[0]

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

    ; Local $timer=TimerInit()
    Local $ret = MemoryFuncCall("wstr", FasmGetFuncPtr($Fasm), "wstr*",$text , "wstr*", "PW")
    Local $diff=TimerDiff($timer)
    MsgBox(0,$diff,$ret[0])
    ConsoleWrite($ret[0]&@CRLF)

    [/autoit]

    Da du aber ein WORD verschlüsselst, musst du den Buchstaben bzw String auch als Unicodezeichen an den assemblercode übergeben!
    das war alles....wstr statt str im dllcall

    oder dann imm Assemblercode byteweise, wenn du nur Ansistrings hast str=ansi ; 1 char=1 byte

  • hast du das Script aus meinem Post ausprobiert? Bei mir läuft das einwandfrei, erst verschlüsseln, dann entschlüsseln

  • Seltsam, bei dem von mir geposteten Script wird da nix drangehängt, auch stringlen($ret[0]) gibt 5 Buchstaben sowohl bei der Ver- als auch bei der Entschlüsselung zurück!

  • Oops, danke, klappt doch :rolleyes: Hab das falsche ausgeführt also mein Asm mit deinem Autoit
    Aber ich finde keinen Unterschied zwischen den beiden Skripten außer dup(100)
    Aber egal was ich jetzt beim versuchten berichtigen bei meinem Skript mache es kommt nur 1! Buchstabe, auch wenn ich nur eine 0 reserviere oder 100
    zweimal gibts nur ein (
    Wenn man bei deinem Skript lea benutz gibts auch wieder Fehler

    EDIT: Habs jetzt, ohne lea, mit dup

    Spoiler anzeigen


    Ich wollte gerade mal Exen probieren, leider funktioniert dein Beispiel garnicht, es kommt eine Value out of Range Meldung bei mov dx,nachricht1

    11 Mal editiert, zuletzt von TheShadowAE (27. August 2010 um 12:54)