也许大家也是研究腾讯游戏的爱好者,对腾讯的游戏都有过这样的体会  例如OD与CE无法进行如以下操作: 
无法附加进程, 
无法打开进程, 
游戏进程被隐藏无法在工具中查看到,
内存无法读取代码  
内存修改后游戏掉线   
无法双机进行调试  
出现SX非法模块提示 `
其实以上说的这么多限制 都是因为TP保护造成的.其实这些东西研究了很久后,发现其实就是黑色老大常说的APIHOOK这方面. 7%32E1F)%  
例如DNF的TP保护就是HOOK了以下几个API函数来禁止上面刚才说的那些:  
NtOpenThread    //这是TP防止调试器在它体内创建线程   
NtOpenProcess   //这是TP防止OD等在进程列表看到游戏进程 
KiAttachProcess   //这是TP防止其他软件附加它  
NtReadVirtualMemory  //这是TP防止别人读取它的内存  
NtWriteVirtualMemory  //这是TP防止别人在它的内存里面乱写乱画 
KDCOM.dll:KdReceivePacket  //这是TP这两个是COM串口的接受和发送数据 
KDCOM.dll:KdSendPacket      //这是TP主要用来方式别人双机调试,TP使用了KdDisableDebugger来禁用双机调试.  
TP通过将以上这几个API进行HOOK后 来保护游戏, 看过独立团第四版本易语言辅助教程的人 应该知道 以上的那几个API函数 开头是 Nt 的吧 
Nt开头的是ntdll.dll库中的函数,也正是黑色衬衣老大在第四版本易语言辅助教程中有一篇课程是讲 SSDTHOOK与恢复这方面的.  
那么TP保护它比较变态,并对debugport进行了疯狂的清零操作甚至还包括EPROCESS+70\+74\+78等几处位置处理的手段通常都是向64端口写入FE导致计算机被重启。 
下面我简单看说下以上关键的几个APIHOOK:
1.KiAttachProcess 函数   
2.NtReadVirtualMemory 内存函数 
3.NtWriteVirtualMemory 内存函数
4.NtOpenThread 线程函数   
5.NtOpenProcess 进程函数   
那么前3个函数是可以直接SSDT恢复的 第四版本易语言辅助教程老大讲了如何恢复的 不明白的可以自己去看教程。 
第4个函数是有监视,如果直接恢复的话电脑会即刻重启.(TP蛮变态)  
第5个函数和ring3有驱动通信,直接恢复这个函数的话  游戏会在1分钟内弹出SX非法模块提示. 
  
既然我们现在知道了TP保护的保护特点和这几个API分析后的结果.   
接下来就是要做出相应的解除TP保护(也就是这些APIHOOK) 
下面我在梳理一下头绪给出相应的解决方案   
1.首先直接恢复 第1、2、3处的SSDT表中的HOOK  
2.绕过4、5处的HOOK 不采用直接恢复   
3.将TP保护程序中的debugport清零的内核线程干掉 停止该线程继续运行.  
4.恢复硬件断点  
但是要有一个先后的逻辑顺序   
因为内核有一个线程负责监视几个地方,必须要先干掉它。 
但是这个内容我写在了处理debugport清零的一起,也就是第3步。所以大家在照搬源码的时候注意代码执行次序。
下面我们就开始写解除TP保护的代码,因为本人喜欢C++ 所以是c++编写,如果是使用易语言的话 就自己翻译过来吧
先从简单的工作讲起,恢复1、2、3处的HOOK 
KiAttachProcess函数的处理的代码:

    1.  
      //////////////////////////////////////////////////////////////////////
    2.  
      // 名称: Nakd_KiAttachProcess
    3.  
      // 功能: My_RecoveryHook_KiAttachProcess的中继函数
    4.  
      // 参数:
    5.  
      // 返回:
    6.  
      //////////////////////////////////////////////////////////////////////
    7.  
      static NAKED VOID Nakd_KiAttachProcess()
    8.  
      {
    9.  
      __asm
    10.  
      {
    11.  
      mov edi,edi
    12.  
      push ebp
    13.  
      mov ebp,esp
    14.  
      push ebx
    15.  
      push esi
    16.  
      mov eax,KiAttachProcessAddress //注意这个是全局变量 BYTE*
    17.  
      add eax,7
    18.  
      jmp eax
    19.  
      }
    20.  
      }
    21.  
      //////////////////////////////////////////////////////////////////////
    22.  
      // 名称: RecoveryHook_KiAttachProcess
    23.  
      // 功能: 解除游戏保护对_KiAttachProcess函数的HOOK(DNF)
    24.  
      // 参数:
    25.  
      // 返回: 状态
    26.  
      //////////////////////////////////////////////////////////////////////
    27.  
      NTSTATUS My_RecoveryHook_KiAttachProcess()
    28.  
      {
    29.  
      BYTE *KeAttachProcessAddress = NULL; //KeAttachProcess函数地址
    30.  
      BYTE *p;
    31.  
      BYTE MovEaxAddress[5] = {0xB8,0,0,0,0}; //
    32.  
      BYTE JmpEax[2] = {0xff,0xe0};
    33.  
      KIRQL Irql;
    34.  
      //特征码
    35.  
      BYTE Signature1 = 0x56, //p-1
    36.  
      Signature2 = 0x57, //p-2
    37.  
      Signature3 = 0x5F, //p-3
    38.  
      Signature4 = 0x5E, //p+5
    39.  
      Signature5 = 0xE8; //p第一个字节
    40.  
      //获得KeAttachProcess地址,然后通过特征码找到
    41.  
      //KiAttachProcess的地址
    42.  
      KeAttachProcessAddress = (BYTE*)MyGetFunAddress(L"KeAttachProcess");
    43.  
      if (KeAttachProcessAddress == NULL)
    44.  
      {
    45.  
      KdPrint(("KeAttachProcess地址获取失败\n"));
    46.  
      return FAILED_TO_OBTAIN_FUNCTION_ADDRESSES;
    47.  
      }
    48.  
      //将p指向KeAttachProcess函数开始处
    49.  
      p = KeAttachProcessAddress;
    50.  
      while (1)
    51.  
      {
    52.  
      if ((*(p-1) == Signature1) &&
    53.  
      (*(p-2) == Signature2) &&
    54.  
      (*(p+5) == Signature3) &&
    55.  
      (*(p+6) == Signature4) &&
    56.  
      (*p == Signature5))
    57.  
      {
    58.  
      //定位成功后取地址
    59.  
      KiAttachProcessAddress = *(PULONG)(p+1)+(ULONG)(p+5);
    60.  
      break;
    61.  
      }
    62.  
      //推动指针
    63.  
      p++;
    64.  
      }
    65.  
      //计算中继函数地址
    66.  
      *(ULONG *)(MovEaxAddress+1)=(ULONG)Nakd_KiAttachProcess;
    67.  
      WPOFF(); //清除CR0
    68.  
      //提升IRQL中断级
    69.  
      Irql=KeRaiseIrqlToDpcLevel();
    70.  
      //写入
    71.  
      RtlCopyMemory(KiAttachProcessAddress,MovEaxAddress,5);
    72.  
      RtlCopyMemory(KiAttachProcessAddress+5,JmpEax,2);
    73.  
      //恢复Irql
    74.  
      KeLowerIrql(Irql);
    75.  
      WPON(); //恢复CR0
    76.  
      return STATUS_SUCCESS;
    77.  

一个不错的过TP思路,转载CSDN的更多相关文章

  1. 【转】一个不错的eclipse反编译插件

    [转]一个不错的eclipse反编译插件 在CSDN论坛上看到的一个不错的eclipse反编译插件,感觉看起来不错的样子,因而记下,原网址是:http://topic.csdn.net/u/20121 ...

  2. linux中内核的一个不错的参数somaxconn

    导读:在linux中,/proc/sys/net/core/somaxconn这个参数,linux中内核的一个不错的参数somaxconn 看下其解析: 对于一个TCP连接,Server与Client ...

  3. [置顶] ios 一个不错的图片浏览分享框架demo

    demo功能:一个不错的图片浏览分享框架demo.iphone6.1 测试通过.可以浏览图片,保存,微博分享到新浪,腾讯,网易,人人等. 注:(由于各个微博的接口有时候会有调整,不一定能分享成功.只看 ...

  4. 转载CSDN博客步骤

    在参考“如何快速转载CSDN中的博客”后,由于自己不懂html以及markdown相关知识,所以花了一些时间来弄明白怎么转载博客,以下为转载CSDN博客步骤和一些知识小笔记. 参考博客原址:http: ...

  5. 一个不错的loading效果--IT蓝豹

    一个不错的loading效果 介绍:一个不错的loading加载效果,弹性收缩,效果不错,学习android动画的朋友可以下载来研究研究本例子其实由SeekBar实现,由MetaballView,Me ...

  6. datetimepicker一个不错的日历android特效

    datetimepicker一个不错的日历效,选中和选择日历效果都很不错, 实用的时候直接可以把datetimepicker-library这个引入到项目,调用的地方在实现 TimePickerDia ...

  7. 一个不错的shell 脚本教程 入门级

    一个很不错的bash脚本编写教程,至少没接触过BASH的也能看懂     建立一个脚本 Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行s ...

  8. 一个不错的图片滑动展示插件 anythingslider

    一个不错的图片http://css-tricks.com/anythingslider-jquery-plugin/ DEMO演示: http://css-tricks.github.io/Anyth ...

  9. 一个不错的PPT,扁平化设计,开放资源,要的进来

    开了那么多的博客,没做啥资源贡献,今天共享一个不错的PPT模板.例如以下图所看到的,须要的话留下邮箱 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFp ...

随机推荐

  1. Linux Kernel 0.12 启动简介,调试记录(Ubuntu1804, Bochs, gdb)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  2. OWASP TOP 10 详解

      OWASP--开放式web应用程序安全项目 参考文献:袁鸣凯.OWASP Top 10十大风险 – 10个最重大的Web应用风险与攻防.2016-9-18. https://blog.csdn.n ...

  3. CVE-2018-2628-WLS Core Components 反序列化

    漏洞参考 https://blog.csdn.net/csacs/article/details/87122472 漏洞概述:在 WebLogic 里,攻击者利用其他rmi绕过weblogic黑名单限 ...

  4. numpy函数的使用

    NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库. 数据分析三剑客:Numpy,Pandas ...

  5. js 判断 是否在当前页面

    1.使用visibilitychange 浏览器标签页被隐藏或显示的时候会触发visibilitychange事件. document.addEventListener("visibilit ...

  6. Windows系统和Linux系统下安装Mongodb及可视化页面展示

    一.Windows系统安装MongoDB 下载地址: ​ 官方:http://www.mongodb.org/ ​ 其它:http://dl.mongodb.org/dl/win32/x86_64 下 ...

  7. Java传参:值传递 or 引用传递 ?

    刚开始学Java的时候一度以为:基本数据类型是值传递,引用类型是引用传递.新人很容易在这两个概念上面被搞糊涂,后来看了Hollis的文章才明白了Java中只有值传递. 接下来我能用简单明了的方式来说明 ...

  8. Codeforces Round #574 (Div. 2) D1. Submarine in the Rybinsk Sea (easy edition) 【计算贡献】

    一.题目 D1. Submarine in the Rybinsk Sea (easy edition) 二.分析 简单版本的话,因为给定的a的长度都是定的,那么我们就无需去考虑其他的,只用计算ai的 ...

  9. Envoy 部署类型

    目录 Envoy 网络拓扑及请求流程 1. 术语 2. 网络拓扑 3. 配置 4. 更高层的架构 5. 请求流程 1. Listener TCP 接收 2. 侦听器过滤器链和网络过滤器链匹配 3.TL ...

  10. 浅析MyBatis(三):聊一聊MyBatis的实用插件与自定义插件

    在前面的文章中,笔者详细介绍了 MyBatis 框架的底层框架与运行流程,并且在理解运行流程的基础上手写了一个自己的 MyBatis 框架.看完前两篇文章后,相信读者对 MyBatis 的偏底层原理和 ...