首页
社区
课程
招聘
[原创]过掉DNF游戏保护,仅供学习研究。不得用于非法途径。
发表于: 2009-9-8 14:05 213832

[原创]过掉DNF游戏保护,仅供学习研究。不得用于非法途径。

2009-9-8 14:05
213832

由于我的C用的比较少,所以大部分都用的汇编,部分地方用汇编写不是很方便,所以我用的C,由于只是学习,所以内核地址我没有计算都是硬编码的。过DNF主要分为三步,也许我的思路不太正确,反正可以OD调试,下断。
程序没怎么修边幅,因为只是测试,所以一般都没有写更改内核后的恢复,不过不妨碍使用。

第一步,这也是最起码的,你必须要能够打开游戏进程和线程,能够开打进程和线程后不被检测到
第二步,能够读写进村内存
第三步,能够用OD附加游戏进程
第四步,能够下硬件断点而不被检测

跳过NtReadVirtualMemory,NtWriteVirtualMemory函数头的钩子

#include<ntddk.h>

typedef struct _SERVICE_DESCRIPTOR_TABLE
{
  PVOID   ServiceTableBase;
  PULONG  ServiceCounterTableBase;
  ULONG   NumberOfService;
  ULONG   ParamTableBase;
}SERVICE_DESCRIPTOR_TABLE,*PSERVICE_DESCRIPTOR_TABLE; //由于KeServiceDescriptorTable只有一项,这里就简单点了
extern PSERVICE_DESCRIPTOR_TABLE    KeServiceDescriptorTable;//KeServiceDescriptorTable为导出函数

/////////////////////////////////////
VOID Hook();
VOID Unhook();
VOID OnUnload(IN PDRIVER_OBJECT DriverObject);
//////////////////////////////////////
ULONG JmpAddress;//跳转到NtOpenProcess里的地址
ULONG JmpAddress1;//跳转到NtOpenProcess里的地址
ULONG OldServiceAddress;//原来NtOpenProcess的服务地址
ULONG OldServiceAddress1;//原来NtOpenProcess的服务地址
//////////////////////////////////////
__declspec(naked) NTSTATUS __stdcall MyNtReadVirtualMemory(HANDLE ProcessHandle,
               PVOID BaseAddress,
               PVOID Buffer,
               ULONG NumberOfBytesToRead,
			   PULONG NumberOfBytesReaded) 
{
  //跳过去
	__asm
	{
		push    0x1c
		push    804eb560h  //共十个字节
		jmp     [JmpAddress]   
  }
}

