首页
社区
课程
招聘
[原创]过TesSafe反WinDbg双机调试
发表于: 2013-4-24 12:54 29045

[原创]过TesSafe反WinDbg双机调试

2013-4-24 12:54
29045

貌似论坛里面有关游戏的贴子都很火,所以发篇帖子涨点人气。

正文:
在论坛搜索了下发现去年的时候有人发过一篇过TesSafe反双机调试的帖子,但是现在已经过时了,并且帖子里面也没提到怎么处理被IAT HOOK的两个函数。在这里呢,我就给大家彻底的讲明白吧。

先开ARK工具看看游戏干了什么。



从图片可以看到游戏启动的时候对ntkrnlmp.exe中的kdcom.KdSendPacket和kdcom.KdReceivePacket两个函数进行了HOOK,通过函数名称就能猜测到函数的用途,一个发包,一个收包,都是com口用来通信的。

怎样恢复这两个函数呢,方面有很多种,列举两个。

1、自己映射内核文件ntkrnlmp.exe,然后通过PE结构遍历ntkrnlmp.exe的导入表,获取导入表中KdSendPacket、KdReceivePacket两个函数的地址在ntkrnlmp.exe中的偏移,然后利用这个偏移修改系统正常运行的ntkrnlmp.exe导入表中的两个函数地址。

但是这里还有一个问题就是,导入表中KdReceivePacket这个位置有代码校验,只要被修改就会重启,所以还得绕过代码校验。所以不推荐这种方法。

2、通过图片可以看到被IATHOOK的两个函数被挂钩后的新地址分别为0xB07920E6,0xB07920F6,相差16个字节。既然不想直接去恢复导入表,那么我们可以在这两个被挂钩后的地址中再跳回正常的KdSendPacket、KdReceivePacket。或许有人又有疑问,这两个挂钩地址处没有代码校验吗,答案是也有校验,只要修改前面几个字节,同样会重启。但是游戏只检测了前面的几个字节,所以只要在靠后一点的地方修改就不会被检测到。



修改后


另外一个也是同样处理函数


这样两个被IATHOOK的函数就相当于被恢复了。

但是上面我们是用工具进行恢复的,而TP启动的时候就已经调用了KdDisableDebugger禁止了WinDbg双机调试,这时候就算恢复了上面的两个函数,同样也无法双机调试。

之所以先讲怎样处理上面的两个函数是因为在TP驱动加载的时候首先进行了IATHOOK,然后调用KdDisableDebugger,如果你先处理KdDisableDebugger,而没有恢复上面两个函数的话,系统会直接重启。

因为要赶在TP调用KdDisableDebugger之前恢复IATHOOK,那么就需要设置一个系统回调函数,然后在加载TP驱动的时候进入我们的回调函数,这时TP已经加载完成,但是还没有开始运行,所以我们可以直接定位到 挂钩地址 处 写入跳转代码到正常的函数。

//恢复两个被iat hook的函数

VOID RenewIATHook(ULONG ImageBase)			
{
	// 模块:KDCOM.dll,函数名称:KdSendPacket,函数地址:ba5a91b2,Hint:0007
	//模块:KDCOM.dll,函数名称:KdReceivePacket,函数地址:ba5a8f4c,Hint:0004

	ULONG uKdSend = 0xba5a91b2;     //KdSendPacket的地址硬编码
	ULONG uKdReceive = 0xba5a8f4c;  //KeReceivePacket地址 

	//因为这两个函数不是导出的,所以我为了省事,就直接这样写了

	ULONG uJmpKdSend = ImageBase + 0x20EE;
	//KdSendPacket挂钩函数地址 = ImageBase + 0x20EE; 硬编码 

	ULONG uJmpKdReceive = ImageBase + 0x20FE;

	ULONG jmpAddr1 = uKdSend - uJmpKdSend - 5;
	ULONG jmpAddr2 = uKdReceive - uJmpKdReceive - 5;

	__asm
	{	
		cli
			pushad
			mov		eax,uJmpKdSend
			mov		byte ptr [eax],0xE9
			mov		ebx,jmpAddr1
			mov		dword ptr [eax+1],ebx

			mov		eax,uJmpKdReceive
			mov		byte ptr [eax],0xE9
			mov		ebx,jmpAddr2
			mov		dword ptr [eax+1],ebx

			popad
			sti
	}
}


ULONG strEnd(PWCHAR dest,PWCHAR sub)
{
	if (dest == NULL && sub == NULL)
		return 0;
	int ulDest = wcslen(dest);
	int ulSub = wcslen(sub);

	if (ulSub == 0 || ulSub > ulDest)
		return 0;
	return !wcscmp(&dest[ulDest - ulSub],sub);
}

VOID NotifyRoutine(IN PUNICODE_STRING  FullImageName,
	IN HANDLE  ProcessId, // where image is mapped
	IN PIMAGE_INFO  ImageInfo)
{
              //这个strEnd是一个判断字符串是不是以***结束
         //我记得wdk中有一个函数可以判断的,但是记不起来了,知道的回复下啊
	if (strEnd(FullImageName->Buffer,L"TesSafe.sys"))
	{
                                 //判断加载的驱动是不是TP
		KdPrint(("TesSafe.sys:ImageBase:%08x \t size: %06x\n",
ImageInfo->ImageBase,ImageInfo->ImageSize));
		RenewIATHook((ULONG)ImageInfo->ImageBase);	
	}
}


