欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]对64位下*P的学习(不用过PG)

[原创]对64位下*P的学习(不用过PG)

前不久研究了一些32位下各种保护,收获颇多,但是在32位下由于内存限制所以,卡卡的感觉让人很不爽,于是研究了一下64为下的保护。
     测试游戏:JFZR  环境:win7 x64
     一:首先是双击调试,我之前发过一篇帖子,总结过双击调试的一些关键变量之类的东西,64位和32位基本想通,详细的可以看我之前的帖子,地址:http://bbs.pediy.com/showthread.php?t=196149
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定时器把权限给写回去:
// 用于全局调试对象权限的计时器   500ms写一次
VOID TimerRoutine(
  _In_      struct _KDPC *Dpc,
  _In_opt_  PVOID DeferredContext,
  _In_opt_  PVOID SystemArgument1,
  _In_opt_  PVOID SystemArgument2
  )
{
  UNREFERENCED_PARAMETER(Dpc);
  UNREFERENCED_PARAMETER(DeferredContext);
  UNREFERENCED_PARAMETER(SystemArgument1);
  UNREFERENCED_PARAMETER(SystemArgument2);
  LARGE_INTEGER lTime = { 0 };
  ULONG ulMicroSecond = 0;
  //将定时器的时间设置为500ms
  ulMicroSecond = 500000;
  //将32位整数转化成64位整数
  lTime = RtlConvertLongToLargeInteger(-10 * ulMicroSecond);
  DbgPrint("dpc Timer...\n");
  KIRQL irql;
  irql = WPOFF();
  *(PULONG_PTR)ul_ValidAccessMask_Addr = 0x1f000f;
  WPON(irql);
  KeSetTimer(&Timer, lTime, &myDpc);
}

      写回权限之后,然后用XT把一些回调结束掉,就发现可以使用OD附加了,但是又遇到情况了,OD附加后,F9运行,游戏却莫名的退出了。在32位调试*p的时候也遇到过这种情况,当时是*p对线程计数做了手脚,于是我列了一下线程,发现并没有异常,于是打开XT检测了一下R3的HOOK,
当我尝试恢复KiUserExceptionDispatcher这个Hook的时候,游戏居然也跟着退出了,习惯性的拿起WinDbg对这个函数下了访问断点,结果如下图:

大体的跟了一下,可以确定这个19号线程是一个检测线程,我先是对此线程挂起,然后发现KiUserExceptionDispatcher这个函数可以正常恢复了,
后来我更暴力的把这个线程直接干掉了,也是没有问题的,发现*P对此线程也没有做保护等处理。
处理完这个线程之后居然可以OD附加调试,硬断,F2都是正常的。附图:

后续:
发现X64位下的*p强度好低,也可能是我调试的游戏强度略低,最后附上源码,并且感谢TA大牛提供的64位教程资料。
新手发帖无任何技术含量,望大牛轻喷~
声明:本文只供计数交流,代码切勿用于非法途径
Test.rar

上传的附件 1.jpg
QQ截图20150329115738.jpg
Test.rar

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功