Deutsch
Forum

Hilfe! WM_TIMER ist ein Scheunentor!!!

 
Hallo Profaner..

Hat mal jemand Lust zu testen, ob [...]  unter XP generell gefixt ist?

- Einen Service zu programieren ist dafür nicht unbedingt nötig, normales Programm mit RUN AS (auch mit PrivAktivate möglich) als Admin starten und das Angreiferprogramm in einem Account mit eingeschränkten Rechten ausführen.
- In das Hauptprogramm einen Timer einfügen (muß natürlich ein Fenster haben).
- Im Angreiferprogramm eine Prozedur schreiben, die eine Messagebox ausgibt, die Proc aber nicht ausführen lassen.
- Mit ProcAddr die Adresse der Prozedur ermitteln.
- Mit PostMessage (oder vielleicht SendMessage) WM_TIMER mit der Adresse der Prozedur vom Angreiferprogramm an das Hauptprogramm senden.

Klapp das???

 
20.05.2005  
 



Hey, keine Kommentare? Kein Interesse, das mal zu testen??

Ich übersetze mal: Laut des Artikels ist es möglich, mit der Message WM_TIMER ein Programm, das einen Timer benutzt und ein eigenes Fenster hat, dazu zu bewegen, eigenen Code auszuführen.
Laufen diese Programme auf einem anderen Account als auf meinem (z.B. als interaktiver Service), würden diese Programme mit den Rechten dieses anderen Accounts ausgeführt werden.
Man loggt sich quasi als Gast ein, sendet an das Handle des Hauptfensters eines laufenden Virenscanners oder einer Firewall eine WM_TIMER Message und kann sich dann über eine selbstgeschriebene PROC Administratorprivilegien verschaffen.
Führt das nicht die gesamte Windows Sicherheit ins Absurde?
 
20.05.2005  
 



Habe den Artikel auch nur überflogen - aber auch so verstanden wie Du AH.

Ich schreibe grade am ACP der ODoku - ich müsste nochmal genau lesen ob hierbei auch die ProcAddr externer Progs mgl. ist - oder nur die ProcAddr eigener Procs.

Salve.
 
20.05.2005  
 




Frank
Abbing
Hi,

ich habs getestet. Zumindest unter XP Home wird nicht die Prozedure des Zielprogramms im Quellprogramm ausgeführt! Stattdessen wird das Quellprogramm immer wieder gestartet!!!

Im Anhang meine beiden Testprogramme. Zum Testen das Quellprogramm zuerst starten und laufen lassen. Dann das Zielprogramm starten. Normalerweise müsste sich jetzt - so Andreas recht hat - im Quellprogramm jede Sekunde eine Messagebox öffnen. Bei mir ist das nicht so. Bin mal gespannt, wie sich das mit anderen Windowsversionen verhält...

3 kB
Hochgeladen:20.05.2005
Ladeanzahl36
Herunterladen
 
20.05.2005  
 



Selbes bei mir: xph,xpp!

Bestimmt irgend solch ein kumulatives Update

Vorrausgesetzt natürlich Franks Demo entspricht dem Behaupteten.

Salve,
 
20.05.2005  
 




Frank
Abbing
Hab versucht die Prozedur-Adresse über tmprc und über wTimerID (aktuelle Fassung) zu übergeben. Beides das gleiche Ergebniss...
Hier die Quellcodes:

