随笔分类 - WinOS底层&应用编程
摘要:SSDT 表的初步学习1 理论知识大概思路和理论知识首先明白应用层到 内核层 会通过一张SSDT 表、、我们要根据SSDT结构和索引号来获取函数的当前地址如果检测一下这个函数有木有被HOOK我们要在获取这个函数的起源地址 对比一下即可知道、、1 读取SSDT表函数当前地址了解SSDT结构系统服务描述符表 在ntoskrnl.exe导出KeServiceDescriptorTable这个表typedef struct _ServiceDescriptorTable {PVOID ServiceTableBase; //System Service Dispatch Table 的基地址PVOID
阅读全文
摘要:NLINEHOOK过简单驱动保护的理论知识和大概思路、、这里的简单驱动保护就是 简单的 HOOK 掉内核API的现象、、、找到被HOOK的函数的当前地址在此地址处先修改页面保护属性然后写入5个字节、5个字节就是一个简单的JMP指令、 这里说一下JMP、如下、、001 JMP 002这样我们就会跳到001 (在此地址写入JMP指令)+ 002(我们要写入的JMP操作数) +5(jmp指令的字节数)这里、就是说如果你要跳回NtOpenProcess的原地址、就应该向被HOOK后的地址处写入这样的指令JMP ( NtOpenProcess的原地址-被HOOK后的地址- 5 )不是很乱思路清晰一些就明
阅读全文
摘要:HOOK SSDT思路:驱动加载时通过KeServiceDescriptorTable得到函数指针地址 -> 替换其地址为自定义函数地址驱动卸载时恢复SSDT原来地址代码部分:对于KeServiceDescriptorTable的类型定义如下:typedef struct _SERVICE_DESCRIPTOR_TABLE{PULONG ServiceTableBase; //指向系统服务函数地址表PULONG ServiceCounterTableBase;ULONG NumberOfService; //服务函数的个数,NumberOfService*4 就是整个地址表的大小ULON
阅读全文
摘要:今天的成果,读取了我的SSDT地址.读取当前地址代码(NtOpenProcess): LONG *SSDT_Adr,t_addr,adr; t_addr=(LONG)KeServiceDescriptorTable->ServiceTableBase; SSDT_Adr=(PLONG)(t_addr+0x7a*4); adr=*SSDT_Adr;读取起源地址(NtOpenProcess):UNICODE_STRING SysRoutineName;LONG orgadr;RtlInitUnicodeString(&SysRoutineName,L"NtOpenProce
阅读全文
摘要:通过Hook SSDT (System Service Dispath Table) 隐藏进程1.原理介绍: Windows操作系统是一种分层的架构体系。应用层的程序是通过API来访问操作系统。而API又是通过ntdll里面的核心API来进行系统服务的查询。核心API通过对int 2e的切换,从用户模式转换到内核模式。2Eh中断的功能是通过NTOSKRNL.EXE的一个函数KiSystemService()来实现的。在你使用了一个系统调用时,必须首先装载要调用的函数索引号到EAX寄存器中。把指向参数区的指针被保存在EDX寄存器中。中断调用后,EAX寄存器保存了返回的结果。KiSystemSer
阅读全文
摘要:句柄和指针区别。从广义上,能够从一个数值拎起一大堆数据的东西都可以叫做句柄。句柄的英文是"Handle",本义就是"柄" 。指针其实也是一种"句柄",只是由于指针同时拥有更特殊的含义——实实在在地对应内存里地一个地址——所以,通常不把指针说成是"句柄"。但指针也有着能从一个32位的值引用到一大堆数据的作用。Windows系统中有许多内核对象(这里的对象不完全等价于"面向对象程序设计"一词中的"对象",虽然实质上还真差不多),比如打开的文件,创建的线程,程序的窗口,等等。这些重
阅读全文
摘要:我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执行一个特定的操作,比如在多媒体中,比如在游戏中等,都会用到时间函数。还比如我们通过记录函数或者算法开始和截至的时间,然后利用两者之差得出函数或者算法的运行时间。编译器和操作系统为我们提供了很多时间函数,这些时间函数的精度也是各不相同的,所以,如果我们想得到准确的结果,必须使用合适的时间函数。现在我就介绍windows下的几种常用时间函数。1:Sleep函数使用:sleep(1000),在Windows和Linux下1000代表的含义并不相同,Windows下的表示1000毫秒,也就是1秒钟;Linux
阅读全文
摘要:#include #include #include #include #define DRIVER_NAME "123467"#define DRIVER_PATH "..\\HelloDDK.sys"//装载NT驱动程序BOOL LoadNTDriver(char* lpszDriverName,char* lpszDriverPath){/************************ 加载NT驱动的代码******************************* ① 调用OpenSCManager,打开SCM管理器.如果返回NULL,则返回失
阅读全文

浙公网安备 33010602011771号