Deutsch
Umfragen

Treiberprogging

 
- Seite 1 -


Hat einer von euch schon mal selbst einen kleinen Treiber geproggt? Wenn ja, in welcher Programmiersprache?
Hat jemand Infos über Treiberprogrammierung?
Hat jemand Möglichkeiten, Treiber zu programmieren?
 
23.10.2006  
 



 
- Seite 2 -


Lecker weil ich brauch auch grad nen Treiber den ich mir wohl selbst schreiben muss...
 
25.10.2006  
 



´Liste oben wird vervollständigt...
 
25.10.2006  
 



Weitere interessante Links.
[...] 
[...] 
[...] 
[...] 
[...] 
[...] 
[...] 

Puh, war schwer zu finden - gut drauf aufpassen, ja?
 
29.10.2006  
 




Michael
Wodrich
[...] 
 
Programmieren, das spannendste Detektivspiel der Welt.
29.10.2006  
 




Thomas
Zielinski
Das ist ja sehr interessant. Aber da meine Fremdsprachenkenntnisse ein wenig eingerostet ist wäre es doch nett wenn einer lange weile hat und das übersetzt.
 
XProfan X4; Win10 x64
Der Kuchen ist eine lüge!
01.11.2006  
 



[quote:2e699b275a=Alexej Jakowitsch]Das ist ja sehr interessant. Aber da meine Fremdsprachenkenntnisse ein wenig eingerostet ist wäre es doch nett wenn einer lange weile hat und das übersetzt.[/quote:2e699b275a]
Ohne Englischkenntnisse wirst du da trotzdem nicht weiterkommen.

@Michael: Besten Dank, die Seite fehlte noch!.
 
04.11.2006  
 



So: Wie weit bin ich?

Bin grad mitten beim Treiberproggen. Im Prinzip läuft das Ding schon - es macht aber (so wie ich es zur Zeit starte) noch nicht das, was es soll.
D.h.: Lade ich den Treiber nicht durch einen Registryeintrag (CreateService, StartService), sondern auf eine spezielle Art, die ich hier nicht posten möcht, lädt sich der Treiber wirklich unter System und schreibt und liest wie geplant aus der Registry. Zur Zeit kämpfe ich noch ein wenig mit der DriverEntry Proc => mein Problem liegt aber wohl eher daran, das ich in MASM nur Einsteiger bin und dort manches noch nicht durchblicke.

Hier mal die BATCH zur Treibererzeugung für MASM mit angehängter Resourcendatei rsrc:

Treibername muß durch den Namen (ohne Dateiendung) der jeweiligen ASM oder OBJ Datei ersetzt werden.
Wer keine Resource anhängen möchte, läßt das rsrc.obj einfach weg.

Gruß

Andreas
 
04.11.2006  
 



Moin. Treiber läuft nun auch, wenn man ihn über StartService startet.
Mein Fehler: Das Register ebx darf scheinbar in einem Treiber unter bestimmten Umständen nicht verwendet werden.

Gruß

Andreas
 
05.11.2006  
 




Michael
Wodrich
ebx wird oft als Indexregister benutzt (also wie ein Zeigerwert).

Du mußt auch auf ASSIGN aufpassen: Damit nagelt man auch Register fest - diese Zuweisung muß später auch wieder aufgehoben werden (ein Assign mit none als Wert).
Ist nur wichtig, wenn sowas bereits im existierenden Beispielcode existiert (und dann kann Frank wohl besser den Sachverhalt erklären).

Schöne Grüße
Michael Wodrich
 
Programmieren, das spannendste Detektivspiel der Welt.
05.11.2006  
 



Einige wichtige Infos zum Einstieg ins Treiberprogging stehen bereits unter [...] , den Rest werde ich versuchen hier zu platzieren.
Vorneweg: Wer im Kernel herumhantiert, muß damit rechnen, daß es bei einem Fehler gewaltig crasht. Und wenn ich sage gewaltig, dann meine ich wirklich gewaltig. Ein Reboot mit Festplattenfehler ist da das kleinste Übel - auch das Abrauchen von Hardware ist nicht ganz ausgeschlossen.
Es empfiehlt sich deshalb das was irgendwie im Usermode löuft, auch im Usermode zu testen.
Die DLLs, auf die es beim Treiberprogging ankommt und aus denen man APIs aufrufen kann sind vor allen Dingen die HAL.DLL, die NTOSKRNL.EXE und die NTDLL.DLL.
Da vielle Funktionen (Nt... und Zw... vor allen Dingen) sowohl in der NTOSKRNL.EXE als auch in der NTDLL.DLL vorhanden sind und es die NTDLL ja auch in normalen Anwendungen im Usermode gibt,, kann man da schon eine ganze Menge im Usermode abtesten. Zum Vergleichen mit der NTDLL habe ich hier im Anhang auch mal die Funktionen der NTOSKRNL.EXE (mit [...]  ausgelesen) aufgelistet..
Zum Testen einfach die Zeilen include masm32includew2k
toskrnl.inc
und
includelib masm32libw2k
toskrnl.lib
bei der Deklarierung der MASM Bibliotheken durch include masm32includew2k
tdll.inc
und includelib masm32libw2k
tdll.lib
ersetzen und das was der Treiber später tun soll dann in eine normale EXE compilieren.. => keine Gefahr für die Hardware.

