c语言绕过dnf检测,过掉DNF游戏保护,仅供学习研究。不得用于非法途径

本文详细介绍了如何使用C语言来绕过DNF游戏的检测机制,包括打开游戏进程和线程、读写内存、使用OD附加进程、设置硬件断点等步骤。通过修改调试相关函数和系统服务描述表,实现对特定函数的HOOK,以避免被游戏检测到。同时,文章还展示了如何伪装调试寄存器以防止硬件断点被检测,以及如何在不被检测的情况下附加到进程。
摘要由CSDN通过智能技术生成

第一步,这也是最起码的,你必须要能够打开游戏进程和线程,能够开打进程和线程后不被检测到

第二步,能够读写进村内存

第三步,能够用OD附加游戏进程

第四步,能够下硬件断点而不被检测

跳过NtReadVirtualMemory,NtWriteVirtualMemory函数头的钩子

代码:

[code#include

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

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值