首页
社区
课程
招聘
[旧帖] [原创]猥琐的恢复InLineHOOK 0.00雪花
2010-11-12 20:19 18364

[旧帖] [原创]猥琐的恢复InLineHOOK 0.00雪花

2010-11-12 20:19
18364
话说来看雪注册已半个月有余了,可是天天在线也不见KX增长。
老话说狗急了跳墙,人急了就会自己动手了。
说一个恢复InlineHook的方法,但是比较猥琐。而且高手直接飘过吧~~~~~~
咱就以某个游戏的保护措施为列吧,看好了这里不是讲如何过这个保护的,而是对她猥琐一下。
这个游戏在内核中HOOK了很多函数,就以KeAttachProcess为例。
在没运行游戏之前
kd> u KeAttachProcess
nt!KeAttachProcess:
804f88cc	8bff	mov	edi,edi
804f88ce	55	push	ebp
804f88cf	8bec	mov	ebp,esp
804f88d1	56	push	esi
804f88d2	57	push	edi

运行游戏之后被修改成……请看图

很明显它是在KeAttachProcess函数开头进行了HOOK并且转到的地址仍然是一条
JMP语句跳到另外一个地方,至于它为什么这么做。我分析可能是用一条线程不停的写
最后那条JMP语句比较方便。扯远了……
那么我们怎么恢复KeAttachProcess呢,正常的情况下只要将它头部的几条重新写进去就可以了
可我们今天要猥琐一点,偏要脱裤子放屁。 有时候脱裤子放屁也是一种艺术。
不废话了,图解它的HOOK原理

而我们要做的呢,看下图

好了,整个原理都看过图了。下面上代码就OK了
//Driver.c
#include <ntddk.h>
#include <wdm.h>
#include <windef.h>

#define NAKED __declspec(naked)		//定义裸体函数
#define PAGEDCODE code_seg("PAGE")	//分页
#define LOCKEDCODE code_seg()		//非分页
#define INITCODE code_seg("INIT")	//初始化时载入内存而后卸载
//保存被HOOK函数开头的前5条指令
#pragma pack(1)
typedef struct _TOP5CODE
{
	UCHAR	instruction;	//指令
	ULONG	address;		//地址
}TOP5CODE,*PTOP5CODE;
#pragma pack( )

BYTE	*KeAttachProcessAddress			= NULL;	//AttachProcess函数地址

//卸载函数
VOID	DriverUnload(IN PDRIVER_OBJECT	pDriverObject)
{
	KdPrint(("Enter DriverUnload\n"));
}

//获取函数地址
ULONG MyGetFunAddress( IN PCWSTR FunctionName)
{
	UNICODE_STRING UniCodeFunctionName;
	RtlInitUnicodeString( &UniCodeFunctionName, FunctionName );
	return (ULONG)MmGetSystemRoutineAddress( &UniCodeFunctionName );   
}

//中继函数
#pragma LOCKEDCODE
static NAKED VOID	MyKeAttachProcessRelay()
{
	__asm
	{
		mov	edi,edi
		push	ebp
		mov	ebp,esp
		push	esi
		mov	eax,KeAttachProcessAddress
		add	eax,6
		jmp	eax  
	}
}

//入口函数
NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath )
{
	TOP5CODE		*top5code	= NULL;
	BYTE			*jmpAddress	= NULL;							//保存GPK修改内容的地址
	BYTE			JmpMyAttachProcess[5]	= {0xE9,0,0,0,0};	//跳转到HOOK函数的地址
	KIRQL			Irql;

	//获取函数地址
	KeAttachProcessAddress	= (BYTE*)MyGetFunAddress(L"KeAttachProcess");
	//将指针指向AttachProcessAddress函数头部
	top5code = (TOP5CODE*)KeAttachProcessAddress;
	jmpAddress = (BYTE*)top5code->address;
	//计算jmpAddress与MyKeAttachProcess的相对地址
	*(ULONG *)(JmpMyAttachProcess+1)=(ULONG)MyKeAttachProcessRelay-((ULONG)jmpAddress+5);

	__asm
	{
		cli
			mov eax,cr0
			and eax,not 10000h
			mov cr0,eax
	}
	//提升IRQL中断级
	Irql=KeRaiseIrqlToDpcLevel();
	//写入JMP语句
	RtlCopyMemory((BYTE*)jmpAddress,JmpMyAttachProcess,5);
	//恢复Irql
	KeLowerIrql(Irql);
	__asm
	{
		mov		eax,cr0
		or		eax,10000h
		mov		cr0,eax
		sti
	}

	//设置卸载函数
	DriverObject->DriverUnload = DriverUnload;
	
	return STATUS_SUCCESS;
}


