JNA - CreateToolhelp32Snapshot не возвращает все библиотеки DLL - PullRequest
1 голос
/ 29 октября 2019

Я пытаюсь получить базовый адрес модуля от процесса, к которому у меня есть дескриптор. Я пробовал это, используя методы CreateToolhelp32Snapshot и EnumProcessModules.


Проблема заключается в том, что оба метода возвращают только эти 5 DLL:

underrail.exe
ndll.dll
wow64.dll
wow64win.dll
wow64cpu.dll

Я знаю, что должно бытьбольше модулей и попытка использовать это в других играх возвращает те же 5 модулей.

Я нашел несколько ответов на один и тот же вопрос, но оба они мне не подошли:

  1. https://www.unknowncheats.me/forum/counterstrike-global-offensive/169030-modules.html
  2. JNA - EnumProcessModules () не возвращает все библиотеки DLL?

Первый не работает, так как я не могу использовать TH32CS_SNAPMODULE|TH32CS_SNAPMODULE32 как флаги в методе.

Второй не работает, потому что я не могу вызвать метод EnumProcessModulesEx (), когда пытаюсь вызвать Psapi.INSTANCE.EnumProcessModulesEx (...)

Вот фрагмент моего кода:

public static int getModuleBaseAddress(int process_id) {

    DWORD pid = new DWORD(process_id);
    HANDLE snapshot = null;

    snapshot = kernel32.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPMODULE, pid);
    MODULEENTRY32W module = new MODULEENTRY32W();


    while(Kernel32.INSTANCE.Module32NextW(snapshot, module)) {

        String s = Native.toString(module.szModule);
        Pointer x = module.modBaseAddr;
        System.out.println(s);
        System.out.println(x);
        System.out.println("---");

    }

    return 0;


}

Обратите внимание, что использование Tlhelp32.TH32CS_SNAPMODULE32 ничего не возвращает, а Tlhelp32.TH32CS_SNAPALL возвращает то же самое, что lhelp32.TH32CS_SNAPMODULE

1 Ответ

0 голосов
/ 30 октября 2019

Благодаря Дэниелу Уиддису у меня есть ответ.

В настоящее время метод EnumProcessModulesEx не отображается в JNA, поэтому вам нужно создать свою собственную версию Psapi, которая в моем случае выглядит примерно так:

import com.sun.jna.Native;
import com.sun.jna.platform.win32.Psapi;
import com.sun.jna.platform.win32.WinDef.HMODULE;
import com.sun.jna.platform.win32.WinNT.HANDLE;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.win32.W32APIOptions;

public interface CustomPsapi extends Psapi{

    Psapi INSTANCE = Native.load("psapi", Psapi.class, 
    W32APIOptions.DEFAULT_OPTIONS);

    public void EnumProcessModulesEx(HANDLE hProcess, HMODULE[] lphModule, int cb, 
    IntByReference lpcbNeeded, int dwFilterFlag);


}

Затем вы можете загрузить свой собственный класс и использовать методы, которые вы отобразили.

public static CustomPsapi c_psapi = Native.load("psapi", CustomPsapi.class);

Что касается правильного отображения всех библиотек DLL, вам нужно использовать теперь сопоставленный EnumProcessModulesEx. метод с флагом для всех модулей в качестве последнего аргумента (0x03), поэтому метод должен выглядеть примерно так:

c_psapi.EnumProcessModulesEx(process, modules, 1024, new IntByReference(1024), 0x03);
...