请教下 ExitProcess 到了内核是不是会调用NtTerminateProcess函数呢 RTExitProcess 到了内核是不是会调用NtTerminateProcess函数呢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有点不解我在逆个程序 OD显示了NtTerminateProcess后还弹出个MessageBox还有我找不到NtExitProcess的资料 只有ZwExitProcess不是很熟悉内核 不知道ZwExitProcess是不是内核函数呢 不存在NtExitProcess和ZwExitProcess 哦 列宁同志 ZwOpenProcess 和NtOpenProcess这二个函数有什么不同呢? ntdll.dll中的ZwOpenProcess 和NtOpenProcess是同一个东西ntoskrnl.exe中的NtOpenProcess是实际的系统服务,ZwOpenProcess是伪造一个trap frame然后通过系统服务分派例程调用NtOpenProcess,这样会使PreviousMode为内核模式 ~哦 多谢咯 我有待深入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; } 你这是哪里来的,参数都和NtOpenProcess不一样 http://www.debugman.com/discussion/3400/obopenobjectbypointer%E6%89%93%E5%BC%80%E8%BF%9B%E7%A8%8B不一样吗 不知道你还记得不 我想逆一个程序 那程序Hook了NtOpenProcess里面的call ObOpenObjectByPoiunterHOOK前:push 1push 2call SysFuncHOOK后:push 1push 2call HookFunc今天测试了下 确定了 HookFunc里面某个变量或者其他的在一定时间内没被触发就退出进程我想 把那段代码copy到我的驱动了然后再在NtOpenProcess 函数前 jmp到MyUnHook函数里在MyUnHook判断 Open的是不是目标程序进程 如果是就调用上面的代码打开进程返回如果不是的话就jmp到NtOpenProcess正常执行列宁同志可以告诉我上面哪里查了吗 那个是别人自己实现的打开进程你为何不用ssdt hook,这个简单多 噢,那就是说用那段代码不用NTOpenProcess也可以啦我不懂你后一句是什么意思 我这情况 应该用不上了 你这情况就应该用ssdt hook直接修改函数地址,不需要分析一堆指令 你是说 push 1push 2call HookFunccall HookFunc修改这里? 不能修改这里的啦代码监测的定时器给我Kill了就不说了 我测试了下 应该是HookFunc里面某个变量或者其他什么在一定时间内没被触发 就会退出进程 或者你是说直接修改NtOpenProcess函数地址? 我想也不行那样也会退出进程的 我没说修改那里,我说修改KiServiceTable里面的项至于定时监测的你先调用被它改过的NtOpenProcess再调用自己的不就行了 你所说的 "KiServiceTable里面的项"究竟还是在NtOpenProcess函数里做手脚还是其他的呢?修改项见过这例子 首先 你上面说的"修改KiServiceTable里面的项" 就是如果有调用NtOpenProcess就执行MyNtOpenProcess是这样吗?像这样: Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x7A * 4 *((ULONG*)Address) = (ULONG)MyNtOpenProcess;//HOOK SSDT还是在NtOpenProcess里面做jmp MyNtOpenProcess ? 前者,ssdt hook不修改函数的代码 噢 多谢啦 就像这篇文章那样吧http://www.debugman.com/discussion/4699 "先调用被它改过的NtOpenProcess再调用自己的"这样就有点不解了在哪里接着自己的函数调用呢 这样还要取分析反汇编 一点汇编都不用修改ssdt可以用mdl法,不需要mov cr0,eaxAddress = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x7A * 4void*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;}}}大致流程就是这样,既调用了它的代码又能够打开目标进程,没有哪里要用到汇编 好啊OldNtOpenProcess是参数是你省略了吧 感谢列宁同志的热心and耐心教导 列宁同志 是这样吗 在你上面代码中第二行这样定义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中调用 这样对不对呢? vc进度条问题 多线程问题,请明白人进来看看,帮我解释一下代码~ 如何对已有的控制面板程序增加设置页 如何将数字转化成字符串? 关于使用IPicture显示jpg图片不能刷新的问题 送分问题都来看看 高分报酬!有图像处理高手吗?看看我的这段代码,透明化图像好像总是有一个象素的偏移:( 线程向主窗口发送消息出错(在线等) 用C语言如何获得网卡的物理地址 如何将字符串以二进制方式写入文件?VC++的工程设置中使用UNICODE 关于窗口停靠的问题,VS2008或VS2010下 诚恳高手给个简单MFC多线程实例
我在逆个程序 OD显示了NtTerminateProcess后还弹出个MessageBox还有我找不到NtExitProcess的资料 只有ZwExitProcess不是很熟悉内核 不知道ZwExitProcess是不是内核函数呢
ntoskrnl.exe中的NtOpenProcess是实际的系统服务,ZwOpenProcess是伪造一个trap frame然后通过系统服务分派例程调用NtOpenProcess,这样会使PreviousMode为内核模式
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;
}
HOOK前:
push 1
push 2
call SysFunc
HOOK后:
push 1
push 2
call HookFunc
今天测试了下 确定了 HookFunc里面某个变量或者其他的在一定时间内没被触发就退出进程我想 把那段代码copy到我的驱动了
然后再在NtOpenProcess 函数前 jmp到MyUnHook函数里在MyUnHook判断 Open的是不是目标程序进程 如果是就调用上面的代码打开进程返回
如果不是的话就jmp到NtOpenProcess正常执行
列宁同志可以告诉我上面哪里查了吗
你为何不用ssdt hook,这个简单多
直接修改函数地址,不需要分析一堆指令
push 1
push 2
call HookFunccall HookFunc
修改这里? 不能修改这里的啦代码监测的定时器给我Kill了就不说了 我测试了下 应该是HookFunc里面某个变量或者其他什么在一定时间内没被触发 就会退出进程
至于定时监测的你先调用被它改过的NtOpenProcess再调用自己的不就行了
还是其他的呢?
修改项见过这例子
Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x7A * 4
*((ULONG*)Address) = (ULONG)MyNtOpenProcess;//HOOK SSDT
还是在NtOpenProcess里面做jmp MyNtOpenProcess ?
http://www.debugman.com/discussion/4699
在哪里接着自己的函数调用呢 这样还要取分析反汇编
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;
}
}
}大致流程就是这样,既调用了它的代码又能够打开目标进程,没有哪里要用到汇编
OldNtOpenProcess是参数是你省略了吧
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中调用 这样对不对呢?