当然这种猥琐也可以用在SSDT HOOK 上面。
就是到被修改的地址开始出写一句JMP 跳转回原始函数的开始处。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
点赞6
打赏
分享
最新回复 (126)
雪    币: 439
活跃值: (1279)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
crazyearl 2 2010-11-13 10:07
2
0
是不是图片都看不到啊?
雪    币: 70
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
zuoshaobo 2010-11-13 10:16
3
0
看到了哦。学习了
雪    币: 1163
活跃值: (137)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
pencil 5 2010-11-13 10:16
4
0
图能看到,文章很不错

学习脱裤子放屁
雪    币: 7464
活跃值: (2061)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
寒冰心结 2010-11-13 10:45
5
0
楼主流程图制作的不错..学习了..

这个驱动对处理函数加了点VM.
你看到的Jmp XXX.貌似是进入虚拟机的前奏.

Ps:
对它的猥琐.用这个办法太麻烦了..
直接XX一下内核文件.就连窝端了..
雪    币: 28
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
anybodys 2010-11-13 10:59
6
0
好大一个圈,呵呵。学习了
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
whypro 2010-11-13 10:59
7
0
能不能把源码都传上来!
雪    币: 439
活跃值: (1279)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
crazyearl 2 2010-11-14 21:08
8
0
上面的就是全部的代码了。可以正常的工作
雪    币: 2321
活跃值: (4028)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
熊猫正正 9 2010-11-14 21:36
9
0
很好~~
雪    币: 8861
活跃值: (2369)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 10 2010-11-14 21:38
10
0
至于么~
GPK其实有非常简单的方法完结~
雪    币: 439
活跃值: (1279)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
crazyearl 2 2010-11-14 21:50
11
0
额知道,1394hub
雪    币: 439
活跃值: (1279)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
crazyearl 2 2010-11-14 21:52
12
0
对了找到同道中人了
能不能提供一下针对GPK的反反调试思路啊
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wwwnimaba 2010-11-14 21:59
13
0
学习学习,
雪    币: 81
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
forchinese 2010-11-14 22:06
14
0
写的很好,代码很清晰,C语言功底很扎实。图一下就看懂了,但看代码花了二十分钟才全部看明白。惭愧。建议给邀请,做得很用心,看代码很有收获。
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wppk 2010-11-14 22:12
15
0
现金不涨,什么原因?
雪    币: 654
活跃值: (448)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
Mx¢Xgt 7 2010-11-14 23:38
16
0
为防止目标驱动检测HOOK有没有被修改回,我用的方法是HOOK他的处理函数的头..
雪    币: 207
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
正happy 1 2010-11-15 20:50
17
0
LZ功力不错啊,学习了
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
痛苦之源 2010-11-15 21:37
18
0
不错,原理一目了然
雪    币: 306
活跃值: (153)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
pyq逍遥 1 2010-11-15 21:49
19
0
  图画的很不错, 学习学习
雪    币: 14
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Sollage 2010-11-15 22:29
20
0
啥时候我也能写一篇精华。。。。学习ing
雪    币: 63
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cfo 2010-11-16 00:13
21
0
很不错,代码还没全弄明白。
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cnkhaos 2010-11-16 00:30
22
0
呵呵 学习了
雪    币: 173
活跃值: (132)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
古越魂 1 2010-11-16 01:28
23
0
学习了...
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
winnip 1 2010-11-16 10:22
24
0
很有意思。。。。楼主做法很聪明啊,斗转星移
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kcec 2010-11-16 10:51
25
0
好长  慢慢看
游客
登录 | 注册 方可回帖
返回