| |
|
|
- Seite 1 - |
|
| Hallo Leute...
Die API ZwQueryVirtualMemory habe ich ja noch gut hinbekommen, aber bei ZwOpenProcess stehe ich im Augenblick auf dem Schlauch. Folgender Quellcode: KompilierenMarkierenSeparierenDef @ZwOpenProcess(4) !"NTDLL.DLL","ZwOpenProcess"
DEF @LsaNtStatusToWinError(1) !"advapi32","LsaNtStatusToWinError"
Def @GetCurrentProcessID(0) !"KERNEL32","GetCurrentProcessId"
Def @CloseHandle(1) !"KERNEL32","CloseHandle"
Def @GetLastError(0) !"KERNEL32","GetLastError"
Def @SetLastError(1) !"KERNEL32","SetLastError"
DEF @AHFormatMessage(7) !"KERNEL32","FormatMessageA"
Declare AHRückgabe&,AHGETERROR_Buffer#,AHGETERROR_Buffer$
Declare NT_Fehler&,WIN_FEHLER&,P_Handle&,P_ID&
Windowstyle 31
WindowTitle "ZwOpenProcess"
Window 0,0-780,440
LET P_ID&=@GetCurrentProcessID()
@SetLastError(0)
LET NT_FEHLER&=@ZwOpenProcess(@ADDR(P_Handle&),$400,0,P_ID&)
LET AHRückgabe&=@GetLastError()
Fehlercode_bestimmen
PRINT "Letzter API-Fehler nach ZwOpenProcess: "+AHGETERROR_Buffer$
LET WIN_FEHLER&=@LsaNtStatusToWinError(NT_FEHLER&)
LET AHRückgabe&=WIN_FEHLER&
Fehlercode_bestimmen
PRINT "Rückmeldung von ZwOpenProcess: "+AHGETERROR_Buffer$+" ("+@STR$(NT_FEHLER&)+")"
Print "ID des Prozesses: "+@STR$(P_ID&)
PRINT "Handle des Prozesses: "+@STR$(P_Handle&)
Print ""
IF P_Handle&<>0
@SetLastError(0)
LET Win_Fehler&=@CloseHandle(P_Handle&)
LET AHRückgabe&=@GetLastError()
Fehlercode_bestimmen
PRINT "Letzter API-Fehler nach CloseHandle: "+AHGETERROR_Buffer$
LET AHRückgabe&=WIN_FEHLER&
Fehlercode_bestimmen
PRINT "Rückmeldung von CloseHandle: "+AHGETERROR_Buffer$
Endif
While 0=0
Waitinput
wend
Proc Fehlercode_bestimmen
DIM AHGETERROR_Buffer#,32000
@AHFormatMessage($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
Was mache ich da für Fehler??? |
|
|
| |
|
|
|
| |
|
- Seite 1 - |
|
Sebastian König | Hallo Andreas,
hast Du mal einen guten Link zu Informationen über ZwOpenProcess()?
MfG
Sebastian |
|
|
| |
|
|
|
| Hallo Sebastian... Ich habe im Augenblick nur [...] . Def letzte Parameter dürfte bei mir also nicht stimmen.. |
|
|
| |
|
|
|
| ...und der zweite ebenfalls. |
|
|
| |
|
|
|
| Der zweite Parameter wirds wohl sein, den ersten könnte ich vielleicht auf 0 setzen. Hier Link: [...] |
|
|
| |
|
|
|
Sebastian König | Ich nehme an, du beziehst dich auf das hier: [quote:7063508387]NTSYSAPI NTSTATUS NTAPI ZwOpenProcess( OUT PHANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId OPTIONAL );
The ClientId parameter is a structure (defined in ntifs.h) that allows you to specify a process ID to open. Once the function succeeds, call ObReferenceObjectByHandle on the returned ProcessHandle to get at the PEPROCESS.[/quote:7063508387] Die Definitionen für CLIENT_ID und OBJECT_ATTRIBUTES habe ich schonmal gefunden: [quote:7063508387] typedef struct _OBJECT_ATTRIBUTES { ULONG Length; HANDLE RootDirectory; PUNICODE_STRING ObjectName; ULONG Attributes; PVOID SecurityDescriptor; PVOID SecurityQualityOfService; } OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
typedef struct _CLIENT_ID { HANDLE UniqueProcess; HANDLE UniqueThread; } CLIENT_ID, *PCLIENT_ID; [/quote:7063508387] Leider muss man das ganze wohl auch noch passend füllen - zumindest die ObjectAttributes, ClientId ist ja wohl optional.
Mit KompilierenMarkierenSeparieren kommt immerhin schonmal nur noch Falscher Parameter. Irgendwie muss man ja auch angeben, welchen Prozess man überhaupt öffnen möchte - entweder wohl in ClientId oder vielleicht in ObjectName... |
|
|
| |
|
|
|
| [quote:0009d0d868=Sebastian König]kommt immerhin schonmal nur noch Falscher Parameter. Irgendwie muss man ja auch angeben, welchen Prozess man überhaupt öffnen möchte - entweder wohl in ClientId oder vielleicht in ObjectName...[/quote:0009d0d868] Angeben muß man das scheinbar in ObjectName, CLIENT_ID kann ja 0 sein. Der Objektname könnte der Name des Prozesses aus dem Taskmanasger sein. RootDirectory macht mir etwas Kopfzerbrechen - keine Ahnung was da hinkommt. SecurityDescriptor könnte auch evtl 0 sein (zur not bastele ich mir selbst einen), bin mir da aber nicht ganz sicher. Bei SecurityQualityOfService bin ich mir auch noch nicht ganz sicher...
CLIENT_ID fehlte mir noch, besten Dank. |
|
|
| |
|
|
|
| Bin zwar noch nicht am Ziel, aber schon etwas weiter: KompilierenMarkierenSeparierenDEF @MultiByteToWideChar(6) !"kernel32","MultiByteToWideChar"
Def @ZwOpenProcess(4) !"NTDLL.DLL","ZwOpenProcess"
DEF @LsaNtStatusToWinError(1) !"advapi32","LsaNtStatusToWinError"
Def @GetCurrentProcessID(0) !"KERNEL32","GetCurrentProcessId"
Def @CloseHandle(1) !"KERNEL32","CloseHandle"
Def @GetLastError(0) !"KERNEL32","GetLastError"
Def @SetLastError(1) !"KERNEL32","SetLastError"
DEF @AHFormatMessage(7) !"KERNEL32","FormatMessageA"
Declare AHRückgabe&,AHGETERROR_Buffer#,AHGETERROR_Buffer$
Declare NT_Fehler&,WIN_FEHLER&,P_Handle&,P_ID&,Objekt_name$
Declare Attr#,Unicode_STR#
Windowstyle 31
WindowTitle "ZwOpenProcess"
Window 0,0-780,440
LET P_ID&=@GetCurrentProcessID()
@SetLastError(0)
Dim Attr#,24
Clear Attr#
Long Attr#,0=24
LET Objekt_name$="F:ProgrammeXProfan9PROFAN.EXE"
Dim Unicode_STR#,513
@MultiByteToWideChar(0,0,@ADDR(Objekt_name$),-1,Unicode_STR#,256)
Long Attr#,8=Unicode_STR#
Let Nt_fehler&=@Zwopenprocess(@Addr(P_handle&),$400,Attr#,0)
Dispose Attr#
LET AHRückgabe&=@GetLastError()
Fehlercode_bestimmen
PRINT "Letzter API-Fehler nach ZwOpenProcess: "+AHGETERROR_Buffer$
LET WIN_FEHLER&=@LsaNtStatusToWinError(NT_FEHLER&)
LET AHRückgabe&=WIN_FEHLER&
Fehlercode_bestimmen
PRINT "Rückmeldung von ZwOpenProcess: "+AHGETERROR_Buffer$+" ("+@STR$(NT_FEHLER&)+")"
Print "ID des Prozesses: "+@STR$(P_ID&)
PRINT "Handle des Prozesses: "+@STR$(P_Handle&)
Print ""
IF P_Handle&<>0
@SetLastError(0)
LET Win_Fehler&=@CloseHandle(P_Handle&)
LET AHRückgabe&=@GetLastError()
Fehlercode_bestimmen
PRINT "Letzter API-Fehler nach CloseHandle: "+AHGETERROR_Buffer$
LET AHRückgabe&=WIN_FEHLER&
Fehlercode_bestimmen
PRINT "Rückmeldung von CloseHandle: "+AHGETERROR_Buffer$
Endif
While 0=0
Waitinput
wend
Proc Fehlercode_bestimmen
DIM AHGETERROR_Buffer#,32000
@AHFormatMessage($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
|
|
|
| |
|
|
|
Sebastian König | |
|
| |
|
|
|
| |
|
| |
|
|
|
| Hallo Sebastian...
Hier nun der komplette Code: KompilierenMarkierenSeparierenDef @ZwOpenProcess(4) !"NTDLL.DLL","ZwOpenProcess"
DEF @LsaNtStatusToWinError(1) !"advapi32","LsaNtStatusToWinError"
Def @GetCurrentProcessID(0) !"KERNEL32","GetCurrentProcessId"
Def @GetLastError(0) !"KERNEL32","GetLastError"
Def @SetLastError(1) !"KERNEL32","SetLastError"
DEF @AHFormatMessage(7) !"KERNEL32","FormatMessageA"
DEF @ZwClose(1) !"NTDLL","ZwClose"
Declare AHRückgabe&,AHGETERROR_Buffer#,AHGETERROR_Buffer$
Declare NT_Fehler&,WIN_FEHLER&,P_Handle&,P_ID&,Objekt_name$
Declare Attr#,Unicode_STR#,Id#
Windowstyle 31
WindowTitle "ZwOpenProcess"
Window 0,0-780,440
LET P_ID&=@GetCurrentProcessID()
Dim Attr#,24
DIM ID#,8
Long ID#,0=P_ID&
Clear Attr#
Long Attr#,0=24 Größe der Struktur
@SetLastError(0)
Let Nt_fehler&=@Zwopenprocess(@Addr(P_handle&),$400,Attr#,ID#)
LET AHRückgabe&=@GetLastError()
Dispose Unicode_STR#
Dispose ID#
Dispose Attr#
Fehlercode_bestimmen
PRINT "Letzter API-Fehler nach ZwOpenProcess: "+AHGETERROR_Buffer$
LET WIN_FEHLER&=@LsaNtStatusToWinError(NT_FEHLER&)
LET AHRückgabe&=WIN_FEHLER&
Fehlercode_bestimmen
PRINT "Rückmeldung von ZwOpenProcess: "+AHGETERROR_Buffer$+" ("+@STR$(NT_FEHLER&)+")"
Print "ID des Prozesses: "+@STR$(P_ID&)
PRINT "Handle des Prozesses: "+@STR$(P_Handle&)
Print ""
IF P_Handle&<>0
@SetLastError(0)
LET NT_Fehler&=@ZwClose(P_Handle&)
LET AHRückgabe&=@GetLastError()
Fehlercode_bestimmen
PRINT "Letzter API-Fehler nach ZwClose: "+AHGETERROR_Buffer$
LET WIN_FEHLER&=@LsaNtStatusToWinError(NT_FEHLER&)
LET AHRückgabe&=WIN_FEHLER&
Fehlercode_bestimmen
PRINT "Rückmeldung von ZwClose: "+AHGETERROR_Buffer$
Endif
While 0=0
Waitinput
wend
Proc Fehlercode_bestimmen
DIM AHGETERROR_Buffer#,32000
@AHFormatMessage($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
Und was ich dir noch sagen wollte: TOLL! SUPER!!! Vielen, vielen Dank Jetzt kann ich schauen, was ich damit anfangen kann! <= Thats Windows
|
|
|
| |
|
|
|
Sebastian König | [quote:3d218d8a75]Jetzt kann ich schauen, was ich damit anfangen kann! <= Thats Windows[/quote:3d218d8a75] Ok, ich bin gespannt, wofür das ganze gut ist! |
|
|
| |
|
|
| |
|
- Seite 2 - |
|
|
| Kann etwas dauern, wieder Nachtschicht - mal achauen, ob ich damit weiterkomme. Im Augenblick scheint sich das zu bestätigen, was ich über Windows denke... |
|
|
| |
|
|