搜索
查看
编辑修改
首页
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
在Mac上搭建Gradle环境_mac安装gradle
2
国内免费好用 Chat GPT推荐
3
fastDFS安装时,./make.sh编译时报错---perl:未找到命令_fastdfs编译make报错
4
使用Vim写LaTeX代码(Vim+Vimtex+Skim)
5
零基础学会编写仿NFT交易市场的Dapp项目(二)
6
html的透明度属性,HTML5 - Canvas的使用样例6(设置透明度)
7
通过Docker快速部署NextCloud_nextcloud 白名单
8
python异常处理_python异常值处理代码
9
【MySQL】GROUP_CONCAT 运用易错点之建立方程
10
OpenHarmony智慧设备开发-芯片模组简析RK3568_openharmony rk3568
当前位置:
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博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/247320
推荐阅读
article
手把手教你搭建
鸿蒙
hi3518
开发
和
运行
环境_
hi3518
hitool
...
前言学习C语言,C++语言,数据结构
和
算法,操作系统,网络,驱动,设计模式等知识用
鸿蒙
来强化就太对了。本文教你一步一步搭...
赞
踩
article
android10.0(Q) 后台启动
Activity
白名单_
background
activity
...
问题log2020-06-08 10:00:05.600 1110-1654/system_process W/Acti...
赞
踩
article
linux
usb
ehci
,
linux
USB
HOST之
EHCI
和
OHCI
...
1. 主机控制器(Host Controller)• UHCI: Universal Host Controller I...
赞
踩
article
面试
经典-30-两数
相加
...
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。...
赞
踩
article
android
studio
通过
wifi
连接
手机
调试_
as
wifi
连
手机
...
as
通过
wifi
连接
手机
调试_
as
wifi
连
手机
as
wifi
连
手机
...
赞
踩
article
人工智能
为
我们
编织了
一个
“幻象
牢笼
”...
翻译并改编自福布斯文章《Artificial Intelligence Is Creating A Fake World...
赞
踩
article
Harm
on
yOS
TextInput
基础属性讲解_鸿蒙
property
'
inputstyle
'...
我们会发现 输入框中的文本一直在变 但name是没有改变的 你用text只是给他个默认值 但输入框内容因为输入改变时 他...
赞
踩
article
Android
Studio
中安装和配置
Gradle
以及移动端开发_andriod
studio3
...
a. 在
Android
Studio
中,打开“File”(文件)->“Settings”(设置)->“Build, Ex...
赞
踩
article
大数据应用之 ---
clickhouse
安装部署_cannot
obtain
modi
fi
cati...
大数据应用之 ---
clickhouse
安装部署_cannot
obtain
modi
fi
cation
time
fo...
赞
踩
article
setwindowhook
内部原理_
setwindowshook
原理...
setwindowhook
-> int
setwindowhook
ex -> NtUserSetWindowHookEx...
赞
踩
article
CVE
-
2022
-21882
Win32k
内核
提权
漏洞
深入分析_
hmvalidatehandle
...
CVE
-
2022
-21882是对
CVE
-2021-1732
漏洞
的绕过,属于win32k驱动程序中的一个类型混淆
漏洞
。攻击...
赞
踩
article
记录...
二维数组的指针形式 Array[2][3]: 1> *(*(Array + i) + j) 2> *(Array + i...
赞
踩
article
adb
命令中“
adb
.exe:
more
than
one
device
/
emulator
”错误解决...
(2)taskkill /f /im
adb
.exe 杀掉ADB的进程。如果实际上只有一个设备或模拟器,并且查到有off...
赞
踩
article
Vue
2
源码
解析(
2
)——
响应
式
详解_
vue
2
响应
式
源码
...
vue
2
的
响应
式
源码
_
vue
2
响应
式
源码
vue
2
响应
式
源码
一:前言 ...
赞
踩
article
在
shell
脚本
中
创建
动态
变量
,并
引用
存储在
动态
变量
中
的值_
shell
动态
变量
...
在
shell
脚本
中
如何
创建
动态
变量
,以及如何
引用
动态
变量
中
保存的
变量
值。_
shell
动态
变量
shell
动态
变量
...
赞
踩
article
【
Leetcode
】
74
. 搜索
二维
矩阵
...
向量的开始迭代器和结束迭代器,定义了一个范围,这个范围包含了。假设范围内的元素是已排序的。是 C++ 标准库中的一个算法...
赞
踩
article
kubernetes
【组件】
ingress
controller
如何通过
域名
访问
您的应用_ing...
文章目录1. 简介2. 安装3. 测试1. 简介Ingress 是 Kubernetes 的一种 API 对象,将集群内...
赞
踩
article
Centos7
固定
ip
地址_
ifcfg
-
eno1
...
Centos7
固定
ip
地址
Centos7
系统视图界面配置命名模式固定
ip
Centos7
系统
Centos7
固定
ip
有两种方...
赞
踩
article
如何一键本地
部署
PolarDB
for
PostgreSQL
_
polardb
postgresql
版...
本步骤指导您如何使用Docker在开发镜像中源码编译
部署
PolarDB
for
PostgreSQL
单节点实例、双节点(...
赞
踩
article
Android
Studio 配置并使用
Protocol
Buffer
生成
java
文件_在
as
工具下...
一、环境配置(一)Project的build.gradle添加Protobuf插件版本信息和maven仓库mavenCe...
赞
踩
相关标签
harmonyos
华为
海思
后台启动
Activity
android
linux usb ehci
面试
算法
android studio
wi-fi
鸿蒙
ide
移动端开发
大数据
java
xml
安全
web安全
网络
adb