2015-04-17 51 views
2

所以我想製作一個可以從另一個程序讀取數據的Java程序。它來自遊戲,我不能(據我所知)從文件中獲取信息(它運行在服務器端)。我將如何做到這一點?目前我正在閱讀屏幕上的像素,但我認爲這不是正確的方法。我可以以某種方式訪問​​RAM嗎?信息將被存儲在那裏。讀取像素的問題是它應該在更多的計算機上運行,​​並且它們不一定具有相同的窗口分辨率/位置(可能是窗口模式)。有任何想法嗎?Java - 閱讀有關其他程序的信息?

+1

你有沒有考慮過使用不同的語言,如C++?您可以開發一個動態鏈接庫,您可以使用指針將其注入遊戲並從內存中讀取。否則,您可以使用JNA並使用'ReadProcessMemory'從進程中讀取內存。 –

+0

唯一的問題是我不知道任何C語言。 – StupidQuestions

+1

我剛剛對我的評論進行了擴充,併爲您留下了答案,希望它可以幫助您交配。 –

回答

8

Java不一定是最好的語言。完成你想要做的事情的方法是製作一個注入式DLL,它使用指針從內存中讀取數據或使用ReadProcessMemory從外部進程讀取內存。

如果您確定要爲此使用Java,則可以使用JNA Library訪問本機方法ReadProcessMemory,並且可以使用類似CheatEngine這樣的工具來查找內存地址。

Kernel32加載(其中ReadProcessMemory方法),你必須沿着這行做一些事情:

Kernel32 kernel32 = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class); 

然後你需要知道你需要完成你想要做什麼的訪問權限,可在Microsoft's website找到。在這種情況下,我們只想讀取,因此我們需要的訪問權限是PROCESS_VM_READ (0x0010)。然後,我們可以將此值存儲在一個const:

public static final int PROCESS_VM_READ = 0x0010; 

然後如果我們仰望的ReadProcessMemory語法,我們發現語法是這樣的:

BOOL WINAPI ReadProcessMemory(
    _In_ HANDLE hProcess, 
    _In_ LPCVOID lpBaseAddress, 
    _Out_ LPVOID lpBuffer, 
    _In_ SIZE_T nSize, 
    _Out_ SIZE_T *lpNumberOfBytesRead 
); 

ReadProcessMemory把一個進程句柄(Pointer在JNA中),要從中讀取的內存地址(可以說我們要從靜態值0x10101AAA82中讀取),要讀取的緩衝區,值的大小以及輸出讀取的字節數的最後一個值,我們將設置爲因爲我們並不在乎。

因此,首先,我們要打開一個指向我們想從中讀取數據的過程中,假設你知道進程的PID:

Pointer process = kernel32.OpenProcess(PROCESS_VM_READ, pid); 

,現在我們有句柄過程(即。的ReadProcessMemory

我們要讀將是的Memory,我們可以通過傳遞我們想要讀取值的大小實例化一個實例緩衝區中的第一個參數,可以說我要讀2字節在這種情況下。

Memory memory = new Memory(2); 

現在,我們已經得到了我們需要閱讀我們的記憶中值的所有參數:

kernel32.ReadProcessMemory(process, 0x10101AAA82, memory, 2, null); 

這意味着我們想要從過程process從內存中讀取地址0x10101AAA822 bytesmemory內存。

現在我們可以得到我們剛纔讀到的價值了!如果我的值是一個整數,我們可以在memory上調用getInt(offset),因爲我們想從頭開始讀取,所以我們將傳遞0作爲偏移量。您也可以運行getStringgetCharjavadoc上列出的任何東西。現在你有你的價值!

+0

這真的很好!非常感謝。 – StupidQuestions

+1

沒問題,如果您還有其他問題可以隨時問 –

+0

哪種語言對這類東西更好? – Hamid

0

你實際上正在努力或多或少的編程一個機器人。 我建議試圖弄清楚負責信息傳遞的文件和/或端口是什麼(這可能很難)。 我不確定Java是否是最好的解決方法。 (Visual Basic可能?)

+0

啊有趣。分析進來的數據包。它不是一個機器人(好吧,不是作弊),它應該收集關於你的遊戲的數據並分析它,這樣用戶就可以看到結果。 – StupidQuestions

+0

這就是我將如何去做。但這可能會很棘手。考慮你必須對通信接口進行逆向工程,這不是每個人都說的代碼,而是編譯好的機器代碼。 –