2015-02-08 51 views
1

我試圖從遊戲中讀取座標。當在通過OpenProcess接收到的HANDLE上使用ReadProcessMemory時,這種方法非常好,並且可以在CheatEngine中找到內存。例如,如果我知道正在運行的進程中的浮點值是0x5AB38F68,我可以讀取它。JNA - EnumProcessModules()不返回所有的DLL?

但是,每次遊戲重新啓動時地址都會更改。它取決於一個名爲AkSoundEngine.dll的模塊。所以基本上地址是AkSoundEngine.dll + 0x168F68。但是,我不能在我的生活中找到所述DLL的baseaddress。它示出了在CE:Click for Image

然而,如之前在相同的HANDLE使用EnumProcessModules()時,這些是結果:

[2015-02-08 09:26:09][INFO][Game:59] - C:\Windows\SYSTEM32\ntdll.dll 
[2015-02-08 09:26:09][INFO][Game:59] - C:\Windows\SYSTEM32\wow64.dll 
[2015-02-08 09:26:09][INFO][Game:59] - C:\Windows\SYSTEM32\wow64win.dll 
[2015-02-08 09:26:09][INFO][Game:59] - C:\Windows\SYSTEM32\wow64cpu.dll 
[2015-02-08 09:26:09][INFO][Game:59] - F:\Steam\steamapps\common\TheLongDark\tld.exe 
[2015-02-08 09:26:09][INFO][Game:59] - F:\Steam\steamapps\common\TheLongDark\tld.exe 
[2015-02-08 09:26:09][INFO][Game:59] - F:\Steam\steamapps\common\TheLongDark\tld.exe 
[2015-02-08 09:26:09][INFO][Game:59] - F:\Steam\steamapps\common\TheLongDark\tld.exe 
[2015-02-08 09:26:09][INFO][Game:59] - F:\Steam\steamapps\common\TheLongDark\tld.exe 

的DLL沒有顯示。因此我的假設是,它可能在tld.exe模塊之一中。如果是這樣的話,我將如何去迭代模塊的模塊,然後接收它的基地址?我是否有權假定我將不得不添加tld.exe的基地址,如下所示: tld.exe+AkSoundEngine.dll+0x168F68

您可能還會注意到,它將tld.exe作爲模塊顯示5次,但其中只有2個返回BaseOfDll,作爲由GetModuleInformation()返回的LPMODULEINFO的一部分。

難道是因爲我剛纔遇到了JNA中可行的事情(我懷疑這是因爲我只是調用C代碼)?

我不確定如何更具體地詢問,但您可以在my GitHub處看到整個代碼。它大部分發生在Game.java的updatePosition()方法中。

回答

3

解決方案是使用EnumProcessModulesEx()和32位標誌。 我也被告知,如果Java是64位,每個HMODULE是8個字節長。 此外,在較新的系統上使用EnumProcessModulesEx()時,PROCESS_ALL_ACCESS標誌存在一些問題。