2

メソッドの戻りアドレスを読み取ろうとしていますが、別のメモリです。そのため、フレーム ポインタを取得し、戻り値の値を読み取ります。私が理解している限り、m_stackframe.AddrReturn.Offset に等しい値を取得することになっていますが、

  1. Esp をフレーム ポインター アドレスに追加すると、ReadProcessMemory は false を返します。
  2. 単純にアドレス フレーム オフセットを使用すると、間違った値が得られます。
//スタックの一番上のメソッドを読み取ります。
bool ok = StackWalk64(IMAGE_FILE_MACHINE_I386,m_processInfo.Handle ,m_threadInfo.Handle, &m_stackframe,&m_threadContext,
                          0,SymFunctionTableAccess64,SymGetModuleBase64,0);

// Esp レジスタはスタックのベース アドレスですよね?
DWORD baseAddressOfCallstack = m_threadContext.Esp;
// スタック フレーム アドレスに ESP を追加して絶対アドレスを取得します。
    DWORD absoluteAddressInCallstack = m_stackframe.AddrFrame.Offset + baseAddressOfCallstack ;
// ポインターに変換します。
    DWORD* addressInCallStack = (DWORD*)absoluteAddressInCallstack;
    DWORD 値 = 0;
    SIZE_T bytesRead = 0;
// プロセスから読み取ろうとしています...
    ok = ReadProcessMemory(m_processInfo.Handle, addressInCallStack, (void*)&val, sizeof(DWORD),&bytesRead);

Windowsでc ++を使用しています。何が問題なのか誰か教えてもらえますか? ありがとう :)

4

1 に答える 1