首页
社区
课程
招聘
[原创]SSDT HOOK bypass 某游戏 and Themida ThreadHideFromDebugger
发表于: 2008-12-12 15:25 19173

[原创]SSDT HOOK bypass 某游戏 and Themida ThreadHideFromDebugger

2008-12-12 15:25
19173
///////////////////////////////////////////////////////////////////////////////
///
/// Copyright (c) 2008 - <dts>
///
/// Original filename: ZwHook.c
/// Project          : ZwHook
/// Date of creation : 2008-11-19
/// Author(s)        : 梧桐
///
/// Purpose          : <description>
///
/// Revisions:
///  0000 [2008-11-19] Initial revision.
///
///////////////////////////////////////////////////////////////////////////////

#include "ntddk.h"

#pragma pack(1)
typedef struct ServiceDescriptorEntry
{
        unsigned int *ServiceTableBase;
        unsigned int *ServiceCounterTableBase; //Used only in checked build
        unsigned int NumberOfServices;
        unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;

#pragma pack()

__declspec(dllimport)  ServiceDescriptorTableEntry_t KeServiceDescriptorTable;

#define SYSTEMSERVICE(_function)  KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]

PMDL  g_pmdlSystemCall;
PVOID *MappedSystemCallTable;

#define SYSCALL_INDEX(_Function) *(PULONG)((PUCHAR)_Function+1)

#define HOOK_SYSCALL(_Function, _Hook)  \
       (PVOID) InterlockedExchange( (PLONG) &MappedSystemCallTable[SYSCALL_INDEX(_Function)], (LONG) _Hook)

#define UNHOOK_SYSCALL(_Function, _Hook)  \
       InterlockedExchange( (PLONG) &MappedSystemCallTable[SYSCALL_INDEX(_Function)], (LONG) _Hook)

NTSYSAPI
NTSTATUS
NTAPI  ZwSetInformationThread(
							  IN HANDLE  ThreadHandle,
							  IN THREADINFOCLASS  ThreadInformationClass,
							  IN PVOID  ThreadInformation,
							  IN ULONG  ThreadInformationLength
							  );

typedef NTSTATUS (*ZWSETINFORMATIONTHREAD)(
	IN HANDLE  ThreadHandle,
	IN THREADINFOCLASS  ThreadInformationClass,
	IN PVOID  ThreadInformation,
	IN ULONG  ThreadInformationLength
	);

ZWSETINFORMATIONTHREAD        OldZwSetInformationThread;

NTSTATUS NewZwSetInformationThread(
								   IN HANDLE  ThreadHandle,
								   IN THREADINFOCLASS  ThreadInformationClass,
								   IN PVOID  ThreadInformation,
								   IN ULONG  ThreadInformationLength)
{ 
	NTSTATUS ntStatus;

	if(ThreadInformationClass == 17) //ANTI-DEBUG
		ntStatus =  STATUS_SUCCESS;
	else
		ntStatus = ((ZWSETINFORMATIONTHREAD)(OldZwSetInformationThread))(
		ThreadHandle,
		ThreadInformationClass,
		ThreadInformation,
		ThreadInformationLength);
	return ntStatus;
}

VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
{
   DbgPrint("ROOTKIT: OnUnload called\n");

   // unhook system calls
   UNHOOK_SYSCALL( ZwSetInformationThread, OldZwSetInformationThread);

   // Unlock and Free MDL
   if(g_pmdlSystemCall)
   {
      MmUnmapLockedPages(MappedSystemCallTable, g_pmdlSystemCall);
      IoFreeMdl(g_pmdlSystemCall);
   }
}


NTSTATUS DriverEntry(IN PDRIVER_OBJECT theDriverObject, 
					 IN PUNICODE_STRING theRegistryPath)
{
   // Register a dispatch function for Unload
   theDriverObject->DriverUnload  = OnUnload; 

   // save old system call locations
   OldZwSetInformationThread =(ZWSETINFORMATIONTHREAD)(SYSTEMSERVICE(ZwSetInformationThread));

   // Map the memory into our domain so we can change the permissions on the MDL
   g_pmdlSystemCall = MmCreateMdl(NULL, KeServiceDescriptorTable.ServiceTableBase, KeServiceDescriptorTable.NumberOfServices*4);
   if(!g_pmdlSystemCall)
      return STATUS_UNSUCCESSFUL;

   MmBuildMdlForNonPagedPool(g_pmdlSystemCall);

   // Change the flags of the MDL
   g_pmdlSystemCall->MdlFlags = g_pmdlSystemCall->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;

   MappedSystemCallTable = MmMapLockedPages(g_pmdlSystemCall, KernelMode);

   // hook system calls
   HOOK_SYSCALL( ZwSetInformationThread, NewZwSetInformationThread);
                              
   return STATUS_SUCCESS;
}

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

收藏
免费 7
支持
分享
最新回复 (17)
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
2
请问线程被偷啥意思?
2008-12-12 15:45
0
雪    币: 236
活跃值: (13)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
抱歉,是我写错了。

大牛没绕过?
2008-12-12 15:57
0
雪    币: 185
活跃值: (804)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
CQWZ好像就是这个吧 hideOD 1.82里面有了这功能 感谢楼主代码
2008-12-12 16:10
0
雪    币: 200
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
看到hook就进来~~~

谢谢lz
2008-12-12 17:10
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这个sys如何调用可以hook掉系统的ZwSetInformationThread 函数调用?
2008-12-13 19:43
0
雪    币: 193
活跃值: (26)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
7
就怕ring3层 人家饶过ZwSetInformationThread函数头 或者 其他手段
所以还是驱动拦的稳当一些
2008-12-14 06:36
0
雪    币: 33
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
楼主能不能偷偷告诉我。。。某游戏 是啥游戏。。
2008-12-14 07:27
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢源代码。。。
2008-12-18 23:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我还以为是分析呢 那你直接发个代码就得了 不用写得这么炫
2009-4-23 09:11
0
雪    币: 129
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
看到这贴,我也学习了~~感谢楼主...
2009-4-23 13:15
0
雪    币: 246
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
XX = NP &&HS;
2009-4-23 21:14
0
雪    币: 163
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
一句话概括就是:通过MDL hook SSDT
2009-4-24 00:17
0
雪    币: 1602
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
17 是什么意思?拜托告诉一下
2009-4-24 10:55
0
雪    币: 153
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
ThreadHideFromDebugger = 17
2009-4-24 11:15
0
雪    币: 253
活跃值: (490)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
这个是需要sys编译的吗?有没有R3层直接劫持的方法
2019-2-9 09:35
0
雪    币: 83
活跃值: (1087)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
17
感谢分享
2019-2-11 08:06
0
雪    币: 35
活跃值: (111)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
PEBOSS 楼主能不能偷偷告诉我。。。某游戏 是啥游戏。。
现在很多游戏用这个反调试
2023-1-11 19:20
0
游客
登录 | 注册 方可回帖
返回
//