您的位置 首页 新开DNF私服

dnf辅佐外挂C++源代码

因为我的C用的对照少,所以大部分都用的汇编,部份中央用汇编写不是很轻易,所以我用的C,因为只是进修,所以内核地址我没有较量争论都是硬编码的。过DNF首要分为三步,或许我的思绪不太准确,归正可以OD调试,下断。

顺序没怎样修容貌,由于只是测试,所以普通都没有写更改内核后的恢复,不外不故障利用。

第一步,这也是最起码的,你必需要可以翻开游戏历程和线程,可以开打历程和线程后不被检测到

第二步,可以读写进村内存

第三步,可以用OD附加游戏历程

第四步,可以下硬件断点而不被检测

dnf 私服能用win8么

跳过NtReadVirtualMemory,NtWriteVirtualMemory函数头的钩子

代码:

#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里的地址

dnf 私服能用win8么

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)

{

dnf 私服能用win8么

//跳过去

dnf 私服能用win8么

__asm

{

push 0x1c

push 804eb560h //共十个字节

dnf 私服能用win8么

jmp [JmpAddress1]

}

}

dnf 私服能用win8么

///

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)

dnf 私服能用win8么

{

DbgPrint(“Unhooker unload!”);

Unhook();

}

/

VOID Hook()

{

ULONG Address, Address1;

Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0xBA * 4;//0x7A为NtOpenProcess效劳ID

dnf 私服能用win8么

Address1 = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x115 * 4;//0x7A为NtOpenProcess效劳ID

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

dnf 私服能用win8么

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

dnf 私服能用win8么

*((ULONG*)Address1) = (ULONG)OldServiceAddress1;//复原SSDT

__asm{

mov eax,cr0

or eax,10000h

mov cr0,eax

sti

}

DbgPrint(“Unhook”);

}

因为它络续对DebugPort清零,所以要点窜调试相关函数,使得一切的接见DebugPort的中央悉数接见EPROCESS中的ExitTime字节,如许它怎样清零都有效了,也检测不到

代码:

.386

.model flat, stdcall

option casemap:none

include

.const

Dspdo_1 equ 80643db6h

Dmpp_1 equ 80642d5eh

Dmpp_2 equ 80642d64h

dnf 私服能用win8么

Dct_1 equ 806445d3h

Dqm_1 equ 80643089h

Kde_1 equ 804ff5fdh

Dfe_1 equ 80644340h

Pcp_1 equ 805d1a0dh

Mcp_1 equ 805b0c06h

Mcp_2 equ 805b0d7fh

dnf 私服能用win8么

Dmvos_1 equ 8064497fh

dnf 私服能用win8么

Dumvos_1 equ 80644a45h

Pet_1 equ 805d32f8h

Det_1 equ 8064486ch

Dep_1 equ 806448e6h

.code

;复原本人的Hook

DriverUnload proc pDriverObject:PDRIVER_OBJECT

ret

dnf 私服能用win8么

DriverUnload endp

ModifyFuncAboutDbg proc addrOdFunc, cmd_1, cmd_2

pushad

mov ebx, addrOdFunc

mov eax, cmd_1

mov DWORD ptr [ebx], eax

mov eax, cmd_2

mov DWORD ptr [ebx + 4], eax

popad

ret

ModifyFuncAboutDbg endp

dnf 私服能用win8么

DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING

cli

dnf 私服能用win8么

mov eax, cr0

dnf 私服能用win8么

and eax, not 10000h

mov cr0, eax

invoke ModifyFuncAboutDbg, Dspdo_1, 90784789h, 0fde89090h

invoke ModifyFuncAboutDbg, Dmpp_1, 90787e39h, 950f9090h

invoke ModifyFuncAboutDbg, Dct_1, 90785e39h, 840f9090h

invoke ModifyFuncAboutDbg, Dqm_1, 9078408bh, 45899090h

invoke ModifyFuncAboutDbg, Kde_1, 90787839h, 13749090h

dnf 私服能用win8么

invoke ModifyFuncAboutDbg, Dfe_1, 9078418bh, 0d2329090h

