次のコードがntdll.dll内にポインタを返す理由を誰かが説明しますか?
GetProcAddress(LoadLibraryA("kernel32.dll"), "EncodePointer");
GetProcAddress(LoadLibraryA("kernel32.dll"), "DecodePointer");
PS:kernel32のエクスポートテーブルが指す関数を呼び出すと、ブレークポイントがスローされます。
次のコードがntdll.dll内にポインタを返す理由を誰かが説明しますか?
GetProcAddress(LoadLibraryA("kernel32.dll"), "EncodePointer");
GetProcAddress(LoadLibraryA("kernel32.dll"), "DecodePointer");
PS:kernel32のエクスポートテーブルが指す関数を呼び出すと、ブレークポイントがスローされます。
これは、Matt Pietrek の優れた MSDN マガジン記事の 1 つである「An In-Depth Look into the Win32 Portable Executable File Format, Part 2 」で説明されているように、エクスポート フォワーディングの単純なケースです。
これは、Dependency Walker や dumpbin などのツールを使用して自分で確認できます。
dumpbin /exports kernel32.dll | grep codePointer
205 CC DecodePointer (forwarded to NTDLL.RtlDecodePointer)
240 EF EncodePointer (forwarded to NTDLL.RtlEncodePointer)
これは、DLL 転送/リダイレクトまたは関数エイリアスと呼ばれます。エクスポート エントリの定義は次のとおりです。
entryname[=internalname] [@ordinal [NONAME]] [PRIVATE] [DATA]
したがって、エントリ名を定義できます
EncodePointer=ntdll.RtlEncodePointer
チェックする:
C:\>findaddress ntdll.dll RtlEncodePointer
ntdll.dll : 7C900000
RtlEncodePointer@ntdll.dll: 7C9132D9
C:\>findaddress kernel32.dll EncodePointer
kernel32.dll : 7C800000
EncodePointer@kernel32.dll: 7C9132D9
(findaddress は、このタスクをすばやく実行するための私の個人的なツールです)
ここで詳細を見ることができます: http://msdn.microsoft.com/en-us/library/hyx1zcd3(v=vs.80).aspx
PS: これは良い質問だと思います。研究目的で小さなプログラム (マルウェアであっても) を書きたいのであれば、それは間違ったことではありません!