メソッドの戻りアドレスを読み取ろうとしていますが、別のメモリです。そのため、フレーム ポインタを取得し、戻り値の値を読み取ります。私が理解している限り、m_stackframe.AddrReturn.Offset に等しい値を取得することになっていますが、
- Esp をフレーム ポインター アドレスに追加すると、ReadProcessMemory は false を返します。
- 単純にアドレス フレーム オフセットを使用すると、間違った値が得られます。
//スタックの一番上のメソッドを読み取ります。 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 ++を使用しています。何が問題なのか誰か教えてもらえますか? ありがとう :)