DNF魔兽辅助技能代码代码是怎么找出来的 可以教教吗

5437人阅读
外挂学习(48)
由于我的用的比较少,所以大部分都用的汇编,部分地方用汇编写不是很方便,所以我用的,由于只是学习,所以内核地址我没有计算都是硬编码的。过主要分为三步,也许我的思路不太正确,反正可以调试,下断。
程序没怎么修边幅,因为只是测试,所以一般都没有写更改内核后的恢复,不过不妨碍使用。
第一步,这也是最起码的,你必须要能够打开游戏进程和线程,能够开打进程和线程后不被检测到
第二步,能够读写进村内存
第三步,能够用附加游戏进程
第四步,能够下硬件断点而不被检测
跳过,函数头的钩子
#include&ntddk.h&
typedef&struct&_SERVICE_DESCRIPTOR_TABLE
&&PVOID&&ServiceTableB
&&PULONG&&ServiceCounterTableB
&&ULONG&&NumberOfS
&&ULONG&&ParamTableB
}SERVICE_DESCRIPTOR_TABLE,*PSERVICE_DESCRIPTOR_TABLE;&//由于只有一项这里就简单点了
extern&PSERVICE_DESCRIPTOR_TABLE&&&&KeServiceDescriptorT//KeServiceDescriptorTable为导出函数
/////////////////////////////////////
VOID&Hook();
VOID&Unhook();
VOID&OnUnload(IN&PDRIVER_OBJECT&DriverObject);
//////////////////////////////////////
ULONG&JmpA//跳转到里的地址
ULONG&JmpAddress1;//跳转到里的地址
ULONG&OldServiceA//原来的服务地址
ULONG&OldServiceAddress1;//原来的服务地址
//////////////////////////////////////
__declspec(naked)&NTSTATUS&__stdcall&MyNtReadVirtualMemory(HANDLE&ProcessHandle,
&&&&&&&&&&&&&&PVOID&BaseAddress,
&&&&&&&&&&&&&&PVOID&Buffer,
&&&&&&&&&&&&&&ULONG&NumberOfBytesToRead,
&&&&&&&&PULONG&NumberOfBytesReaded)&
&&//跳过去
&&&&push&&&&0x1c
&&&&push&&&&804eb560h&&//共十个字节
&&&&jmp&&&&[JmpAddress]&&
__declspec(naked)&NTSTATUS&__stdcall&MyNtWriteVirtualMemory(HANDLE&ProcessHandle,
&&&&&&&&&&&&&&PVOID&BaseAddress,
&&&&&&&&&&&&&&PVOID&Buffer,
&&&&&&&&&&&&&&ULONG&NumberOfBytesToWrite,
&&&&&&&&PULONG&NumberOfBytesReaded)&
&&//跳过去
&&&&push&&&&0x1c
&&&&push&&&&804eb560h&&//共十个字节
&&&&jmp&&&&[JmpAddress1]&
///////////////////////////////////////////////////
NTSTATUS&DriverEntry(IN&PDRIVER_OBJECT&DriverObject,PUNICODE_STRING&RegistryPath)
&&DriverObject-&DriverUnload&=&OnU
&&DbgPrint(&Unhooker&load&);
&&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为服务
&&Address1&=&(ULONG)KeServiceDescriptorTable-&ServiceTableBase&+&0x115&*&4;//0x7A为服务
&&DbgPrint(&Address:0x%08X&,Address);
&&OldServiceAddress&=&*(ULONG*)A//保存原来的地址
&&OldServiceAddress1&=&*(ULONG*)Address1;//保存原来的地址
&&DbgPrint(&OldServiceAddress:0x%08X&,OldServiceAddress);
&&DbgPrint(&OldServiceAddress1:0x%08X&,OldServiceAddress1);
&&DbgPrint(&MyNtOpenProcess:0x%08X&,MyNtReadVirtualMemory);
&&DbgPrint(&MyNtOpenProcess:0x%08X&,MyNtWriteVirtualMemory);
&&JmpAddress&=&(ULONG)0x805b528a&+&7;&//跳转到函数头+的地方,这样在其前面写的都失效了
&&JmpAddress1&=&(ULONG)0x805b5394&+&7;
&&DbgPrint(&JmpAddress:0x%08X&,JmpAddress);
&&DbgPrint(&JmpAddress1:0x%08X&,JmpAddress1);
&&{&&&&//去掉内存保护
&&&&&&&&mov&&eax,cr0
&&&&and&&eax,not&10000h
&&&&mov&&cr0,eax
&&*((ULONG*)Address)&=&(ULONG)MyNtReadVirtualM//HOOK&SSDT
&&*((ULONG*)Address1)&=&(ULONG)MyNtWriteVirtualM
&&{&&&&//恢复内存保护&&
&&&&&&&&mov&&eax,cr0
&&&&or&&eax,10000h
&&&&mov&&cr0,eax
//////////////////////////////////////////////////////
VOID&Unhook()
&&ULONG&&Address,&Address1;
&&Address&=&(ULONG)KeServiceDescriptorTable-&ServiceTableBase&+&0xBA&*&4;//查找
&&Address1&=&(ULONG)KeServiceDescriptorTable-&ServiceTableBase&+&0x115&*&4;
&&&&&&&&&&mov&&eax,cr0
&&&&and&&eax,not&10000h
&&&&mov&&cr0,eax
&&*((ULONG*)Address)&=&(ULONG)OldServiceA//还原
&&*((ULONG*)Address1)&=&(ULONG)OldServiceAddress1;//还原
&&__asm{&&
&&&&&&&&mov&&eax,cr0
&&&&or&&eax,10000h
&&&&mov&&cr0,eax
&&DbgPrint(&Unhook&);
由于它不断对清零,所以要修改调试相关函数,使得所有的访问的地方全部访问中的字节,这样它怎么清零都无效了,也检测不到
.model&flat,&stdcall
option&casemap:none
include&dnf_hook.inc
Dspdo_1&equ&80643db6h
Dmpp_1&equ&80642d5eh
Dmpp_2&equ&80642d64h
Dct_1&equ&h
Dqm_1&equ&h
Kde_1&equ&804ff5fdh
Dfe_1&equ&h
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&h
;还原自己的
DriverUnload&proc&pDriverObject:PDRIVER_OBJECT
DriverUnload&endp
ModifyFuncAboutDbg&proc&addrOdFunc,&cmd_1,&cmd_2
&&mov&&ebx,&addrOdFunc
&&mov&&eax,&cmd_1
&&mov&&DWORD&ptr&[ebx],&eax
&&mov&&eax,&cmd_2
&&mov&&DWORD&ptr&[ebx&+&4],&eax
ModifyFuncAboutDbg&endp
DriverEntry&proc&pDriverObject:PDRIVER_OBJECT,&pusRegistryPath:PUNICODE_STRING
&&&&&&&&mov&&eax,&cr0
&&&&&&&&and&&eax,&not&10000h
&&&&&&&&mov&&cr0,&eax
&&invoke&ModifyFuncAboutDbg,&Dspdo_1,&h,&0fde89090h
&&invoke&ModifyFuncAboutDbg,&Dmpp_1,&90787e39h,&950f9090h
&&invoke&ModifyFuncAboutDbg,&Dct_1,&90785e39h,&840f9090h
&&invoke&ModifyFuncAboutDbg,&Dqm_1,&9078408bh,&h
&&invoke&ModifyFuncAboutDbg,&Kde_1,&h,&h
&&invoke&ModifyFuncAboutDbg,&Dfe_1,&9078418bh,&0d2329090h
&&invoke&ModifyFuncAboutDbg,&Pcp_1,&h,&45f69090h
&&invoke&ModifyFuncAboutDbg,&Mcp_1,&90785e39h,&950f9090h
&&invoke&ModifyFuncAboutDbg,&Mcp_2,&90784a89h,&5e399090h
&&invoke&ModifyFuncAboutDbg,&Dmvos_1,&9078498bh,&0cb3b9090h
&&invoke&ModifyFuncAboutDbg,&Dumvos_1,&h,&h
&&invoke&ModifyFuncAboutDbg,&Pet_1,&00787f83h,&h
&&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
DriverEntry&endp
end&DriverEntry
以及最重要的,不能让它检测到有硬件断点,所以要对做一些伪装,把真实的~的数据存放到别的地方,访问的时候返回正确的数据,如果是要获取上下文,就稍微做下手脚
.model&flat,&stdcall
option&casemap:none
include&dnf_hook.inc
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&805da3h
NtGetContextThreadRetAddr&equ&805c76a7h;805d2555h
nameOffset&dd&?
threadCxtLink&dd&0
tmpLink&dd&?
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
GetProcessName&endp
HookCode&proc
&&;执行被覆盖的代码
&&push&&&&dword&ptr&[ebp-38h]
&&push&&&&dword&ptr&[ebp-24h]
&&;判断是否的进程
&&invoke&&GetProcessName
&&.if&&!eax&&;如果是自己的进程,那么跳转回去执行它的代码
&&&&pushad
&&&&invoke&DbgPrint,&$CTA0(&\nNotUnHook\n&)
&&&&mov&&eax,&NtOpenProcessNoC805c13e6h
&&&&jmp&&eax
&&.else&&&&;如果不是自己的进程,那么直接调用,再返回到后面
&&&&pushad
&&&&invoke&DbgPrint,&$CTA0(&\nUnHook\n&)
&&&&mov&&eax,&ObOpenObjectByPointerA805b13f0h
&&&&call&&eax
&&&&mov&&ebx,&NtOpenProcessRetA805c13ebh
&&&&jmp&&ebx
HookCode&endp
;获取系统名称偏移
GetNameOffset&proc&epe
&&local&tmpOffset
&&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
&&&&mov&&eax,&tmpOffset
&&&&pop&&eax
&&&&inc&&ebx
&&&&inc&&ecx
&&&&cmp&&ecx,&4096
&&&&je&&@F
&&&&jmp&&@B
&&mov&&eax,&-1
GetNameOffset&endp
&&;头字节跳转
&&mov&&eax,&offset&HookCode
&&sub&&eax,&NtOpenProcessHookA805c13e0h;805c13edh
&&sub&&eax,&5
&&mov&&ebx,&NtOpenProcessHookA805c13e0h;805c13edh
&&mov&&cl,&0E9h
&&mov&&BYTE&PTR&[ebx],&cl
&&mov&&DWORD&PTR&[ebx&+&1],&eax
HookThreadCode&proc
&&;执行被覆盖的代码
&&push&&&&dword&ptr&[ebp-34h]
&&push&&&&dword&ptr&[ebp-20h]
&&;判断是否的进程
&&invoke&&GetProcessName
&&.if&&!eax&&;如果是自己的进程,那么跳转回去执行它的代码
&&&&pushad
&&&&invoke&DbgPrint,&$CTA0(&\nNotUnHook\n&)
&&&&mov&&eax,&NtOpenThreadNoC805c13e6h
&&&&jmp&&eax
&&.else&&&&;如果不是自己的进程,那么直接调用,再返回到后面
&&&&pushad
&&&&invoke&DbgPrint,&$CTA0(&\nUnHook\n&)
&&&&mov&&eax,&ObOpenObjectByPointerA805b13f0h
&&&&call&&eax
&&&&mov&&ebx,&NtOpenThreadRetA805c13ebh
&&&&jmp&&ebx
HookThreadCode&endp
HookThread&proc
&&;头字节跳转
&&mov&&eax,&offset&HookThreadCode
&&sub&&eax,&NtOpenThreadHookA805c13e0h;805c13edh
&&sub&&eax,&5
&&mov&&ebx,&NtOpenThreadHookA805c13e0h;805c13edh
&&mov&&cl,&0E9h
&&mov&&BYTE&PTR&[ebx],&cl
&&mov&&DWORD&PTR&[ebx&+&1],&eax
HookThread&endp
HookDbg&proc
&&mov&&&&edi,&edi
&&push&&&&ebp
&&mov&&&&ebp,&esp
&&push&&&&ebx
&&push&&&&esi
&&mov&&esi,&KiAttachProcessRetAddr
&&jmp&&esi
HookDbg&endp
&&;头字节跳转
&&mov&&eax,&offset&HookDbg
&&sub&&eax,&KiAttachProcessA805c13e0h;805c13edh
&&sub&&eax,&5
&&mov&&ebx,&KiAttachProcessA805c13e0h;805c13edh
&&mov&&cl,&0E9h
&&mov&&BYTE&PTR&[ebx],&cl
&&mov&&DWORD&PTR&[ebx&+&1],&eax
;还原自己的
DriverUnload&proc&pDriverObject:PDRIVER_OBJECT
&&&&&&&&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
DriverUnload&endp
;显示的信息
ShowLinkTableInfo&proc&ptrLT
&&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
ShowLinkTableInfo&endp&
;判断该线程是否存在
;如果不存在则返回,存在则返回指向该链表的指针,代表链表为空
ExsitsLinkTable&proc&pHandle
&&mov&&eax,&threadCxtLink
&&.if&&!eax&&;链表为空
&&&&pushad
&&&&invoke&&DbgPrint,&$CTA0(&\nLinkTable&Is&Null.\n&)
&&&&popad&&&&
&&&&mov&&eax,&1
&&mov&&ebx,&(LinkTable&ptr&[eax]).ThreadHandle
&&cmp&&ebx,&pHandle&&;如果匹配已经存在
&&mov&&eax,&(LinkTable&ptr&[eax]).NextLinkPtr
&&.if&&!eax&&;已经到达末尾,没有找到匹配
&&&&pushad
&&&&invoke&&DbgPrint,&$CTA0(&\pHandle&Is&Not&Found.\n&)
&&&&xor&&eax,&eax
&&invoke&&DbgPrint,&$CTA0(&\npHandle&Is&Exsits.\n&)
&&invoke&&ShowLinkTableInfo,&eax
&&;返回链表指针
&&mov&&tmpLink,&eax
&&mov&&eax,&tmpLink
ExsitsLinkTable&endp
CopyContextToLinkTable&proc&ptrContext,&ptrLT
&&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
CopyContextToLinkTable&endp
AddLinkTable&proc&pHandle,&ptrContext
&&invoke&&ExsitsLinkTable,&pHandle
&&.if&&eax&&&1
&&&&;已经存在只需要更新寄存器即可
&&&&invoke&&CopyContextToLinkTable,&eax,&ptrContext
&&&&push&&eax
&&&&invoke&&ExAllocatePool,&1,&size&LinkTable
&&&&.if&&eax
&&&&&&;申请内存成功
&&&&&&mov&&ebx,&eax
&&&&&&pop&&eax
&&&&&&;置地一个元素
&&&&&&mov&&ecx,&pHandle
&&&&&&mov&&(LinkTable&ptr&[ebx]).ThreadHandle,&ecx
&&&&&&;拷贝寄存器的值
&&&&&&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
&&&&&&;申请内存失败
&&&&&&pop&&eax
&&&&&&pushad
&&&&&&invoke&DbgPrint,&$CTA0(&\nAlloc&Memory&Faild.\n&)
&&&&&&popad
&&&&&&jmp&&@F
&&&&.endif
AddLinkTable&endp
;判断进程是否过虑进程
;如果是需要过虑的进程返回值为,否则返回
IsFilterProcess&proc
&&;获取当前进程名
&&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
&&mov&&eax,&1
&&xor&&eax,&eax
IsFilterProcess&endp
;显示的调试寄存器
ShowDrRegInfo&proc&ptrContext
&&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
ShowDrRegInfo&endp
;恢复被隐藏的寄存器
RecoveryDrReg&proc&ptrContext,&pHandle
&&mov&&ebx,&threadCxtLink
&&test&&ebx,&ebx
&&jne&&@F&&;如果没有遍历完
&&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
;清空的寄存器
ClearDrReg&proc&ptrContext
&&mov&&ebx,&ptrContext
&&mov&&ecx,&4
&&mov&&DWORD&ptr&[ebx&+&ecx],&0
&&add&&ecx,&4
&&cmp&&ecx,&18h
&&invoke&DbgPrint,&$CTA0(&\n-------------ClearDrReg-------------\n&)
&&invoke&ShowDrRegInfo,&ptrContext
ClearDrReg&endp
;NtGetContextThread钩子代码
NtGetContextThreadHookCode&proc
&&;ebx存放指针
&&mov&&ebx,&DWORD&ptr&[ebp&+&10h]
&&;线程句柄
&&mov&&edx,&DWORD&ptr&[ebp&+&0ch]
&&pushad&&
&&invoke&&ShowDrRegInfo,&ebx
&&invoke&&IsFilterProcess
&&.if&&eax&&;如果是
&&&&invoke&&AddLinkTable,&edx,&ebx
&&&&invoke&&ClearDrReg,&ebx
&&.else&&&&;如果不是
&&&&invoke&&RecoveryDrReg,&ebx,&edx
&&invoke&&ShowDrRegInfo,&ebx
&&;执行被覆盖的代码
&&mov&&&&eax,&esi
&&pop&&&&esi
NtGetContextThreadHookCode&endp
;NtGetContextThread加跳转
HookNtGetContextThread&proc
&&;头字节跳转
&&mov&&eax,&offset&NtGetContextThreadHookCode
&&sub&&eax,&NtGetContextThreadA805c13e0h;805c13edh
&&sub&&eax,&5
&&mov&&ebx,&NtGetContextThreadA805c13e0h;805c13edh
&&mov&&cl,&0E9h
&&mov&&BYTE&PTR&[ebx],&cl
&&mov&&DWORD&PTR&[ebx&+&1],&eax
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
&&mov&&nameOffset,&eax
&&&&&&&&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
DriverEntry&endp
end&DriverEntry
文章:100篇
阅读:37938
文章:42篇
阅读:10317
文章:15篇
阅读:22722dnf狂人辅助怎么修改代码的?
全部答案(共1个回答)
一直都不错的
代码表那是之前的,每次更新都会有些变动
是“源代码”,不是“原代码”。
用一般的编辑软件都可以修改。如:EDIT、Wingdows中的记事本等。
具体怎么改那要看你的要求了。
G都是要钱的 那些游戏里喊得 免费的挂都是盗号的挂。不过有那个钱买挂 不如买点游戏币 让人带你升级 比挂安全。就是开销大点。
还有就是 用挂的话游戏的乐趣全没了...
首先你要会过游戏保护,你会用CE吗?不会你怎么去找.你可以去滴水官网去下 去下CE.免费试用的.然后到外挂海论坛多看些教程.你就会懂了.你光问找基址.我想是没人...
你好,应该是系统错误了。
答: 这个啊 我知道有一家 我经常去买 效果非常不错 还给优惠 我都已经成老客户了 要是你需要的话 我可以介绍给你 扣{贰陆伍贰八九o四柒叁}
答: 你重登试试。如果还不行就重新安装游戏。
答: 搞积分的
大家还关注
Copyright &
Corporation, All Rights Reserved
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区
相关问答:123456789101112131415特玩传送门
网络游戏移动第一门户

我要回帖

更多关于 吃鸡辅助开源代码 的文章

 

随机推荐