日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

什么是游戏NP?如何在NP下读写游戏内存及如何进入NP进程

發布時間:2023/12/31 综合教程 35 生活家
生活随笔 收集整理的這篇文章主要介紹了 什么是游戏NP?如何在NP下读写游戏内存及如何进入NP进程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是NP
NP 即 nProtect GameGuard
(簡稱GameGuardGG,其驅動程序為GameMon.des)是由韓國INCA互聯網(INCA Internet)開發的游戲反作弊的軟件。隨著網絡游戲的興起,愈來愈多人利用外掛從中作弊,這促使GameGuard等反作弊軟件的誕生,GameGuard開發完成后,很快就被日本及韓國網絡游戲商引入。隨后開設“網絡游戲用戶通報中心”,能傳送關于不正當或作弊工具之信息。

NP的主要功能

  nProtect GameGuard含有即時變換偵測規則、可置于游戲執行檔前使用,利用動態加密的方式達到防止外掛的目的,有效防堵作弊程式(如加速器),以及偵測玩家電腦有沒有使用插件等。nProtect GameGuard具有多種功能,例如:
  透過持續掃描任何事先有登入過的程式碼、系統內部時間器運作等方式,偵測玩家電腦有沒有使用插件;
  檢測及阻擋惡意程式碼;
  自動掃描工具;
  即時變換偵測;
  可停止鼠標及鍵盤的驅動程序及側錄程式;
  可阻擋玩家及雙重核心中央處理器(CPU)之不正當的操作;
  占用甚少CPU,不會拖慢電腦及游戲;及
  監視玩家之操作環境,以及一舉一動。

突破NP防線

要去掉NP的注入是很容易的事,但是去掉npggNT.des并不是說我們想對游戲怎么樣都可以了,NP還掛鉤了很多內核函數,所以很多關鍵系

統函數就算我們在用戶層能用也對游戲沒有什么效果。
如果我們想在不破解NP前提下讀寫游戲內存該怎么辦呢,我想辦法至少有兩個
一、用驅動
在驅動下讀寫游戲內存是沒問題,但是由于我不懂驅動,所以也沒什么可說。
二、進入游戲進程
在用戶層,如果我們想在不破解NP的前提下讀寫游戲內存的話,大概就只能進入游戲進程了。因為很簡單,我們的程序無法對游戲使用OpenProcess、ReadProcessMemoery及

WriteProcessMemory這些函數(就算是去掉了NP監視模塊npggNT.des),而NP又不可能限制游戲自身使用這些函數,所以只要我們能夠進入游戲進程就能夠讀寫游戲的內存。怎么

進入游戲呢?下面介紹兩種方法:

1,最簡單的辦法―全局消息鉤子(WH_GETMESSAGE)
看似很復雜的東西原來很簡單就可以實現,大道至易啊。使用消息鉤子進入游戲進程無疑是最簡單的一種方法,具體編程大概象這樣:一個消息鉤子的DLL,里面包含一個消

息回調函數(什么都不用做),讀寫內存過程,跟主程序通訊過程或操作界面過程,當然在DLL_PROCESS_ATTACH要判斷當前的進程是不是游戲的,是的話就做相應的處理;一個安

裝全局消息鉤子的主程序。大概這樣就可以了。使用全局消息鉤子的好處是簡單易用,但是不足之處是要在游戲完全啟動(NP當然也啟動啦)后才能進入,如果想在NP啟動前做一

些什么事的話是不可能的。
另外也簡單介紹一下防全局鉤子的辦法,Windows是通過調用LoadLibraryExW來向目標進程注入鉤子DLL的,所以只要我們在鉤子安裝前掛鉤了這個函數,全局鉤子就干擾不了

了。

