由于我的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");

}

由于它不断对DebugPort清零,所以要修改调试相关函数,使得所有的访问DebugPort的地方全部访问EPROCESS中的ExitTime字节,这样它怎么清零都无效了,也检测不到

代码:

.386

.model flat, stdcall

option casemap:none

include dnf_hook.inc

.const

Dspdo_1 equ 80643db6h

Dmpp_1 equ 80642d5eh

Dmpp_2 equ 80642d64h

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

Dmvos_1 equ 8064497fh

Dumvos_1 equ 80644a45h

Pet_1 equ 805d32f8h

Det_1 equ 8064486ch

Dep_1 equ 806448e6h

.code

;还原自己的Hook

DriverUnload proc pDriverObject:PDRIVER_OBJECT

ret

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

DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING

cli

mov  eax, cr0

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

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

invoke ModifyFuncAboutDbg, Pet_1, 00787f83h, 74909090h

invoke ModifyFuncAboutDbg, Det_1, 9078498bh, 0c9859090h

invoke ModifyFuncAboutDbg, Dep_1, 9078498bh, 0c9859090h

;invoke ModifyFuncAboutDbg, Dmpp_2, 8bc0950fh, 8b90c032h

mov  eax, pDriverObject

assume  eax : ptr DRIVER_OBJECT

mov  [eax].DriverUnload, offset DriverUnload

assume  eax : nothing

mov  eax, cr0

or  eax, 10000h

mov  cr0, eax

sti

mov  eax, STATUS_SUCCESS

ret

DriverEntry endp

end DriverEntry

绕过NtOpenProcess,NtOpenThread,KiAttachProcess

以及最重要的,不能让它检测到有硬件断点,所以要对CONTEXT做一些伪装,把真实的DR0~DR7的数据存放到别的地方,OD访问的时候返回正确的数据,如果是DNF要获取上下文,就稍微做下手脚

代码:

.386

.model flat, stdcall

option casemap:none

include dnf_hook.inc

.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 ?

threadCxtLink dd 0

tmpLink dd ?

.code

GetProcessName proc

invoke PsGetCurrentProcess

mov  ebx, eax

add  ebx, nameOffset

invoke DbgPrint, $CTA0("\n")

push  ebx

invoke DbgPrint, ebx

pop  ebx

invoke strncmp, $CTA0("DNF.exe"), ebx, 6

push  eax

invoke DbgPrint, $CTA0("\n")

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("\nNotUnHook\n")

popad

mov  eax, NtOpenProcessNoChange;805c13e6h

jmp  eax

.else    ;如果不是DNF自己的进程,那么直接调用ObOpenObjectByPointer,再返回到后面

pushad

invoke DbgPrint, $CTA0("\nUnHook\n")

popad

mov  eax, ObOpenObjectByPointerAddr;805b13f0h

call  eax

mov  ebx, NtOpenProcessRetAddr;805c13ebh

jmp  ebx

.endif

HookCode endp

;获取系统名称偏移

GetNameOffset proc epe

local tmpOffset

pushad

mov  ebx, epe

invoke strlen, $CTA0("System")

xor  ecx, ecx

@@:

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

ret

Hook endp

HookThreadCode proc

;执行被覆盖的代码

push    dword ptr [ebp-34h]

push    dword ptr [ebp-20h]

;判断是否dnf的进程

invoke  GetProcessName

.if  !eax  ;如果是DNF自己的进程,那么跳转回去执行它的Hook代码

pushad

invoke DbgPrint, $CTA0("\nNotUnHook\n")

popad

mov  eax, NtOpenThreadNoChange;805c13e6h

jmp  eax

.else    ;如果不是DNF自己的进程,那么直接调用ObOpenObjectByPointer,再返回到后面

pushad

invoke DbgPrint, $CTA0("\nUnHook\n")

popad

mov  eax, ObOpenObjectByPointerAddr;805b13f0h

call  eax

mov  ebx, NtOpenThreadRetAddr;805c13ebh

jmp  ebx

.endif

HookThreadCode endp

HookThread proc

pushad

;头5字节跳转

mov  eax, offset HookThreadCode

sub  eax, NtOpenThreadHookAddr;805c13e0h;805c13edh

sub  eax, 5

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

jmp  esi

HookDbg endp

Dbg proc

pushad

;头5字节跳转

mov  eax, offset HookDbg

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

mov  DWORD ptr [ebx], eax

mov  eax, 43e8dc75h

mov  DWORD ptr [ebx + 4], eax

;还原线程处理

mov  eax, 0ffcc75ffh

mov  ebx, 805cc8d8h

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的信息

ShowLinkTableInfo proc ptrLT

pushad

