IDを使用してスレッドの開始アドレスを取得したい。出来ますか?
2 に答える
必要なのは、 OpenThread とNtQueryInformationThreadを呼び出すことだけです
2 番目のパラメータをThreadQuerySetWin32StartAddress
こちらの記事も参考にしてください
これは、次の理由から簡単ではありません。Win32 サブシステムでは、すべてのスレッドが同じ開始アドレスを持っています。VistaまでのWindows(ただしVistaは含まない)では、内部にありました(公式のシンボルに従ってkernel32.dll
命名されました)。BaseThreadStartThunk
Vista以降のWindowsバージョンでは、共通の開始アドレスが含まRtlUserThreadStart
れていますntdll.dll
(BaseThreadStartThunk
名前が変更されBaseThreadInitThunk
、現在はWin32固有のタスクのみを実行しているようです)。
ただし、スレッドを一時停止し、 ( を使用して)スレッドを取得し、そこからスタックをトラバースして先頭に戻り、そこでパラメータを調査することを試みることができます。スレッド開始ルーチンの各実装のリバース エンジニアリングが必要になりますが、実行可能なはずです。CONTEXT
GetThreadContext
kernel32.dll
別の方法として、文書化されていないネイティブ APINtQueryInformationThread
を で使用することもできますThreadQuerySetWin32StartAddress
。関数に関するMSDN ページもありますが、完全にはほど遠いものです。