[C/C++] [Assembler-Tut] WindowStealther

Dieses Thema im Forum "Programmier Tutorials" wurde erstellt von KingKa0s, 23. März 2006 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 23. März 2006
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    [Assembler-Tut] WindowStealther

    Bevor ich in den Urlaub gefahren bin habe ich eine PN bekommen, weil jemand das Programm nicht laden konnte, also habe ich es (um zu erreichen, das die Exe kleiner ist) das Programm mal in ASM übersetzt, um das Programm hier im board in den Anhang laden zu können. Inzwischen gibt es ja XUP auf das ich meine (auch in C++ geschriebenen, etwas größeren) Programme hochladen kann.

    Das soll mich aber nicht davon abhalten euch ein Tutorial in Assemblerprogrammierung zu bieten. Der (in lowlevel Assembler geschriebene) Quellcode ist sehr ausführlich (fast jede Zeile) und deutsch kommentiert. In der *.ASM-Datei steht mit welchem Compiler man die Datei compilieren kann.

    https://xup.in/dl,21439659/http:xupraidrushwsdownloadphpvalid1id2dcd9961b08f60d263f07527515f0.rar/
    EXE-Size: 6.144 Bytes


    Beschreibung:

    Das Programm kann Fenster halbdurchsichtig (tranzkluent) machen. Dazu muss man einfach das Programm starten, die gewünschte Sichtbarkeit mit dem Schieberegler einstellen. Dann das Fenster in den Vordergrund holen, das durchsichtig gemacht werden soll und Strg+Alt+F6 drücken. Die Trankluenz bleibt auch nach dem schließen des WindowStealthers erhalten.


    Source-Code parts

    PHP:
    ;===========================================================================================
    WindowStealther . asm  FASM  ( flat assembler 1.64 )
    http : //www.flatassembler.net/
    Fenster halbtransparent machen  ( Transkluenz )
    Programmiert von KingKa0s
    ;===========================================================================================

    format PE GUI 4.0
    entry start

    ;===========================================================================================
    Für das Programm notwendige Makros / Strukturen
    ;-------------------------------------------------------------------------------------------
      include 
    '..\..\include\win32a.inc'

    ;===========================================================================================
    vordefinierte Strings  initialisierte und nicht initialisierte Variablen
    ;-------------------------------------------------------------------------------------------
    section  '.data'  data readable writeable

      Title     db 
    'WindowStealther' , 0
      ClassName db 
    'WindowStealtherMainWindow' , 0
      hotkeyerr db 
    'Strg + Alt + F6 konnten nicht als Hotkeys definiert werden, da schon ein anderes Programm diese Kombination verwendet.' , 0

      WinX    dd 0           
    ; X - Koordinaten Abstand in Pixel vom linken Bildschirmrand
      WinY    dd 0           
    ; Y - Koordinaten Abstand in Pixel vom oberen Bildschirmrand
      WinW    dd 145           
    ; Breite des Hauptfensters
      WinH    dd 120           
    ; Höhe des Hauptfensters

      hWnd    dd 
    ?           ; Handle des Hauptfensters
      scrollhwnd dd 
    ?       ; Handle der Scrollbar

      _scrollbar   db 
    'scrollbar' , 0
      scrollinfo   SCROLLINFO

      _label       db 
    'static' , 0
      hotkeylabel  db 
    'Strg + Alt + F6' , 0

      _button      db 
    'button' , 0
      checkboxtext db 
    'Stay on Top' , 0

    ;-------------------------------------------------------------------------------------------
    ; For 
    structures one can  use  notation :
    wc WNDCLASS
    I chose otherwise  as  more clear  and  understanding in the statements
    ;-------------------------------------------------------------------------------------------
    wc :               ; WNDCLASS Strucktur  ( API = RegisterClass )
      
    wc . style        dd  ?   ; Fenster - Style
      wc
    . lpfnWndProc    dd  ?   ; Adresse der lpfnWndProc Funktion
      wc
    . cbClsExtra     dd  ?   ; "Class Extra Bytes"  um der ClassStructure zusätzliche Bytes aus dem Speicher zuzuweisen
      wc
    . cbWndExtra     dd  ?   ; "Window Extra Bytes"  um der WindowStructure zusätzliche Bytes aus dem Speicher zuzuweisen
      wc
    . hInstance        dd  ?   ; Handle des Programms  der Programminstanz
      wc
    . hIcon        dd  ?   ; Handle des Mainicons das im Fenstertitel angezeigt wird
      wc
    . hCursor        dd  ?   ; Handle des Cursors der Standartmäßig im Fenster angezeigt werden soll
      wc
    . hbrBackground  dd  ?   ; Hintergrundfarbe des Fensters
      wc
    . lpszMenuName   dd  ?   ; Menü - ID
      wc
    . lpszClassName  dd  ?   ; String für  die  Fensterklasse

    msg
    :               ; WMG Struktur  ( API = GetMessage )
      
    msg . hwnd        dd  ?   ; Handle des Fensters dass  die  Message erhalten hat
      msg
    . message        dd  ?   ;Die  Nummer der Message  ID
      msg
    . wParam        dd  ?   ; Zusatzinformation 1 für  die  Message
      msg
    . lParam        dd  ?   ; Zusatzinformation 2 für  die  Message
      msg
    . time        dd  ?   ;Die  Zeit zu der  die  Message gesendet wurde
      msg
    . pt_x        dd  ?   ; Mauszeigerposition X  ( POINT - Struktur )
      
    msg . pt_y        dd  ?   ; Mauszeigerposition Y  ( POINT - Struktur )

    ;===========================================================================================
    Code der ausgeführt wird
    ;-------------------------------------------------------------------------------------------
    section  '.code'  code readable executable

    start
    :
        ;---------------------------------------------------------------------------------------
        ; 
    API GetModuleHandle sendet dem Programm sein Handle  ( der Programminstanz )
        ; 
    MERKE eax enthält den Rückgabewert von API - Funktionen nach deren Aufruf
        
    ;---------------------------------------------------------------------------------------
        
    push 0                     ; lpModuleHandle Handle der Programminstanz
        call 
    [ GetModuleHandle ]            ;-  API Funktion  -
        
    mov  [ wc . hInstance ], eax             ; eax  Programmhandle

        
    ;---------------------------------------------------------------------------------------
        ; 
    API - Funktion  "LoadIconA"  läd das MainIcon aus den den Resourcen
        
    ;---------------------------------------------------------------------------------------
        
    push IDC_MAINICON                 ; Icon ID  17  ( definiert in den Resourcen )
        
    push  [ wc . hInstance ]             ; Programmhandle
        call 
    [ LoadIcon ]                ;-  API Funktion  -
        
    mov  [ wc . hIcon ], eax                 ; eax  Handle des gerade geladenen Icons

        
    ;---------------------------------------------------------------------------------------
        ; 
    API  "LoadCursorA"  läd den Standard - System - Cursor wenn hInstance
        
    auf 0 gesetzt wird und lpCursorName auf den Standardwert von 32512.
        
    ;---------------------------------------------------------------------------------------
        
    push IDC_ARROW                 ; lpCursorName IDC_ARROW ist der Standardwert
        push 0                    
    ; hInstance 0 = Standardcursor
        call 
    [ LoadCursor ]                ;-  API Funktion  -
        
    mov  [ wc . hCursor ], eax             ; eax  Handle des Cursors

        
    ;---------------------------------------------------------------------------------------
        ; 
    API  "GetSystemMetrics"  ließt verschiende Informationen des Systems aus .
        ; 
    Mit dem Parameter  "SM_CXSCREEN"  die  Breite des Bildschirms .
        ;---------------------------------------------------------------------------------------
        
    push SM_CXSCREEN                 ; Parameter für  die  Bildschirmbreite
        call 
    [ GetSystemMetrics ]            ;-  API Funktion  -
        
    sub eax ,[ WinW ]                ; Subtrahiere  die  Breite des Fensters von der Bildschirmbreite

        mov edx
    2                     ; und teile das Ergebnis durch 2
        mov ecx
    edx                 ; TIP einfache Methode zum halbieren ist  shr eax , 1
        
    xor  edx edx                 ; Inhalt des Registers edx löschen
        div ecx                    
    ; TIP einfache Methode zum vierteln ist  shr eax , 2

        mov 
    [ WinX ], eax                 ; Ergebniss  Abstand des Fensters vom linken Bildschirmrand

        
    ;---------------------------------------------------------------------------------------
        ; 
    API  "GetSystemMetrics"  ließt verschiende Informationen des Systems aus .
        ; 
    Mit dem Parameter  "SM_CXSCREEN"  die  Breite des Bildschirms .
        ;---------------------------------------------------------------------------------------
        
    push SM_CYSCREEN                 ; Parameter für  die  Bildschirmhöhe
        call 
    [ GetSystemMetrics ]            ;-  API Funktion  -
        
    sub eax ,[ WinH ]                ; Subtrahiere  die  Höhe des Fensters von der Bildschirmhöhe
        shr eax
    , 1                     ; und teile das Ergeniss durch 2
        mov 
    [ WinY ], eax                 ; Ergebniss  Abstand des Fensters vom oberen Bildschirmrand

        
    ;---------------------------------------------------------------------------------------
        ; 
    The API  function  'RegisterClass'  registers a window  class
        ; 
    This API needs a  'WNDCLASS'  structure so we fill it with correct values
        
    ;---------------------------------------------------------------------------------------
        
    mov  [ wc . style ], 0                 ; Fenster - Style
        mov 
    [ wc . lpfnWndProc ], WindowProc         ; Adresse der lpfnWndProc Funktion
        mov 
    [ wc . cbClsExtra ], 0             ; "Class Extra Bytes"  um der ClassStructure zusätzliche Bytes aus dem Speicher zuzuweisen
        mov 
    [ wc . cbWndExtra ], 0             ; "Wjndow Extra Bytes"  um der WindowStructure zusätzliche Bytes aus dem Speicher zuzuweisen
        mov 
    [ wc . hbrBackground ], COLOR_BTNFACE + 1   ; Hintergrundfarbe
        mov dword
    [ wc . lpszMenuName ], 0         ; Menü - ID aus den Resourcen
        mov dword
    [ wc . lpszClassName ], ClassName    ; String für  die  Fensterklasse

        
    ;---------------------------------------------------------------------------------------
        ; Die 
    WNDCLASS ist komplett gefüllt nun wird  die  Funktion  "RegisterClass"  aufgerufen .
        ;---------------------------------------------------------------------------------------
        
    push wc                     ; Pointer zur WNDCLASS Struktur
        call 
    [ RegisterClass ]            ;-  API Funktion  -

        ;---------------------------------------------------------------------------------------
        ; 
    API  "CreateWindowEx"  erzeugt ein neues Fenster .
        ; 
    Der Rückgabewert ist hier das Handle des neuen Fensters .
        ;---------------------------------------------------------------------------------------
        
    push 0                     ; lpParam Pointer zu Extradaten 0 = keine Daten
        push 
    [ wc . hInstance ]             ; Programmhandle
        push 0                    
    ; hMenu Handle des Menus
        push 0                    
    ; hWndParent Handle des Elternfensters 0 = keins
        push 
    [ WinH ]                 ; intnHeight Höhe des neuen Fensters in Pixel
        push 
    [ WinW ]                 ; intnWidth Breite des neuen Fensters in Pixel
        push 
    [ WinY ]                 ; inty Position des Fensters von oben  ( relativ zum Elternfensters )
        
    push  [ WinX ]                 ; intx Position des Fensters von links  ( relativ zum Elternfensters )
        
    push WS_SYSMENU + WS_VISIBLE +\        ; dwStyle 0 = kein Sysmenu / Schließen - Buttons
                WS_MINIMIZEBOX        
    ; Fortsetzung der darüberliegenden Zeile durch  "\"
        push Title                    ;Pointer zum Fenstertitel (Pointer ohne Klammern um den Variablennamen)
        push ClassName                ;Pointer zum Klassenname des Fensters
        push 0                    ;dwExStyle, zusätzlicher Fenster-Style 0=keiner
        call [CreateWindowEx]            ;- API Funktion -
        mov [hWnd],eax                ;eax = Handle des Fensters

        ;---------------------------------------------------------------------------------------
        ; API "
    CreateWindowEx " erzeugt ein neues Fenster.
        ; Der Rückgabewert ist hier das Handle des neuen Fensters.
        ;---------------------------------------------------------------------------------------
        push 0                    ;lpParam, Pointer zu Extradaten 0=keine Daten
        push [wc.hInstance]             ;Programmhandle
        push 0                    ;hMenu, Handle des Menus
        push [hWnd]                 ;hWndParent, Handle des Elternfensters 0=keins
        push 17                    ;intnHeight, Höhe des neuen Fensters in Pixel
        push 121                    ;intnWidth, Breite des neuen Fensters in Pixel
        push 12                    ;inty, Position des Fensters von oben (relativ zum Elternfensters)
        push 8                    ;intx, Position des Fensters von links (relativ zum Elternfensters)
        push WS_CHILD+WS_VISIBLE            ;dwStyle, 0=kein Sysmenu/Schließen-Buttons
        push 0                    ;Pointer zum Fenstertitel (Pointer ohne Klammern um den Variablennamen)
        push _scrollbar                ;Pointer zum Klassenname des Fensters
        push 0                       ;dwExStyle, zusätzlicher Fenster-Style 0=keiner
        call [CreateWindowEx]            ;- API Funktion -
        mov [scrollhwnd], eax            ;eax = Handle des Fensters (in dem Fall Scrollbar)

        ;---------------------------------------------------------------------------------------
        ; API "
    SetScrollInfo " legt die Eigenschaften einer Scrollbar fest
        ; Der Rückgabewert ist hier die aktuelle Position des Schiebereglers.
        ;---------------------------------------------------------------------------------------
        mov [scrollinfo.cbSize], \            ;cbSize, Information zu Größe auf die Größe der Struktur SCROLLINFO setzen
         sizeof.SCROLLINFO            ;Fortsetzung der darüberliegenden Zeile durch "
    \ "
        mov [scrollinfo.fMask], SIF_ALL        ;fMask, Information welche Variablen geändert werden sollen
        mov [scrollinfo.nMin], 1            ;nMin, minimaler Wert der Scrollbar
        mov [scrollinfo.nMax], 265            ;nMax, maximaler Wert der Scrollbar + nPage
        mov [scrollinfo.nPage], 10            ;nPage, Breite des Schiebereglers in Pixel
        mov [scrollinfo.nPos], 255            ;nPos, setze Position des Schiebereglers
        mov [scrollinfo.nTrackPos], 0        ;nTrackPos, setzt die Position des Schiebereglers während des Verschiebens,
                            ;SetScrollInfo ignoriert diesen Wert
        push TRUE                    ;fRedraw, Neuzeichnen der Scrollbar nach Aufruf der Funktion
        push scrollinfo                ;lpsi, Pointer zur SCROLLINFO-Struktur
        push SB_CTL                 ;fnBar, Typ der Scrollbar
        push eax                    ;eax = immernoch Handle des Fensters (in dem Fall Scrollbar)
        call [SetScrollInfo]            ;- API Funktion -

        ;---------------------------------------------------------------------------------------
        ; API "
    CreateWindowEx " erzeugt ein neues Fenster.
        ; Der Rückgabewert ist hier das Handle des neuen Fensters.
        ;---------------------------------------------------------------------------------------
        push 0                    ;lpParam, Pointer zu Extradaten 0=keine Daten
        push [wc.hInstance]             ;Programmhandle
        push 0                    ;hMenu, Handle des Menus
        push [hWnd]                 ;hWndParent, Handle des Elternfensters 0=keins
        push 13                    ;intnHeight, Höhe des neuen Fensters in Pixel
        push 70                    ;intnWidth, Breite des neuen Fensters in Pixel
        push 64                    ;inty, Position des Fensters von oben (relativ zum Elternfensters)
        push 8                    ;intx, Position des Fensters von links (relativ zum Elternfensters)
        push WS_CHILD+WS_VISIBLE            ;dwStyle, 0=kein Sysmenu/Schließen-Buttons
        push hotkeylabel                ;Pointer zum Fenstertitel (Pointer ohne Klammern um den Variablennamen)
        push _label                 ;Pointer zum Klassenname des Fensters
        push 0                    ;dwExStyle, zusätzlicher Fenster-Style 0=keiner
        call [CreateWindowEx]            ;- API Funktion -
        mov ebx, eax                ;eax = Handle des Fensters (in dem Fall static)

        ;---------------------------------------------------------------------------------------
        ; API "
    GetStockObject " ließt vordefinierte Definitionen zu Pinseln, Schritarten
        ; und Paletten. Rückgabewert ist das Handle des gesuchten Objekts.
        ;---------------------------------------------------------------------------------------
        push DEFAULT_GUI_FONT           ;fnObject, ID des gesuchten Objekts
        call [GetStockObject]           ;- API Funktion -

        ;---------------------------------------------------------------------------------------
        ; API "
    SendMessage " sendet eine Message an ein anderes Fenster, das Zielfenster
        ; reagiert dabei auf die Message anhand der Message-ID. Rückgabewert abhänig
        ; von der gesendeten Message.
        ;---------------------------------------------------------------------------------------
        push TRUE                    ;lParam, bei WM_SETFONT: Neuzeichnen
        push eax                    ;wParam, bei WM_SETFONT: Handle zur Font
        push WM_SETFONT                ;Msg, Nummer der Message / ID
        push ebx                    ;hwnd, Handle des Fensters, an das die Message gesendet werden soll
        call [SendMessage]                ;- API Funktion -

        ;---------------------------------------------------------------------------------------
        ; API "
    CreateWindowEx " erzeugt ein neues Fenster.
        ; Der Rückgabewert ist hier das Handle des neuen Fensters.
        ;---------------------------------------------------------------------------------------
        push 0                    ;lpParam, Pointer zu Extradaten 0=keine Daten
        push [wc.hInstance]             ;Programmhandle
        push 0                    ;hMenu, Handle des Menus
        push [hWnd]                 ;hWndParent, Handle des Elternfensters 0=keins
        push 17                    ;intnHeight, Höhe des neuen Fensters in Pixel
        push 81                    ;intnWidth, Breite des neuen Fensters in Pixel
        push 40                    ;inty, Position des Fensters von oben (relativ zum Elternfensters)
        push 8                    ;intx, Position des Fensters von links (relativ zum Elternfensters)
        push WS_CHILD+WS_VISIBLE+\            ;dwStyle, 0=kein Sysmenu/Schließen-Buttons
              BS_AUTOCHECKBOX        ;BS_AUTOCHECKBOX legt fest, dass der Button als CheckBox angezeigt wird
        push checkboxtext                ;Pointer zum Fenstertitel (Pointer ohne Klammern um den Variablennamen)
        push _button                ;Pointer zum Klassenname des Fensters
        push 0                    ;dwExStyle, zusätzlicher Fenster-Style 0=keiner
        call [CreateWindowEx]            ;- API Funktion -
        mov ebx, eax                ;eax = Handle des Fensters (in dem Fall Button)

        ;---------------------------------------------------------------------------------------
        ; API "
    GetStockObject " ließt vordefinierte Definitionen zu Pinseln, Schritarten
        ; und Paletten. Rückgabewert ist das Handle des gesuchten Objekts.
        ;---------------------------------------------------------------------------------------
        push DEFAULT_GUI_FONT           ;fnObject, ID des gesuchten Objekts
        call [GetStockObject]           ;- API Funktion -

        ;---------------------------------------------------------------------------------------
        ; API "
    SendMessage " sendet eine Message an ein anderes Fenster, das Zielfenster
        ; reagiert dabei auf die Message anhand der Message-ID. Rückgabewert abhänig
        ; von der gesendeten Message.
        ;---------------------------------------------------------------------------------------
        push TRUE                    ;lParam, bei WM_SETFONT: Neuzeichnen
        push eax                    ;wParam, bei WM_SETFONT: Handle zur Font
        push WM_SETFONT                ;Msg, Nummer der Message / ID
        push ebx                    ;hwnd, Handle des Fensters, an das die Message gesendet werden soll
        call [SendMessage]                ;- API Funktion -

     
     
  2. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.