invoke  DbgPrint, $CTA0("\nThe LinkTable Info:\n")

mov  ebx, ptrLT

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

invoke  DbgPrint, $CTA0("ThreadHandle:%0X\n"), eax

mov  ebx, ptrLT

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

invoke  DbgPrint, $CTA0("Dr0Seg:%0X\n"), eax

mov  ebx, ptrLT

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

invoke  DbgPrint, $CTA0("Dr1Seg:%0X\n"), eax

mov  ebx, ptrLT

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

invoke  DbgPrint, $CTA0("Dr2Seg:%0X\n"), eax

mov  ebx, ptrLT

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

invoke  DbgPrint, $CTA0("Dr3Seg:%0X\n"), eax

mov  ebx, ptrLT

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

invoke  DbgPrint, $CTA0("Dr6Seg:%0X\n"), eax

mov  ebx, ptrLT

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

invoke  DbgPrint, $CTA0("Dr7Seg:%0X\n"), eax

mov  ebx, ptrLT

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

invoke  DbgPrint, $CTA0("LinkPtr:%0X\n"), eax

mov  ebx, ptrLT

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

invoke  DbgPrint, $CTA0("NextLinkPtr:%0X\n"), eax

popad

ret

ShowLinkTableInfo endp

;判断该线程是否存在

;如果不存在则返回0,存在则返回指向该链表的指针,1代表链表为空

ExsitsLinkTable proc pHandle

pushad

mov  eax, threadCxtLink

.if  !eax  ;链表为空

pushad

invoke  DbgPrint, $CTA0("\nLinkTable Is Null.\n")

popad

popad

mov  eax, 1

ret

.endif

@@:

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

cmp  ebx, pHandle  ;如果匹配已经存在

je  @F

mov  eax, (LinkTable ptr [eax]).NextLinkPtr

.if  !eax  ;已经到达末尾,没有找到匹配

pushad

invoke  DbgPrint, $CTA0("\pHandle Is Not Found.\n")

popad

popad

xor  eax, eax

ret

.endif

jmp  @B

@@:

pushad

invoke  DbgPrint, $CTA0("\npHandle Is Exsits.\n")

popad

invoke  ShowLinkTableInfo, eax

;返回链表指针

mov  tmpLink, eax

popad

mov  eax, tmpLink

ret

ExsitsLinkTable endp

;拷贝Context到LinkTable中

CopyContextToLinkTable proc ptrContext, ptrLT

pushad

mov  ebx, ptrContext

mov  edx, ptrLT

mov  ecx, 4

@@:

mov  eax, DWORD ptr [ebx + ecx]

mov  DWORD ptr [edx + ecx], eax

add  ecx, 4

cmp  ecx, 18h

jbe  @B

popad

ret

CopyContextToLinkTable endp

;添加LinkTable表

AddLinkTable proc pHandle, ptrContext

pushad

invoke  ExsitsLinkTable, pHandle

.if  eax > 1

;已经存在只需要更新dr寄存器即可

invoke  CopyContextToLinkTable, eax, ptrContext

.else

push  eax

invoke  ExAllocatePool, 1, size LinkTable

.if  eax

;申请内存成功

mov  ebx, eax

pop  eax

;置地一个元素

mov  ecx, pHandle

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

;拷贝dr寄存器的值

invoke  CopyContextToLinkTable, ptrContext, ebx

;置另外两个元素

mov  (LinkTable ptr [ebx]).LinkPtr, ebx

mov  (LinkTable ptr [ebx]).NextLinkPtr, 0

invoke  ShowLinkTableInfo, ebx

;把新的链表项添加到链表中

.if  eax == 1

;如果链表为空,直接加在表头

mov  threadCxtLink, ebx

.else

;如果链表不为空则加到末尾

mov  eax, threadCxtLink

@@:

;指向下一个元素

mov  ecx, (LinkTable ptr [eax]).NextLinkPtr

test  ecx, ecx

je  @F

mov  eax, ecx

jmp  @B

@@:

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

.endif

.else

;申请内存失败

pop  eax

pushad

invoke DbgPrint, $CTA0("\nAlloc Memory Faild.\n")

popad

jmp  @F

.endif

.endif

@@:

popad

ret

AddLinkTable endp

;判断进程是否过虑进程

;如果是需要过虑的进程返回值为1,否则返回0

IsFilterProcess proc

pushad

;获取当前进程名

invoke  PsGetCurrentProcess

mov  ebx, eax

add  ebx, nameOffset

invoke  DbgPrint, $CTA0("\n%s: Call NtGetContextThread \n"), ebx

invoke  strncmp, $CTA0("DNF.exe"), ebx, 7

