搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
从前慢现在也慢
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
智能视频分析平台:食堂安全的守护者
2
k8s部署之kubesphere安装与生产配置使用教程(问题整合,持续更新)
3
CentOS网络配置_ifcfg-eno1
4
ChatGLM2-6B从本地加载模型报错-解决办法_does not appear to have a file named config.json
5
一文彻底玩转Android通知栏消息通知_android 通知栏消息
6
nginx目录搜索_nginx 搜索拖到这里
7
一分钟修改好Linux中root密码_putty修改root@中root名称
8
HCIA-RS知识梳理(下)_vlan tci tpid
9
Vuex的理解和应用
10
Docker本地部署Rss订阅工具并实现公网远程访问_docker-hub-rss
当前位置:
article
> 正文
过NP方法一_过np检测
作者:从前慢现在也慢 | 2024-03-16 05:18:14
赞
踩
过np检测
现在使用的NP系统已经和刚开始时使用的进步了很多,早期的NP可以直接用汇编把关键跳修改从而跳过NP监视,而现今使用的NP还挂钩了很多内核函数,所以很多关键系统函数就算我们在使用者层能跳过,后期也将使得游戏无法运行,所以直接跳过肯定不行,所以就开始考虑,如果我们不破解NP前提下读写游戏记忆体该怎么办?我知道方法主要有两种,一种是基于底层的调用驱动,模拟为系统驱动去调用内存,可以躲过NP的监视,因为这个比NP更为基础,不过实现起来编程难度较大,另外一种是注入游戏进程用HOOK Call 提升挂的效率和及时性,有相似的思路),在游戏本体中去读写内存,NP目前还是没有反应可以顺利躲过,还有就是注入NP程序本身,对NP进行修改(这个比较狠,也是我从高人处抄来的):(以国内的J天D地,为例)
在使用层,在不破解NP的前提下读写游戏记忆体,大概就只能进入游戏进程了。因为我们的程序无法对游戏使用OpenProcess、ReadProcessMemoery及
WriteProcessMemory这些函数(就算是去掉了NP监视模块npggNT.des),而NP又不可能限制游戏自身使用这些函数,所以只要我们能够进入游戏进程就能够读写游戏的记忆体。OpenProcess、WriteProcessMemory这些必备函数都不能用,怎么注入?”,当然啦,NP启动后是不能干这些事情,所以我们要在NP启动前完成。这样一来,时机就很重要了。游戏启动的流程大概是这样:游戏Main->GameGuard.des->GameMon.des(NP进程)。我们的做法就是按照流程进行:游戏Main->GameGuard.des(暂停)->注入DLL->GameGuard.des(继续)->GameMon.des。关键点就是让GameGuard.des暂停,使用全局消息钩子可以轻松实现。要实现大概需要做下面的工作:一个全局消息钩子DLL,里面只要一个消息回调函数(什么都不用做),DLL_PROCESS_ATTACH下进行当前进程判断找GameGuard.des,找到的话就向主程序SendMessage;主程序,负责安装钩子,接收钩子DLL发来的消息,接收到消息就开始搜寻游戏进程,向游戏进程注入记忆体操作DLL,返回给SendMessage让GameGuard.des继续,卸载钩子(免得它继续钩来钩去);记忆体操作DLL,负责对游戏内存进行操作。
具体编写如下(有省略):
GameHook.cpp//
BOOL IsGameGuard();
//
LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam)
{
return (CallNextHookEx(m_hHook,nCode,wParam,lParam));//什么都不需要做
}
///
BOOL WINAPI DllMain(HINSTANCE hInst,DWORD dwReason,LPVOID lp)
{
switch(dwReason){
case DLL_PROCESS_ATTACH:
if(IsGameGuard())//判断当前进程是不是GameGuard.des
SendMessage(m_hwndRecv,WM_HOOK_IN_GAMEGUARD,NULL,NULL);//向主窗体送出消息,SendMessage是等待接受窗体处理完毕才返回的,
break; //所以进程就暂停在这里,我们有足够的时间去做事情
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
///
GAMEHOOKAPI BOOL SetGameHook(BOOL fInstall,HWND hwnd)
{
...
}
BOOL IsGameGuard()
{
TCHAR szFileName[256];
GetModuleFileName(NULL,szFileName,256);
if(strstr(szFileName,"GameGuard.des")!=NULL){//这样的判断严格来说是有问题的,但实际操作也够用了。当然也可以进行更严格的判断,不过麻烦点
return TRUE;
}
return FALSE;
}
//Main
void OnGameGuard(WPARAM wParam,LPARAM lParam)//处理消息钩子DLL发来的消息就是上面SendMessage的那个
{
DWORD dwProcessId=FindGameProcess(m_strGameName);//开始搜寻游戏进程
if(dwProcessId==0){
MessageBox(m_hWnd,"没有找到游戏进程","搜寻游戏进程",MB_OK);
return;
}
if(!InjectDll(dwProcessId)){//搜寻到就开始注入
MessageBox(m_hWnd,"向游戏进程注入失败",注入",MB_OK);
return;
}
}
/
DWORD FindGameProcess(LPCSTR szGameName)//负责搜寻游戏进程
{
HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hSnapshot==INVALID_HANDLE_VALUE)
return 0;
PROCESSENTRY32 pe={sizeof(pe)};
DWORD dwProcessID=0;
for(BOOL fOK=Process32First(hSnapshot,&pe);fOK;fOK=Process32Next(hSnapshot,&pe)){
if(lstrcmpi(szGameName,pe.szExeFile)==0){
dwProcessID=pe.th32ProcessID;
break;
}
}
CloseHandle(hSnapshot);
return dwProcessID;
}
/
BOOL InjectDll(DWORD dwProcessId)//负责注入,参考自Jeffrey Richter《windows核心程序化》
{
CString strText;
char* szLibFileRemote=NULL;
HANDLE hProcess=OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,dwProcessId);
if(hProcess==NULL){
// SetRecord("Open game process failed!");
return FALSE;
}
int cch=lstrlen(szDll)+1;
int cb=cch*sizeof(char);
szLibFileRemote=(char*)VirtualAllocEx(hProcess,NULL,cb,MEM_COMMIT,PAGE_READWRITE);
if(szLibFileRemote==NULL){
// SetRecord("Alloc memory to game process failed!");
CloseHandle(hProcess);
return FALSE;
}
if(!WriteProcessMemory(hProcess,(LPVOID)szLibFileRemote,(LPVOID)szDll,cb,NULL)){
// SetRecord("Write game process memory failed!");
CloseHandle(hProcess);
return FALSE;
}
PTHREAD_START_ROUTINE pfnThreadRtn=(PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("kernel32")),"LoadLibraryA");
if(pfnThreadRtn==NULL){
// SetRecord("Alloc memory to game process failed!");
CloseHandle(hProcess);
return FALSE;
}
HANDLE hThread=CreateRemoteThread(hProcess,NULL,0,pfnThreadRtn, szLibFileRemote,0,NULL);
if(!hThread)
{
// SetRecord("Create remote thread failed!");
CloseHandle(hProcess);
return FALSE;
}
if(hThread!=NULL)
CloseHandle(hThread);
CloseHandle(hProcess);
return TRUE;
}
///操作游戏内存的DLL就不贴了,大家根据不同的需要各显神通吧///
进入到游戏内部,那就可以随性而调用readm,writem,这些函数了,因为NP不能对游戏本身也限制。
注入NP本身,如果我们对NP有足够的了解,想对它内存补丁一下,来做一些事情,哪又怎样才可以进入NP的进程呢?嗯,我们知道游戏启动流程是这样的游戏Main->GameGuard.des->GameMon.des(NP进程),其中GameGuard.des跟GameMon.des进程是游戏Main通过调用函数CreateProcessA来创建的,上面我们说到有办法在NP进程(GameMon.des)启动前将我们的DLL注入到游戏进程里,因此我们可以在GameMon.des启动前挂钩(HOOK)CreateProcessA,游戏创建NP进程时让NP暂停,但是游戏本来创建NP进程时就是让它先暂停的,这步我们可以省了。下面是游戏启动NP(版本900)时传递的参数
ApplicationName:C:\惊天动地Cabal Online\GameGuard\GameMon.des
CommandLine:\x01\x58\x6d\xae\x99\x55\x57\x5d\x49\xbe\xe4\xe1\x9b\x14\xe6\x88\x57\x68\x6d\x11\xb9\x36\x73\x38\x71\x1e\x88\x46\xa9\x97\xd4\x3a\x20\x90
\x62\xae\x15\xcd\x4b\xcd\x72\x82\xbd\x75\x0a\x54\xf0\xcc\x01\xad
CreationFlags:4
Directory:
其中的CommandLine,它要传递的参数是:一个被保护进程的pid,两个Event的Handle,以及当前timeGetTime的毫秒数 (感谢JTR)。
CreationFlags:4 查查winbase.h头文件,发现#define CREATE_SUSPENDED 0x00000004,所以NP进程创建时就是暂停的
在我们替换的CreateProcessA中,先让游戏创建NP进程(由于游戏创建时NP进程本来就是暂停的,所以不用担心NP的问题),让游戏进程暂停(SendMessage就可以了),然后再向NP进程注入DLL,最后让游戏进程继续。这样我们的DLL就进入NP进程了。实现起来大概是这样子
BOOL WINAPI
MyCreateProcessA(//替换原来的CreateProcessA
LPCSTR lpApplicationName,
LPSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCSTR lpCurrentDirectory,
LPSTARTUPINFOA lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
)
{
UnhookCreateProcessA();
BOOL fRet=CreateProcessA(lpApplicationName,lpCommandLine,lpProcessAttributes,lpThreadAttributes,bInheritHandles,dwCreationFlags,
lpEnvironment,lpCurrentDirectory,lpStartupInfo,lpProcessInformation);
RehookCreateProcessA();
SendMessage(hwndRecv,//负责注入的窗体句柄
WM_HOOK_NP_CREATE,//自定义消息
(WPARAM)lpProcessInformation->dwProcessId,//把NP进程ID传给负责注入的主窗体
NULL);
return fRet;
}
由于我们是在不破解NP的前提下对游戏内存进行操作,所以一不小心的话,很容易就【游戏当机】。NP保护了游戏进程的代码段,所以在NP启动后就不要再对其代码段进行修改,要补丁或HOOK系统函数这些都要在NP启动前完成。当然读写游戏的数据段是没问题的,因为游戏本身也不断进行这样的操作。
声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
【wpsshop博客】
推荐阅读
article
CKA备考实验 |
readiness
probe
_
readiness
probe
配置文件
...
这里有3个pod,它们的标签是一样的,都是run=app,为具有这个标签的pod创建一个名字为readsvc的服务。关于...
赞
踩
article
SpringMVC
框架——初学
知识点
篇2
_
getthymeleafview
...
报文信息转换器HttpMessageConverter报文可以简单的理解为我们前端页面传入后端代码的一些键值对,例如在登...
赞
踩
article
Android
Studio
使用
protobuf
协议
开发_
androidstudio
用什么
协议
...
这篇文章主要是介绍如何在
Android
Studio
中使用
protobuf
协议
。先简单的介绍下
protobuf
:什么是pr...
赞
踩
article
python
学习之
urllib
下载
文件...
urllib
库 #urlretrieve 导入 import
urllib
.request urlretrieve...
赞
踩
article
hive
执行
流程(
3
)-
Driver
类
分析
1
Driver
类
整体流程...
Driver
类
是对1org.apache.hadoop.
hive
.ql.processors.CommandProces...
赞
踩
article
微信
小
程序
直播
接入_c#
微信
直播
列表...
申请开通
小
程序
直播
1、申请
小
程序
直播
有以下几个硬性指标:1. 满足
小
程序
18个开放类目2. 主体下
小
程序
近半年没有严重违...
赞
踩
article
环境变量
的
作用
...
1. PATH
环境变量
。
作用
是指定命令搜索路径,在shell下面执行命令时,它会到PATH变量所指定的路径中查找看是否能...
赞
踩
article
Linux
系统
网络
参数
配置
和说明【
linux
网络
配置
精品】_
eno1
网卡
配置
...
Linux
系统
网络
参数
配置
和说明本文是一篇总结和说明如何
配置
LINUX
系统
的vlan及
配置
ip,以便于环境搭建及组网,花...
赞
踩
article
HTML5
可视化
音乐
播放器
(附
源码
)_
html5
音乐
播放器
源码
...
最近某
音乐
播放器
越来越迷,以前下载的本地
音乐
没有版权也不能播放了…特在网上找了个
音乐
播放插件,但功能实在简陋,特在其基础...
赞
踩
article
四信
5G
RedCap
产品发布,加速
行业
迈向
5G
“轻时代”_
redcap
面向承载
中
速率
的
业务
而设计...
2023年,是
RedCap
商用发展过程
中
极具里程碑意义
的
一年。
四信
作为深耕
行业
多年
的
物联网技术专家,将
RedCap
技术结...
赞
踩
article
【
Leetcode
】
74
. 搜索
二维
矩阵
...
向量的开始迭代器和结束迭代器,定义了一个范围,这个范围包含了。假设范围内的元素是已排序的。是 C++ 标准库中的一个算法...
赞
踩
article
大
语言
模型
推理
提速,
TensorRT
-
LLM
高性能
推理
实践_
llm
tensorrt
...
大型
语言
模型
(Large language models,
LLM
)是基于大量数据进行预训练的超大型深度学习
模型
,本文主要...
赞
踩
article
k8s
之
存储
篇---
存储
类
StorageClass
_
storageclassname
...
StorageClass
为管理员提供了描述
存储
"类"的方法。不同的类型可能会映射到不同的服务质量等级或备份策略,或是由...
赞
踩
article
vue超级深度监听单个元素使用函数式方法_
watcher
only
accepts
simple
d...
Failed watching path: “XXXXX” Watcher
only
accepts
simple
do...
赞
踩
article
重编内核导致
ubuntu
有线连接不出现的问题_
intel
i225v
网卡
驱动
...
i225v
ubuntu
有线网路图标 有线
网卡
驱动
_
intel
i225v
网卡
驱动
intel
i225v
网卡
驱动
...
赞
踩
article
MGV2000
_
S905L
系列
_
线刷
_
通刷
固件
_
s905l3b
9.0 cw...
MGV2000
_
S905L
系列
_
线刷
_
通刷
固件
_
s905l3b
9.0 cw
s905l3b
9.0 cw ...
赞
踩
article
大型
语言
模型,用最少的数学和行话进行解释_
large
language
models
, explai...
对Large
language
models
,
explained
with
a
minimum
of math and...
赞
踩
article
VMware
设置
桥接
上网
_
vmware
不能
桥接
...
环境:主机Win7、
VMware
Workstation 6.5.3、虚拟机Ubuntu10.04。 一、
桥接
的基本原理...
赞
踩
article
html
制作
在线视频
音乐
播放器
,用
html
5制作
音乐
播放器
,这3款就足够了!...
用HTML5结合Jquery做一个简易版的
音乐
播放器
代码展示:三生草var sum = 1;function ssss(...
赞
踩
article
微信
小
程序
商品
详情
页
(
页面
的实现)_
微信
小
程序
详情
页面
...
首先先把
页面
搭建起来,并进行渲染顶部导航栏已经做过现在就不发了,直接复制就好。通过搜索
页面
传入的id,来进行操作(没有接...
赞
踩
相关标签
kubernetes
http
前端
java
容器
springmvc
python
urllib
requests
大数据
数据库
小程序
开发工具
Linux配置
Linux网络配置
Linux系统
Linux配置vlan和网络
Linux网络搭建
javascript
html5
jquery
1024程序员节
5G
leetcode