Einen Treiber zu proggen hat sehr viel Ähnlichkeit mit dem Erstellen einer DLL - ist aber wesentlich einfacher. Eine DLL besitzt eine Einsprungsfunktion, die beim Laden ausgeführt wird - und so ist es bei einem Treiber auch. Eine Einstiegsfunktion eines Treibers sieht unter MASM folgendermaßen aus:

Ein so geproggter Treiber führt seine Code aus und wird danach wieder aus dem Kernel entfernt.

Ein so geproggter Treiber bleibt noch dem Ausführen des Codes weiterhin im Kernel geladen.

Einfach, oder?
...Fortsetzung folgt, falls Interesse da ist....

239 kB
Kurzbeschreibung: APIs der NTOSKRNL.EXE unter W2K
Hochgeladen:07.11.2006
Ladeanzahl62
Herunterladen
 
07.11.2006  
 



Da es sowieso nicht den Effekt hatte, den ich gesucht habe, stelle ich das hier mal als Beispiel hin.
MASM32 Code:
.386
.model flat, stdcall
option casemap:none
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                 I N C L U D E F I L E S
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
include masm32includew2k
tddk.inc
include masm32includew2k
tstatus.inc
include masm32includew2k
toskrnl.inc
includelib masm32libw2k
toskrnl.lib
include masm32MacrosStrings.mac
includelib masm32libw2k
tdll.lib
.data
Object_Attrib dd 24,0,0,64,0,0
P_Object_Attrib dd 24,0,0,0,0,0
COUNTED_ANSI_STRING dw 0,0,0,0
LSA_Unicode dw 0,518,0,0
ACCESS_RIGHTS dd 65539
KeyHandle dd 0
Needed dd 0
OwnID dd 0
Address dd 0
Var dd 0
Prot dd 0,0,0,0,0,0,0
P_ID dd 0,0
PID dd 0
P_ACCESS_WRITE dd 40
P_ACCESS dd 1024
ZwQuery dd 0
ZwWrite dd 0
ErrorAddress dd 0
ReturnError dd -1073741438
P_Handle dd 0
Keyname db RegistryMachineSoftwareScannyVMQuery,0
ValuenameOwnID db OwnID,0
ValuenamePID db PID,0
ValuenameAddress db Address,0
ValuenameVar db Var,0
ValuenameZwQuery db ZwQueryVirtualMemory,0
ValuenameZwWrite db ZwWriteVirtualMemory,0
ValuenameReturn db Return,0
.data?
Key_Info db 530 dup(?)
Unicode db 518 dup(?)
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                    C O D E
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
.code
start:
DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
invoke RtlInitAnsiString,addr COUNTED_ANSI_STRING,addr Keyname
;PrintDec eax, Rückgabe von RtlInitAnsiString
lea edx,COUNTED_ANSI_STRING
mov ax,[edx+0]
;PrintDec ax, Länge des Strings
mov ax,[edx+2]
;PrintDec ax, Länge des Bereichs
mov eax,[edx+4]
;PrintStringByAddr eax
lea edx,LSA_Unicode
mov ax,518
mov [edx+2],ax
lea eax,Unicode
mov [edx+4],eax
invoke RtlAnsiStringToUnicodeString,addr LSA_Unicode,addr COUNTED_ANSI_STRING,0
;PrintDec eax, Rückgabe von RtlAnsiStringToUnicodeString
lea edx,LSA_Unicode
mov ax,[edx+0]
;PrintDec ax, Länge des Strings
mov ax,[edx+2]
;PrintDec ax, Länge des Bereichs
lea edx,Object_Attrib
;PrintDec edx, Adresse der Object_Attributes Struktur
lea eax,LSA_Unicode
;PrintDec eax, Adresse der LSA_Unicode Struktur
;PrintDec edx, Vor Änderung
add edx,8
;PrintDec edx, Nach Änderung
mov [edx],eax
invoke ZwOpenKey,addr KeyHandle,ACCESS_RIGHTS,addr Object_Attrib
;PrintDec eax, Rückgabe von ZwOpenKey
;PrintDec KeyHandle,Handle des Schlüssels

