> null, // no dependencies
null, // localsystem account
null // no password
);
if (schservice == null)
{
if(getlasterror() == error_service_exists)
{
printf("service has already installed!\n");
}
printf("install driver false!");
return false;
}
bool nret = startservice(schservice, 0, null);
if(!nret)
{
if(getlasterror() == error_service_already_running)
{
printf("service is already running!\n");
return false; }
}
closeservicehandle(schservice);
closeservicehandle(hscmanager);
return true;
}
以上对驱动程序大致框架做了一个非常简单的介绍,这仅仅是驱动程序中的一个”hello world!”。驱动程序是相当复杂的,由于我们只是利用驱动程序的特权,对windows内核进行修改,所以就不对驱动驱动程序进行深入讨论了。
通过hook ssdt (system service dispath table) 隐藏进程
1.原理介绍:
windows操作系统是一种分层的架构体系。应用层的程序是通过api来访问操作系统。而api又是通过ntdll里面的核心api来进行系统服务的查询。核心api通过对int 2e的切换,从用户模式转换到内核模式。2eh中断的功能是通过ntoskrnl.exe的一个函数kisystemservice()来实现的。在你使用了一个系统调用时,必须首先装载要调用的函数索引号到eax寄存器中。把指向参数区的指针被保存在edx寄存器中。中断调用后,eax寄存器保存了返回的结果。kisystemservice()是根据eax的值来决定哪个函数将被调用。而系统在ssdt中维持了一个数组,专门用来索引特定的函数服务地址。在windows 2000中有一个未公开的由ntoskrnl.exe导出的keservicedescriptortable变量,我们可以通过它来完成对ssdt的访问与修改。keservicedescriptortable对应于一个数据结构,定义如下:
typedef struct systemservicedescriptortable
{
uint *servicetablebase;
uint *servicecountertablebase;
uint numberofservice;
uchar *parametertablebase;
}systemservicedescriptortable,*psystemservicedescriptortable;
其中servicetablebase指向系统服务程序的地址(ssdt),parametertablebase则指向sspt中的参数地址,它们都包含了numberofservice这么多个数组单元。在windows 2000 sp4中numberofservice的数目是248个。
我们的任务管理器,是通过用户层的api来枚举当前的进程的。ring3级枚举的方法:
• psapi
– enumprocesses()
• toolhelp32
– process32first()
- process32next()
来对进程进行枚举。而她们最后都是通过ntquerysysteminformation来进行查询的。所以我们只需要hook掉ntquerysysteminformation,把真实ntquerysysteminformation返回的数进行添加或者是删改,就能有效的欺骗上层api。从而达到隐藏特定进程的目的。
2. hook
windows2000中ntquerysysteminformation在ssdt里面的索引号是0x97,所以只需要把ssdt中偏移0x97*4处把原来的一个dword类型的读出来保存一个全局变量中然后再把她重新赋值成一个新的hook函数的地址,就完成了hook。
oldfuncaddress = keservicedescriptortable-> servicecounte
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>