__declspec(naked) NTSTATUS __stdcall MyNtWriteVirtualMemory(HANDLE ProcessHandle,
               PVOID BaseAddress,
               PVOID Buffer,
               ULONG NumberOfBytesToWrite,
			   PULONG NumberOfBytesReaded) 
{
  //跳过去
	__asm
	{
		push    0x1c
		push    804eb560h  //共十个字节
		jmp     [JmpAddress1] 
	}
}
///////////////////////////////////////////////////
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
  DriverObject->DriverUnload = OnUnload;
  DbgPrint("Unhooker load");
  Hook();
  return STATUS_SUCCESS;
}
/////////////////////////////////////////////////////
VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
{
  DbgPrint("Unhooker unload!");
  Unhook();
}
/////////////////////////////////////////////////////
VOID Hook()
{
  ULONG  Address, Address1;
  Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0xBA * 4;//0x7A为NtOpenProcess服务ID
  Address1 = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x115 * 4;//0x7A为NtOpenProcess服务ID

  DbgPrint("Address:0x%08X",Address);

  OldServiceAddress = *(ULONG*)Address;//保存原来NtOpenProcess的地址
  OldServiceAddress1 = *(ULONG*)Address1;//保存原来NtOpenProcess的地址
  DbgPrint("OldServiceAddress:0x%08X",OldServiceAddress);
  DbgPrint("OldServiceAddress1:0x%08X",OldServiceAddress1);

  DbgPrint("MyNtOpenProcess:0x%08X",MyNtReadVirtualMemory);
  DbgPrint("MyNtOpenProcess:0x%08X",MyNtWriteVirtualMemory);

  JmpAddress = (ULONG)0x805b528a + 7; //跳转到NtOpenProcess函数头+10的地方,这样在其前面写的JMP都失效了
  JmpAddress1 = (ULONG)0x805b5394 + 7;
  DbgPrint("JmpAddress:0x%08X",JmpAddress);
  DbgPrint("JmpAddress1:0x%08X",JmpAddress1);
    
  __asm
  {		//去掉内存保护
		cli
        mov  eax,cr0
		and  eax,not 10000h
		mov  cr0,eax
  }

  *((ULONG*)Address) = (ULONG)MyNtReadVirtualMemory;//HOOK SSDT
  *((ULONG*)Address1) = (ULONG)MyNtWriteVirtualMemory;

  __asm
  {		//恢复内存保护  
        mov  eax,cr0
		or   eax,10000h
		mov  cr0,eax
		sti
  }
}
//////////////////////////////////////////////////////
VOID Unhook()
{
  ULONG  Address, Address1;
  Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0xBA * 4;//查找SSDT
  Address1 = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x115 * 4;

  __asm{
    cli
          mov  eax,cr0
    and  eax,not 10000h
    mov  cr0,eax
  }

  *((ULONG*)Address) = (ULONG)OldServiceAddress;//还原SSDT
  *((ULONG*)Address1) = (ULONG)OldServiceAddress1;//还原SSDT

  __asm{  
         mov  eax,cr0
    or   eax,10000h
    mov  cr0,eax
    sti
  }

  DbgPrint("Unhook");
}

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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (156)
雪    币: 135
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
强大.. 谢谢了 正在研究这个游戏
2009-9-8 14:11
0
雪    币: 416
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
呵呵 老大很强大
2009-9-8 14:14
0
雪    币: 4560
活跃值: (1002)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
果然很黄很强大
2009-9-8 14:18
0
雪    币: 159
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
还有几个Shadow SSDT hook 只需要用RU恢复一下即可,它没有检测
2009-9-8 14:18
0
雪    币: 137
活跃值: (115)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
汇编的代码能改成C++的就好了,我不会汇编
2009-9-8 14:21
0
雪    币: 159
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
你终于现身了。。。
2009-9-8 14:58
0
雪    币: 451
活跃值: (78)
能力值: ( LV12,RANK:470 )
在线值:
发帖
回帖
粉丝
8
进入第一页来膜拜大牛
2009-9-8 16:57
0
雪    币: 77
活跃值: (17)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
果然很强悍
汇编是真不太懂,,,还得好好学学
要是有哪位牛人给翻译成C的,那就更强悍了
2009-9-8 18:23
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
占第一页。膜拜一下。。继续学习去。
2009-9-8 18:30
0
雪    币: 376
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
无限拜膜Lz一月成就,收藏细细研究......
2009-9-8 20:12
0
雪    币: 179
活跃值: (26)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
12
楼主辛苦了,愿意把自己一个月的成果拿出来和大家分享,佩服!
2009-9-8 20:27
0
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
13
先收藏,有时间再学习,可惜不是C代码

我试过把KiAttachProcess整个用lde剥出来,读写进程内存是可以的。只是玩玩,没试ObOpenObjectByPointer。
2009-9-8 20:32
0
雪    币: 159
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
遇到DebugPort清零大家还有什么好的方法么?
2009-9-8 20:58
0
雪    币: 280
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
support!!!
2009-9-8 21:08
0
雪    币: 246
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
如果我的技术有资格膜拜楼主 如果我的精神有资格膜拜 ,让我膜拜一下吧!
2009-9-8 21:12
0
雪    币: 3500
活跃值: (2984)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
不错不错,向楼主学习了,先收藏,谢谢楼主共享
2009-9-8 21:52
0
雪    币: 697
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
楼主如何知道DNF挂接了哪个函数的?望赐教一二
2009-9-9 10:33
0
雪    币: 159
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
19
实现某个功能遇到障碍就用icesword或者RU之类的工具大致定位下,然后再用Windbg看看
2009-9-9 10:41
0
雪    币: 332
活跃值: (30)
能力值: ( LV12,RANK:460 )
在线值:
发帖
回帖
粉丝
20
偶一直在找DebugPort
2009-9-9 10:47
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
一个月就有这样的水平很强大了,我都几年了没有进步
2009-9-9 11:47
0
雪    币: 77
活跃值: (17)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
22
请教LZ个问题
LZ过NTOPENPROCESS的HOOK,用到的办法是HOOK 调用ObOpenObjectByPointer函数前几个字节,然后判断是否是DNF进程读取对吧
可是DNF的驱动保护在这个地方有代码检验,不仅仅检测他自己的代理函数地址是否正确,同时也检测ObOpenObjectByPointer调用前几个字节是否被修改,如被检测出来被修改就会弹出TP发现非法模块

这一部分是怎么过的呢?
本人新手初学驱动编程,问的问题有些菜,见谅见谅
2009-9-9 17:44
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
无限拜膜Lz一月成就,收藏细细研究......
2009-9-9 17:58
0
雪    币: 46
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
呵呵~~强大~~~
2009-9-9 18:49
0
雪    币: 49
活跃值: (12)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
25
LZ的代码已经没用咯。。。。。感觉是蛮久以前写的。。。现在tx都内存代码校验了。。。patch直接给蓝屏了。。。。
2009-9-9 19:30
0
游客
登录 | 注册 方可回帖
返回
//