3
DWORD baseAddress = (DWORD) GetModuleHandle(NULL);

そのコードを DLL に入れてプロセスに注入すると、注入されたプロセスのベース アドレスと同じように見えます。

それはどのように正確に機能しますか?HMODULE から DWORD へのキャストはどのように機能しますか? DWORD の代わりに void* にキャストすると機能しますか?

4

2 に答える 2

5

これは、32 ビットおよび 64 ビット バージョンの Windows の実装の詳細です。HMODULE はそれよりも古いもので、Windows の 16 ビット バージョンでは真のハンドルでした。これは win32 では不要になりました。モジュールがロードされる仮想メモリ アドレスは、モジュールを一意に識別します。したがって、VM アドレスを使用することが望ましいため、ハンドル テーブルに保持する必要はありません。

これは、DWORD にキャストできないことを意味し、64 ビット バージョンで仮想メモリ アドレスを格納するのに十分ではありません。DWORD_PTR を使用する必要があります。

于 2013-08-05T20:34:51.347 に答える
3

これが機能するのは、Windows がたまたまベース アドレスを識別ハンドルとして使用したためであり、32 ビット システムではアドレスが DWORD に適合するためです。Windows はこれを行う必要がないため、Windows に頼るべきではありません。

于 2013-08-05T20:30:06.403 に答える