test  eax, eax

jne  @F

popad

mov  eax, 1

ret

@@:

popad

xor  eax, eax

ret

IsFilterProcess endp

;显示Context的调试寄存器

ShowDrRegInfo proc ptrContext

pushad

invoke  DbgPrint, $CTA0("\nThe Context Info:\n")

mov  ebx, ptrContext

mov  eax, DWORD ptr [ebx + 4]

invoke  DbgPrint, $CTA0("Dr0:%0X\n"), eax

mov  ebx, ptrContext

mov  eax, DWORD ptr [ebx + 8]

invoke  DbgPrint, $CTA0("Dr1:%0X\n"), eax

mov  ebx, ptrContext

mov  eax, DWORD ptr [ebx + 0ch]

invoke  DbgPrint, $CTA0("Dr2:%0X\n"), eax

mov  ebx, ptrContext

mov  eax, DWORD ptr [ebx + 10h]

invoke  DbgPrint, $CTA0("Dr3:%0X\n"), eax

mov  ebx, ptrContext

mov  eax, DWORD ptr [ebx + 14h]

invoke  DbgPrint, $CTA0("Dr6:%0X\n"), eax

mov  ebx, ptrContext

mov  eax, DWORD ptr [ebx + 18h]

invoke  DbgPrint, $CTA0("Dr7:%0X\n"), eax

popad

ret

ShowDrRegInfo endp

;恢复被隐藏的dr寄存器

RecoveryDrReg proc ptrContext, pHandle

pushad

;定位到LinkTable

mov  ebx, threadCxtLink

NEXT:

test  ebx, ebx

jne  @F  ;如果没有遍历完

popad

ret

@@:

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

cmp  eax, pHandle

je  @F  ;如果找到匹配项

mov  ebx, (LinkTable ptr [ebx]).NextLinkPtr

jmp  NEXT

@@:

;拷贝完毕后立即结束

invoke CopyContextToLinkTable, ebx, ptrContext

xor  ebx, ebx

jmp  NEXT

RecoveryDrReg endp

;清空Context的dr寄存器

ClearDrReg proc ptrContext

pushad

mov  ebx, ptrContext

mov  ecx, 4

@@:

mov  DWORD ptr [ebx + ecx], 0

add  ecx, 4

cmp  ecx, 18h

jbe  @B

pushad

invoke DbgPrint, $CTA0("\n-------------ClearDrReg-------------\n")

popad

invoke ShowDrRegInfo, ptrContext

popad

ret

ClearDrReg endp

;NtGetContextThread钩子代码

NtGetContextThreadHookCode proc

;ebx存放CONTEXT指针

mov  ebx, DWORD ptr [ebp + 10h]

;线程句柄

mov  edx, DWORD ptr [ebp + 0ch]

pushad

invoke  ShowDrRegInfo, ebx

invoke  IsFilterProcess

.if  eax  ;如果是DNF.exe

invoke  AddLinkTable, edx, ebx

invoke  ClearDrReg, ebx

.else    ;如果不是DNF.exe

invoke  RecoveryDrReg, ebx, edx

.endif

invoke  ShowDrRegInfo, ebx

;执行被覆盖的代码

popad

mov    eax, esi

pop    esi

leave

ret

NtGetContextThreadHookCode endp

;NtGetContextThread加跳转

HookNtGetContextThread proc

pushad

;头5字节跳转

mov  eax, offset NtGetContextThreadHookCode

sub  eax, NtGetContextThreadAddr;805c13e0h;805c13edh

sub  eax, 5

mov  ebx, NtGetContextThreadAddr;805c13e0h;805c13edh

mov  cl, 0E9h

mov  BYTE PTR [ebx], cl

mov  DWORD PTR [ebx + 1], eax

popad

ret

HookNtGetContextThread endp

DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING

invoke DbgPrint, $CTA0("Begin")

invoke PsGetCurrentProcess

invoke GetNameOffset, eax

mov  nameOffset, eax

cmp  eax, -1

je  @F

mov  nameOffset, eax

cli

mov  eax, cr0

and  eax, not 10000h

mov  cr0, eax

call  Hook

call  HookThread

call  Dbg

call  HookNtGetContextThread

mov  eax, pDriverObject

assume  eax : ptr DRIVER_OBJECT

mov  [eax].DriverUnload, offset DriverUnload

assume  eax : nothing

mov  eax, cr0

or  eax, 10000h

mov  cr0, eax

sti

invoke DbgPrint, $CTA0("End")

@@:

mov  eax, STATUS_SUCCESS

ret

DriverEntry endp

end DriverEntry

