RT
ExitProcess 到了内核是不是会调用NtTerminateProcess函数呢

解决方案 »

  1.   

    有点不解
    我在逆个程序 OD显示了NtTerminateProcess后还弹出个MessageBox还有我找不到NtExitProcess的资料 只有ZwExitProcess不是很熟悉内核 不知道ZwExitProcess是不是内核函数呢
      

  2.   

    不存在NtExitProcess和ZwExitProcess
      

  3.   

    哦 列宁同志 ZwOpenProcess 和NtOpenProcess这二个函数有什么不同呢?
      

  4.   

    ntdll.dll中的ZwOpenProcess 和NtOpenProcess是同一个东西
    ntoskrnl.exe中的NtOpenProcess是实际的系统服务,ZwOpenProcess是伪造一个trap frame然后通过系统服务分派例程调用NtOpenProcess,这样会使PreviousMode为内核模式
      

  5.   

    ~哦 多谢咯 我有待深入
    http://topic.csdn.net/u/20110713/21/e7d67b89-7c53-4b40-97b9-4790aeaa359d.html
    你上次在14楼给我的那段代码是不是和这个一样的呢NTSTATUS MyNtOpenProcess(                           PHANDLE ProcessHandle,  
                             ACCESS_MASK DesiredAccess,  
                             HANDLE ProcessId,  
                             KPROCESSOR_MODE AccessMode  
                             )  
    {  
        NTSTATUS status = STATUS_SUCCESS;  
        ACCESS_STATE accessState;  
        char auxData[0x200];  
        PEPROCESS processObject = NULL;  
        HANDLE processHandle = NULL;      status = SeCreateAccessState(  
            &accessState,  
            auxData,  
            DesiredAccess,  
            &(*PsProcessType)->TypeInfo.GenericMapping  
            );      if (!NT_SUCCESS(status))  
            return status;      accessState.PreviouslyGrantedAccess |= accessState.RemainingDesiredAccess;  
        accessState.RemainingDesiredAccess = 0;      status = PsLookupProcessByProcessId(ProcessId, &processObject);      if (!NT_SUCCESS(status))  
        {  
            SeDeleteAccessState(&accessState);  
            return status;  
        }      status = ObOpenObjectByPointer(  
            processObject,  
            0,  
            &accessState,  
            0,  
            *PsProcessType,  
            AccessMode,  
            &processHandle  
            );      SeDeleteAccessState(&accessState);  
        ObDereferenceObject(processObject);      if (NT_SUCCESS(status))  
            *ProcessHandle = processHandle;      return status;  
    }  
      

  6.   

    你这是哪里来的,参数都和NtOpenProcess不一样
      

  7.   

    http://www.debugman.com/discussion/3400/obopenobjectbypointer%E6%89%93%E5%BC%80%E8%BF%9B%E7%A8%8B不一样吗
      

  8.   

    不知道你还记得不 我想逆一个程序 那程序Hook了NtOpenProcess里面的call ObOpenObjectByPoiunter
    HOOK前:
    push 1
    push 2
    call SysFunc
    HOOK后:
    push 1
    push 2
    call HookFunc
    今天测试了下 确定了 HookFunc里面某个变量或者其他的在一定时间内没被触发就退出进程我想 把那段代码copy到我的驱动了
    然后再在NtOpenProcess 函数前 jmp到MyUnHook函数里在MyUnHook判断 Open的是不是目标程序进程 如果是就调用上面的代码打开进程返回
    如果不是的话就jmp到NtOpenProcess正常执行
    列宁同志可以告诉我上面哪里查了吗
      

  9.   

    那个是别人自己实现的打开进程
    你为何不用ssdt hook,这个简单多
      

  10.   

    噢,那就是说用那段代码不用NTOpenProcess也可以啦我不懂你后一句是什么意思 我这情况 应该用不上了
      

  11.   

    你这情况就应该用ssdt hook
    直接修改函数地址,不需要分析一堆指令
      

  12.   

    你是说 
    push 1
    push 2
    call HookFunccall HookFunc
    修改这里? 不能修改这里的啦代码监测的定时器给我Kill了就不说了 我测试了下 应该是HookFunc里面某个变量或者其他什么在一定时间内没被触发 就会退出进程
      

  13.   

    或者你是说直接修改NtOpenProcess函数地址? 我想也不行那样也会退出进程的
      

  14.   

    我没说修改那里,我说修改KiServiceTable里面的项
    至于定时监测的你先调用被它改过的NtOpenProcess再调用自己的不就行了 
      

  15.   

    你所说的 "KiServiceTable里面的项"究竟还是在NtOpenProcess函数里做手脚
    还是其他的呢?
    修改项见过这例子
      

  16.   

    首先 你上面说的"修改KiServiceTable里面的项" 就是如果有调用NtOpenProcess就执行MyNtOpenProcess是这样吗?像这样:
      Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x7A * 4
      *((ULONG*)Address) = (ULONG)MyNtOpenProcess;//HOOK SSDT
    还是在NtOpenProcess里面做jmp MyNtOpenProcess ?
      

  17.   

    前者,ssdt hook不修改函数的代码
      

  18.   

    噢 多谢啦 就像这篇文章那样吧
    http://www.debugman.com/discussion/4699
      

  19.   

    "先调用被它改过的NtOpenProcess再调用自己的"这样就有点不解了
    在哪里接着自己的函数调用呢 这样还要取分析反汇编
      

  20.   

    一点汇编都不用修改ssdt可以用mdl法,不需要mov  cr0,eaxAddress = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x7A * 4
    void*OldNtOpenProcess=*((void**)Address)
      *((ULONG*)Address) = (ULONG)MyNtOpenProcessNTSTATUS __stdcall MyNtOpenProcess(PHANDLE ProcessHandle,
                   ACCESS_MASK DesiredAccess,
                   POBJECT_ATTRIBUTES ObjectAttributes,
                   PCLIENT_ID ClientId) 
    {
    if(OldNtOpenProcess()!=NT_SUCCESS)
    {
    if(ClientId->UniqueProcess==你要打开的那个进程)
    {
    void*process;
    PsLookupProcessByProcessId(ClientId->UniqueProcess,&process)
    ObOpenObjectByPointer(process,...,ProcessHandle);
    return NT_SUCCESS;
    }
    }
    }大致流程就是这样,既调用了它的代码又能够打开目标进程,没有哪里要用到汇编
      

  21.   

    好啊
    OldNtOpenProcess是参数是你省略了吧
      

  22.   

    感谢列宁同志的热心and耐心教导
      

  23.   

    列宁同志 是这样吗 在你上面代码中第二行这样定义
    NTSTATUS *(__stdcall * OldNtOpenProcess(PHANDLE ProcessHandle,
      ACCESS_MASK DesiredAccess,
      POBJECT_ATTRIBUTES ObjectAttributes,
      PCLIENT_ID ClientId))=(NTSTATUS(__stdcall *)(PHANDLE ProcessHandle,
      ACCESS_MASK DesiredAccess,
      POBJECT_ATTRIBUTES ObjectAttributes,
      PCLIENT_ID ClientId))Address; 然后再MyNtOpenProcess中调用 这样对不对呢?