invoke ModifyFuncAboutDbg, Pcp_1, 90784389h, 45f69090h

invoke ModifyFuncAboutDbg, Mcp_1, 90785e39h, 950f9090h

invoke ModifyFuncAboutDbg, Mcp_2, 90784a89h, 5e399090h

invoke ModifyFuncAboutDbg, Dmvos_1, 9078498bh, 0cb3b9090h

invoke ModifyFuncAboutDbg, Dumvos_1, 00787983h, 74909090h

dnf 私服能用win8么

invoke ModifyFuncAboutDbg, Pet_1, 00787f83h, 74909090h

invoke ModifyFuncAboutDbg, Det_1, 9078498bh, 0c9859090h

invoke ModifyFuncAboutDbg, Dep_1, 9078498bh, 0c9859090h

;invoke ModifyFuncAboutDbg, Dmpp_2, 8bc0950fh, 8b90c032h

dnf 私服能用win8么

mov eax, pDriverObject

assume eax : ptr DRIVER_OBJECT

mov [eax].DriverUnload, offset DriverUnload

assume eax : nothing

dnf 私服能用win8么

mov eax, cr0

or eax, 10000h

dnf 私服能用win8么

mov cr0, eax

sti

mov eax, STATUS_SUCCESS

ret

DriverEntry endp

end DriverEntry

dnf 私服能用win8么

绕过NtOpenProcess,NtOpenThread,KiAttachProcess

和最主要的,不克不及让它检测到有硬件断点,所以要对CONTEXT做一些假装,把真实的DR0~DR7的数据寄存到其它中央,OD接见的时辰前往准确的数据,若是是DNF要获得上下文,就略微做下四肢举动

代码:

dnf 私服能用win8么

.386

.model flat, stdcall

option casemap:none

include

dnf 私服能用win8么

.const

NtOpenProcessHookAddr equ 805cc626h

NtOpenProcessRetAddr equ 805cc631h

NtOpenProcessNoChange equ 805cc62ch

NtOpenThreadHookAddr equ 805cc8a8h

NtOpenThreadRetAddr equ 805cc8b3h

NtOpenThreadNoChange equ 805cc8aeh

KiAttachProcessAddr equ 804f9a08h

KiAttachProcessRetAddr equ 804f9a0fh

ObOpenObjectByPointerAddr equ 805bcc78h

NtGetContextThreadAddr equ 805d2551h;805c76a3h

NtGetContextThreadRetAddr equ 805c76a7h;805d2555h

.data

nameOffset dd ?

dnf 私服能用win8么

threadCxtLink dd 0

tmpLink dd ?

.code

GetProcessName proc

invoke PsGetCurrentProcess

mov ebx, eax

add ebx, nameOffset

invoke DbgPrint, $CTA0(“

“)

push ebx

invoke DbgPrint, ebx

pop ebx

invoke strncmp, $CTA0(“”), ebx, 6

push eax

invoke DbgPrint, $CTA0(“

“)

pop eax

ret

GetProcessName endp

HookCode proc

;履行被笼盖的代码

push dword ptr [ebp-38h]

push dword ptr [ebp-24h]

;判定是不是dnf的历程

invoke GetProcessName

.if !eax ;若是是DNF本人的历程,那末跳转归去履行它的Hook代码

pushad

invoke DbgPrint, $CTA0(“

NotUnHook

“)

popad

mov eax, NtOpenProcessNoChange;805c13e6h

jmp eax

.else ;若是不是DNF本人的历程,那末直接挪用ObOpenObjectByPointer,再前往到前面

pushad

invoke DbgPrint, $CTA0(“

UnHook

“)

popad

mov eax, ObOpenObjectByPointerAddr;805b13f0h

call eax

mov ebx, NtOpenProcessRetAddr;805c13ebh

jmp ebx

.endif

HookCode endp

;获得零碎称号偏移

GetNameOffset proc epe

local tmpOffset

pushad

dnf 私服能用win8么

mov ebx, epe

invoke strlen, $CTA0(“System”)

xor ecx, ecx

dnf 私服能用win8么

@@:

push eax

push ecx

invoke strncmp, $CTA0(“System”), ebx, eax