dnf辅助外挂C++源代码相关推荐

  1. DNF辅助程序功能介绍

    DNF辅助程序功能介绍: 软件最新版本: 8月29日 软件大小:3400K 授权方式:会员版 软件语言:简体中文 运行环境:Vista,Win2003,WinXp,Win2000,9X 外挂下载: 点 ...

  2. java计算机毕业设计腾讯网游辅助小助手源代码+数据库+系统+lw文档

    java计算机毕业设计腾讯网游辅助小助手源代码+数据库+系统+lw文档 java计算机毕业设计腾讯网游辅助小助手源代码+数据库+系统+lw文档 本源码技术栈: 项目架构:B/S架构 开发语言:Java ...

  3. uiautomator2+ tesseract 智能识别文字实现手游辅助外挂,打怪刷装备快人一步

    目录 一.背景 二.需求分解 三.脚本开发实践 1.tesseract 安装及测试 2.python使用Tesseract库识别文字 3.构建定时任务,定时刷怪 4.最终效果 一.背景 先交代下背景, ...

  4. java怎么写dnf辅助_易语言地下城与勇士辅助自动刷图类源码

    DNF辅助自动刷图类 仅供学习参考,禁止商业用途 .版本 2 .支持库 EThread .支持库 spec .程序集 自动 .子程序 自动刷图 .判断开始 (全局_总开关.自动刷图开关 = 假) 全局 ...

  5. 逆向知识之CS辅助/外挂专题.2.实现CS1.6透视原理

    逆向知识之CS辅助/外挂专题.2.实现CS1.6透视原理 一丶透视简介 我们涉及到FPS游戏.免不了说透视.自瞄什么的. 在CS1.6中. 有OpenGl.也有D3D. 透视的方法很多. gl透视(也 ...

  6. dnf辅助新手制作_网络辅助功能的新手介绍

    dnf辅助新手制作 This article is a part of the Tech in Policy publication. TiP focuses on technology being ...

  7. java计算机毕业设计腾讯网游辅助小助手源代码+数据库+系统+lw文档1

    java计算机毕业设计腾讯网游辅助小助手源代码+数据库+系统+lw文档1 java计算机毕业设计腾讯网游辅助小助手源代码+数据库+系统+lw文档1 本源码技术栈: 项目架构:B/S架构 开发语言:Ja ...

  8. 石器外挂部分源代码2

    good  good  study,day day up.无聊转帖~~             hoho 我来做回傻子.  公开部分 xx游戏 xx 的部分源代码.               #in ...

  9. 方舟生存进化mysql_MySQL——关于索引的总结_pubg黑号,dnf辅助

    新书<OpenShift云原生架构:原理与实践>第一章第三节:企业级PaaS平台OpenShiftdnf辅助 索引的优瑕玷 首先说说索引的优点:最大的利益无疑就算提高查询效率.有的索引还能 ...

最新文章

  1. Python 技术篇-文件操控:文件的移动和复制
  2. 为了简单起见,Arquillian Chameleon
  3. heartbeat v2+ldirectord+LVS集群
  4. 内存分配器ptmalloc,jemalloc,tcmalloc调研与对比
  5. 机器学习(Machine Learning)与深度学习(Deep Learning)资料汇总
  6. python脚本的编写_python脚本编写与执行
  7. PowerDesigner16.5的下载、安装
  8. 在R和Python中求峰度和偏度
  9. 剖析Android shape标签的绘制
  10. 开源硕士毕业论文算法
  11. 小红书笔记无法展示是什么原因?让我们来看看吧
  12. android 调出键盘表情_Android 显示输入法中的emoji表情以及String字符
  13. python3计算列表长度
  14. “RTOS:实时应用的操作系统”
  15. Fabric 测试网络 - 商业票据
  16. 《区块链技术与应用》北大肖臻老师——课程笔记【4-5】
  17. 中国味精市场销售现状与十四五发展趋势分析报告2022-2028
  18. 李日学撤回私有化要约:寺库市值跌至1783万美元 趣店损失惨重
  19. 静电场电位与电场强度matlab,基于MATLAB的静电场模拟
  20. 更改磁盘名称,D盘变为E盘

热门文章

  1. 数据库-设置mysql编码
  2. Request_获取请求头数据
  3. SpringBoot_web开发-thymeleaf语法
  4. Bootstrap组件1_字体图标
  5. RocketMQ简介、环境搭建
  6. 蓝字冲销是什么意思_60秒学个词:Elusive 是什么意思?(美音版)
  7. python之路day9_亮仔的Python之路Day9——Python知识体系重组
  8. 使用docker快速搭建nginx+php环境
  9. css背景图根据屏幕大小自动缩放
  10. 单多晶之争:光伏技术要靠市场检验