NtCreateProcess( OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN HANDLE ParentProcess,
IN BOOLEAN InheritObjectTable,
IN HANDLE SectionHandle OPTIONAL,
IN HANDLE DebugPort OPTIONAL,
IN HANDLE ExceptionPort OPTIONAL );
我要用delphi 来hook NtCreateProcess 帮转成delphi的下,顺便说明下怎么hook?怎么得到启动程序的路径!
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN HANDLE ParentProcess,
IN BOOLEAN InheritObjectTable,
IN HANDLE SectionHandle OPTIONAL,
IN HANDLE DebugPort OPTIONAL,
IN HANDLE ExceptionPort OPTIONAL );
我要用delphi 来hook NtCreateProcess 帮转成delphi的下,顺便说明下怎么hook?怎么得到启动程序的路径!
我找的快发疯了!
type
PUNICODE_STRING = ^UNICODE_STRING;
_UNICODE_STRING = record
Length: word;
MaximumLength: word;
Buffer: PWideChar;
end; POBJECT_ATTRIBUTES = ^OBJECT_ATTRIBUTES;
_OBJECT_ATTRIBUTES = record
Length: ULONG;
RootDirectory: HANDLE;
ObjectName: PUNICODE_STRING;
Attributes: Dword;
SecurityDescriptor: pointer; // Points to type SECURITY_DESCRIPTOR
SecurityQualityOfService: pointer; // Points to type SECURITY_QUALITY_OF_SERVICE
end;function NtCreateProcess(ProcessHandle: PHANDLE; DesiredAccess: Dword; ObjectAttributes: POBJECT_ATTRIBUTES; InheritFromProcessHandle: HANDLE;InheritHandles: boolean; SectionHandle: HANDLE;DebugPort: HANDLE; ExceptionPort: HANDLE): Dword; stdcall;
TNtCreateProcess = function(ProcessHandle: PHANDLE; DesiredAccess: Dword; ObjectAttributes: POBJECT_ATTRIBUTES; InheritFromProcessHandle: HANDLE;InheritHandles: boolean; SectionHandle: HANDLE;DebugPort: HANDLE; ExceptionPort: HANDLE): Dword; stdcall; TJmpCode = packed record
JmpCode: BYTE;
Address: TNtCreateProcess;
MovEAX: array[0..2] of BYTE;
end;end;
var
OldNtCreateProcess:TNtCreateProcess ;
NewCode,OldCode:TJmpCode;function MyNtCreateProcess(ProcessHandle: PHANDLE; DesiredAccess: Dword; ObjectAttributes: POBJECT_ATTRIBUTES; InheritFromProcessHandle: HANDLE;InheritHandles: boolean; SectionHandle: HANDLE;DebugPort: HANDLE; ExceptionPort: HANDLE): Dword; stdcall;
begin
Result := OldNtCreateProcess(ProcessHandle, DesiredAccess,ObjectAttributes, InheritFromProcessHandle,InheritHandles,SectionHandle,DebugPort);
{这里做自己想做的事情}
{......}
end;3.设置hookvar
gNtCreateProcessAddress:pointer;procedure SetNtCreateProcessHook;
var
DLLModule: THandle;
dwSize: Cardinal;
begin
DLLModule := LoadLibrary('ntdll.dll');
gNtCreateProcessAddress:= GetProcAddress(DLLModule, 'NtCreateProcess'); //取得API地址
NewCode.JmpCode := $B8;
NewCode.MovEAX[0] := $FF;
NewCode.MovEAX[1] := $E0;
NewCode.MovEAX[2] := 0;
ReadProcessMemory(GetCurrentProcess, gNtCreateProcessAddress, @OldCode, Sizeof(TJmpCode),dwSize);
NewCode.Address := @MyNtCreateProcess;
WriteProcessMemory(GetCurrentProcess, gNtCreateProcessAddress, @NewCode, Sizeof(TJmpCode),dwSize);
end;procedure StopNtCreateProcessHook;
var
dwSize: Cardinal;
begin
WriteProcessMemory(GetCurrentProcess, gNtCreateProcessAddress, @OldCode, Sizeof(TJmpCode),dwSize);
end;调用:
直接SetNtCreateProcessHook;
这个代码在ring3下hook没什么意义,当你执行一个新进程根本无法hook到,只能hook自己进程创建的事件真要hook住全局的创建进程事件必须在ring0驱动层.
这个范例只是让你知道如何hook一个系统api.