首页
社区
课程
招聘
[原创]散谈游戏保护那点事~就从_TP开始入手吧
发表于: 2010-12-20 02:37 483401

[原创]散谈游戏保护那点事~就从_TP开始入手吧

2010-12-20 02:37
483401
收藏
免费 8
支持
分享
最新回复 (234)
雪    币: 342
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
101
这个 真不错啊!
2011-4-13 22:23
0
雪    币: 6976
活跃值: (1372)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
102
太给里了. 这哥们. 解决了我多年的困扰啊
2011-4-15 01:18
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
103
mark一下   楼主辛苦
2011-4-18 11:35
0
雪    币: 578
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
104
能看懂一点点点点,但大部分完全不懂了。。。。LZ大半夜不睡,发贴,真是辛苦了啊
2011-4-18 12:16
0
雪    币: 168
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
105
牛X 的人,崇拜下
2011-4-20 17:15
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
106
感谢lz,看了lz的帖子,犹如当头棒喝,醍醐灌顶,让我幡然醒悟!!
2011-4-20 20:23
0
雪    币: 376
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
107
kd> uf KdDisableDebugger
nt!KdDisableDebugger:
80823d62 6a01            push    1
80823d64 e82dffffff      call    nt!KdDisableDebuggerWithLock (80823c96)
80823d69 c3              ret

kd> uf KdDisableDebuggerWithLock
nt!KdDisableDebuggerWithLock:
80823c96 8bff            mov     edi,edi
80823c98 55              push    ebp
80823c99 8bec            mov     ebp,esp
80823c9b 51              push    ecx
80823c9c 53              push    ebx
80823c9d 33db            xor     ebx,ebx
80823c9f 381d6c0c8a80    cmp     byte ptr [nt!KdBlockEnable (808a0c6c)],bl
80823ca5 885dff          mov     byte ptr [ebp-1],bl
80823ca8 740a            je      nt!KdDisableDebuggerWithLock+0x1e (80823cb4)

修改KdDisableDebugger或者KdDisableDebuggerWithLock头为xor eax,eax;ret ?后在游戏启动的时候System CPU使用率都会99%,机器基本卡死,卡了半个小时也没看见游戏启动画面...
2011-4-22 07:45
0
雪    币: 193
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
108
好东西啊,难得lz共享出来
2011-5-1 23:16
0
雪    币: 861
活跃值: (1023)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
109
mark mark mark mark mark
2011-5-14 18:56
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
110
不是很懂,但这样好饿帖子,必须得顶
2011-5-19 15:10
0
雪    币: 237
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
111
哎,内核真是麻烦,啰嗦死了
2011-5-20 10:54
0
雪    币: 342
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
112
两个硬件断点检测的处理 是否能再细腻点?
2011-5-27 18:15
0
雪    币: 76
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
113
一头雾水啊
2011-5-31 08:57
0
雪    币: 107
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
114
嗯,很详细哈
但有个问题,像NtReadVirtualMemory这类未导出函不能用MmGetSystemRoutine获取地址,而使用KeServiceDescriptorTable来取得当前地址,如果NtReadVirtualMemory本身被其它程式给SDDT HOOK了,那获取当前地址不就出错了?
碰到过这样的问题,不懂有没好的方法可以处理
2011-6-3 11:35
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
115
......我用DDK编译了下,发现224处错误,痛苦呀!贴上我改的OpenThread

