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

  • ASM

    • Andy
    • 16. August 2010 um 18:53
    Zitat

    denn in assembler gibt es keine Befehle wie MsgBox(), das musst du alles selbst zusammen basteln

    Das stimmt nicht!
    So gut wie jede nennenswerte Bibliothek gibt es auch in Assembler, die API-Funktionen sowieso.
    Beispiel für Messagebox:

    Code
    ; example of simplified Windows programming using complex macro features
    include 'win32ax.inc' ; you can simply switch between win32ax, win32wx, win64ax and win64wx here
    .code
      start:
    	invoke	MessageBox,HWND_DESKTOP,"Hi! I'm the example program!",invoke GetCommandLine,MB_OK
    	invoke	ExitProcess,0
    .end start


    die passende EXE 2kb groß Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    Beispiel Dialogbox;

    Spoiler anzeigen
    Code
    ; DialogBox example
    
    
    format PE GUI 4.0
    entry start
    
    
    include 'win32a.inc'
    
    
    ID_CAPTION	   = 101
    ID_MESSAGE	   = 102
    ID_ICONERROR	   = 201
    ID_ICONINFORMATION = 202
    ID_ICONQUESTION    = 203
    ID_ICONWARNING	   = 204
    ID_TOPMOST	   = 301
    
    
    section '.text' code readable executable
    
    
      start:
    
    
    	invoke	GetModuleHandle,0
    	invoke	DialogBoxParam,eax,37,HWND_DESKTOP,DialogProc,0
    	or	eax,eax
    	jz	exit
    	invoke	MessageBox,HWND_DESKTOP,message,caption,[flags]
      exit:
    	invoke	ExitProcess,0
    
    
    proc DialogProc hwnddlg,msg,wparam,lparam
    	push	ebx esi edi
    	cmp	[msg],WM_INITDIALOG
    	je	.wminitdialog
    	cmp	[msg],WM_COMMAND
    	je	.wmcommand
    	cmp	[msg],WM_CLOSE
    	je	.wmclose
    	xor	eax,eax
    	jmp	.finish
      .wminitdialog:
    	invoke	CheckRadioButton,[hwnddlg],ID_ICONERROR,ID_ICONWARNING,ID_ICONINFORMATION
    	jmp	.processed
      .wmcommand:
    	cmp	[wparam],BN_CLICKED shl 16 + IDCANCEL
    	je	.wmclose
    	cmp	[wparam],BN_CLICKED shl 16 + IDOK
    	jne	.processed
    	invoke	GetDlgItemText,[hwnddlg],ID_CAPTION,caption,40h
    	invoke	GetDlgItemText,[hwnddlg],ID_MESSAGE,message,100h
    	mov	[flags],MB_OK
    	invoke	IsDlgButtonChecked,[hwnddlg],ID_ICONERROR
    	cmp	eax,BST_CHECKED
    	jne	.iconerror_ok
    	or	[flags],MB_ICONERROR
          .iconerror_ok:
    	invoke	IsDlgButtonChecked,[hwnddlg],ID_ICONINFORMATION
    	cmp	eax,BST_CHECKED
    	jne	.iconinformation_ok
    	or	[flags],MB_ICONINFORMATION
          .iconinformation_ok:
    	invoke	IsDlgButtonChecked,[hwnddlg],ID_ICONQUESTION
    	cmp	eax,BST_CHECKED
    	jne	.iconquestion_ok
    	or	[flags],MB_ICONQUESTION
          .iconquestion_ok:
    	invoke	IsDlgButtonChecked,[hwnddlg],ID_ICONWARNING
    	cmp	eax,BST_CHECKED
    	jne	.iconwarning_ok
    	or	[flags],MB_ICONWARNING
          .iconwarning_ok:
    	invoke	IsDlgButtonChecked,[hwnddlg],ID_TOPMOST
    	cmp	eax,BST_CHECKED
    	jne	.topmost_ok
    	or	[flags],MB_TOPMOST
          .topmost_ok:
    	invoke	EndDialog,[hwnddlg],1
    	jmp	.processed
      .wmclose:
    	invoke	EndDialog,[hwnddlg],0
      .processed:
    	mov	eax,1
      .finish:
    	pop	edi esi ebx
    	ret
    endp
    
    
    section '.bss' readable writeable
    
    
      flags dd ?
      caption rb 40h
      message rb 100h
    
    
    section '.idata' import data readable writeable
    
    
      library kernel,'KERNEL32.DLL',\
    	  user,'USER32.DLL'
    
    
      import kernel,\
    	 GetModuleHandle,'GetModuleHandleA',\
    	 ExitProcess,'ExitProcess'
    
    
      import user,\
    	 DialogBoxParam,'DialogBoxParamA',\
    	 CheckRadioButton,'CheckRadioButton',\
    	 GetDlgItemText,'GetDlgItemTextA',\
    	 IsDlgButtonChecked,'IsDlgButtonChecked',\
    	 MessageBox,'MessageBoxA',\
    	 EndDialog,'EndDialog'
    
    
    section '.rsrc' resource data readable
    
    
      directory RT_DIALOG,dialogs
    
    
      resource dialogs,\
    	   37,LANG_ENGLISH+SUBLANG_DEFAULT,demonstration
    
    
      dialog demonstration,'Create message box',70,70,190,175,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME
        dialogitem 'STATIC','&Caption:',-1,10,10,70,8,WS_VISIBLE
        dialogitem 'EDIT','',ID_CAPTION,10,20,170,13,WS_VISIBLE+WS_BORDER+WS_TABSTOP
        dialogitem 'STATIC','&Message:',-1,10,40,70,8,WS_VISIBLE
        dialogitem 'EDIT','',ID_MESSAGE,10,50,170,13,WS_VISIBLE+WS_BORDER+WS_TABSTOP+ES_AUTOHSCROLL
        dialogitem 'BUTTON','&Icon',-1,10,70,80,70,WS_VISIBLE+BS_GROUPBOX
        dialogitem 'BUTTON','&Error',ID_ICONERROR,20,82,60,13,WS_VISIBLE+BS_AUTORADIOBUTTON+WS_TABSTOP+WS_GROUP
        dialogitem 'BUTTON','I&nformation',ID_ICONINFORMATION,20,95,60,13,WS_VISIBLE+BS_AUTORADIOBUTTON
        dialogitem 'BUTTON','&Question',ID_ICONQUESTION,20,108,60,13,WS_VISIBLE+BS_AUTORADIOBUTTON
        dialogitem 'BUTTON','&Warning',ID_ICONWARNING,20,121,60,13,WS_VISIBLE+BS_AUTORADIOBUTTON
        dialogitem 'BUTTON','&Style',-1,100,70,80,70,WS_VISIBLE+BS_GROUPBOX
        dialogitem 'BUTTON','&Top most',ID_TOPMOST,110,82,60,13,WS_VISIBLE+WS_TABSTOP+BS_AUTOCHECKBOX
        dialogitem 'BUTTON','OK',IDOK,85,150,45,15,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON
        dialogitem 'BUTTON','C&ancel',IDCANCEL,135,150,45,15,WS_VISIBLE+WS_TABSTOP+BS_PUSHBUTTON
      enddialog
    Alles anzeigen


    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.


    Beispiel OpenGL

    Spoiler anzeigen
    Code
    ; OpenGL programming example
    
    
    format PE GUI 4.0
    entry start
    
    
    include 'win32a.inc'
    
    
    include 'opengl.inc'
    
    
    section '.text' code readable executable
    
    
      start:
    
    
    	invoke	GetModuleHandle,0
    	mov	[wc.hInstance],eax
    	invoke	LoadIcon,0,IDI_APPLICATION
    	mov	[wc.hIcon],eax
    	invoke	LoadCursor,0,IDC_ARROW
    	mov	[wc.hCursor],eax
    	invoke	RegisterClass,wc
    	invoke	CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_OVERLAPPEDWINDOW+WS_CLIPCHILDREN+WS_CLIPSIBLINGS,16,16,432,432,NULL,NULL,[wc.hInstance],NULL
    	mov	[hwnd],eax
    
    
      msg_loop:
    	invoke	GetMessage,msg,NULL,0,0
    	or	eax,eax
    	jz	end_loop
    	invoke	TranslateMessage,msg
    	invoke	DispatchMessage,msg
    	jmp	msg_loop
    
    
      end_loop:
    	invoke	ExitProcess,[msg.wParam]
    
    
    proc WindowProc hwnd,wmsg,wparam,lparam
    	push	ebx esi edi
    	cmp	[wmsg],WM_CREATE
    	je	.wmcreate
    	cmp	[wmsg],WM_SIZE
    	je	.wmsize
    	cmp	[wmsg],WM_PAINT
    	je	.wmpaint
    	cmp	[wmsg],WM_KEYDOWN
    	je	.wmkeydown
    	cmp	[wmsg],WM_DESTROY
    	je	.wmdestroy
      .defwndproc:
    	invoke	DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
    	jmp	.finish
      .wmcreate:
    	invoke	GetDC,[hwnd]
    	mov	[hdc],eax
    	mov	edi,pfd
    	mov	ecx,sizeof.PIXELFORMATDESCRIPTOR shr 2
    	xor	eax,eax
    	rep	stosd
    	mov	[pfd.nSize],sizeof.PIXELFORMATDESCRIPTOR
    	mov	[pfd.nVersion],1
    	mov	[pfd.dwFlags],PFD_SUPPORT_OPENGL+PFD_DOUBLEBUFFER+PFD_DRAW_TO_WINDOW
    	mov	[pfd.iLayerType],PFD_MAIN_PLANE
    	mov	[pfd.iPixelType],PFD_TYPE_RGBA
    	mov	[pfd.cColorBits],16
    	mov	[pfd.cDepthBits],16
    	mov	[pfd.cAccumBits],0
    	mov	[pfd.cStencilBits],0
    	invoke	ChoosePixelFormat,[hdc],pfd
    	invoke	SetPixelFormat,[hdc],eax,pfd
    	invoke	wglCreateContext,[hdc]
    	mov	[hrc],eax
    	invoke	wglMakeCurrent,[hdc],[hrc]
    	invoke	GetClientRect,[hwnd],rc
    	invoke	glViewport,0,0,[rc.right],[rc.bottom]
    	invoke	GetTickCount
    	mov	[clock],eax
    	xor	eax,eax
    	jmp	.finish
      .wmsize:
    	invoke	GetClientRect,[hwnd],rc
    	invoke	glViewport,0,0,[rc.right],[rc.bottom]
    	xor	eax,eax
    	jmp	.finish
      .wmpaint:
    	invoke	GetTickCount
    	sub	eax,[clock]
    	cmp	eax,10
    	jb	.animation_ok
    	add	[clock],eax
    	invoke	glRotatef,[theta],0.0,0.0,1.0
          .animation_ok:
    	invoke	glClear,GL_COLOR_BUFFER_BIT
    	invoke	glBegin,GL_QUADS
    	invoke	glColor3f,1.0,0.1,0.1
    	invoke	glVertex3f,-0.6,-0.6,0.0
    	invoke	glColor3f,0.1,0.1,0.1
    	invoke	glVertex3f,0.6,-0.6,0.0
    	invoke	glColor3f,0.1,0.1,1.0
    	invoke	glVertex3f,0.6,0.6,0.0
    	invoke	glColor3f,1.0,0.1,1.0
    	invoke	glVertex3f,-0.6,0.6,0.0
    	invoke	glEnd
    	invoke	SwapBuffers,[hdc]
    	xor	eax,eax
    	jmp	.finish
      .wmkeydown:
    	cmp	[wparam],VK_ESCAPE
    	jne	.defwndproc
      .wmdestroy:
    	invoke	wglMakeCurrent,0,0
    	invoke	wglDeleteContext,[hrc]
    	invoke	ReleaseDC,[hwnd],[hdc]
    	invoke	PostQuitMessage,0
    	xor	eax,eax
      .finish:
    	pop	edi esi ebx
    	ret
    endp
    Alles anzeigen

    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.


    Blume, nein ich kanns nicht^^, jedenfalls nicht so wie die Bitpfriemler, aber das Prinzip habe ich verstanden!

    Für die Leute, die Spass verstehen, noch 1 kb Fun^^
    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    @Topic,
    ja, ich würde dir auch nicht gerade zu Assembler raten, wenn du nicht unbedingt mit Großrechnern oder bei Compilerbauern oder anderen interessanten Sachen programmieren willst...
    Aber es gibt einen sehr wahren Spruch dazu: "Wer in einer Herde Schafe nicht auffallen will, der sollte zuallererst ein Schaf sein!"
    Überleg dir mal, was in einer Bewerbung Eindruck schindet, ein cleveres (wegen mir übelst schnelles Bitgeschiebe) Assemblerprogramm, oder der 09/15 "Ich kann C++, Java, Javascript, HTML, PHP" (von allem ein bisschen aber nix richtig)

    Dateien

    HELLO.EXE 1,54 kB – 376 Downloads DIALOG.EXE 3,07 kB – 506 Downloads OPENGL.EXE 3,07 kB – 540 Downloads
  • Steganographie....Verstecken statt Verschlüsseln

    • Andy
    • 16. August 2010 um 17:07
    Zitat

    Sieht sehr gut aus, vielleicht machst du eine UDF daraus zum verstecken und wiederfinden

    Ja, der Witz ist ja dabei, daß man nur die Dateien einlesen muß, Byteweise verknüpfen und wieder schreiben. Das sollte mit dem vorliegenden Script eigentlich jeder selbst hinbekommen.
    Alles andere sollte man für die eigenen Bedürfnisse zurechtlegen. Es geht ja auch darum, daß ein "Angreifer" nicht sofort über die Nachricht stolpert. So könnte man statt 2 nur 1 Bit ändern, die Schreibreihenfolge verändern, Die Bits vorher rotieren oder oder oder...
    Weiterhin würde es Sinn machen, den Dateinamen und die Dateigröße direkt mit in den Container zu schreiben. Dann könnte man auch z.B. Exe-Files in einem Bild "verstecken".
    Oder im Vorfeld eine Analyse des Bildes durchführen! Mal angenommen, das Bild hätte einen komplett weißen 0xFFFFFF Hintergrund und wäre nur im mittleren Bereich "bunt". Dann würde jeder "Angreifer" in einem Hexeditor oder mit einem fähigen Bildbearbeitungsprogramm sehen, daß "irgendetwas faul ist"....
    Also würde man die Daten nur im "bunten" Teil verstecken.

    Das Thema wird immer interessanter, da die weltweiten Geheimdienste mittlerweile extrem empfindlich auf "Verschlüsselung" reagieren. Die Nahost- und asiatischen Geheimdienste laufen zzt Amok, weil die systeminterne Verschlüsselung der Datendienste und Telefonate von z.B. Blackberry-Handys komplett über deren kanadischen Server läuft. Die Schlüssel sind natürlich nicht öffentlich. Die Frage ist, was man mit den verschlüsselten Daten (die man natürlich innerhalb von RiM (Hersteller der Blackberrys) alle problemlos entschlüsseln kann) anfängt...
    Es wird so sein wie bei Skype, dort bekommt derjenige einen Dechiffrierschlüssel, der ausreichnd zahlt. Das halte ich für legitim, denn Skype Ltd. ist kein Wohlfahrtsverein, sondern ein marktwirtschaftliches Unternehmen!
    Östereich hat einfach beschlossen, Skype nur zuzulassen, wenn Regierungsbehörden den Zugriff auf die Verschlüsselung bzw. Entschlüsselung der Nutzerdaten bekommen. Ansonsten keine Lizenzen für Gespräche....sagen wir so, "man hat sich geeinigt", Skype darf telefonieren und die Regierung mithören^^. Indien hat auch den Fuß in der Skype-Tür...

    Da mittlerweile sowieso jede Mail und SMS gescannt und jedes Telefongespräch mitgehört wird, ist es wesentlich unverfänglicher, dem Kollegen in Bagdad die Bilder von Tante Friedas 75. Geburtstag zu schicken, als eine per AES1024 (;)) verschlüsselte Nachricht. (die btw. sowieso entschlüsselt werden kann). Ausserden kann man sich einen Spass draus machen, und "hinter" alle versendeten oder gespeicherten Bilder (Bundestrojaner lässt grüssen) ein freundliches FU! ,,I,, oder gleich ein Ascii-Art
    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.
    einbauen, dann ist es für die Datenschnüffler nicht ganz so langweilig 8o

    Zitat

    Da könnte mann bestimmt was mit ASM rumbaun oder ? Aber so weit bin ich noch nicht

    Abber sischäärr...Mach einfach nen Thread auf, ich stosse dann dazu^^ Je mehr mitmachen und Ideen einbringen, desto besser....

    Bilder

    • Stinkefinger_MS_Sans_Serif.png
      • 440 Byte
      • 260 × 288
  • Steganographie....Verstecken statt Verschlüsseln

    • Andy
    • 16. August 2010 um 11:58

    Hallo zusammen,
    bei der Steganographie geht es darum, eine geheime Nachricht in einem anderen, offensichtlich harmlosen Objekt zu "verstecken" im Sinne von überdecken.
    Dabei werden Daten oft in Bildern versteckt, man kann aber auch in MP3´s oder in anderen Dateiformaten Informationen unterbringen, ohne dass man den "geheimen" Inhalt erkennt.
    Der folgende fast 1 kb große Text

    Zitat

    Hallo, diese Nachricht ist im AutoIt-Icon versteckt!
    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.


    ist im rechten Icon enthalten, das linke ist das Orginal-Icon!
    -

    Sieht man den Unterschied der Icons? Nein, genau DAS ist die Absicht! Ein offensichtlich harmloses Objekt enthält weitere Daten...

    Wie funktioniert das?
    Beispiel 32- oder 24-Bit Grafiken:
    Ein Pixel besteht aus 3 Farbanteilen, Blau, Grün, Rot, welche jeweils einen Wert von 0 bis 255 (8 Bit=1 Byte) annehmen können. Man stellt die Farbe hexadezimal als 0xBBGGRR dar. Nun ist es so, daß kleine Änderungen in der Farbe von Menschen nicht wahrgenommen werden können, ein Mensch kann keinen Unterschied zwischen der Farbe 0xA3B3C3 und 0xA0B0C0 erkennen. Die "niederwertigen" Bits sind also für den optischen Eindruck völlig irrelevant. Mit Geräuschen verhält sich das ebenso. Kompressionsverfahren wie z.B. MP3 nutzen das aus, indem "unhörbare" (bei Bildern "unsichtbare") Anteile einfach weggelassen werden.
    Bei der Steganografie wird hingegen dieser "unwichtige" Anteil an den Farben durch z.B. eine geheime Nachricht ersetzt!
    Dabei wird die Nachricht in (in meinem Beispiel) 2 Bit lange Teilstücke aufgeteilt, und diese Teilstücke anstatt der "unwichtigen" niederwertigen Bits in den Farben eingesetzt.

    Aufgabe: Der Buchstabe M soll in einem knallgrünen Bild versteckt werden.
    Der Buchstabe M (Ascii 77, Ascii-Tabelle in der AutoIt-Hilfe im Anhang) sieht Binär also folgendermassen aus 01001101. Dieser Binärstring wird nun in 2 Bit große Teilstücke aufgeteilt:
    M => 77 => 01001101 =>01 00 11 01

    Als Farbe nehmen wir der Einfachheit halber an, die ersten Pixel des Bildes seien knallgrün Farbe 0x00FF00. Dabei besteht der Blau-Anteil der Farbe aus 0x00, Grün aus 0xFF und Rot aus 0x00. Binärdarstellung von grünen Pixeln:
    00000000 11111111 00000000 (Erstes Pixel) 00000000 11111111 00000000 (zweites Pixel) usw.
    Nun löschen wir die untersten beiden Bits in jedem Farbanteil, und ersetzen sie mit den Teilstücken unseres Buchstabens:
    00000001 11111100 00000011 (Erstes Pixel) 00000001 11111111 00000000 (zweites Pixel) usw.

    Bild speichern, fertig...Das Bild ist immer noch knallgrün, aber hat nun "Inhalt". Unser Buchstabe M sitzt "unsichtbar" in diesem Bild. Wie kann man den wieder herausholen?
    Umgekehrter Weg, bei jedem Farbanteil die letzten beiden Bits extrahieren, aus 4 dieser 2er-Blöcke wird ein 8-Bit Ascii-Buchstabe...isn´t that easy?

    Im folgenden Script habe ich als Bilddatei das AutoIt-Icon 3-fach vergrößert dargestellt.

    Spoiler anzeigen
    AutoIt
    ;eine Text-Nachricht mit bis zu 819 Zeichen wird "unsichtbar" im AutoIt-Icon versteckt und wieder extrahiert
    ;Beispiel für Steganographie von Andy @ autoit.de
    
    
    #include <WinAPI.au3>
    #include <WinAPIGdi.au3>
    #include <EditConstants.au3>
    #include <WindowsConstants.au3>
    #include <StructureConstants.au3>
    
    
    
    
    Local $hGUI, $hEdit, $hicon
    Local $pointer_icon, $hbmp_icon                                    ;pointer und handle icon
    Local $pointer_stegano, $hbmp_stegano                              ;pointer und handle stegano
    Local $pointer_diff, $hbmp_diff                                    ;pointer und handle differenzbild
    
    
    $hGUI = GUICreate("Beispiel für Steganographie", 560, 300)         ;GUI
    $label1 = GUICtrlCreateLabel("Orginal Icon                   Icon mit integriertem Text               Differenzbild            64-fach verstärktes Differenzbild", 10, 10)
    $label2 = GUICtrlCreateLabel("Der im Icon versteckte Text:", 10, 170)
    $label3 = GUICtrlCreateEdit("", 10, 195, 530, 100, $ES_READONLY, 0)
    
    
    $hdc_gui = _WinAPI_GetDC($hGUI)                                    ;DeviceContext der Gui
    GUISetState()
    
    
    $hDC_icon = _CreateNewBmp32(32, 32, $pointer_icon, $hbmp_icon)     ;neue 32-Bit-Bitmap erstellen, Rückgabe: DC, Pointer und Handle
    
    
    Local $hicon = DllStructCreate("ptr")                              ;platz für Pointer des/der Icon(s)
    _WinAPI_ExtractIconEx(@AutoItExe, 0, DllStructGetPtr($hicon), 0, 1) ;AutoIt-Icon holen (Zeiger auf die Liste der Handles)
    $hicon = DllStructGetData($hicon, 1)                               ;Handle des Icons holen
    $anz = _WinAPI_DrawIconEx($hDC_icon, 0, 0, $hicon, 32, 32, 0, _WinAPI_GetSysColorBrush(2), 3) ;Icon in den Buffer zeichnen mit Windows-"Hintergrundfarbe"
    _WinAPI_StretchBlt($hdc_gui, 10, 50, 100, 100, $hDC_icon, 0, 0, 32, 32, $SRCCOPY) ;Icon mit 3-facher Größe in die GUI kopieren
    
    
    ;In diesem Icon wird eine "Nachricht" versteckt, indem ein Text (maximal 819 Zeichen) in die beiden untersten Bits jeder "Pixel"-farbe
    ;kodiert wird. 819 = 32 Pixel * 32 Pixel * 4 Byte pro Pixel (Anzahl Bytes des Icons) / 5 (in 5 Bytes wird ein "Buchstabe" versteckt)
    ;32 Bit pro Pixel= 4 Byte = BBGGRRAA  Alphakanal wird nicht verwendet bzw verändert, so kann man auch transparente Icons/Bilder benutzen
    ;Es wird eine neue Bitmap erstellt (_stegano) und diese aus den obersten 6 Bit der Farbe des Orginal-Icons mit den Bits der
    ;Nachricht, welche die untersten beiden Bits der Farb-Bytes enthalten, zusammenkopiert
    ;32 Bit pro Pixel BBBBBBTTGGGGGGTTRRRRRRTTAAAAAAAA   TT= Bits eines Buchstabens aus dem Text
    ;das nachfolgende Script kann immens gekürzt werden, allerdings auf kosten der Übersichtlichkeit und des Verständnisses^^
    $Text = "Hallo, diese Nachricht ist im AutoIt-Icon versteckt!" & @CRLF ;versteckte Nachricht
    $Text &= "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo."
    
    
    ;den Text in 2-Bit lange Teilstücke auftrennen
    Dim $bitarray[32 * 32 * 4]                                         ;Platz für die 2-Bit-Stücke 8 Bit = 4 * 2 Bit
    
    
    For $i = 1 To StringLen($Text)                                     ;jeden Buchstaben im Text holen
        $byte = Asc(StringMid($Text, $i, 1))                           ;ascii-code der einzelnen Buchstaben holen
        $bitarray[($i - 1) * 4 + 0] = BitShift($byte, 6)               ;oberste  2 bit
        $bitarray[($i - 1) * 4 + 1] = BitShift(BitAND($byte, 48), 4)   ;nächste  2 bit  AND 00110000, bitshift 4
        $bitarray[($i - 1) * 4 + 2] = BitShift(BitAND($byte, 12), 2)   ;nächste  2 bit  AND 00001100 bitshift 2
        $bitarray[($i - 1) * 4 + 3] = BitAND($byte, 3)                 ;unterste 2 bit  AND 00000011
    Next
    
    
    ;unterste 2 Bit aus jedem Byte des Icons mit den 2 Byte des Textes ersetzen
    $hDC_stegano = _CreateNewBmp32(32, 32, $pointer_stegano, $hbmp_stegano) ;neue 32-Bit-Bitmap erstellen, Rückgabe: DC, Pointer und Handle
    $struct_stegano = DllStructCreate("byte [" & 32 * 32 * 4 & "]", $pointer_stegano) ;struct mit der größe der Bitmap an der Position der "Kopie"
    $struct_icon = DllStructCreate("byte [" & 32 * 32 * 4 & "]", $pointer_icon) ;struct mit der größe der Bitmap an der Position des Icons
    
    
    $bitarray_count = 0                                                ;zähler für den Index des Bitarray
    For $y = 0 To 31                                                   ;spaltenweise Pixel ändern
        For $x = 0 To 31                                               ;zeilenweise Pixel ändern
            ;Pixel-farbanteile aus dem Icon holen
            $B = DllStructGetData($struct_icon, 1, $y * 128 + ($x * 4) + 1) ;blau-anteil des Pixels
            $G = DllStructGetData($struct_icon, 1, $y * 128 + ($x * 4) + 2) ;gruen-anteil des Pixels
            $R = DllStructGetData($struct_icon, 1, $y * 128 + ($x * 4) + 3) ;rot-anteil des Pixels
            $A = DllStructGetData($struct_icon, 1, $y * 128 + ($x * 4) + 4) ;Alpha-anteil des Pixels (wird nicht verändert)
            ;die untersten 2 Byte der farbanteile "löschen"
            $B = BitAND($B, 252)                                       ;AND 11111100 setzt die unteren beiden bit auf 0, alle anderen bleiben erhalten
            $G = BitAND($G, 252)
            $R = BitAND($R, 252)
            ;Bits aus dem Bitarray dazuaddieren
            $B = $B + $bitarray[$bitarray_count * 3 + 0]               ;2 bits aus dem Bitarray in das Byte an unterster position einfügen
            $G = $G + $bitarray[$bitarray_count * 3 + 1]
            $R = $R + $bitarray[$bitarray_count * 3 + 2]
            $bitarray_count += 1                                       ;zähler erhöhen, nächste 3 2er Bits
            ;mit dem Text modifizierte Farbbytes in Zielbitmap einfügen
            DllStructSetData($struct_stegano, 1, $B, $y * 128 + ($x * 4) + 1) ;blau-anteil in _stegano-bitmap eintragen
            DllStructSetData($struct_stegano, 1, $G, $y * 128 + ($x * 4) + 2) ;grün-anteil in bitmap eintragen
            DllStructSetData($struct_stegano, 1, $R, $y * 128 + ($x * 4) + 3) ;rot-anteil in bitmap eintragen
            DllStructSetData($struct_stegano, 1, $A, $y * 128 + ($x * 4) + 4) ;alpha-anteil in bitmap eintragen
        Next
    Next
    
    
    ;_stegano-Icon in GUI darstellen
    _WinAPI_StretchBlt($hdc_gui, 140, 50, 100, 100, $hDC_stegano, 0, 0, 32, 32, $SRCCOPY) ;Icon mit 3-facher Größe in die GUI kopieren
    
    
    ;Text aus dem _stegano-Icon extrahieren
    Dim $char_array[32 * 32 * 4]                                       ;platz für die 2-Bit-stücke machen
    $char_array_count = 0
    For $y = 0 To 31                                                   ;spaltenweise Pixel auslesen
        For $x = 0 To 31                                               ;zeilenweise Pixel auslesen
            ;Pixel-farbanteile aus dem Icon holen
            $B = DllStructGetData($struct_stegano, 1, $y * 128 + ($x * 4) + 1) ;blau-anteil des Pixels
            $G = DllStructGetData($struct_stegano, 1, $y * 128 + ($x * 4) + 2) ;gruen-anteil des Pixels
            $R = DllStructGetData($struct_stegano, 1, $y * 128 + ($x * 4) + 3) ;rot-anteil des Pixels
            ;die untersten 2 Byte der farbanteile "herauslösen"
            $char_array[$char_array_count * 3 + 0] = BitAND($B, 3)     ;AND 00000011 löscht die oberen 6 bit, die beiden unteren bleiben erhalten
            $char_array[$char_array_count * 3 + 1] = BitAND($G, 3)
            $char_array[$char_array_count * 3 + 2] = BitAND($R, 3)
            ;Bits aus dem Bitarray dazuaddieren
            $char_array_count += 1                                     ;zähler erhöhen, nächste 3 2er Bits
        Next
    Next
    
    
    $string = ""                                                       ;extrahierter text
    For $i = 0 To UBound($char_array) - 1 Step 4
        $char = $char_array[$i] * 64                                   ;oberste 2bit
        $char += $char_array[$i + 1] * 16                              ;nächste 2 bit
        $char += $char_array[$i + 2] * 4                               ;nächste 2 bit
        $char += $char_array[$i + 3]                                   ;unterste 2 bit
        $string &= Chr($char)                                          ;8 Bit = 1 Byte = 1 char
    Next
    
    
    GUICtrlSetData($label3, $string)                                   ;text in GUI anzeigen
    
    
    ;differenzbild in der GUI anzeigen
    _WinAPI_StretchBlt($hdc_gui, 280, 50, 100, 100, $hDC_icon, 0, 0, 32, 32, $SRCCOPY) ;Orginal Icon mit 3-facher Größe in die GUI kopieren
    _WinAPI_StretchBlt($hdc_gui, 280, 50, 100, 100, $hDC_stegano, 0, 0, 32, 32, $MERGEPAINT) ;stegano-Icon mit 3-facher Größe in die GUI kopieren und mit dem Orginal XOR-Verknüpfen
    
    
    ;da nur sehr kleine Änderungen vorhanden sind, muss das Differenzbild für die Anzeige verstärkt werden...
    ;dazu werden die einzelnen Farbanteile des Differenzbildes mit 64 multipliziert!
    ;Differenzbild erstellen
    $hDC_diff = _CreateNewBmp32(32, 32, $pointer_diff, $hbmp_diff)     ;neue 32-Bit-Bitmap erstellen, Rückgabe: DC, Pointer und Handle
    $struct_diff = DllStructCreate("byte [" & 32 * 32 * 4 & "]", $pointer_diff) ;struct an position des Differenz-Bildes
    _WinAPI_BitBlt($hdc_diff, 0, 0, 32, 32, $hDC_icon, 0, 0, $SRCCOPY) ;Orginal Icon ins DIFF kopieren
    _WinAPI_BitBlt($hdc_diff, 0, 0, 32, 32, $hDC_stegano, 0, 0, $mergepaint) ;stegano-Icon DIFF kopieren und mit dem Orginal XOR-Verknüpfen
    
    
    For $y = 0 To 31                                                   ;spaltenweise Pixel ändern
        For $x = 0 To 31                                               ;zeilenweise Pixel ändern
            ;Pixel-farbanteile aus dem Icon holen
            $B = DllStructGetData($struct_diff, 1, $y * 128 + ($x * 4) + 1) ;blau-anteil des Pixels
            $G = DllStructGetData($struct_diff, 1, $y * 128 + ($x * 4) + 2) ;gruen-anteil des Pixels
            $R = DllStructGetData($struct_diff, 1, $y * 128 + ($x * 4) + 3) ;rot-anteil des Pixels
            $A = DllStructGetData($struct_diff, 1, $y * 128 + ($x * 4) + 4) ;Alpha-anteil des Pixels (wird nicht verändert)
            ;die untersten 2 Byte der farbanteile mit 64 multiplizieren
            ;geänderte bytes zurückschreiben
            DllStructSetData($struct_diff, 1, $B * 64, $y * 128 + ($x * 4) + 1) ;blau-anteil in _diff-bitmap eintragen
            DllStructSetData($struct_diff, 1, $G * 64, $y * 128 + ($x * 4) + 2) ;grün-anteil in bitmap eintragen
            DllStructSetData($struct_diff, 1, $R * 64, $y * 128 + ($x * 4) + 3) ;rot-anteil in bitmap eintragen
            DllStructSetData($struct_diff, 1, $A, $y * 128 + ($x * 4) + 4) ;alpha-anteil in bitmap eintragen
        Next
    Next
    _WinAPI_StretchBlt($hdc_gui, 400, 50, 100, 100, $hDC_diff, 0, 0, 32, 32, $SRCCOPY) ;verstärktes Differenzbild mit 3-facher Größe in die GUI kopieren
    
    
    ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
    Do                                                                 ;falls GUI minimiert oder übermalt wird, Bilder zeichnen
        _WinAPI_StretchBlt($hdc_gui, 10, 50, 100, 100, $hDC_icon, 0, 0, 32, 32, $SRCCOPY) ;Orginal-Icon mit 3-facher Größe in die GUI kopieren
        _WinAPI_StretchBlt($hdc_gui, 140, 50, 100, 100, $hDC_stegano, 0, 0, 32, 32, $SRCCOPY) ;stegano-Icon mit 3-facher Größe in die GUI kopieren
        _WinAPI_StretchBlt($hdc_gui, 400, 50, 100, 100, $hDC_diff, 0, 0, 32, 32, $SRCCOPY) ;verstärktes Differenzbild mit 3-facher Größe in die GUI kopieren
    Until GUIGetMsg() = -3 * Sleep(50)
    
    
    ;stegano-Icon speichern, man kann natürlich andere Dateiformate als BMP verwenden, sollte dann aber die Kompression ausschalten...sonst wird die Nachricht "wegkompriimiert"
    #include <gdiplus.au3>
    _GDIPlus_Startup()
    _GDIPlus_ImageSaveToFile(_GDIPlus_BitmapCreateFromHBITMAP($hbmp_icon), @ScriptDir & "\Orginal-Icon.bmp")  ;oder png oder unkomprimiertes JPG...
    _GDIPlus_ImageSaveToFile(_GDIPlus_BitmapCreateFromHBITMAP($hbmp_stegano), @ScriptDir & "\Stegano-Icon.bmp")  ;oder png oder unkomprimiertes JPG...
    _GDIPlus_Shutdown()
    shellexecute("Orginal-Icon.bmp")  ;auf Bildschirmgröße vergrößern und vergleichen!
    shellexecute("Stegano-Icon.bmp")
    
    
    
    
    ;DC´s und Handles entladen
    _Delete_Bitmap32($hDC_icon, $hbmp_icon)
    _Delete_Bitmap32($hDC_stegano, $hbmp_stegano)
    _Delete_Bitmap32($hDC_diff, $hbmp_diff)
    Exit
    
    
    
    
    
    
    
    
    Func _Delete_Bitmap32($hDC, $hBmp)
        _WinAPI_DeleteObject($hBmp)
        _WinAPI_ReleaseDC(0, $hDC)
    EndFunc                                                            ;==>_Delete_Bitmap32
    
    
    
    
    Func _CreateNewBmp32($iwidth, $iheight, ByRef $ptr, ByRef $hBmp)   ;erstellt leere 32-bit-Bitmap; Rückgabe DC und ptr und handle auf die Bitmapdaten
        ;by Andy
        Local $hcdc = _WinAPI_CreateCompatibleDC(0)                    ;Desktop-Kompatiblen DeviceContext erstellen lassen
        Local $tBMI = DllStructCreate($tagBITMAPINFO)                  ;Struktur der Bitmapinfo erstellen und Daten eintragen
        DllStructSetData($tBMI, 1, DllStructGetSize($tBMI) - 4)        ;Structgröße abzüglich der Daten für die Palette
        DllStructSetData($tBMI, 2, $iwidth)
        DllStructSetData($tBMI, 3, -$iheight)                          ;minus =standard = bottomup
        DllStructSetData($tBMI, 4, 1)
        DllStructSetData($tBMI, 5, 32)                                 ;32 Bit = 4 Bytes => AABBGGRR
        Local $adib = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'uint', 0)
        $hBmp = $adib[0]                                               ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
        $ptr = $adib[4]                                                ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
        ;_arraydisplay($adib)
        _WinAPI_SelectObject($hcdc, $hBmp)                             ;objekt hbitmap in DC
        Return $hcdc                                                   ;DC der Bitmap zurückgeben
    EndFunc                                                            ;==>_CreateNewBmp32
    Alles anzeigen

    Als "Nachricht" kann man alles mögliche verstecken, z.B. andere Dateien (*.EXE, *.XLS, *.TXT *.MP3). Wobei man nicht festgelegt ist, mit welchen Bits und wo in der Containerdatei welche Daten wie gespeichert werden...
    Um der Freundin einen heissen Liebesbrief zu schicken, reicht es ab heute, ihr einen harmlosen Smilie mit entsprechendem Inhalt zu senden....

    Fehlt nur noch die Steganographie.UDF....ich habe eine , aber wo bleibt dann der Anreiz für euch ? Baut selbst etwas eigenes...eine digitale Signatur eurer Bilder oder MP3´s mit integriertem Coverbild und Lyrics, HAPPY PROGRAMMING!

    Wer das Script einigermassen nachvollzogen hat, der bemerkt, daß die GUI nur zum Anzeigen der Bilder nötig ist. Das "Blitten" und das Ersetzen der Bits findet im Speicher statt! Also auch etwas für "nicht GDI+-Fuzzis :thumbup:

    //EDIT 24.04.2014
    Eine schöne Umsetzung der Steganographie mittels sehr schnellem Assembler-Codes gibt es vom User Xenon

    Dateien

    Stegano-Icon.bmp 4,15 kB – 3.908 Downloads
  • Auslesen einer CSV via Dim

    • Andy
    • 15. August 2010 um 17:48
    Zitat

    Nur wenn ich keine 7 Zeilen haben stürztes ab..

    Glatt gelogen! Du bekommst eine Fehlermeldung ausgegeben! Wenn du diese Fehlermeldung nicht beachtest, wessen Problem ist das?

    Zitat

    .. kann man dort noch etwas einbauen..

    Ja, Errorhandling in das Script einfügen. S.o.

    Zitat

    ich habe immoment leider keine Idee

    Fehlermeldung lesen hilft....


    Du rufst das Array-Item mit einem Index auf, der größer ist als das aktuelle Array. . Schau mal in der Hilfe das Beispiel von

    [autoit]

    Ubound()

    [/autoit]
  • Dreieck mit GDI+ Farbverlauf füllen

    • Andy
    • 14. August 2010 um 18:57

    Ich hatte, um verschiedene Farbpaletten zu erstellen, etwas ähnliches geschrieben. Die Stützfarben werden angegeben, die Zwischenfarben in beliebiger Schrittweite ausgerechnet

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>
    #include <Color.au3>
    Opt("GUIOnEventMode", 1)
    ;Palette für den Farbverlauf RRGGBB
    ;
    ;
    $rot=0xFF0000
    $gelb=0xFFFF00
    $schwarz=0x000000
    $weiss=0xFFFFFF
    $blau=0x0000FF

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

    $random=random(0,255^3,1);zufallsfarbe erzeugen

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

    ;die Grundfarben werden in ein array eingetragen, die funktion berechnet dann alle zwischenfarben
    Dim $Farbverlauf_1[2]=[0xFF0000,0x00FF00];Rot+Grün
    Dim $Farbverlauf_2[2]=[$random,0xFFFFFF];Blau +Weiß
    Dim $Farbverlauf_3[6]=[$schwarz,$rot,$gelb,$weiss,$blau,$schwarz];
    ;-----------------------------------------------
    $hGUI = GUICreate("Farbverlauf", 1024, 500, 557, 78)
    GUISetOnEvent(-3, "death")
    GUISetState(@SW_SHOW)

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

    ;-----------------------------------------------
    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $bin="0x"

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

    Draw() ;farbverläufe zeichnen

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

    While 1
    Sleep(20)
    tooltip("Farbcode: "&hex(pixelgetcolor(mousegetpos(0),mousegetpos(1),$hgui)))
    WEnd

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

    func draw() ;zeichnet 3 Farbverläufe in die GUI
    for $i=0 to 800
    $col = _createcolorfrompalette($farbverlauf_1, $i, 800) ;ermittelt die Farbe zwischen den arrayinhalten
    $pen = _GDIPlus_PenCreate($col+0xFF000000) ;übergibt diese Farbe einem brush
    _GDIPlus_Graphicsdrawline($hGraphic, $i, 50, $i,150 , $pen) ;füllt ein rechteck mit dieser Farbe aus
    _GDIPlus_PenDispose($pen) ;löscht den pen
    next
    ;3. Farbverlauf 100 Pixel breit von rechts nach links halbtransparent
    for $i=0 to 500
    $col = _createcolorfrompalette($farbverlauf_3, $i, 500) ;ermittelt die Farbe zwischen den arrayinhalten
    $pen = _GDIPlus_PenCreate($col+0xFF000000) ;übergibt diese Farbe einem brush
    _GDIPlus_Graphicsdrawline($hGraphic, $i, 200, $i,300 , $pen) ;füllt ein rechteck mit dieser Farbe aus
    _GDIPlus_PenDispose($pen) ;löscht den pen
    next
    for $i=0 to 200
    $col = _createcolorfrompalette($farbverlauf_2, $i, 200) ;ermittelt die Farbe zwischen den arrayinhalten
    ;$bin&="00"&stringright(hex($col,6),2)&stringmid(hex($col,6),3,2)&stringleft(hex($col,6),2)
    $pen = _GDIPlus_PenCreate($col+0xFF000000) ;übergibt diese Farbe einem brush
    _GDIPlus_Graphicsdrawline($hGraphic, $i, 350, $i,450 , $pen) ;füllt ein rechteck mit dieser Farbe aus
    _GDIPlus_PenDispose($pen) ;löscht den pen
    next

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

    endfunc

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

    Func death()
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>death

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

    Func _createcolorfrompalette(ByRef $aPalette, $count, $maximum) ;gibt zwischenfarbe anhand der beiden Nachbarn im Palette-array zurück
    Local $ubound = UBound($aPalette) - 1 ;maximale Anzahl Palettenfarben
    Local $percent = $count * $ubound / $maximum ;Position innerhalb des Palettenarrays
    $index = Int($percent) ;index des Palettenarrays "unterhalb" von percent
    If $percent = $index Then Return $aPalette[$index] ;bei genauem indextreffer farbe zurückgeben

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

    $startrot = _ColorGetRed($aPalette[$index]) ;startfarbe
    $startgruen = _ColorGetGreen($aPalette[$index])
    $startblau = _ColorGetBlue($aPalette[$index])
    $endrot = _ColorGetRed($aPalette[$index + 1]) ;endfarbe
    $endgruen = _ColorGetGreen($aPalette[$index + 1])
    $endblau = _ColorGetBlue($aPalette[$index + 1])

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

    $xx = (($percent - $index)) ;faktor zwischen 0 und 1

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

    $r = Int($startrot - ($startrot - $endrot) * $xx) * 256 * 256 ;zwischenrot
    $g = Int($startgruen - ($startgruen - $endgruen) * $xx) * 256 ;zwischengruen
    $b = Int($startblau - ($startblau - $endblau) * $xx) ;zwischenblau
    Return $r + $g + $b
    EndFunc ;==>_createcolorfrompalette

    [/autoit]
  • Die WinApi erweitern!

    • Andy
    • 14. August 2010 um 18:13
    Zitat

    Gut, wie ich gesehen habe gibt es noch viele viel ander Funktionen

    zwischen 30 und 40tausend, genau weiss das wohl keiner...öffne einfach mal alle Dll´s unterhalb vom Windowsverzeichnis und lass dir die Funktionen ausgeben....viel Spass dabei^^
    Gestern oder heute wurde hier doch ein Funktionenviewer für Dll´s vorgestellt...

  • Die WinApi erweitern!

    • Andy
    • 14. August 2010 um 14:59

    Yashied hat sich schon die Mühe gemacht.....http://www.autoitscript.com/forum/index.php?showtopic=98712&view=findpost&p=709878

  • Hosts-Datei im ganzem Lan verfügbar

    • Andy
    • 14. August 2010 um 14:56

    Na klar geht das, Beispiele findet die Suche reichlich...
    Aber das ist alles viel zu viel Aufwand! Wer ändert 23x am Tag seine Hosts-Datei? Wie I2C schon sagte, EINE Datei zentral und alle anderen Rechner im Lan verweisen auf diese Datei. Dann musst du nur 1x an jeden Rechner um den Pfad anzupassen und ab dann nie mehr....

  • Daten lesen aus eine sich schnell ändernde Datei ?

    • Andy
    • 14. August 2010 um 14:50

    Schau dir mal in der Hilfe das Beispiel zu _winapi_setfilepointer() an.
    Damit ist es möglich, bereits geöffnete Dateien ab einer bestimmten Position zu lesen. Allerdings kann es sein, daß während des Schreibvorgangs des anderen Programms der letzte Teil der Datei "gelockt" wird. Hier im Forum gibt es dazu auch Beispiele, wie mehrere Programme Zugriff auf eine Datei erhalten.

  • Herzlichen Glückwunsch Stilgar

    • Andy
    • 14. August 2010 um 14:41

    Glücklichen Herzwunsch auch von mir!

  • Funktion um die Funktionen einer DLL aufzulisten

    • Andy
    • 14. August 2010 um 01:32

    Ich schiesse gleich mit Kanonen auf Spatzen, dann ist man sicher, dass die keine weiteren Geheimnisse mehr haben ==> IDA Pro, damit fällt es auch relativ leicht, wenigstens an die Anzahl und Art der Parameter zu kommen.

  • TCPConnect über Internet

    • Andy
    • 14. August 2010 um 01:18
    Zitat

    Der Router leitet nut Anfragen die von innerhalb des Netzes an die eigene öffentliche IP gehen zum Webinterface um.

    Welches Webinterface? Das vom Router?
    Oder habe ich etwas falsch verstanden?
    Wenn du im internen Netz einen Dienst, bspw einen FTP-Server laufen hast, der über das externe Netz erreichbar ist, dann werden Anfragen aus dem internen Netz an diesen Dienst an die öffentliche=externe IP natürlich nicht erst "raus" ins Internet geleitet, was sollen die auch da? Ne Ehrenrunde drehen und wieder zurückkommen?
    Genauso verhält sich das mit den AutoIt-Servern. Da kannst du externe IP´s angeben so viel du willst, solange der Dienst "direkt" vom Router erreichbar ist, leitet er dich auch sofort auf dem kürzesten Weg dorthin....

  • Kürzester Weg berechnen

    • Andy
    • 12. August 2010 um 15:51

    Und bei dem "gigantischen Problem" erübrigt sich die Sache eigentlich von alleine....
    -Wegpunkte ermitteln
    -Strecken zwischen den Wegpunkten ermitteln (Grundschule)
    -FOR/TO Schleife addiert nacheinander die möglichen Wegstrecken. Kürzeste merken.
    -Fertig
    Ich schätze, 20-30 Minuten Aufwand für einen blutigen Anfänger (der in der Lage ist, die Hilfe zu bedienen)

  • Aus Array nur bestimmte Werte ausgeben in Textdatei

    • Andy
    • 12. August 2010 um 15:42
    Spoiler anzeigen
    [autoit]

    #include<File.au3>
    #include <Excel.au3>
    #include <Array.au3>

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

    $sFileContent = FileRead("Report.csv.txt")

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

    ;msgbox("","test", $sFileContent)

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

    Dim $text
    Dim $var1, $var2
    $var1 = 265
    $var2 = 263

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

    Local $aMyIDs[13] = [$var1, $var2, "540", "515", "517", "520", "523", "528", "529", "586", "538", "555", "556"]

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

    ;_ArrayDisplay($aMyIDs, "Array using Default Parameters")

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

    $hFile = FileOpen("Test.txt", 2)
    ;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hFile = ' & $hFile & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    For $i = 0 To UBound($aMyIDs) - 1
    ; ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $i = ' & $i & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    $aFound = StringRegExp($sFileContent, "," & $aMyIDs[$i] & ",(.*)", 3) ; Filtere alle Zeilen, die mit der ID anfangen
    ;_arraydisplay($aFound)
    If @error Then ContinueLoop ; nichts gefunden
    For $k = 0 To UBound($aFound) - 1
    $text = (StringStripWS($aFound[$k], 3) & @CRLF)
    $text = StringReplace($text, ",", " ")

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

    FileWriteLine($hFile, $text)
    ;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $text = ' & $text & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    Next
    Next

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

    FileClose($hFile)

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

    ShellExecute("Test.txt")

    [/autoit]

    habe mal die "Debug"-infos auskommentiert, so findet man die "Fehler" relativ schnell. Regex angepasst

  • Kürzester Weg berechnen

    • Andy
    • 12. August 2010 um 14:22

    Zur Lösung des Travelling Salesman-Problem TSP hatte ich früher auch schon einige Programme erstellt, aber das wird erst ab einer Strecke oberhalb von 20-30 Wegpunkten interessant. Bis dahin kann man brute-forcen.
    Ab 1000 Wegpunkten aufwärts wirds mit reinem AutoIt-code träge. Wer "Futter" für seine Algorithmen sucht, wird HIER fündig

  • Stadt, Land, Fluss -Generator

    • Andy
    • 12. August 2010 um 05:13

    Als "Stringfreak" kommen mir keine Arrays ins Haus!^^

    [autoit]

    $Buchstaben = "abcdefghijklmnopqrstuvwxyz"

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

    Do
    $erg = _BuchstabeRandom($Buchstaben) ;einen zufälligen Buchstaben aus der Liste holen
    Until ConsoleWrite($erg) = 0 ;so lange, bis die Liste leer ist, Buchstaben in die Console schreiben
    ConsoleWrite(@CRLF) ;damit es auch schön aussieht^^

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

    Func _BuchstabeRandom(ByRef $Buchstaben)
    Local $ret = StringMid($Buchstaben, Random(1, StringLen($Buchstaben), 1), 1) ;zufälligen Buchstaben...
    $Buchstaben = StringReplace($Buchstaben, $ret, "", 1, 1) ;...aus der Liste löschen
    Return $ret ;zufälligen Buchstaben zurückgeben
    EndFunc ;==>_BuchstabeRandom

    [/autoit]
  • Assembler Hilfe-Thread

    • Andy
    • 12. August 2010 um 04:24
    Zitat

    Wie sehen denn "einfache" Schleifen aus?

    Da gibt es mehrere Möglickeiten. Die einfachste ist der LOOP. Man lädt die Anzahl der Schleifendurchläufe in das ECX-Register und jedes Mal, wenn der LOOP ausgeführt wird, erniedrigt sich der Wert von ECX um eins.
    Also äquivalent zu:

    [autoit]

    $EAX=0
    For $ECX=33 to 0 step -1
    $EAX=$EAX+3
    next

    [/autoit][autoit]

    FasmAdd($Fasm, "use32") ;wir benutzen den 32-Bit Assembler
    FasmAdd($Fasm, "mov eax,0") ;EAX=0
    FasmAdd($Fasm, "mov ecx,33") ;Schleifenzähler
    FasmAdd($Fasm, "Label1:") ;Sprungmarke
    FasmAdd($Fasm, "add eax,3") ;EAX=EAX+3
    FasmAdd($Fasm, "Loop Label1") ;ECX=ECX-1 : Springe zur Sprungmarke bis ECX=0
    FasmAdd($Fasm, "ret")
    Local $Ret = MemoryFuncCall("int", FasmGetFuncPtr($Fasm))
    _arraydisplay($ret)

    [/autoit]

    Aber der Loop kann noch mehr! Je nachdem, welches Abbruchkriterium noch gebraucht wird (bestimmt durch ZF, das Zero-Flag), kann man die Schleife schon vorher abbrechen!

    [autoit]

    FasmAdd($Fasm, "mov eax,54") ;EAX=54 ;von 54 runterzählen
    FasmAdd($Fasm, "mov ecx,33") ;Schleifenzähler
    FasmAdd($Fasm, "Label1:") ;Sprungmarke
    FasmAdd($Fasm, "sub eax,3") ;EAX=EAX-3
    FasmAdd($Fasm, "LOOPNZ Label1") ;ECX=ECX-1 : Springe zur Sprungmarke bis ECX=0 oder ZeroFlag=1
    FasmAdd($Fasm, "mov eax,ecx") ;ECX=15 d.h. die Schleife wurde 18 mal durchlaufen 18*3=54
    FasmAdd($Fasm, "ret")
    Local $Ret = MemoryFuncCall("int", FasmGetFuncPtr($Fasm))
    _arraydisplay($ret)

    [/autoit]


    Allerdings kann man das auch "zu Fuß" machen. Statt LOOP schreibt man dann

    Code
    sub ecx,1  ;ecx=ecx-1
    JNZ Label1  ;Jump if Not Zero   zum Label

    Bei dieser Gelegenheit noch eine kleine Anmerkung zu den Labels.
    Bei FASM kann man beliebig viele "anonyme" Label setzen mit @@:
    Zu diesen Labels kann man dann mit @b (backwards) zurückspringen oder mit @f (foreward) nach vorne springen

  • Tutorial AutoIt und Assembler UPDATE 24. Oktober 2010 Verwendung von Autoitvariablen im Assemblercode

    • Andy
    • 11. August 2010 um 16:58

    Beispiel_3 Verwenden eigener Variablennamen

    Ein großer Vorteil von Assembler ist die enorme Geschwindigkeit, mit der Daten, die sich in den Prozessorregistern befinden, verarbeitet werden. Leider ist die Anzahl dieser Register IMMER zu wenig^^. Es gibt nun 2 Möglichkeiten, einen "Zwischenspeicher" zu erstellen.
    Man legt per PUSH-Befehl die Daten einfach auf dem Stack ab, um sie mit dem POP Befehl wieder abzuholen, oder man definiert einfach Variablen in seinem Script!

    PUSH EAX ;legt den Inhalt von EAX auf dem Stack ab
    PUSH 122 ;legt 122 auf dem Stack ab
    ;irgendwelcher Code
    POP EBX ;EBX=122 nimmt das oberste Element vom Stack und löscht dieses Element auf dem Stack
    POP ECX ;ECX=(ehemaliges)EAX nimmt das oberste Element vom Stack und löscht dieses Element auf dem Stack

    Push und Pop sollten immer zusammen verwendet werden, um nach dem Abschluss des Programms einen definierten Zustand auf dem Stack zu erhalten!
    Wer mehrere Register auf einen Streich sichern möchte, sollte sich PUSHA (Push all) und POPA mal ansehen, bzw PUSHAD und POPAD.

    Eine weitere Möglichkeit ist die Verwendung von Variablen, die auch im Code verwendet werden können.
    Da diese Variablen eigentlich nur Zeiger auf einen verwendeten Speicherbereich sind, gilt auch hier: Bei Verwendung von Prozessorbefehlen immer das Format beachten!
    Es gibt nur sehr wenige Befehle, die direkt Daten im Speicher manipulieren können, ohne den Befehl über ein Register zu gehen.

    Variablen sind wie gesagt einfache Speicherbereiche. Diese können in Assembler nach folgendem Muster angelegt werden:
    Variablenname db(Byte)/dw(word)/dd(dword)/dq(quadword) Inhalt (s. Zeilen 15-19)

    [autoit]

    ;Verwendung von Variablen
    Dim $Fasm = FasmInit()

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

    FasmReset($Fasm)
    FasmAdd($Fasm, "use32")
    FasmAdd($Fasm, "org "&FasmGetBasePtr($Fasm)) ;Dem Assembler die zzt aktuellen Segmentregister bzw Offsets mitteilen
    ; FasmAdd($Fasm, "return db 195 ") ;trägt das Mnemonic 195=C3h in den Code ein = RET , also zurück zum aufrufenden Programm!
    FasmAdd($Fasm, "mov eax,dword[erste]") ;EAX=22 speicherinhalt an der Adresse von "erste"
    ; FasmAdd($Fasm, "mov eax,erste") ;EAX= Speicheradresse, an der die Variable "erste" beginnt
    FasmAdd($Fasm, "ret") ;zurück zum aufrufenden Programm
    ;ab hier kommen die Variablen, diese sollten immer HINTER dem Programmcode stehen
    ;wer erfahren möchte was passiert, wenn Variablen irgendwo im Code eingetragen werden, der kommentiert einfach die "return db 195"-Zeile aus....
    ;der Assembler assembliert natürlch stur seinen Code, und wenn der Prozessor ein C3 als nächsten Befehl bekommt, dann bedeutet das RET!!!

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

    FasmAdd($Fasm, "erste dd 77 ") ;den Wert 22 als Inhalt in das reservierte dword eingetragen $erste=22
    FasmAdd($Fasm, "zweite db 8 dup(7)") ;8 Bytes reservieren mit jeweils dem Inhalt 7 das wird zu 0707070707070707
    FasmAdd($Fasm, "dritte dq 1001001b") ;Quadword (4 Words= 8 Bytes) und binären Inhalt eintragen
    FasmAdd($Fasm, "string db 'Hallo, das ist ein nullterminierter String',0 ") ;String
    FasmAdd($Fasm, "variable1 dd ?") ;nicht näher bezeichnete resevierte 4 bytes

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

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

    [/autoit]


    Was ist zu beachten? Zunächst muss dem Assembler mit der ORG-Anweisung mitgeteilt werden, in welchem Speicherbereich er zu werkeln hat.
    Anhand dieser Adresse "errechnet" er die Position unserer Variablen BEVOR er das Script assembliert! Das heisst im vorliegenden Fall, daß er die Speicheradresse, in der unser Bytecode steht (Startadresse) nimmt, und die Bytes zählt, bis er beim ersten Byte der entsprechenden Variablen ist. Kompliziert? Egal, Beispiel:
    Unser obiges Programm vom ersten mov eax...blabla bis zum ret besteht aus 6 Bytes. (kann man schön in der Konsole sehen, C3 ist das RET)
    Das heisst, das 7. Byte hinter dem Programmcode ist das erste Byte der Variablen "erste".
    Im weiteren zählt der Assembler zu der Startadresse einfach 7 Bytes dazu und hat so die Adresse von "erste". "erste" ist 4 Bytes lang, also ist Adresse von "zweite" = Startadresse + 6 Bytes Programm + 4 Bytes "erste" +1 (das erste Byte von "zweite")
    Muss uns das eigentlich interessieren was der Assemmbler da macht?
    Eigentlich nicht, aber aufmerksame Mitleser haben bemerkt, daß ich im Beispiel den MemoryFuncCall() verwendet habe!
    Der Witz ist nämlich, daß der Assembler ohne das ORG die Startadresse mit Null annimmt. Die Adresse der Variablen wird also zu "zweite" = 0 + 6 Bytes Programm + 4 Bytes "erste" +1 (das erste Byte von "zweite")
    Nun ratet mal was passiert, wenn das Programm irgendwo in den Speicher geladen wird und auf die (vermeintliche) Variable an Adresse 0x0000000B zugegriffen wird?

    BÄÄÄÄÄM, Windows-Schutzverletzung, den dieser Speicherbereich ist geperrt, Windows erlaubt nur Speicherzugriffe im AutoIt zugeteilten Speicherbereich!
    Und nu?
    MemoryFuncCall()-Verwender sind aus dem Schneider und lachen sich eins^^, aber wer auch den Bytecode (ohne die FASM.AU3 und MEMORY.AU3) verwenden will, der muss was herausfinden?
    Naja, die Startadresse (Position, an der der Bytecode im Speicher liegt) des Programms! Die müsste man dann einfach zu den Adressen der Variablennamen dazuzählen, und alles wäre paletti!
    Und das ist ja einfach, denn die Startadresse haben wir ja bereits! Diese Startadresse wird ja dem CallWindowProcW mittels "ptr", DllStructGetPtr($tCodeBuffer) übergeben! Aber um nicht einen der 4 wertvollen der Übergabe-Parameter mit dem Pointer zu "verschwenden" habe ich ein wenig gestöbert und herausgefunden, daß beim Starten unseres Bytecodes die Startadresse im ESI-Register steht! Ob AutoIt oder Windows dafür verantwortlich sind, ist mir ehrlich gesagt egal^^

    Unsere Variablenadresse erhalten wir also mit

    [autoit]


    FasmAdd($Fasm, "mov eax,dword[esi+erste]") ;EAX=22 Speicherinhalt an der Adresse von "erste"

    [/autoit]

    und lassen den ORG-Befehl weg. Denn wie schon gesagt, ermittelt ORG die Adressen ja VOR dem Assemblerlauf, aber unser Bytecode kann ja später irgendwoanders im Speicher stehen!
    Wer jetzt aufgepasst hat, der fragt sich was passiert, wenn man im Beispiel den ORG-Befehl NICHT weglässt....in unserem Beispiel nichts aufregendes, denn das aktuelle Speichersegment wurde ja während des Programmlaufs nicht verändert! Aber wenn der Bytecode kopiert, und von einem anderen Programm verwendet wird, gibt es einen Absturz...weil durch die ORG-Anweisung im Bytecode FESTE Adressen der Variablen verwendet wurden...

    Für die Bytecoder...

    [autoit]

    ;Verwendung von Variablen
    Dim $Fasm = FasmInit()
    FasmReset($Fasm)
    FasmAdd($Fasm, "use32")

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

    FasmAdd($Fasm, "mov eax,dword[esi+erste]") ;EAX=77 ESI ist Basisadresse des Programms, "erste" die Anzahl Bytes bis zur Variable
    ;folgende 2 Zeilen zum Verdeutlichen auskommentieren
    ; FasmAdd($Fasm, "mov eax,erste") ;erste die Anzahl Bytes von 0 bis zur Variable
    ; FasmAdd($Fasm, "mov eax,esi") ;in ESI steht die Startadresse im Speicher
    FasmAdd($Fasm, "ret") ;zurück zum aufrufenden Programm
    ;ab hier kommen die Variablen
    FasmAdd($Fasm, "erste dd 77 ") ;den Wert 77 als Inhalt in das reservierte dword eingetragen $erste=77
    FasmAdd($Fasm, "zweite db 8 dup(7)") ;8 Bytes reservieren mit jeweils dem Inhalt 7 das wird zu 0707070707070707
    FasmAdd($Fasm, "dritte dq 1001001b") ;Quadword (4 Words= 8 Bytes) und binären Inhalt eintragen
    FasmAdd($Fasm, "string db 'Hallo, das ist ein nullterminierter String',0 ") ;String
    FasmAdd($Fasm, "variable1 dd ?") ;nicht näher bezeichnete resevierte 4 bytes

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

    ConsoleWrite(String(FasmGetBinary($Fasm)) & @CRLF)
    $tCodeBuffer = DllStructCreate("byte[512]") ;Speicher für den assemblercode belegen
    DllStructSetData($tCodeBuffer, 1, String(FasmGetBinary($Fasm)))
    $a = DllCall("user32.dll", "int", "CallWindowProcW", "ptr", DllStructGetPtr($tCodeBuffer),"int",0,"int",0, "int", 0,"int",0);bytecode aufrufen, rückgabe in a[0]
    _arraydisplay($a)
    FasmExit($Fasm)

    [/autoit]


    Bytecode aus der Konsole kopieren und starten..

    [autoit]

    $tCodeBuffer = DllStructCreate("byte[512]") ;Speicher für den Assemblercode belegen
    DllStructSetData($tCodeBuffer, 1, "0x8B4604C34D0000000707070707070707490000000000000048616C6C6F2C20646173206973742065696E206E756C6C7465726D696E69657274657220537472696E6700")
    $a = DllCall("user32.dll", "int", "CallWindowProcW", "ptr", DllStructGetPtr($tCodeBuffer),"int",5,"int",3, "int", 0,"int",0);bytecode aufrufen, rückgabe in a[0]
    ;Inhalt der Variablen "erste" im Bytecode ausgeben
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $m = ' & $a[0]& @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit]

    Die Variablen sind ja nur eine aufeinanderfolgende Anzahl von Bytes, daher muss penibel auf den Datentyp bzw. Datenformat geachtet werden! Man kann natürlich einfach "mehr" Daten lesen, als für diese Variable reserviert ist.

    [autoit]

    ;Verwendung von Variablen
    Dim $Fasm = FasmInit()
    FasmReset($Fasm)
    FasmAdd($Fasm, "use32")
    FasmAdd($Fasm, "mov eax,0") ;register leeren
    FasmAdd($Fasm, "mov al,byte[esi+var1]") ;Var1 ist ein Byte, es wird ein Byte ins Lowbyte von EAX ausgelesen
    ; FasmAdd($Fasm, "mov ax,word[esi+var1]") ;Var1 ist ein Byte, es wird aber ein Word=2 Byte ins Low-und Highbyte (zusammen AX) von EAX ausgelesen
    ; FasmAdd($Fasm, "mov eax,dword[esi+var1]") ;Var1 ist ein Byte, es wird aber ein dWord=4 Byte ausgelesen
    ;da beim Lesen unerlaubterweise auf DATEN AUSSERHALB DES PROGRAMMCODES zugegriffen wird (die 2 Byte "hinter" var2) gibt es
    ;ggf einen Absturz, wenn Windows diese 2 Byte für ein anderes Programm reserviert hat!!!!
    ;daher niemals über das letzte Datenbyte hinaus Daten lesen oder schreiben!
    FasmAdd($Fasm, "ret") ;zurück zum aufrufenden Programm
    ;ab hier kommen die Variablen
    FasmAdd($Fasm, "var1 db 15h") ;15hex ins Byte schreiben
    FasmAdd($Fasm, "var2 db 66h") ;66hex ins Byte schreiben

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

    ConsoleWrite(String(FasmGetBinary($Fasm)) & @CRLF)
    $tCodeBuffer = DllStructCreate("byte[512]") ;Speicher für den assemblercode belegen
    DllStructSetData($tCodeBuffer, 1, String(FasmGetBinary($Fasm)))
    $a = DllCall("user32.dll", "int", "CallWindowProcW", "ptr", DllStructGetPtr($tCodeBuffer),"int",0,"int",0, "int", 0,"int",0);bytecode aufrufen, rückgabe in a[0]
    msgbox(0,"EAX",hex($a[0],8))
    _arraydisplay($a)
    FasmExit($Fasm)

    [/autoit]

    Zum Verdeutlichen die auskommentierten Zeilen ausführen...

    Apropos...Daten in Variablen einfügen geht natürlich auch^^

    [autoit]

    ;Verwendung von Variablen
    Dim $Fasm = FasmInit()
    FasmReset($Fasm)
    FasmAdd($Fasm, "use32")
    FasmAdd($Fasm, "mov eax, [esp+4]") ;EAX=33 erster Parameter von CallWindowProcW
    FasmAdd($Fasm, "mov dword[esi+var1],eax") ;$var1=33 wenn die Datentypen "passen", kann man das "dword" weglassen!
    FasmAdd($Fasm, "mov eax, [esp+8]") ;EAX=4567 zweiter Parameter von CallWindowProcW
    FasmAdd($Fasm, "mov [esi+var2],eax") ;$var2=4567
    ;beide Variablen addieren, ADD erlaubt nicht, Speicherzellen direkt zu addieren ADD [SpeicherX],[SpeicherY] funktioniert nicht
    FasmAdd($Fasm, "mov ebx,[esi+var2]");EBX=$var2=4567
    FasmAdd($Fasm, "mov ecx,[esi+var1]");ECX=$var1=33
    FasmAdd($Fasm, "add ecx,ebx") ;ECX=ECX+EBX addieren
    FasmAdd($Fasm, "mov eax,ecx") ;EAX=ECX
    FasmAdd($Fasm, "ret") ;zurück zum aufrufenden Programm
    ;ab hier kommen die Variablen
    FasmAdd($Fasm, "var1 dd 0") ;dword reservieren
    FasmAdd($Fasm, "var2 dd 0") ;dword reservieren

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

    ConsoleWrite(String(FasmGetBinary($Fasm)) & @CRLF)
    $tCodeBuffer = DllStructCreate("byte[512]") ;Speicher für den assemblercode belegen
    DllStructSetData($tCodeBuffer, 1, String(FasmGetBinary($Fasm)))
    $a = DllCall("user32.dll", "int", "CallWindowProcW", "ptr", DllStructGetPtr($tCodeBuffer),"int",33,"int",4567, "int", 0,"int",0);bytecode aufrufen, rückgabe in a[0]
    _arraydisplay($a)
    FasmExit($Fasm)

    [/autoit]

    Das ESI-Register ist ziemlich wichtig, wenn es z.B. um das Kopieren oder durchsuchen von Speicher geht. Daher sollte man, falls ESI anderweitig gebraucht wird, ein anderes, sonst nicht verwendetes Register (z.B. EBX) verwenden.
    mov ebx,esi
    ;esi verwenden
    add ecx,[ebx+var1] ;Variable in ECX schreiben

    oder
    PUSH esi
    ;esi verwenden
    POP esi
    add ecx,[esi+var1] ;Variable in ECX schreiben


    /EDIT/ 14. Februar 2012
    HIER wird beschrieben, wie man auf Variablen zugreift, auch wenn das ESI-Register nicht die Startadresse des ASM-Codes im Speicher enthält.

  • TCPConnect über Internet

    • Andy
    • 11. August 2010 um 13:04

    Anleitung war wohl von AutoBert gemeint^^, aber um die Uhrzeit kann so etwas mal passieren

  • Verschlüsselung

    • Andy
    • 11. August 2010 um 09:27

    Das rätselhafte waren die verwirrenden Doppelpunkte ^^

    [autoit]

    msgbox(0,"",binarytostring("0x"&stringreplace("50:61:73:73:77:6f:72:64:3a:20:77:78:33",":","")))

    [/autoit]

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™