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?怎么得到启动程序的路径!

解决方案 »

  1.   

    ntoskrnl导出的函数不能在R3下直接HOOK,必须利用驱动,你可以HOOK ntdll导出的 ZwCreateProcess代替
      

  2.   

    定义方面,找个jedi api库就有了
      

  3.   

    跪求:你能不能给我段hook ZwCreateProcess的代码啊,
    我找的快发疯了!
      

  4.   

    1。定义原型:
    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;
      

  5.   

    2.定义自己的回调函数:Type
    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.
      

  6.   

    不是这样所有ntoskrnl导出都可以hook只是hook到的只能在自己执行的进程内有效果。这里你所说的不能hook就是因为hook ntoskrnl导出的函数不是全局的,除非全局hook才有效果。
      

  7.   

    等有空发个windows是如何创建一个新进程的详细过程。