//NtOpenThread用到的全局变量[为了方便堆栈平衡的处理使用全局变量]
PEPROCESS threadEPROCESS = NULL; //保存访问者的EPROCESS
ANSI_STRING t_str1,t_str2; //保存进程名称
BYTE *ObOpenObjectByPointerAddress = NULL; //ObOpenObjectByPointer的地址
BYTE *t_TpHookAddress = NULL; //TP的HOOK函数地址
BYTE *t_ReturnAddress = NULL; //返回到的地址
BYTE *t_MyHookAddress = NULL; //我们的HOOK函数在哪写入
//////////////////////////////////////////////////////////////////////
// 名称: Nakd_NtOpenThread
// 功能: My_RecoveryHook_NtOpenThread的中继函数
// 参数:
// 返回:
//////////////////////////////////////////////////////////////////////
static NAKED VOID Nakd_NtOpenThread()
{
//获得调用者的EPROCESS
threadEPROCESS = IoGetCurrentProcess();
//将调用者的进程名保存到str1中
RtlInitAnsiString(&t_str1,(ULONG)threadEPROCESS+0x174);
//将我们要比对的进程名放入str2
RtlInitAnsiString(&t_str2,DNF_EXE);
if (RtlCompareString(&t_str1,&t_str2,TRUE) == 0)
{
//说明是DNF进程访问了这里
__asm
{
push dword ptr [ebp-34h]
push dword ptr [ebp-20h]
push t_ReturnAddress
mov eax,t_TpHookAddress
jmp eax
}
}
else
{
__asm
{
push dword ptr [ebp-34h]
push dword ptr [ebp-20h]
push t_ReturnAddress
mov eax,ObOpenObjectByPointerAddress
jmp eax
}
}
}
//////////////////////////////////////////////////////////////////////
// 名称: My_RecoveryHook_NtOpenProcess
// 功能: 解除游戏保护对NtOpenProcess的HOOK
// 参数:
// 返回: 状态
//////////////////////////////////////////////////////////////////////
NTSTATUS My_RecoveryHook_NtOpenThread()
{
BYTE *NtOpenThreadAddress = NULL; //NtOpenProcess的地址
BYTE *p = NULL; //临时
TOP5CODE *top5code = NULL; //保存5字节内容
BYTE JmpAddress[6] = {0xE9,0,0,0,0,0x90};
KIRQL Irql;

//获取NtOpenProcess的地址
NtOpenThreadAddress = (BYTE*)MyGetFunAddress(L"NtOpenThread");
if (NtOpenThreadAddress == NULL)
{
KdPrint(("NtOpenProcess地址获取失败\n"));
return FAILED_TO_OBTAIN_FUNCTION_ADDRESSES;
}
//获取ObOpenObjectByPointer的地址
ObOpenObjectByPointerAddress = (BYTE*)MyGetFunAddress(L"ObOpenObjectByPointer");
if (ObOpenObjectByPointerAddress == NULL)
{
KdPrint(("ObOpenObjectByPointer地址获取失败\n"));
return FAILED_TO_OBTAIN_FUNCTION_ADDRESSES;
}

//将p指向NtOpenProcess函数开始处
p = NtOpenThreadAddress;
BYTE szCode[7]={0x50,0xff,0x75,0xcc,0xff,0x75,0xe0};
//用一个无限循环来判断给定的特征码来确定被HOOK位置
for(int i=0;i<400; i++)
{
if (RtlCompareMemory(p,szCode,7) == 0)
{
p +=7;
KdPrint(("%0X \n",(ULONG)p));
break;
}
//推动指针向前走
p++;
}

//将top5code指向 p 的当前处
//用以取出 call [地址] 这5字节里面的地址
top5code = (TOP5CODE*)p;
t_TpHookAddress = (BYTE*)((ULONG)p+5+top5code->address);

//找到我们写入自定义函数的地址
t_MyHookAddress = p-6;
//保存调用ObOpenObjectByPointer函数以后的返回地址
t_ReturnAddress = p+5;

//将一条JMP Nakd_NtOpenProcess写入到数组中
*(ULONG *)(JmpAddress+1)=(ULONG)Nakd_NtOpenProcess - ((ULONG)t_MyHookAddress+5);

WPOFF(); //清除CR0
//提升IRQL中断级
Irql=KeRaiseIrqlToDpcLevel();
//写入
RtlCopyMemory(t_MyHookAddress,JmpAddress,6);
//恢复Irql
KeLowerIrql(Irql);
WPON(); //恢复CR0

return STATUS_SUCCESS;
}
2011-6-8 16:32
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
116
BYTE  Signature1 = 0x56,  //p-1
Signature2 = 0x57, //p-2
Signature3 = 0x5F, //p-3
Signature4 = 0x5E, //p+5
Signature5 = 0xE8; //p第一个字节

不知道楼主用什么编译器,这样也能编译成功?
2011-6-8 16:34
0
雪    币: 342
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
117
楼上一定第一次使用ddk编译器 不解释
2011-6-8 19:55
0
雪    币: 416
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
118
貌似 debugPort 的检测又增加了2处把。、、、 崩溃、、、那两处太恐怖了、、
2011-6-8 23:26
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
119
仰望楼主  发现自己多么的不努力。。。
2011-6-10 15:42
0
雪    币: 233
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
120
楼主真是好人啊
2011-6-18 17:40
0
雪    币: 255
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
121
好文章,标记一下慢慢学习研究
2011-7-8 20:18
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
122

看了一截,实际上我看不懂。也来凑热闹。
2011-7-8 20:31
0
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
123
虽然很多还看不明白,慢慢学习
2011-7-15 07:05
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
124
过程很好,思路很好,讲解很详细,谢谢!
2011-7-16 09:14
0
雪    币: 54
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
125
学习了,游戏的保护很强大啊
2011-7-16 09:35
0
游客
登录 | 注册 方可回帖
返回
//