pop ecx

.if !eax

pop eax

mov tmpOffset, ecx

popad

mov eax, tmpOffset

ret

.elseif

pop eax

inc ebx

inc ecx

cmp ecx, 4096

je @F

jmp @B

.endif

@@:

popad

mov eax, -1

ret

GetNameOffset endp

Hook proc

pushad

;头5字节跳转

mov eax, offset HookCode

sub eax, NtOpenProcessHookAddr;805c13e0h;805c13edh

sub eax, 5

mov ebx, NtOpenProcessHookAddr;805c13e0h;805c13edh

mov cl, 0E9h

mov BYTE PTR [ebx], cl

mov DWORD PTR [ebx + 1], eax

popad

dnf 私服能用win8么

ret

Hook endp

HookThreadCode proc

;履行被笼盖的代码

push dword ptr [ebp-34h]

push dword ptr [ebp-20h]

;判定是不是dnf的历程

dnf 私服能用win8么

invoke GetProcessName

.if !eax ;若是是DNF本人的历程,那末跳转归去履行它的Hook代码

pushad

dnf 私服能用win8么

invoke DbgPrint, $CTA0(“

NotUnHook

“)

popad

dnf 私服能用win8么

mov eax, NtOpenThreadNoChange;805c13e6h

jmp eax

.else ;若是不是DNF本人的历程,那末直接挪用ObOpenObjectByPointer,再前往到前面

pushad

invoke DbgPrint, $CTA0(“

UnHook

“)

popad

mov eax, ObOpenObjectByPointerAddr;805b13f0h

call eax

mov ebx, NtOpenThreadRetAddr;805c13ebh

jmp ebx

.endif

dnf 私服能用win8么

HookThreadCode endp

HookThread proc

pushad

;头5字节跳转

mov eax, offset HookThreadCode

sub eax, NtOpenThreadHookAddr;805c13e0h;805c13edh

sub eax, 5

dnf 私服能用win8么

mov ebx, NtOpenThreadHookAddr;805c13e0h;805c13edh

mov cl, 0E9h

mov BYTE PTR [ebx], cl

mov DWORD PTR [ebx + 1], eax

popad

ret

HookThread endp

HookDbg proc

mov edi, edi

push ebp

mov ebp, esp

push ebx

push esi

mov esi, KiAttachProcessRetAddr

dnf 私服能用win8么

jmp esi

HookDbg endp

Dbg proc

pushad

;头5字节跳转

dnf 私服能用win8么

mov eax, offset HookDbg

dnf 私服能用win8么

sub eax, KiAttachProcessAddr;805c13e0h;805c13edh

sub eax, 5

mov ebx, KiAttachProcessAddr;805c13e0h;805c13edh

mov cl, 0E9h

mov BYTE PTR [ebx], cl

mov DWORD PTR [ebx + 1], eax

popad

ret

Dbg endp

;复原本人的Hook

DriverUnload proc pDriverObject:PDRIVER_OBJECT

cli

mov eax, cr0

and eax, not 10000h

mov cr0, eax

;复原历程处置惩罚

mov eax, 0ffc875ffh

mov ebx, 805cc656h

dnf 私服能用win8么

mov DWORD ptr [ebx], eax

mov eax, 43e8dc75h

mov DWORD ptr [ebx + 4], eax

;复原线程处置惩罚

mov eax, 0ffcc75ffh

mov ebx, 805cc8d8h

dnf 私服能用win8么

mov DWORD ptr [ebx], eax

mov eax, 0c1e8e075h

mov DWORD ptr [ebx + 4], eax

;复原调试处置惩罚

mov eax, 08b55ff8bh

mov ebx, 804f9a08h

mov DWORD ptr [ebx], eax

mov eax, 08b5653ech

mov DWORD ptr [ebx + 4], eax

mov eax, cr0

or eax, 10000h

mov cr0, eax

sti

ret

DriverUnload endp

;显示LinkTable的信息

dnf 私服能用win8么

ShowLinkTableInfo proc ptrLT

pushad

invoke DbgPrint, $CTA0(“

The LinkTable Info:

“)