Quelle:
KompilierenMarkierenSeparieren
.386                   ; minimum processor needed for 32 bit
.model flat, stdcall   ; FLAT memory model & STDCALL calling
option casemap :none   ; set code to case sensitive
include masm32includewindows.inc
include masm32includeuser32.inc
include masm32includekernel32.inc
includelib masm32libuser32.lib
includelib masm32libkernel32.lib
include    D:PROGRAMMEmasm32includedebug.inc
includelib D:PROGRAMMEmasm32libdebug.lib
szText MACRO Name, Text:VARARG
LOCAL lbl
jmp lbl
Name db Text,0
lbl:
ENDM
m2m MACRO M1, M2
push M2
pop  M1
ENDM
return MACRO arg
mov eax, arg
ret
ENDM
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
TopXY PROTO   :DWORD,:DWORD
.data
szDisplayName db "Quellfenster mit Timer",0
CommandLine   dd 0
hWnd          dd 0
hInstance     dd 0
timer         dd 0
testit        db "Test",0
.code
start:
invoke GetModuleHandle, NULL ; provides the instance handle
mov hInstance, eax
invoke GetCommandLine        ; provides the command line address
mov CommandLine, eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax       ; cleanup & return to operating system
WinMain proc hInst     :DWORD,
hPrevInst :DWORD,
CmdLine   :DWORD,
CmdShow   :DWORD
LOCAL wc   :WNDCLASSEX
LOCAL msg  :MSG
LOCAL Wwd  :DWORD
LOCAL Wht  :DWORD
LOCAL Wtx  :DWORD
LOCAL Wty  :DWORD
szText szClassName,"Generic_Class"
mov wc.cbSize,         sizeof WNDCLASSEX
mov wc.style,          CS_HREDRAW or CS_VREDRAW
or CS_BYTEALIGNWINDOW
mov wc.lpfnWndProc,    offset WndProc      ; address of WndProc
mov wc.cbClsExtra,     NULL
mov wc.cbWndExtra,     NULL
m2m wc.hInstance,      hInst               ; instance handle
mov wc.hbrBackground,  COLOR_BTNFACE+1     ; system color
mov wc.lpszMenuName,   NULL
mov wc.lpszClassName,  offset szClassName  ; window class name
invoke LoadIcon,hInst,500    ; icon ID   ; resource icon
mov wc.hIcon,          eax
invoke LoadCursor,NULL,IDC_ARROW         ; system cursor
mov wc.hCursor,        eax
mov wc.hIconSm,        0
invoke RegisterClassEx, ADDR wc     ; register the window class
mov Wwd, 500
mov Wht, 350
invoke GetSystemMetrics,SM_CXSCREEN ; get screen width in pixels
invoke TopXY,Wwd,eax
mov Wtx, eax
invoke GetSystemMetrics,SM_CYSCREEN ; get screen height in pixels
invoke TopXY,Wht,eax
mov Wty, eax
invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW,
ADDR szClassName,
ADDR szDisplayName,
WS_OVERLAPPEDWINDOW,
Wtx,Wty,Wwd,Wht,
NULL,NULL,
hInst,NULL
mov   hWnd,eax  ; copy return value into handle DWORD
invoke LoadMenu,hInst,600                 ; load resource menu
invoke SetMenu,hWnd,eax                   ; set it to main window
invoke ShowWindow,hWnd,SW_SHOWNORMAL      ; display the window
invoke UpdateWindow,hWnd                  ; update the display
StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0         ; get each message
cmp eax, 0                                  ; exit if GetMessage()
je ExitLoop                                 ; returns zero
invoke TranslateMessage, ADDR msg           ; translate it
invoke DispatchMessage,  ADDR msg           ; send it to message proc
jmp StartLoop
ExitLoop:
return msg.wParam
WinMain endp
; #########################################################################
WndProc proc hWin   :DWORD,
uMsg   :DWORD,
wParam :DWORD,
lParam :DWORD

.if uMsg == WM_COMMAND

    .if wParam == 1000

        invoke SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL

    .elseif wParam == 1900

        szText TheMsg,"Assembler, Pure & Simple"
        invoke MessageBox,hWin,ADDR TheMsg,ADDR szDisplayName,MB_OK

    .endif

.elseif uMsg == WM_TIMER

    .if wParam!=111

        invoke SetTimer,hWnd,111,1000,wParam

    .endif

.elseif uMsg == WM_DESTROY

    invoke PostQuitMessage,NULL
    return 0

.endif

invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
WndProc endp
; ########################################################################
TopXY proc wDim:DWORD, sDim:DWORD
shr sDim, 1      ; divide screen dimension by 2
shr wDim, 1      ; divide window dimension by 2
mov eax, wDim    ; copy window dimension into eax
sub sDim, eax    ; sub half win dimension from half screen dimension
return sDim
TopXY endp
; ########################################################################
end start

Ziel:
KompilierenMarkierenSeparieren
.386                   ; minimum processor needed for 32 bit
.model flat, stdcall   ; FLAT memory model & STDCALL calling
option casemap :none   ; set code to case sensitive
include masm32includewindows.inc
include masm32includeuser32.inc
include masm32includekernel32.inc
includelib masm32libuser32.lib
includelib masm32libkernel32.lib
include    D:PROGRAMMEmasm32includedebug.inc
includelib D:PROGRAMMEmasm32libdebug.lib
szText MACRO Name, Text:VARARG
LOCAL lbl
jmp lbl
Name db Text,0
lbl:
ENDM
m2m MACRO M1, M2
push M2
pop  M1
ENDM
return MACRO arg
mov eax, arg
ret
ENDM
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
TopXY PROTO   :DWORD,:DWORD
.data
szDisplayName db "Zielfenster ohne Timer",0
CommandLine   dd 0
hWnd          dd 0
hInstance     dd 0
timer         dd 0
testit        db "Test",0
fname         db "Quellfenster mit Timer",0
cname         db "Generic_Class",0
.code
start:
invoke GetModuleHandle, NULL ; provides the instance handle
mov hInstance, eax
invoke GetCommandLine        ; provides the command line address
mov CommandLine, eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax       ; cleanup & return to operating system
timerproc proc
invoke MessageBox,0,addr testit,addr testit,64
ret
timerproc endp
WinMain proc hInst     :DWORD,
hPrevInst :DWORD,
CmdLine   :DWORD,
CmdShow   :DWORD
LOCAL wc   :WNDCLASSEX
LOCAL msg  :MSG
LOCAL Wwd  :DWORD
LOCAL Wht  :DWORD
LOCAL Wtx  :DWORD
LOCAL Wty  :DWORD
szText szClassName,"Generic_Class"
mov wc.cbSize,         sizeof WNDCLASSEX
mov wc.style,          CS_HREDRAW or CS_VREDRAW
or CS_BYTEALIGNWINDOW
mov wc.lpfnWndProc,    offset WndProc      ; address of WndProc
mov wc.cbClsExtra,     NULL
mov wc.cbWndExtra,     NULL
m2m wc.hInstance,      hInst               ; instance handle
mov wc.hbrBackground,  COLOR_BTNFACE+1     ; system color
mov wc.lpszMenuName,   NULL
mov wc.lpszClassName,  offset szClassName  ; window class name
invoke LoadIcon,hInst,500    ; icon ID   ; resource icon
mov wc.hIcon,          eax
invoke LoadCursor,NULL,IDC_ARROW         ; system cursor
mov wc.hCursor,        eax
mov wc.hIconSm,        0
invoke RegisterClassEx, ADDR wc     ; register the window class
mov Wwd, 500
mov Wht, 350
invoke GetSystemMetrics,SM_CXSCREEN ; get screen width in pixels
invoke TopXY,Wwd,eax
mov Wtx, eax
invoke GetSystemMetrics,SM_CYSCREEN ; get screen height in pixels
invoke TopXY,Wht,eax
mov Wty, eax
invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW,
ADDR szClassName,
ADDR szDisplayName,
WS_OVERLAPPEDWINDOW,
Wtx,Wty,Wwd,Wht,
NULL,NULL,
hInst,NULL
mov   hWnd,eax  ; copy return value into handle DWORD
invoke LoadMenu,hInst,600                 ; load resource menu
invoke SetMenu,hWnd,eax                   ; set it to main window
invoke ShowWindow,hWnd,SW_SHOWNORMAL      ; display the window
invoke UpdateWindow,hWnd                  ; update the display
invoke FindWindow,addr cname,addr fname

