16

プロセスの特定のアドレスにアクセスしたい。ただし、そのためには、最初にプロセスのベースアドレスを取得する必要があります。私はツールを使用して、実際に正しく実行されているかどうかを確認しています。ツールは、私が以下を必要としていることを示しています:"app.exe"+0x011F9B08 = 0x119F8300

を介してプロセスのベースアドレスを取得できると思いましOpenProcess()たが0x0000005c、結果として次のようになります。私はそれが正しくないと思いますか?少なくとも、私が必要なものではありません。

必要なベースアドレスは次のとおりです。0x119F8300 - 0x011F9B08 = 0x107FE7F8 <-- base?

これは私のコードです:

hWindow = FindWindow(NULL, lpWindowName);
if(hWindow)
{
    GetWindowThreadProcessId(hWindow, &dwProcId);
    if(dwProcId != 0)
    {
            // hProcHandle -> 0x0000005c
            hProcHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcId);
    }
    else
    {
        return 0;
    }
}

開いたプロセスのベースアドレスを取得するにはどうすればよいですか?

4

2 に答える 2

17

他のプロセスのアドレス空間内で仮想アドレスを取得する場合は、次のように行うことができます。

  1. --を使用してプロセスを開きます。OpenProcess成功した場合、返される値はプロセスへのハンドルです。これは、カーネルがカーネルオブジェクトを識別するために使用する不透明なトークンです。その正確な整数値(この場合は0x5c)は、他のハンドルや無効なハンドルと区別する以外は、ユーザースペースプログラムにとって意味がありません。
  2. GetProcessImageFileNameプロセスのメイン実行可能モジュールの名前を取得するために呼び出します。
  3. EnumProcessModulesターゲットプロセス内のすべてのモジュールのリストを列挙するために使用します。
  4. モジュールごとに、を呼び出しGetModuleFileNameExてファイル名を取得し、実行可能ファイルのファイル名と比較します。
  5. 実行可能ファイルのモジュールを見つけたら、を呼び出しGetModuleInformationて実行可能ファイルの生のエントリポイントを取得します。

これにより仮想アドレスが得られますが、現在のプロセスのアドレス空間にマップされていないため、仮想アドレスでできることはそれほど多くありません。

于 2013-01-22T20:34:10.680 に答える
9

@AdamRosenfieldの答えについて少し詳しく説明したいと思います。ここでは例としてLeagueofLegendsを使用します。


プロセスを開く(ハンドルを取得する)には、PID(プロセスID)が必要です。通常、ウィンドウのタイトルは既知であるため、ウィンドウハンドル(HWND)を介してこれを行うことができます。

//You will need to change this the name of the window of the foreign process
HWND WindowHandle = FindWindow(nullptr, L"League of Legends (TM) Client");
DWORD PID;
GetWindowThreadProcessId(WindowHandle, &PID);
PVOID hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, 0, PID);

プロセスのハンドルを取得できたので、続けましょう

HMODULE Module = GetModule();
DWORD BaseAddress = (DWORD)Module;

GetModule関数

HMODULE GetModule()
{
    HMODULE hMods[1024];
    HANDLE pHandle = GetHandle();
    DWORD cbNeeded;
    unsigned int i;

    if (EnumProcessModules(pHandle, hMods, sizeof(hMods), &cbNeeded))
        {
        for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
        {
            TCHAR szModName[MAX_PATH];
            if (GetModuleFileNameEx(pHandle, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR)))
            {
                wstring wstrModName = szModName;
                //you will need to change this to the name of the exe of the foreign process
                wstring wstrModContain = L"League of Legends.exe"; 
                if (wstrModName.find(wstrModContain) != string::npos)
                {
                    CloseHandle(pHandle);
                    return hMods[i];
                }
            }
        }
    }
    return nullptr;
}

個人的には、ハンドルを取得するための関数とモジュールを取得するための関数の2つを作成するのが好きです。

これで、外部プロセスのベースアドレスを取得できました。

于 2015-08-08T15:24:47.437 に答える