.IF eax == 0

    invoke RtlInitAnsiString,addr COUNTED_ANSI_STRING,addr ValuenameOwnID
    ;PrintDec eax, Rückgabe von RtlInitAnsiString
    lea edx,COUNTED_ANSI_STRING
    mov ax,[edx+0]
    ;PrintDec ax, Länge des Strings
    mov ax,[edx+2]
    ;PrintDec ax, Länge des Bereichs
    mov eax,[edx+4]
    ;PrintStringByAddr eax
    lea edx,LSA_Unicode
    mov ax,518
    mov [edx+2],ax
    lea eax,Unicode
    mov [edx+4],eax
    invoke RtlAnsiStringToUnicodeString,addr LSA_Unicode,addr COUNTED_ANSI_STRING,0
    ;PrintDec eax, Rückgabe von RtlAnsiStringToUnicodeString
    lea edx,LSA_Unicode
    mov ax,[edx+0]
    ;PrintDec ax, Länge des Strings
    mov ax,[edx+2]
    ;PrintDec ax, Länge des Bereichs
    invoke ZwQueryValueKey,KeyHandle,addr LSA_Unicode,2,addr Key_Info,580,addr Needed
    ;PrintDec eax, Rückgabe von ZwQueryValueKey

    .IF eax == 0

        lea edx,Key_Info
        add edx,12
        mov edx,[edx]
        mov OwnID,edx
        ;PrintDec OwnID, Prozess-ID von Scanny

    .endif

    invoke RtlInitAnsiString,addr COUNTED_ANSI_STRING,addr ValuenamePID
    ;PrintDec eax, Rückgabe von RtlInitAnsiString
    lea edx,COUNTED_ANSI_STRING
    mov ax,[edx+0]
    ;PrintDec ax, Länge des Strings
    mov ax,[edx+2]
    ;PrintDec ax, Länge des Bereichs
    mov eax,[edx+4]
    ;PrintStringByAddr eax
    lea edx,LSA_Unicode
    mov ax,518
    mov [edx+2],ax
    lea eax,Unicode
    mov [edx+4],eax
    invoke RtlAnsiStringToUnicodeString,addr LSA_Unicode,addr COUNTED_ANSI_STRING,0
    ;PrintDec eax, Rückgabe von RtlAnsiStringToUnicodeString
    lea edx,LSA_Unicode
    mov ax,[edx+0]
    ;PrintDec ax, Länge des Strings
    mov ax,[edx+2]
    ;PrintDec ax, Länge des Bereichs
    invoke ZwQueryValueKey,KeyHandle,addr LSA_Unicode,2,addr Key_Info,580,addr Needed
    ;PrintDec eax, Rückgabe von ZwQueryValueKey

    .IF eax == 0

        lea edx,Key_Info
        add edx,12
        mov edx,[edx]
        mov PID,edx
        ;PrintDec PID, ID des auszulesenden Prozesses

    .endif

    invoke RtlInitAnsiString,addr COUNTED_ANSI_STRING,addr ValuenameAddress
    ;PrintDec eax, Rückgabe von RtlInitAnsiString
    lea edx,COUNTED_ANSI_STRING
    mov ax,[edx+0]
    ;PrintDec ax, Länge des Strings
    mov ax,[edx+2]
    ;PrintDec ax, Länge des Bereichs
    mov eax,[edx+4]
    ;PrintStringByAddr eax
    lea edx,LSA_Unicode
    mov ax,518
    mov [edx+2],ax
    lea eax,Unicode
    mov [edx+4],eax
    invoke RtlAnsiStringToUnicodeString,addr LSA_Unicode,addr COUNTED_ANSI_STRING,0
    ;PrintDec eax, Rückgabe von RtlAnsiStringToUnicodeString
    lea edx,LSA_Unicode
    mov ax,[edx+0]
    ;PrintDec ax, Länge des Strings
    mov ax,[edx+2]
    ;PrintDec ax, Länge des Bereichs
    invoke ZwQueryValueKey,KeyHandle,addr LSA_Unicode,2,addr Key_Info,580,addr Needed
    ;PrintDec eax, Rückgabe von ZwQueryValueKey

    .IF eax == 0

        lea edx,Key_Info
        add edx,12
        mov edx,[edx]
        mov Address,edx
        ;PrintDec Address, Zu bearbeitende Adresse

    .endif

    invoke RtlInitAnsiString,addr COUNTED_ANSI_STRING,addr ValuenameVar
    ;PrintDec eax, Rückgabe von RtlInitAnsiString
    lea edx,COUNTED_ANSI_STRING
    mov ax,[edx+0]
    ;PrintDec ax, Länge des Strings
    mov ax,[edx+2]
    ;PrintDec ax, Länge des Bereichs
    mov eax,[edx+4]
    ;PrintStringByAddr eax
    lea edx,LSA_Unicode
    mov ax,518
    mov [edx+2],ax
    lea eax,Unicode
    mov [edx+4],eax
    invoke RtlAnsiStringToUnicodeString,addr LSA_Unicode,addr COUNTED_ANSI_STRING,0
    ;PrintDec eax, Rückgabe von RtlAnsiStringToUnicodeString
    lea edx,LSA_Unicode
    mov ax,[edx+0]
    ;PrintDec ax, Länge des Strings
    mov ax,[edx+2]
    ;PrintDec ax, Länge des Bereichs
    invoke ZwQueryValueKey,KeyHandle,addr LSA_Unicode,2,addr Key_Info,580,addr Needed
    ;PrintDec eax, Rückgabe von ZwQueryValueKey

    .IF eax == 0

        lea edx,Key_Info
        add edx,12
        mov edx,[edx]
        mov Var,edx
        ;PrintDec Var, Adresse der Variablen in Scanny

    .endif

    invoke RtlInitAnsiString,addr COUNTED_ANSI_STRING,addr ValuenameZwQuery
    ;PrintDec eax, Rückgabe von RtlInitAnsiString
    lea edx,COUNTED_ANSI_STRING
    mov ax,[edx+0]
    ;PrintDec ax, Länge des Strings
    mov ax,[edx+2]
    ;PrintDec ax, Länge des Bereichs
    mov eax,[edx+4]
    ;PrintStringByAddr eax
    lea edx,LSA_Unicode
    mov ax,518
    mov [edx+2],ax
    lea eax,Unicode
    mov [edx+4],eax
    invoke RtlAnsiStringToUnicodeString,addr LSA_Unicode,addr COUNTED_ANSI_STRING,0
    ;PrintDec eax, Rückgabe von RtlAnsiStringToUnicodeString
    lea edx,LSA_Unicode
    mov ax,[edx+0]
    ;PrintDec ax, Länge des Strings
    mov ax,[edx+2]
    ;PrintDec ax, Länge des Bereichs
    invoke ZwQueryValueKey,KeyHandle,addr LSA_Unicode,2,addr Key_Info,580,addr Needed
    ;PrintDec eax, Rückgabe von ZwQueryValueKey

    .IF eax == 0

        lea edx,Key_Info
        add edx,12
        mov edx,[edx]
        mov ZwQuery,edx
        ;PrintDec ZwQuery, Adresse der Funktion ZwQueryVirtualMemory

    .endif

    invoke RtlInitAnsiString,addr COUNTED_ANSI_STRING,addr ValuenameZwWrite
    ;PrintDec eax, Rückgabe von RtlInitAnsiString
    lea edx,COUNTED_ANSI_STRING
    mov ax,[edx+0]
    ;PrintDec ax, Länge des Strings
    mov ax,[edx+2]
    ;PrintDec ax, Länge des Bereichs
    mov eax,[edx+4]
    ;PrintStringByAddr eax
    lea edx,LSA_Unicode
    mov ax,518
    mov [edx+2],ax
    lea eax,Unicode
    mov [edx+4],eax
    invoke RtlAnsiStringToUnicodeString,addr LSA_Unicode,addr COUNTED_ANSI_STRING,0
    ;PrintDec eax, Rückgabe von RtlAnsiStringToUnicodeString
    lea edx,LSA_Unicode
    mov ax,[edx+0]
    ;PrintDec ax, Länge des Strings
    mov ax,[edx+2]
    ;PrintDec ax, Länge des Bereichs
    invoke ZwQueryValueKey,KeyHandle,addr LSA_Unicode,2,addr Key_Info,580,addr Needed
    ;PrintDec eax, Rückgabe von ZwQueryValueKey

    .IF eax == 0

        lea edx,Key_Info
        add edx,12
        mov edx,[edx]
        mov ZwWrite,edx
        ;PrintDec ZwWrite, Adresse der Funktion ZwWriteVirtualMemory

    .endif

    invoke RtlInitAnsiString,addr COUNTED_ANSI_STRING,addr ValuenameReturn
    ;PrintDec eax, Rückgabe von RtlInitAnsiString
    lea edx,COUNTED_ANSI_STRING
    mov ax,[edx+0]
    ;PrintDec ax, Länge des Strings
    mov ax,[edx+2]
    ;PrintDec ax, Länge des Bereichs
    mov eax,[edx+4]
    ;PrintStringByAddr eax
    lea edx,LSA_Unicode
    mov ax,518
    mov [edx+2],ax
    lea eax,Unicode
    mov [edx+4],eax
    invoke RtlAnsiStringToUnicodeString,addr LSA_Unicode,addr COUNTED_ANSI_STRING,0
    ;PrintDec eax, Rückgabe von RtlAnsiStringToUnicodeString
    lea edx,LSA_Unicode
    mov ax,[edx+0]
    ;PrintDec ax, Länge des Strings
    mov ax,[edx+2]
    ;PrintDec ax, Länge des Bereichs
    invoke ZwQueryValueKey,KeyHandle,addr LSA_Unicode,2,addr Key_Info,580,addr Needed
    ;PrintDec eax, Rückgabe von ZwQueryValueKey

    .IF eax == 0

        lea edx,Key_Info
        add edx,12
        mov edx,[edx]
        mov ErrorAddress,edx
        ;PrintDec ErrorAddress, Adresse der Rückmeldevariablen

    .endif

    mov edx,PID
    mov P_ID,edx
    invoke ZwOpenProcess,addr P_Handle,P_ACCESS,addr P_Object_Attrib,addr P_ID
    ;PrintDec eax, Rückgabe von ZwOpenProcess

    .IF eax == 0

        lea edx,Needed
        push edx
        push 28
        lea edx,Prot
        push edx
        push 0
        push Address
        push P_Handle
        call ZwQuery
        mov ReturnError,eax
        ;invoke ZwQueryVirtualMemory,P_Handle,Address,0,addr Prot,28,addr Needed
        ;PrintDec eax, Rückgabe von ZwQueryVirtualMemory
        invoke ZwClose,P_Handle

    .endif

    mov edx,OwnID
    mov P_ID,edx
    invoke ZwOpenProcess,addr P_Handle,P_ACCESS_WRITE,addr P_Object_Attrib,addr P_ID
    ;PrintDec eax, Rückgabe von ZwOpenProcess

    .IF eax == 0

        lea edx,Needed
        push edx
        push 28
        lea edx,Prot
        push edx
        push Var
        push P_Handle
        call ZwWrite
        ;invoke ZwWriteVirtualMemory,P_Handle,Var,addr Prot,28,addr Needed
        lea edx,Needed
        push edx
        push 4
        lea edx,ReturnError
        push edx
        push ErrorAddress
        push P_Handle
        call ZwWrite
        ;PrintDec eax, Rückgabe von ZwWriteVirtualMemory
        invoke ZwClose,P_Handle

    .endif

    invoke ZwClose,KeyHandle

