私のプログラムは、Windows Vista Ultimate と Windows 7 では問題なく動作しますが、Windows XP では失敗します。
まず、私のアプリケーションはシステム ファイルのプロセスを作成し、GetThreadContext(remote_thread) を呼び出して LPVOID 値を値 context->Eip に設定し、VirtualQueryEx から設定された MEMORY_BASIC_INFORMATION 構造体の値をチェックします。
VirtualQueryEx が呼び出されたときに返される値は次のとおりです。
WindowsXP
- 0 - 配賦基準
- 0 - 割り当て保護
- 2088828928 - ベースアドレス
- 1 - 保護する
- 983040 - 領域サイズ
- 65536 - 状態
- 0 - タイプ
ウィンドウズ7
- 2003959808 - 割り当てベース
- 128 - 割り当て保護
- 2004025344 - ベースアドレス
- 32 - 守る
- 876544 - 領域サイズ
- 4096 - 状態
- 16777216 - タイプ
Windows ビスタ
- 2006122496 - 割り当てベース
- 128 - 割り当て保護
- 2006536192 - ベースアドレス
- 32 - 守る
- 389120 - 領域サイズ
- 4096 - 状態
- 16777216 - タイプ
Windows XP でアプリケーションを実行すると、アロケーション ベースとアロケーション プロテクトがなく、Windows 7 や Windows Vista とは値がまったく異なるのはなぜですか。
アドレス (コンテキスト-> Eip) で VirtualProtectEx を使用する予定なので、それらが XP の値である場合、アクセスできないメモリにアクセスするため、VirtualProtectEx は必然的に失敗します。
プロセスを作成する方法は次のとおりです。
if ( CreateProcessW(m_pwszContainerPath, NULL, NULL, NULL, FALSE, DETACHED_PROCESS | CREATE_SUSPENDED, NULL, NULL, &m_stStartInfo, &m_stProcessHandles) == TRUE )
{
// Get context of thread
m_stContext.ContextFlags = CONTEXT_FULL;
if ( GetThreadContext(m_stProcessHandles.hThread, &m_stContext) == FALSE )
goto _CLEANUP;
// Grab, Eip
m_pvLdrInitEip = (LPVOID)m_stContext.Eip;
}
実際のところ、これは Windows 7 と Windows Vista の両方で問題なく動作します。
私がここに欠けているものはありますか?助けてくれてありがとう。
編集 - ここに写真があります:
これは、実行可能ファイルを実行している olly の 2 つのインスタンスの図です。1 つは XP 仮想マシン内で、もう 1 つは外部です。私が気づいたことから、XP の画像 (一番下) では EIP が ModuleEntryPoint に設定されていますが、Windows 7 インスタンスでは ntdll に設定されています。
さらに調査したところ、EIP は実際には、本来あるべき ntdll.dll ではなく、kernel32.dll イメージ (Windows XP の場合) にあることがわかりました..