- 注册时间
 - 2021-4-16
 
- 最后登录
 - 2024-7-7
 
- 在线时间
 - 4 小时
 
 
 
 
 
编程入门 
  
	- 龙马币
 - 52 
 
 
 
 
 | 
 
 
前不久研究了一些32位下各种保护,收获颇多,但是在32位下由于内存限制所以,卡卡的感觉让人很不爽,于是研究了一下64为下的保护。 
 
测试游戏:JFZR  环境:win7 x64 
 
一:首先是双击调试,我之前发过一篇帖子,总结过双击调试的一些关键变量之类的东西,64位和32位基本想通。 
PS:过双击调试的时候要打一下PG的补丁,以为要替换那几个全局变量,还有就是Inline Hook IoAllocateMdl这个函数。这里再贴一下代理函数: 
- PMDL newIoAllocateMdl(
 
 -         __in_opt PVOID  VirtualAddress,
 
 -         __in ULONG  Length,
 
 -         __in BOOLEAN  SecondaryBuffer,
 
 -         __in BOOLEAN  ChargeQuota,
 
 -         __inout_opt PIRP  Irp  OPTIONAL)
 
 - {
 
 -         if (VirtualAddress == KdEnteredDebugger)
 
 -         {
 
 -                 //DbgPrint("[KdEnteredDebugger] address: %p\n", KdEnteredDebugger);
 
 -                 VirtualAddress = (PUCHAR)KdEnteredDebugger + 0x30;  
 
 -         }
 
 -         return oldIoAllocateMdl(VirtualAddress, Length, SecondaryBuffer, ChargeQuota, Irp);
 
 - }
 
  复制代码 
    二:双击调试过了之后,开始对关键点下访问断点(全局调试对象权限,DebugPort),发现*P并没有对DebugPort做清零,而是只对全局调试对象权限做了清零处理,难道没有了DebugPort清零?于是自己写了个程序对程序模拟的试了一下DebugPort清零(在未打PG补丁的情况下),结果就是触发PG蓝屏。也就是说64位下如果对DebugPort清零就会触发PG。 
 
但是对全局对象权限的清零并不会触发PG。处理方法就是简单粗暴地用DPC定时器把权限给写回去: 
 
源码: 
 
 
 |   
 
 
 
 |