.endif

mov eax,STATUS_DEVICE_CONFIGURATION_ERROR
ret
DriverEntry endp
end start

Gruß

Andreas
 
29.11.2006  
 



Ich habe mal zu dem MASm32 Quelltext oben noch ein Profan Steuerungsprogramm zum Testen gepackt und alles unten in compilierter Form zum Download bereitgestellt.
Profan Steuerungsproggi:
DEF @GetDlgCtrlID(1) !USER32,GetDlgCtrlID
DEF @ButtonClicked(1) @GetDlgCtrlID(@&(1))=-%MENUITEM
DEF @GetModuleHandle(1) !KERNEL32,GetModuleHandleA
DEF @GetProcAddress(2) !KERNEL32,GetProcAddress
Def @GetCurrentProcessID(0) !KERNEL32,GetCurrentProcessId
Def @CloseServiceHandle(1) !ADVAPI32,CloseServiceHandle
Def @StartService(3) !ADVAPI32,StartServiceA
Def @OpenService(3) !ADVAPI32,OpenServiceA
Def @OpenSCManager(3) !ADVAPI32,OpenSCManagerA
Def @CreateService(13) !ADVAPI32,CreateServiceA
Def @DeleteService(1) !ADVAPI32,DeleteService
Def @CloseServiceHandle(1) !ADVAPI32,CloseServiceHandle
Def @OpenSCManager(3) !ADVAPI32,OpenSCManagerA
DEF @GetACP(0) !kernel32,GetACP
DEF @MultiByteToWideChar(6) !kernel32,MultiByteToWideChar
Def @GetSystemInfo(1) !KERNEL32,GetSystemInfo
DeF @FormatMessage(7) !KERNEL32,FormatMessageA
Def @LsaNtStatusToWinError(1) !ADVAPI32,LsaNtStatusToWinError
Declare NTFEHLER&,AHRückgabe&,AHGETERROR_Buffer#,AHGETERROR_Buffer$
Declare Button&,Prot#,Zwischenmerker$,Zwischenmerker&,PID&
Declare M_NAME$,PROC_NAME$,PROC_ADDRESS&,Fehler&,MHANDLE&,SCManager_Handle&,Service&
Declare Zwischenmerker2&,Zwischenmerker3&,PAGE_SIZE&,SYSTEM_INFO#,PRID&
Dim Prot#,28
Windowstyle 31+512
Windowtitle Speicherinfos auslesen
Window 0,0-640,440
Let Button&=@CreateButton(%HWND,Speicherinfos lesen,20,100,300,30)
@Createtext(%HWND,Prozess-ID:,20,140,80,20)
LET PID&=@CreateEdit(%HWND,@STR$(@GetCurrentProcessID()),110,140,100,20)
Usermessages $10
DIM SYSTEM_INFO#,36
@GetSystemInfo(SYSTEM_INFO#)
LET PAGE_SIZE&=@LONG(SYSTEM_INFO#,4)
Dispose SYSTEM_INFO#

IF @val($WINVER)<5

    @messagebox(Geht leider auf dieser Windowsversion nicht!!!,Falsche Windowsversion!,64)
    @sendmessage(%HWND,$10,0,0)

endif

While %UMESSAGE<>$10

    Waitinput

    If @Buttonclicked(Button&)

        SetMenuitem 0
        LET Zwischenmerker$=@INPUT$(Welche Adresse näher untersuchen?,Adresse eingeben,@STR$(%HINSTANCE))

        IF Zwischenmerker$<>

            Read_VMInfos

        endif

    endif

wend

Dispose Prot#

Proc Fehlercode_bestimmen

    Parameters NTSTATUS%

    IF NTSTATUS%=1

        LET NTFEHLER&=AHRückgabe&
        LET AHRückgabe&=@LsaNtStatusToWinError(NTFEHLER&)

    endif

    DIM AHGETERROR_Buffer#,32000
    @FormatMessage($1000,0,AHRückgabe&,0,AHGETERROR_Buffer#,32000,0) Wandelt Fehlercode in Landesspezifische Message um.
    Let AHGETERROR_Buffer$=@trim$(@STRING$(AHGETERROR_Buffer#,0))
    Dispose AHGETERROR_Buffer#

Endproc

Proc Start_Driver

    Parameters BinaryPathName$,Service_Name$,SC_DisplayName$

    IF BinaryPathName$<>

        LET SCManager_Handle&=@OpenSCManager(0,0,$F000F)
        LET Service&=@CreateService(SCManager_Handle&,@ADDR(Service_Name$),@ADDR(SC_DisplayName$),$10 | $10000,$1,$3,$0,@ADDR(BinaryPathName$),0,0,0,0,0)

        IF Service&=0

            LET SERVICE&=@OpenService(SCManager_Handle&,@ADDR(Service_Name$),$10 | $10000)

        endif

        @StartService(Service&,0,0)
        @DeleteService(Service&)
        @CloseServiceHandle(Service&)
        @CloseServiceHandle(SCManager_Handle&)

    endif

endproc

Proc Read_VMInfos

    Clear Prot#
    LET Zwischenmerker&=@VAL(Zwischenmerker$)
    WriteIni HKEY_DW_2,SoftwareScannyVMQuery,OwnID=@GetCurrentProcessID()
    LET PRID&=@val(@GetText$(PID&))
    WriteIni HKEY_DW_2,SoftwareScannyVMQuery,PID=PRID& Hier kann irgendeine PID hin
    WriteIni HKEY_DW_2,SoftwareScannyVMQuery,Address=Zwischenmerker&
    WriteIni HKEY_DW_2,SoftwareScannyVMQuery,Var=Prot#
    WriteIni HKEY_DW_2,SoftwareScannyVMQuery,Return=@addr(Fehler&)
    LET M_NAME$=NTDLL.DLL
    LET MHANDLE&=@GetModuleHandle(@ADDR(M_NAME$))
    LET PROC_NAME$=ZwQueryVirtualMemory
    LET PROC_ADDRESS&=@GetProcAddress(MHANDLE&,@ADDR(PROC_NAME$))
    WriteIni HKEY_DW_2,SoftwareScannyVMQuery,ZwQueryVirtualMemory=PROC_ADDRESS&
    LET PROC_NAME$=ZwWriteVirtualMemory
    LET PROC_ADDRESS&=@GetProcAddress(MHANDLE&,@ADDR(PROC_NAME$))
    WriteIni HKEY_DW_2,SoftwareScannyVMQuery,ZwWriteVirtualMemory=PROC_ADDRESS&
    Start_Driver $Progdir+vmquery.sys,VMQUERY,Speicherstatus lesen
    LET AHRÜCKGABE&=Fehler&
    Fehlercode_bestimmen 1
    Locate 0,0
    CLS
    Print AHGETERROR_Buffer$
    ADDSTRING __________________________________________
    ADDSTRING ID des Prozesses: +@Str$(PRID&)
    ADDSTRING Zu testende Adresse: +@Str$(Zwischenmerker&)

    If Fehler&=0

        LET Zwischenmerker2&=@LONG(Prot#,0)+@LONG(Prot#,12)-1
        LET Zwischenmerker$=@STR$(@LONG(Prot#,0))+ bis +@STR$(Zwischenmerker2&)
        ADDSTRING  Adresse liegt in Adressbereich: +Zwischenmerker$

        If @int(@LONG(PROT#,12)/PAGE_SIZE&)=1

            ADDSTRING  Seitenanzahl des Adressbereiches: +eine Seite

        else

            ADDSTRING  Seitenanzahl des Adressbereiches: +@STR$(@int(@LONG(Prot#,12)/PAGE_SIZE&))+ Seiten

        endif

        ADDSTRING  Offsetadresse der Speicherzuweisung: +@STR$(@LONG(Prot#,4))
        Clear Zwischenmerker$
        LET Zwischenmerker3&=@long(Prot#,24)

        IF @or(Zwischenmerker3&,$20000)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+   Privat
            Zwischenmerker3&=Zwischenmerker3&-$20000

        endif

        IF @or(Zwischenmerker3&,$40000)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+   Mapping
            Zwischenmerker3&=Zwischenmerker3&-$40000

        endif

        IF @or(Zwischenmerker3&,$1000000)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+   Image
            Zwischenmerker3&=Zwischenmerker3&-$1000000

        endif

        IF Zwischenmerker3&>0

            LET Zwischenmerker$=Zwischenmerker$+  $+@Hex$(Zwischenmerker3&)

        endif

        LET Zwischenmerker$=@trim$(Zwischenmerker$)

        IF Zwischenmerker$<>

            ADDSTRING  Speichertyp der Seiten: +Zwischenmerker$

        endif

        Clear Zwischenmerker$
        LET Zwischenmerker3&=@long(Prot#,8)

        IF @or(Zwischenmerker3&,$1)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+   kein Zugriff
            Zwischenmerker3&=Zwischenmerker3&-$1

        endif

        IF @or(Zwischenmerker3&,$2)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+   nur lesen
            Zwischenmerker3&=Zwischenmerker3&-$2

        endif

        IF @or(Zwischenmerker3&,$4)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+   lesen, schreiben
            Zwischenmerker3&=Zwischenmerker3&-$4

        endif

        IF @or(Zwischenmerker3&,$8)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+   copy-on-write
            Zwischenmerker3&=Zwischenmerker3&-$8

        endif

        IF @or(Zwischenmerker3&,$10)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+   ausführen
            Zwischenmerker3&=Zwischenmerker3&-$10

        endif

        IF @or(Zwischenmerker3&,$20)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+   ausführen, lesen
            Zwischenmerker3&=Zwischenmerker3&-$20

        endif

        IF @or(Zwischenmerker3&,$40)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+   ausführen, lesen, schreiben
            Zwischenmerker3&=Zwischenmerker3&-$40

        endif

        IF @or(Zwischenmerker3&,$80)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+  ausführen, lesen, schreiben, copy-on-write, read-on-write
            Zwischenmerker3&=Zwischenmerker3&-$80

        endif

        IF @or(Zwischenmerker3&,$100)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+  geschützt
            Zwischenmerker3&=Zwischenmerker3&-$100

        endif

        IF @or(Zwischenmerker3&,$200)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+  kein Caching
            Zwischenmerker3&=Zwischenmerker3&-$200

        endif

        IF @or(Zwischenmerker3&,$400)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+  WRITECOMBINE
            Zwischenmerker3&=Zwischenmerker3&-$400

        endif

        IF Zwischenmerker3&>0

            LET Zwischenmerker$=Zwischenmerker$+  $+@Hex$(Zwischenmerker3&)

        endif

        LET Zwischenmerker$=@trim$(Zwischenmerker$)

        IF Zwischenmerker$<>

            ADDSTRING  Zugewiesen mit Zugriffsflags: +Zwischenmerker$

        endif

        Clear Zwischenmerker$
        LET Zwischenmerker3&=@long(PROT#,20)

        IF @or(Zwischenmerker3&,$1)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+   kein Zugriff
            Zwischenmerker3&=Zwischenmerker3&-$1

        endif

        IF @or(Zwischenmerker3&,$2)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+   nur lesen
            Zwischenmerker3&=Zwischenmerker3&-$2

        endif

        IF @or(Zwischenmerker3&,$4)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+   lesen, schreiben
            Zwischenmerker3&=Zwischenmerker3&-$4

        endif

        IF @or(Zwischenmerker3&,$8)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+   copy-on-write
            Zwischenmerker3&=Zwischenmerker3&-$8

        endif

        IF @or(Zwischenmerker3&,$10)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+   ausführen
            Zwischenmerker3&=Zwischenmerker3&-$10

        endif

        IF @or(Zwischenmerker3&,$20)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+   ausführen, lesen
            Zwischenmerker3&=Zwischenmerker3&-$20

        endif

        IF @or(Zwischenmerker3&,$40)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+   ausführen, lesen, schreiben
            Zwischenmerker3&=Zwischenmerker3&-$40

        endif

        IF @or(Zwischenmerker3&,$80)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+  ausführen, lesen, schreiben, copy-on-write, read-on-write
            Zwischenmerker3&=Zwischenmerker3&-$80

        endif

        IF @or(Zwischenmerker3&,$100)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+  geschützt
            Zwischenmerker3&=Zwischenmerker3&-$100

        endif

        IF @or(Zwischenmerker3&,$200)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+  kein Caching
            Zwischenmerker3&=Zwischenmerker3&-$200

        endif

        IF @or(Zwischenmerker3&,$400)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+  WRITECOMBINE
            Zwischenmerker3&=Zwischenmerker3&-$400

        endif

        IF Zwischenmerker3&>0

            LET Zwischenmerker$=Zwischenmerker$+  $+@Hex$(Zwischenmerker3&)

        endif

        LET Zwischenmerker$=@trim$(Zwischenmerker$)

        IF Zwischenmerker$<>

            ADDSTRING  Augenblicklicher Zugriffsschutz der Seiten: +Zwischenmerker$

        endif

        Clear Zwischenmerker$
        LET Zwischenmerker3&=@long(PROT#,16)

        IF @or(Zwischenmerker3&,$1000)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+   Physikalischem Speicher zugewiesen.
            Zwischenmerker3&=Zwischenmerker3&-$1000

        endif

        IF @or(Zwischenmerker3&,$10000)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+   Frei, kann zugewiesen werden.
            Zwischenmerker3&=Zwischenmerker3&-$10000

        endif

        IF @or(Zwischenmerker3&,$2000)=Zwischenmerker3&

            LET Zwischenmerker$=Zwischenmerker$+   Reserviert, kann nicht zugewiesen werden.
            Zwischenmerker3&=Zwischenmerker3&-$2000

        endif

        IF Zwischenmerker3&>0

            LET Zwischenmerker$=Zwischenmerker$+  $+@Hex$(Zwischenmerker3&)

        endif

        LET Zwischenmerker$=@trim$(Zwischenmerker$)
        ADDSTRING  Status der Seiten: +Zwischenmerker$
        LET Zwischenmerker3&=@long(PROT#,16)

        IF @or(Zwischenmerker3&,$1000)=Zwischenmerker3&

            ADDSTRING  Startadresse der Speicherregion: +@str$(@long(Prot#,0))
            ADDSTRING  Maximal auslesbare Bytes: +@str$(@long(Prot#,12))

        endif

    Else

        ADDSTRING  Info: +Für diese Adresse sind keine Daten auslesbar!

    endif

    @editbox(Ausgelesene Speicherinfos...,1)

endproc


Wenn man unter XP als PID 4 oder unter 2000 als PID 8 eingibt (Prozess System), erkennt man auch gleich die Besonderheiten der Geschichte - obwohl keine Zugriffsrechte geändert wurden und der Prozess in einem normalen Useraccount läuft, kann man den Speicher des Prozesses System ohne weiteres scannen.

Gruß

Andreas

269 kB
Kurzbeschreibung: Userspeicher scannen
Hochgeladen:01.12.2006
Ladeanzahl29
Herunterladen
 
01.12.2006  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

5.755 Betrachtungen

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