.if eax!=0

    invoke SendMessage,eax,WM_TIMER,addr timerproc,addr timerproc

.endif

StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0         ; get each message
cmp eax, 0                                  ; exit if GetMessage()
je ExitLoop                                 ; returns zero
invoke TranslateMessage, ADDR msg           ; translate it
invoke DispatchMessage,  ADDR msg           ; send it to message proc
jmp StartLoop
ExitLoop:
return msg.wParam
WinMain endp
WndProc proc hWin   :DWORD,
uMsg   :DWORD,
wParam :DWORD,
lParam :DWORD

.if uMsg == WM_COMMAND

    .if wParam == 1000

        invoke SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL

    .elseif wParam == 1900

        szText TheMsg,"Assembler, Pure & Simple"
        invoke MessageBox,hWin,ADDR TheMsg,ADDR szDisplayName,MB_OK

    .endif

.elseif uMsg == WM_DESTROY

    invoke PostQuitMessage,NULL
    return 0

.endif

invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
WndProc endp
; ########################################################################
TopXY proc wDim:DWORD, sDim:DWORD
shr sDim, 1      ; divide screen dimension by 2
shr wDim, 1      ; divide window dimension by 2
mov eax, wDim    ; copy window dimension into eax
sub sDim, eax    ; sub half win dimension from half screen dimension
return sDim
TopXY endp
; ########################################################################
end start
 
20.05.2005  
 




CB
XP Pro SP2: selbes Resultat wie bei Frank.
 
XProfan 8/9.1, Win XP, AMD 64/3200
21.05.2005  
 



Ich habe die Sache mal mit einer anderen Message und innerhalb eines lokalen Prozesses getestet. Dabei wird wirklich die angegebene Adresse angesprungen.

Zum Glück geht das also doch nicht so einfach:
Jeder Prozess hat ja (wenn ich es richtig verstanden habe) seine privaten Adressbereich. Eine ermittelte Adresse bezieht sich also ja immer nur auf den aktuellen Prozess. Damit der Prozess, den ich attackieren will, weiß welche Adresse er anspringen soll, wird man wohl etwas untersuchen, mappen und rechnen müssen. In dem Artikel ist ja auch von einem Debugger die Rede...
 
21.05.2005  
 




Jörg
Sellmeyer
Bei mir passiert gar nix.
Win98SE / XProfan9
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
21.05.2005  
 



Hallo Jörg...

Kann auch nicht, Adresse paßt nicht.
 
21.05.2005  
 




Frank
Abbing
Hi,

> Kann auch nicht, Adresse paßt nicht.

Die Adresse passt schon. Habe das überprüft. Das Sourceprogramm erhält tatsächlich genau die Adresse. Nur biegt Windows beim Installieren des Timers unter XP die Adresse um auf den Startpunkt des eigenen Programms. Unter 98 wird der Timer dagegen anscheinend gar nicht gestartet.
 
21.05.2005  
 



Hallo Frank...

Ich vermute mal, das die Adresse , die man da bekommt, ein virtuelle Adresse ist, die immer auf den aktuellen Prozess bezogen ist. (Sehe ich das richtig? Mit deinen MASM Kenntnissen wirst du das auf jedenfall besser wissen als ich.) Ich vermute, das man zuerst einmal die reale Adrese der Prtozedur im Speicher haben muß. Danach könnte man evtl. die erhaltene Adresse auf den zu attackierenden Prozeß umrechnen, dessen reale Speicheradresse man dazu aber auch erst einmal kennen müßte. Wie siehst du das?

Ach ja..., die Message EM_SETWORDBREAKPROC soll ebenfalls dazu genutzt werden können, fremden Code anzuspringen - mit der läßt sich das evtl. besser testen.
 
21.05.2005  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

8.449 Betrachtungen

Unbenanntvor 0 min.
Peter Max Müller19.10.2017
Donnie14.04.2013
Claus de Lieth08.02.2013
Daniel Mittermeier29.09.2012
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie