DNF登陆后TP界面结束后进程面试时间很短就结束了了,重新下了游戏,重启各种方法都试

其实渣新学内核编程不过半个月时间,帖中难免有幼稚的想法和错误,遇到的问题我会用蓝色文字表述,还请各位前辈指正,感激不尽!
我把自己目前的进展和遇到的问题一起说说吧:
x64系统过TP大概分两步,首先要过双机调试,然后要过应用层调试。
1、过双机调试,这里也分两步
(1)首先要保证debug模式下启动游戏不蓝屏。
我也是第一次研究TP,对这之前的保护不了解,不过看网上所说这个启动蓝屏似乎是最近几个月新加的。
要过这个需要对内核调试引擎有一定的了解,不过还好我们是站在巨♂人♀的肩膀上,在看雪找到了篇帖子,比较详细的分析了系统启动时内核调试引擎初始化的几个标志。
TP只是检测了其中一个(待定),KdEnteredDebugger,它通过MDL映射来判断这个标志是不是True,如果是就蓝屏,解决方法我照抄了那篇帖子,直接在Hook一下IoAllocateMdl,
把判断的地址改到一个恒为False的地方这样就可以绕过了
[C++]&纯文本查看&复制代码
newIoAllocateMdl(
&&&&&&&&__in_opt
VirtualAddress,
&&&&&&&&__in
&&&&&&&&__in
SecondaryBuffer,
&&&&&&&&__in
ChargeQuota,
&&&&&&&&__inout_opt
PIRP& Irp& OPTIONAL)
&&&&&&&&if
(VirtualAddress == KdEnteredDebugger)
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&VirtualAddress
= (PUCHAR)KdEnteredDebugger
+ 0x30;&
&&&&&&&&return
oldIoAllocateMdl(VirtualAddress, Length, SecondaryBuffer, ChargeQuota, Irp);
不过这样做带来一个问题,蓝屏是不蓝屏了,TP的驱动模块也能加载,但只能启动登陆客户端Client.exe,在登陆后启动DNF.exe时TP会再进行一次检测,
这次就会造成虚拟机卡死,估计还是和调试模式的检测有关。
我用了个折中的解决办法,就是用户态调试的时候不进入Debug模式,这样就能启动DNF.exe了,不过实在是不方便
(2)使双机调试能下断点
关于双机调试中断点原理和异常的处理流程,我是看了《软件调试》这本书和http://www.xfocus.net/articles/.html这片帖子,有了些了解。
对于TP来说,他是不断调用KdDisableDebuger()这个函数来清零KdDebuggerEnabled,调试引擎就是在KeUpdateSystemTime()这个函数里不断检测这个标志来确定异常处理的流程
解决方法,一开始我是直接HooK KdDisableDebuger(),开头
[Asm]&纯文本查看&复制代码
直接STATUS_SUCCESS然后返回,不让它做其他处理,但是毫无效果,还是下不了断点,不知道是怎么回事……
后来想了个办法,直接修改KeUpdateSystemTime()里面检测的地方,和上面一样,让它检测其它地址……
[C++]&纯文本查看&复制代码
KUSTPatchAddr1
= SearchAddressBySig((PUCHAR)KeUpdateSystemTimeAddr
+ 0x100, 0x100, UPSig1, sizeof(UPSig1))
(KUSTPatchAddr1 != NULL)
&&&&KUSTPatchAddr1
+= sizeof(UPSig1);
&&&&DisableWriteProtect64();
&&&&*(PULONG)KUSTPatchAddr1
= (PUCHAR)pDummyKdDebuggerEnabled
- ((PUCHAR)KUSTPatchAddr1
&&&&EnableWriteProtect64();
要改的地方有3处,我只贴了一处的代码。这样就能下各种断点了。
2、双机调试之后就是用户态调试了
x64系统上TP目前做的保护还不是特别多,这也是我选x64入手的原因之一
TP修改了DebugObject中ValccessMask一项,这个就是调试权限,代码中我们恢复下就可以了。
windbg下输入以下命令就可以定位到ValidAccessMask,下硬件断点就能找到ValidAccessMask清零的地方。
至于如何在自己的代码中定位这个变量,我是通过SSDT表查找NtCreateDebugObject这个内核函数地址,里面定位DbgkDebugObjectType
再根据下面的结构体加几个偏移地址(+0x040
+&0x01c)来找到ValidAccessMask。应该有更好的定位方法……
[Asm]&纯文本查看&复制代码
DbgkDebugObjectType
_OBJECT_TYPE fffffa80`24e33250
_OBJECT_TYPE_INITIALIZER fffffa80`24e3x040
nt!_OBJECT_TYPE_INITIALIZER
&&&+0x000
Length&&&&&&&&&&
&&&+0x002
ObjectTypeFlags& : 0x8 ''
&&&+0x002
CaseInsensitive& : 0y0
&&&+0x002
UnnamedObjectsOnly : 0y0
&&&+0x002
UseDefaultObject : 0y0
&&&+0x002
SecurityRequired : 0y1
&&&+0x002
MaintainHandleCount : 0y0
&&&+0x002
MaintainTypeList : 0y0
&&&+0x002
SupportsObjectCallbacks : 0y0
&&&+0x004
ObjectTypeCode&& : 0
&&&+0x008
InvalidAttributes : 0
&&&+0x00c
GenericMapping&& : _GENERIC_MAPPING
&&&+0x01c
ValidAccessMask& : 0x1f000f
&&&+0x020
RetainAccess&&&& : 0
&&&+0x024
PoolType&&&&&&&& : 0 ( NonPagedPool )
&&&+0x028
DefaultPagedPoolCharge : 0
&&&+0x02c
DefaultNonPagedPoolCharge : 0x58
&&&+0x030
DumpProcedure&&& : (null)
&&&+0x038
OpenProcedure&&& : (null)
&&&+0x040
CloseProcedure&& : 0xfffff800`01f0ddb0&&&& void& nt!DbgkpCloseObject+0
&&&+0x048
DeleteProcedure& : 0xfffff800`01d66fe0&&&& void& nt!CmpConfigureProcessors+0
&&&+0x050
ParseProcedure&& : (null)
&&&+0x058
SecurityProcedure : 0xfffff800`01dd25f0&&&& long& nt!SeDefaultObjectMethod+0
&&&+0x060
QueryNameProcedure : (null)
&&&+0x068
OkayToCloseProcedure : (null)
_OBJECT_TYPE_INITIALIZER fffffa80`24e5x040
nt!_OBJECT_TYPE_INITIALIZER
&&&+0x000
Length&&&&&&&&&&
&&&+0x002
ObjectTypeFlags& : 0x8 ''
&&&+0x002
CaseInsensitive& : 0y0
&&&+0x002
UnnamedObjectsOnly : 0y0
&&&+0x002
UseDefaultObject : 0y0
&&&+0x002
SecurityRequired : 0y1
&&&+0x002
MaintainHandleCount : 0y0
&&&+0x002
MaintainTypeList : 0y0
&&&+0x002
SupportsObjectCallbacks : 0y0
&&&+0x004
ObjectTypeCode&& : 0
&&&+0x008
InvalidAttributes : 0
&&&+0x00c
GenericMapping&& : _GENERIC_MAPPING
&&&+0x01c
ValidAccessMask& : 0
&&&+0x020
RetainAccess&&&& : 0
&&&+0x024
PoolType&&&&&&&& : 0 ( NonPagedPool )
&&&+0x028
DefaultPagedPoolCharge : 0
&&&+0x02c
DefaultNonPagedPoolCharge : 0x58
&&&+0x030
DumpProcedure&&& : (null)
&&&+0x038
OpenProcedure&&& : (null)
&&&+0x040
CloseProcedure&& : 0xfffff800`01eb5db0&&&& void& nt!DbgkpCloseObject+0
&&&+0x048
DeleteProcedure& : 0xfffff800`01d0efe0&&&& void& nt!CmpConfigureProcessors+0
&&&+0x050
ParseProcedure&& : (null)
&&&+0x058
SecurityProcedure : 0xfffff800`01d7a5f0&&&& long& nt!SeDefaultObjectMethod+0
&&&+0x060
QueryNameProcedure : (null)
&&&+0x068
OkayToCloseProcedure : (null)
清零代码:
fffff880`0bcdc4cc
54&&&&&&&&&&&&& push&&&
fffff880`0bcdc4cd
33c0&&&&&&&&&&& xor&&&&
fffff880`0bcdc4cf
87434c&&&&&&&&& xchg&&&
[rbx+4Ch]
fffff880`0bcdc4d2
33c0&&&&&&&&&&& xor&&&&
fffff880`0bcdc4d4
874350&&&&&&&&& xchg&&&
[rbx+50h]
fffff880`0bcdc4d7
33c0&&&&&&&&&&& xor&&&&
fffff880`0bcdc4d9
87435c&&&&&&&&& xchg&&&
[rbx+5Ch] // ValidAccessMask&
fffff880`0bcdc4dc
833d& cmp&&&&
[fffff880`0bce4a78],0
fffff880`0bcdc4e3
0f8544feffff&&& jne&&&&
fffff880`0bcdc32d
fffff880`0bcdc4e9
33c9&&&&&&&&&&& xor&&&&
fffff880`0bcdc4eb
ff15df6b0000&&& call&&&
[fffff880`0bce30d0]
fffff880`0bcdc4f1
488b4c2440&&&&& mov&&&&
[rsp+40h]
fffff880`0bcdc4f6
4833cc&&&&&&&&& xor&&&&
fffff880`0bcdc4f9
e&&&&& call&&&
fffff880`0bce1c20
fffff880`0bcdc4fe
488b5c2468&&&&& mov&&&&
[rsp+68h]
fffff880`0bcdc503
&&&&&&& add&&&&
fffff880`0bcdc507
5f&&&&&&&&&&&&& pop&&&&
fffff880`0bcdc508
c3&&&&&&&&&&&&& ret
从清零代码那里的windbg信息来看,没有地址标号的提示(TesSafe+xxxx),这代码似乎不是在一个驱动模块里?
关于恢复的方法,大体上能想到3种:
1、开一个IoTimer或者DpcTimer或者干脆开个线程,不断对ValidAccessMask地址写入它原来的值
2、自己代码内利用调试寄存器下硬件断点,然后hook IDT 1号中断服务子程,在里面恢复ValidAccessMask
3、自己代码内利用调试寄存器下硬件断点,定位到上面的清零代码,nop之(我在windbg里直接nop掉是可以的,没有模块自校验)
目前我尝试了第一种方法,开了个IoTimer,虽说1s一次会造成一些概率问题,但测试而已,简单粗暴就好。
[C++]&纯文本查看&复制代码
OnTimer(DEVICE_OBJECT& *DeviceObject, PVOID&
&&&&&&&&DisableWriteProtect64();
&&&&&&&&*g_pValidAccessMask
= 0x1f000f;
&&&&&&&&EnableWriteProtect64();
至于为什么会有后两种想法,是因为我觉得其作用不仅仅在于次,通过调试寄存器和1号中断应该还可以作很多事情,不仅仅是写个0x1f000f而已……
不过虽说想法很好,我还没开始实践……这中间似乎涉及到多核CPU还有用户栈内核栈切换的许多知识……
好了,现在可以开OD附加了,那么问题来了,学挖掘……哦不…………
还是先请前辈们看看效果图:
这是开另一个任意程序调试的OD,一切正常:
这是附加了DNF.exe,反汇编窗口基本全是0,右键看不到模块信息……
这个就是传说中的DebugPort清零吗?如果是的话,我在自己研究下恢复,如果不是,哪是什么问题造成了这种现象?
另外从图上游戏界面可以看到,DNF检测到了非法模块,这个不知道会有什么影响……
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:6752次
排名:千里之外
转载:76篇
(1)(1)(2)(17)(29)(25)(1)dnf为什么输完密码密保进入游戏 TP还没出来 就跳了 任务管理器没有dnfchina进程 重安装过还是没用, dnf为什么输完密码密保进入游戏
dnf为什么输完密码密保进入游戏 TP还没出来 就跳了 任务管理器没有dnfchina进程 重安装过还是没用 问题补充:
只有我的号登不上去,输完密码TP没出来 用别人的号就登上去 naoh97 dnf为什么输完密码密保进入游戏 TP还没出来 就跳了 任务管理器没有dnfchina进程 重安装过还是没用
重启试试,如果不行的话就把IE浏览器里的历史记录清楚,SSL状态清楚,再重启,这样基本就没问里了,具体步骤是:1、右键Internet Explorer;2、点击属性;乏叮催顾诎该挫双旦晶3、点击删除cookies和删除文件;4、点击内容;5点击清楚SSL状态。OVER
正常、才安装就是这样、到了输入账号就会掉‘、这样说明电脑还有漏洞或者还是很卡、这样的状况会维持1-2天。过后就会好
DNF程序的问题 重下载一遍就好了
换台别的机器试试你的号看能不能上一键结束DNF的TP进程和快速关闭DNF游戏进程的方法讲解。_地下城与勇士吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:6,640,817贴子:
一键结束DNF的TP进程和快速关闭DNF游戏进程的方法讲解。
一、打开一个空白的TXT,根据需要选择复制以下“英文部分”的内容到TXT空白文本文档中。  第一种、一键结束TP相关进程的指令:  taskkill /f /im QQlogin.exetaskkill /f /im Tensafe.exe_1taskkill /f /im Tensafe.exe_2taskkill /f /im Txplatform.exetaskkill /f /im Tencentdl.exe  第二种、快速关闭DNF游戏进程的指令:  taskkill /f /im DNF.exetaskkill /f /im DNFchina.exetaskkill /f /im Txplatform.exe  二、点击“文件”,“另存为”,文件名分别保存为“一键结束TP.dat”和“快速关闭DNF.dat”到桌面。  桌面产生方形有齿轮的文件时,你就成功编辑好指令程序了。然后,根据个人需要使用这两个指令程序。  ★使用时需要注意:1、保存时名字可以自己设定,但是,一定要有后缀名“.dat”,一个点和3个英文字母,别把点忘了  2、如果是登录后一键结束TP相关进程,一定要在TP走完后,再点击你编辑好的程序。如果是在登录界面没消失前点击,登录界面将会消失,游戏可能无法成功登录。如果登录后,TP没有走完时点击,将有一个Txplatform.exe进程产生,还要重新点击再结束该进程  3、这种指令的核心就是“taskkill /f /im ”(注意m后有空格),它不仅可以用在DNF上,也可以用在其他方面,只要找准需要结束的进程名,按照同样的方法,一样可以结束其他进程。具体用到哪些方面,自己去实验吧。(PS:比如:结束开机时的多种无用进程。又比如:家里玩DNF时,家长突然回来,但是在刷图中,回城要虚弱,开又慢,只需要点击“快速关闭DNF”,就可以马上把DNF关了。当然,为了不使家长发现,大家可以把文件名设置为其他的名字,自己清楚具体功能就行了)  4、如果喜欢用连发的,可以在“快速关闭DNF.dat”指令中加入“taskkill /f /im ****.exe”(“****”是你的连发进程名) ,那么在结束DNF时,就可以把连发一起关闭
目测以后还会出单人异界...
笑死宝宝我了
取了个蝴蝶辉耀的id,然后
把永远爱你写进诗的结...
Tx什么时候出春节 套啊...
今天有个卖游戏币的,刷...
贴吧热议榜
使用签名档&&
保存至快速回贴}

我要回帖

更多关于 抗战还有一年就结束了 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信