2,更麻煩的辦法―遠程注入
知道遠程注入方法和原理的人可能會說“有沒有搞錯,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//////////////////////////////////////////////////////////////////
BOOLIsGameGuard();
//////////////////////////////////
LRESULTCALLBACKGetMsgProc(intnCode,WPARAMwParam,LPARAMlParam)
{
return(CallNextHookEx(m_hHook,nCode,wParam,lParam));//什么都不需要做
}
///////////////////////////////////////
BOOLWINAPIDllMain(HINSTANCEhInst,DWORDdwReason,LPVOIDlp)
{
switch(dwReason){
caseDLL_PROCESS_ATTACH:
if(IsGameGuard())//判斷當前進程是不是GameGuard.des
SendMessage(m_hwndRecv,WM_HOOK_IN_GAMEGUARD,NULL,NULL);//向主窗體發送消息,SendMessage是等待接受窗體處理完畢才返回的,
break;//所以進程就暫停在這里,我們有足夠的時間去做事情
caseDLL_PROCESS_DETACH:
break;
}
returnTRUE;
}
///////////////////////////////////
GAMEHOOKAPIBOOLSetGameHook(BOOLfInstall,HWNDhwnd)
{

}
////////////////////////////////////////
BOOLIsGameGuard()
{
TCHARszFileName[256];
GetModuleFileName(NULL,szFileName,256);
if(strstr(szFileName,"GameGuard.des")!=NULL){//這樣的判斷嚴格來說是有問題的,但實際操作也夠用了。當然也可以進行更嚴格的判斷,不過麻煩點
returnTRUE;
}
returnFALSE;
}
//////////////////////////////////////////////////////Main////////////////////////////////////////////////////////////////////////
voidOnGameGuard(WPARAMwParam,LPARAMlParam)//處理消息鉤子DLL發來的消息就是上面SendMessage的那個
{
DWORDdwProcessId=FindGameProcess(m_strGameName);//開始查找游戲進程
if(dwProcessId==0){
MessageBox(m_hWnd,"沒有找到游戲進程","查找游戲進程",MB_OK);
return;
}

if(!InjectDll(dwProcessId)){//查找到就開始注入
MessageBox(m_hWnd,"向游戲進程注入失敗",注入",MB_OK);
return;
}
}
/////////////////////////////////////////////////
DWORDFindGameProcess(LPCSTRszGameName)//負責查找游戲進程
{
HANDLEhSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hSnapshot==INVALID_HANDLE_VALUE)
return0;
PROCESSENTRY32pe={sizeof(pe)};
DWORDdwProcessID=0;
for(BOOLfOK=Process32First(hSnapshot,&pe);fOK;fOK=Process32Next(hSnapshot,&pe)){
if(lstrcmpi(szGameName,pe.szExeFile)==0){
dwProcessID=pe.th32ProcessID;
break;
}
}
CloseHandle(hSnapshot);
returndwProcessID;
}
/////////////////////////////////////////////////
BOOLInjectDll(DWORDdwProcessId)//負責注入,參考自JeffreyRichter《windows核心編程》
{
CStringstrText;
char*szLibFileRemote=NULL;

HANDLEhProcess=OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,dwProcessId);
if(hProcess==NULL){
//SetRecord("Opengameprocessfailed!");
returnFALSE;
}
intcch=lstrlen(szDll)+1;
intcb=cch*sizeof(char);
szLibFileRemote=(char*)VirtualAllocEx(hProcess,NULL,cb,MEM_COMMIT,PAGE_READWRITE);
if(szLibFileRemote==NULL){
//SetRecord("Allocmemorytogameprocessfailed!");
CloseHandle(hProcess);
returnFALSE;
}

if(!WriteProcessMemory(hProcess,(LPVOID)szLibFileRemote,(LPVOID)szDll,cb,NULL)){
//SetRecord("Writegameprocessmemoryfailed!");
CloseHandle(hProcess);
returnFALSE;
}

PTHREAD_START_ROUTINEpfnThreadRtn=(PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("kernel32")),"LoadLibraryA");
if(pfnThreadRtn==NULL){
//SetRecord("Allocmemorytogameprocessfailed!");
CloseHandle(hProcess);
returnFALSE;
}

HANDLEhThread=CreateRemoteThread(hProcess,NULL,0,pfnThreadRtn,szLibFileRemote,0,NULL);
if(!hThread)
{
//SetRecord("Createremotethreadfailed!");
CloseHandle(hProcess);
returnFALSE;
}
if(hThread!=NULL)
CloseHandle(hThread);
CloseHandle(hProcess);
returnTRUE;

}
///////////////////////////操作游戲內存的DLL就不貼了,大家根據不同的需要各顯神通吧///////////////////////////////////////////////////

這種方法比一個全局消息鉤子麻煩一點,但是優點是顯然易見的:可以在NP啟動前做事情,比如HOOK游戲函數或做游戲內存補丁。下面進入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:\驚天動地CabalOnline\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頭文件,發現#defineCREATE_SUSPENDED0x00000004,所以NP進程創建時就是暫停的

在我們替換的CreateProcessA中,先讓游戲創建NP進程(由于游戲創建時NP進程本來就是暫停的,所以不用擔心NP的問題),讓游戲進程暫停(SendMessage就可以了),然后再

向NP進程注入DLL,最后讓游戲進程繼續。這樣我們的DLL就進入NP進程了。實現起來大概是這樣子

BOOL
WINAPI
MyCreateProcessA(//替換原來的CreateProcessA
LPCSTRlpApplicationName,
LPSTRlpCommandLine,
LPSECURITY_ATTRIBUTESlpProcessAttributes,
LPSECURITY_ATTRIBUTESlpThreadAttributes,
BOOLbInheritHandles,
DWORDdwCreationFlags,
LPVOIDlpEnvironment,
LPCSTRlpCurrentDirectory,
LPSTARTUPINFOAlpStartupInfo,
LPPROCESS_INFORMATIONlpProcessInformation
)
{
UnhookCreateProcessA();
BOOLfRet=CreateProcessA(lpApplicationName,lpCommandLine,lpProcessAttributes,lpThreadAttributes,bInheritHandles,dwCreationFlags,
lpEnvironment,lpCurrentDirectory,lpStartupInfo,lpProcessInformation);
RehookCreateProcessA();
SendMessage(hwndRecv,//負責注入的窗體句柄
WM_HOOK_NP_CREATE,//自定義消息
(WPARAM)lpProcessInformation->dwProcessId,//把NP進程ID傳給負責注入的主窗體
NULL);
returnfRet;
}四、注意問題
由于我們是在不破解NP的前提下對游戲內存進行操作,所以一不小心的話,很容易就死游戲。NP保護了游戲進程的代碼段,所以在NP啟動后就不要再對其代碼段進行修改,要

補丁或HOOK系統函數這些都要在NP啟動前完成。當然讀寫游戲的數據段是沒問題的,因為游戲本身也不斷進行這樣的操作。

總結

以上是生活随笔為你收集整理的什么是游戏NP?如何在NP下读写游戏内存及如何进入NP进程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。