荣誉资质

【分享】虚拟机运行出现腾讯全家桶 TP protect提示游戏运行环境异常的解决办法

类别:荣誉资质 日期:2023-06-26 03:39:47
我要分享

腾讯全家桶的tp protect在运行游戏就会检测虚拟机,然后什么 TPProtect 还是什么名字的腾讯安全检测系统就会终止游戏。


WMware解决办法?


然而这个问题很好解决,解决方法就是首先关闭WMware虚拟机,然后找到虚拟机的文件的存储位置,右键打开菜单,mac用户点击 “显示包内容”,

然后在打开的文件夹中,找到扩展名是.xml 的文件,


例如 Windows 7 x64.xml,用记事本打开,在最底下加入如下两行代码即可:

isolation.tools.setVersion.disable?=?"TRUE"

isolation.tools.getVersion.disable?=?"TRUE"


在正常情况下,TRUE 两侧的引号可加可不加。保存以后就可以启动虚拟机了。如果出现报错,请完全退出 WMware 并尝试重新启动。几次过后应该可以解决



宿主如果是linux或者Windows

在虚拟机中进行游戏需要修改 VMware 的系统参数,在此之前需要安装 VMware Tools 。

然后修改虚拟机参数配置文件 Windows 7 x64.vmx (请在状态栏中查看虚拟机文件的存放位置)

进入虚拟机文件夹中,找到 xxx.vmx,这个文件为虚拟机配置文件。

在文件最后添加两行

~注意:在简体中文系统中,此文件的编码方式为 GBK 并不是 UTF-8 。


题外话1

分享一个vmware的激活码

VMware 2018 v14.x 永久许可证激活码
FF31K-AHZD1-H8ETZ-8WWEZ-WUUVA


题外话2:

linux的kvm虚拟机才能单独分配物理PCIE通道给虚拟机,

需要用到GPU的游戏在VMware虚拟机上全都得卡

能运行腾讯全家桶不等于全部游戏都能流畅,

像lol这种最低画质三四十帧撑死了

请你分清楚这个区别



OD与CE的用户无法进行如以下操作:
无法附加进程,
无法打开进程,
游戏进程被隐藏无法在工具中查看到,
内存无法读取代码
内存修改后游戏掉线? ?
无法双机进行调试
出现SX非法模块提示 `
其实以上说的这么多限制 都是因为TP保护造成的.其实这些东西研究了很久后,发现其实就是黑色老大常说的APIHOOK这方面.
例如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函数的处理的代码:
复制代码
//////////////////////////////////////////////////////////////////////
//名称:Nakd_KiAttachPROCess
//功能:My_RecoveryHook_KiAttachPROCess的中继函数
//参数:? ?
//返回:? ?
//////////////////////////////////////////////////////////////////////
static NAKED VOIDNakd_KiAttachPROCess()
{
__asm
{
? ? mov? ?edi,edi
? ? push? ? ebp
? ? mov? ?ebp,esp
? ? push? ? ebx
? ? push? ? esi
? ? mov? ? eax,KiAttachPROCessAddress//注意这个是全局变量 BYTE*
? ? add? ? eax,7
? ? jmp? ? eax
}
}
//////////////////////////////////////////////////////////////////////
//名称:RecoveryHook_KiAttachPROCess
//功能:解除游戏保护对_KiAttachPROCess函数的HOOK(DNF)
//参数:? ?
//返回:状态
//////////////////////////////////////////////////////////////////////
NTSTATUS My_RecoveryHook_KiAttachPROCess()
{
BYTE? ? *KeAttachPROCessAddress=NULL;//KeAttachPROCess函数地址
BYTE? ? *p;
BYTE? ? MovEaxAddress[5]={0xB8,0,0,0,0};//
BYTE? ? JmpEax[2]? ?={0xff,0xe0};
KIRQL? ? Irql;
//特征码
BYTESignature1=0x56,//p-1
? ?Signature2=0x57,//p-2
? ?Signature3=0x5F,//p-3
? ?Signature4=0x5E,//p+5
? ?Signature5=0xE8;//p第一个字节
//获得KeAttachPROCess地址,然后通过特征码找到
//KiAttachPROCess的地址
KeAttachPROCessAddress=(BYTE*)MyGetFunAddress(L"KeAttachPROCess");
if (KeAttachPROCessAddress==NULL)
{
? ? KdPrint(("KeAttachPROCess地址获取失败 "));
? ? returnFAILED_TO_OBTAIN_FUNCTION_ADDRESSES;
}
//将p指向KeAttachPROCess函数开始处
p=KeAttachPROCessAddress;
while (1)
{
? ? if ((*(p-1)==Signature1) &&
? ?(*(p-2)==Signature2) &&
? ?(*(p+5)==Signature3) &&
? ?(*(p+6)==Signature4) &&
? ?(*p? ?==Signature5))
? ? {
? ?//定位成功后取地址
? ?KiAttachPROCessAddress=*(PULONG)(p+1)+(ULONG)(p+5);
? ?break;
? ? }
? ? //推动指针
? ? p++;
}
//计算中继函数地址
*(ULONG *)(MovEaxAddress+1)=(ULONG)Nakd_KiAttachPROCess;
WPOFF();//清除CR0
//提升IRQL中断级
Irql=KeRaiseIrqlToDpcLevel();
//写入
RtlCopyMemory(KiAttachPROCessAddress,MovEaxAddress,5);
RtlCopyMemory(KiAttachPROCessAddress+5,JmpEax,2);
//恢复Irql
KeLowerIrql(Irql);
WPON();? ? //恢复CR0
returnSTATUS_SUCCESS;
}


平台注册入口