#pragma alloc_text("INIT")
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegPath){
	NTSTATUS status;
	UNREFERENCED_PARAMETER(RegPath);

	DriverObject->DriverUnload = DriverUnload;
	for (int i=0;i<IRP_MJ_MAXIMUM_FUNCTION;i++)
		DriverObject->MajorFunction[i] = DriverDispatch;


	KdPrint(("Init\n"));
	PsSetLoadImageNotifyRoutine(NotifyRoutine);

	return STATUS_SUCCESS;
}




b094dfd9 57              push    edi
b094dfda 8b782c          mov     edi,dword ptr [eax+2Ch]
b094dfdd 33f1            xor     esi,ecx
b094dfdf 33f9            xor     edi,ecx
b094dfe1 eb4b            jmp     TesSafe+0x702e (b094e02e)
b094dfe3 803d6da295b000  cmp     byte ptr [TesSafe+0x1326d (b095a26d)],0
b094dfea 7516            jne     TesSafe+0x7002 (b094e002)
b094dfec 688a4d6e43      push    436E4D8Ah
b094dff1 6876426e57      push    576E4276h
b094dff6 e873caffff      call    TesSafe+0x3a6e (b094aa6e)
b094dffb c6056da295b001  mov     byte ptr [TesSafe+0x1326d (b095a26d)],1
b094e002 85ff            test    edi,edi
b094e004 7404            je      TesSafe+0x700a (b094e00a)
b094e006 ffd7            call    edi           //call KdDisableDebugger
b094e008 eb24            jmp     TesSafe+0x702e (b094e02e)
b094e00a 803d6ea295b000  cmp     byte ptr [TesSafe+0x1326e (b095a26e)],0
b094e011 751b            jne     TesSafe+0x702e (b094e02e)
b094e013 6812010000      push    112h
b094e018 68e64d6e43      push    436E4DE6h
b094e01d 6873426e57      push    576E4273h
b094e022 e865caffff      call    TesSafe+0x3a8c (b094aa8c)
b094e027 c6056ea295b001  mov     byte ptr [TesSafe+0x1326e (b095a26e)],1
b094e02e 803e00          cmp     byte ptr [esi],0
b094e031 75b0            jne     TesSafe+0x6fe3 (b094dfe3) 

//跳回去,继续call KdDisableDebugger  ,应该是个while循环,所以把这里nop掉
//ew b094e031 0x9090

b094e033 5f              pop     edi
b094e034 5e              pop     esi
b094e035 c3              ret

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 6
支持
分享
最新回复 (40)
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
2
这么去对抗特么复杂,其实没那么复杂~~~
2013-4-24 13:15
0
雪    币: 193
活跃值: (518)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
3
AGP秒杀所有
2013-4-24 13:18
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
支持原创。。。。。。。。。。。。。。
2013-4-24 13:27
0
雪    币: 45
活跃值: (1359)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
支持,呵呵,其实kdcom.KdSendPacket和kdcom.KdReceivePacket完全不用理会。装个微软的Virtual Machine monitor搞定。
2013-4-24 13:38
0
雪    币: 70
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
有钱我也去V大那听听,
2013-4-24 13:45
0
雪    币: 107
活跃值: (399)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
思路不错...谢谢分享......
2013-4-24 14:18
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
什么意思?VT引擎吗?装好后就可以无视TP反双机调试?
2013-4-24 14:31
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
什么意思?VT引擎吗?装好后就可以无视TP反双机调试?
2013-4-24 14:37
0
雪    币: 97697
活跃值: (200734)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
10
Thanks for share.
2013-4-24 14:38
0
雪    币: 693
活跃值: (108)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
11
楼主用的ark可是Kernel Dective吗?
2013-4-24 16:01
0
雪    币: 45
活跃值: (1359)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
叫VirtualKD,百度一下就知道了。
2013-4-24 17:57
0
雪    币: 1233
活跃值: (907)
能力值: ( LV12,RANK:750 )
在线值:
发帖
回帖
粉丝
13
MARK 虽然不大可能用得上,这个是老V的强项,哈哈
2013-4-24 20:30
0
雪    币: 1025
活跃值: (239)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
楼主使用的ark工具叫什么名字啊? 在什么地方下载
2013-4-24 22:31
0
雪    币: 193
活跃值: (518)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
15
你觉得我会告诉你  V大的 A盾很好用吗
2013-4-24 22:46
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
A盾是V的?
2013-4-24 23:37
0
雪    币: 400
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
笑而不语
2013-4-25 00:15
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
A盾是Winker的
2013-4-25 00:18
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
19
A盾是Winker的~
但是AGP是我的就够了~~
2013-4-25 11:10
0
雪    币: 10
活跃值: (231)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
20
话说kdcom.KdSendPacket和kdcom.KdReceivePacket这两个函数 跟od 的收发数据应该没关系把? 只是跟windebug双机调试上通信有关系把?
2013-4-25 16:18
0
雪    币: 238
活跃值: (206)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21


这是什么工具?谢谢。
2013-4-25 22:03
0
雪    币: 55
活跃值: (33)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
我也想知道这是什么工具
2013-4-25 22:11
0
雪    币: 193
活跃值: (518)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
23
KD啊
2013-4-25 23:03
0
雪    币: 74
活跃值: (748)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
mark,感谢分享
2013-4-26 00:04
0
雪    币: 298
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
能否分享下ARK tools
2013-4-27 18:52
0
游客
登录 | 注册 方可回帖
返回
//