mov ebx, ptrLT

mov eax, (LinkTable ptr [ebx]).ThreadHandle

invoke DbgPrint, $CTA0(“ThreadHandle:%0X

“), eax

mov ebx, ptrLT

mov eax, (LinkTable ptr [ebx]).Dr0Seg

invoke DbgPrint, $CTA0(“Dr0Seg:%0X

“), eax

mov ebx, ptrLT

dnf 私服能用win8么

mov eax, (LinkTable ptr [ebx]).Dr1Seg

invoke DbgPrint, $CTA0(“Dr1Seg:%0X

“), eax

mov ebx, ptrLT

mov eax, (LinkTable ptr [ebx]).Dr2Seg

invoke DbgPrint, $CTA0(“Dr2Seg:%0X

“), eax

mov ebx, ptrLT

mov eax, (LinkTable ptr [ebx]).Dr3Seg

invoke DbgPrint, $CTA0(“Dr3Seg:%0X

“), eax

mov ebx, ptrLT

mov eax, (LinkTable ptr [ebx]).Dr6Seg

invoke DbgPrint, $CTA0(“Dr6Seg:%0X

“), eax

dnf 私服能用win8么

mov ebx, ptrLT

mov eax, (LinkTable ptr [ebx]).Dr7Seg

invoke DbgPrint, $CTA0(“Dr7Seg:%0X

推荐浏览:【dnf超等助手】游久DNF超等助手 最新版

dnf超等助手软件简介

游久DNF超等助手是一个集服装摹拟、附魔查询、好感查询、NPC资料查询、游戏窗口化、游戏疑难杂症处置惩罚、一键连发等多种功用于一身的专业DNF游戏辅佐软件。

游戏双开

进步前辈的Migration双开,完满兼容Win7/Vista/WinXP

一键连发

经过自定义连发键,你可以在按下热键的时辰主动完成更多更庞杂的连招,或主动反复按键,将你的出招速度到达极限。

游戏优化

使游戏运转愈加流通,处理部份低端机械玩游戏对照卡的环境。清算游戏目次内的冗余文件,帮你的客户端瘦身。

游戏丑化

各类玩家建造的优美游戏皮肤、模子补钉,飞速下载,一扫而光。

检查悉数软件简介»

推荐浏览:体验服共研招募

1、甚么是《地下城与懦夫手游》体验服? 《地下城与懦夫手游》体验服为不定期删档非凡服务器,《地下城与懦夫手游》体验服游戏内的各类设置将不同于正式服,并存在随时停止版本更新及暂且停机的能够。主要更新将在体验服优先停止,在体验服开放的进程中,有时机先行体验到最新的游戏内容,并取得更超前、更实时的资讯;

《地下城与懦夫手游》体验服没法停止任何充值,但对取得资历的玩家我们将予以必然福利待遇,将不定期的发放必然数目的道具和经历(详细数目会凭据测试内容而有所调剂),以轻易玩家体验测试版本的各类道具及功用;

另外,体验服用户还能经过不定期进行的体验服流动争夺周边、体验服福利嘉奖。对能共同我们提交有建设性建议的和第一时候发明严重BUG的懦夫,我们还将额定赐与嘉奖,详见后续测试流动通知布告;

2、《地下城与懦夫手游》体验服有甚么注意事项? 进入《地下城与懦夫手游》体验服需求专门的客户端,而且QQ帐号或微信账号具有《地下城与懦夫手游》体验服资历可体验。《地下城与懦夫手游》体验服今朝仅对安卓用户开放,iOS用户 临时没法知足,尽请谅解;

现阶段体验服首要目标是停止游戏功能测试和寻觅游BUG,游戏内设置与正式服务器有所区别,测试内容不等同于正式服游戏终究内容,进程中泛起的回档、掉线、没法充值、商城物品没法采办等环境属于正常局限,泛起此成绩我们将不予受理,还请谅解;

《地下城与懦夫手游》体验服与正式服数据不互通,在此中的游戏行动不会对正式服形成影响,体验服内容不等同于正式服游戏内容,正式服内容请以官方通知布告为准;

热门文章

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注