如何在NP下讀寫遊戲記憶體及如何進入NP程序

2021-04-25 17:41:00 字數 4753 閱讀 7389

標 題:

如何在np下讀寫遊戲記憶體及如何進入np程序

作 者:

墮落天才

時 間: 2007-01-04,13:28

鏈 接: http://bbs.pediy.com/showthread.php?t=37417

統函式就算我們在使用者層能用也對遊戲沒有什麼效果。

如果我們想在不破解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//

bool isgameguard(); //

lresult callback getmsgproc(int ncode,wparam wparam,lparam lparam)

///

bool winapi dllmain(hinstance hinst,dword dwreason,lpvoid lp)

return true; }

///gamehookapi bool setgamehook(bool finstall,hwnd hwnd)

bool isgameguard()

return false; }

//main

void ongameguard(wparam wparam,lparam lparam)//處理訊息鉤子dll發來的訊息就是上面sendmessage的那個   

if(!injectdll(dwprocessid)) }

/dword findgameprocess(lpcstr szgamename)//負責查詢遊戲程序 ;

dword dwprocessid=0;

for(bool fok=process32first(hsnapshot,&pe);fok;fok=process32next(hsnapshot,&pe)) }

closehandle(hsnapshot);

return dwprocessid; }

/bool injectdll(dword dwprocessid)//負責注入,參考自jeffrey richter《windows核心程式設計》

int cch=lstrlen(szdll)+1;

int cb=cch*sizeof(char);

szlibfileremote=(char*)virtualallocex(hprocess,null,cb,mem_commit,page_readwrite);

if(szlibfileremote==null)

if(!writeprocessmemory(hprocess,(lpvoid)szlibfileremote,(lpvoid)szdll,cb,null))

pthread_start_routine pfnthreadrtn=(pthread_start_routine)

getprocaddress(getmodulehandle(text("kernel32")),"loadlibrarya");

if(pfnthreadrtn==null)

handle hthread=createremotethread(hprocess,null,0,pfnthreadrtn, szlibfileremote,0,null);

if(!hthread)

if(hthread!=null)

closehandle(hthread);  

closehandle(hprocess);

return true;

}     

///操作遊戲記憶體的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)時傳遞的引數

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

lpstr lpcommandline,

lpsecurity_attributes lpprocessattributes,

lpsecurity_attributes lpthreadattributes,

bool binherithandles,

dword dwcreationflags,

lpvoid lpenvironment,

lpcstr lpcurrentdirectory,

lpstartupinfoa lpstartupinfo,

lpprocess_information lpprocessinformation )

四、注意問題

由於我們是在不破解np的前提下對遊戲記憶體進行操作,所以一不小心的話,很容易就死遊戲。np保護了遊戲程序的**段,所以在np啟動後就不要再對其**段進行修改,要

補丁或hook系統函式這些都要在np啟動前完成。當然讀寫遊戲的資料段是沒問題的,因為遊戲本身也不斷進行這樣的操作。

如何在linux下看程序實際占用記憶體

下面是由seme.pl指令碼解析的smaps資料 首先安裝linux smaps模組 perl mcpan e install linux smaps 然後用seme.pl解析1293程序的smaps資料 code smem.pl 1293 vmsize 7200 kb rss 1052 kb to...

如何在Linux下清屏?

出處 1351 感謝原作者的整理 在windows的dos操作介面裡面,清屏的命令是cls,那麼在linux 裡面的清屏命令是什麼呢?下面筆者分享幾種在linux下用過的清屏方法。1 clear命令 這個命令將會重新整理螢幕,本質上只是讓終端顯示頁向後翻了一頁,如果向上滾動螢幕還可以看到之前的操作資...

如何在C 中讀寫INI檔案

ini檔案就是擴充套件名為 ini 的檔案。在windows系統中,ini檔案是很多,最重要的就是 system.ini system32.ini 和 win.ini 該檔案主要存放使用者所做的選擇以及系統的各種引數。使用者可以通過修改ini檔案,來改變應用程式和系統的很多配置。但自從windows...