トップ回答者
VS2019 C++コンソールアプリでデバッグ実行するとntdll.dllで一般保護例外が発生する

質問
-
VS2019のC++でコンソールアプリを新規作成すると、「Hello world.」を出力する雛形が作成されます。
これを何も変更せずにそのままデバッグ実行すると、「Hello world.」が表示された直後にntdll.dllで一般保護例外が発生します。
環境は、Windows 7 32bit です。
いろいろ試した結果、[ツール]-[オプション]-[デバッグ]にある、「デバッグの停止時に自動的にコンソールを閉じる」にチェックを入れると例外は発生しなくなりました。
このチェックを入れることに特に問題はないので(main関数終了時にsystem("pause")を呼び出せばそこでコンソールは閉じずに残るので)不自由はないのですが、このチェックを外しても動くようにするのが本来だと思うので、報告させていただきました。
なお、Windows10 64bit環境でも試してみましたが、こちらではチェックを外しても例外は発生しませんでした。
以上
回答
-
> どういう手法なのでしょう?
私が自分でデバッグ トレースして詳細に調べたのでは無いので、すべてをきちんと把握している訳ではないですが、このログを見る限りインジェクションされたトレンドマイクロ DLL は、自身のため専用の システム DLL を二重にロードしているようです。
例えば今回のログから、PSAPI.DLL, SHLWAPI.dll, KERNEL32.dll, ADVAPI32.dll の3つの DLL を独自にロードおよび管理している形跡が読み取れます。
なんでそんなことをするのかというと、恐らく自分以外の「第三者」が仕込んだ API Hook の影響を排除するためと考えられます。
例えば。。。
マルウェアが CreateFile() や ReadFile(), WriteFile() 等の API に Hook を仕掛けていたとして、セキュリティ ソフトの DLL がそれら API を「そのまま」使うと、マルウェアの影響を受けてしまう。。。。つまり正しいセキュリティ監視が出来ないことになってしまう。
だからセキュリティ ソフトは、個々のユーザー モード プロセス空間の空き領域にそれら システム DLL を独自にロード (正確にはマップ。。。かな) させ、自身の DLL が使うそれら API コールはすべてそっちを使うように IAT も書き換える。
これによって、セキュリティ ソフトは「第三者」が仕込んだ API Hook の影響を排除することができる。
さらにこの Hook は、プロローグ コードの書き換えではなく IAT の書き換えと Code Injection をベースにしているので、恐らくマルウェア側からも見えにくいはず。
いずれにせよ TmUmEvt.dll はかなり手の込んだ方法で、API Hook をしているようです。
(それにしても灯台下暗し。。。目から鱗。。。)
> それと、FreeLibraryする方法はだめでした。そうでしょうね。
こんな手の込んだことしているセキュリティ ソフトが、あんなお手軽コードですり抜けられる訳がありませんね。wwww> 一応ダンプは保存したので、WinDBGで見ることは可能です。これ以上は、ユーザー モード ダンプを見ても、あんまり意味がないかも。
(個人的には、そのダンプ欲しいけど。www)
カーネル モード デバッグできっちりトレースしないと、具体的な挙動は把握できないと思います。> トレンドマイクロDLLの影響にはほぼ間違いなさそうですが、
> それを回避するようなデバッグができるようにVisual Studio側で
> なんとかできないのでしょうかね?それを私に聞かれも。。。
とりあえず「デバッグの停止時に自動的にコンソールを閉じる」の設定で回避するしかないと思います。
そもそもこの問題の原因は、マイクロソフトとトレンドマイクロのどっちが悪いのか、白黒つけるのが難しいと思いますし。
という訳で、私が手伝えるのはここまで。- 回答としてマーク pine 2019年6月19日 6:23
すべての返信
-
pineさん、こんにちは。フォーラムオペレーターのHarukaです。
MSDNフォーラムにご投稿くださいましてありがとうございます。
詳細な状況をご提供いただきありがとうございます。その後のご状況いかがでしょうか。
追加でご確認いただいたことなどあれば、追記いただくことで回答がつきやすくなります。
また、英語とはなりますが米国のフォーラム(Developer Community: https://developercommunity.visualstudio.com/spaces/62/index.html)に投稿いただくこともご検討ください。
私共でもご案内できる情報がないか確認いたします。どうぞよろしくお願いします。
MSDN/ TechNet Community Support Haruka
ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~ -
-
-
今朝、VS2019の更新が来ていたので更新してみましたが状況は変わりませんでした。(Version 16.1.3)
で、例外が発生したときの呼び出し履歴を見ると以下のようになっていました。
例外の内容は「0x7746F45A (ntdll.dll) で例外がスローされました (consoleTest.exe 内): 0xC0000005: 場所 0x00000000 への書き込み中にアクセス違反が発生しました」です。
使用しているWindows7(32bit)の環境の問題かもしれませんが、デバッグなしでの起動(CTRL+F5)だと例外は出ないので、デバッガが関係しているんだと思われます。
- 編集済み pine 2019年6月12日 4:17 画像の貼り直し
-
ですから、その情報だけでなぜ「デバッガが関係している」という結論になるのかが、私にはわかりません。
「デバッガが関係している」のであれば、他のプラットフォーム上でも起きるはずだと考えます。
特定のプラットフォーム (今回の場合は Windows 7 x86) でしか起きないのであれば、その環境固有の何かに起因しているのでは。。。。と、私なら考えます。コールスタックはどのような状況になっていたのですか?
ntdll.dll 内のどの関数で、0xC0000005 の例外が発生していたのですか?
ちなみに 0xC0000005 は STATUS_ACCESS_VIOLATION というエラーを示しています。
つまり、メモリ アクセス違反が起きたということですが、現状で提示されている情報からわかるのはそれだけです。
VS2019 デバッガの問題ならば、WinDBG 上では発生しないと考えられるので、確認されることをお勧めします。 -
お手数掛けまして申し訳ありません。
まず、VS2019のデバッガ上での動作ですが先程は画像のアップに失敗してまして、改めてテキストで貼り付けると
=======================================
ntdll.dll!@RtlActivateActivationContextUnsafeFast@8()
ntdll.dll!_LdrpProcessStaticImports@12()
ntdll.dll!_LdrpLoadDll@28()
ntdll.dll!_LdrLoadDll@16()
000a00c5()
[下のフレームは間違っているか、または見つかりません]
[外部コード]
=======================================
となっており、「RtlActivateActivationContextUnsafeFast」で発生しています。(このntdllの関数が何をしているのかは寡聞にして知りません。もし良ければ教えてください)
それから、WinDBGで実行してみたのですが、例外は発生しません。(Go Handled Exceptionで実行)
>VS2019 デバッガの問題ならば、WinDBG 上では発生しないと考えられるので、確認されることをお勧めします。
ということですので、この結果からVS2019側に問題がある疑いが濃いと思われます。
それから、もしご存知なら教えていただきたのですが、Visual Studioの
[ツール]-[オプション]-[デバッグ]にある、「デバッグの停止時に自動的にコンソールを閉じる」
の項目ですが、この機能の実現ってどういうふうに行っているのでしょうか?(おそらくVS2019のデバッガにそう言う機能があるのだと思うのですが。)
最初の投稿で書きましたが、このオプションにチェックを入れれば、VS2019のデバッガ動作での例外は発生しません。
そもそもプログラムは
#include <iostream> int main() { std::cout << "Hello World!" << std::endl; }
と、どこで例外が発生するの?というコードです。
確かに、Windowsのシステムがおかしい可能性は0ではないと思います。(考えたくはないですが)ウィルスやマルウェアの可能性ももしかするとあるかもしれません。
でも、より可能性の高さから言うと、VS2019のデバッガではないかと思うのです。
-
LdrLoadDll() がロードしようとしている DLL の名前を確認しましたか?
VS デバッガには関数呼び出し時のパラメータ値を表示させる機能があるので、それを使えば確認できます。
LdrLoadDll() の場合、3rd パラメータに DLL モジュール名が UNICODE_STRING 構造体としてセットされるので、その中身を確認すれば、どの DLL をロードしようとしているのかが分かります。提示されているコールスタックを見る限り、私には外部プロセスから DLL Injection されているような状態に見えます。
以下は、Windows 10 x64 環境で notepad.exe を起動時の LdrLoadDll() コールを、WinDBG でトレースしたものです。# Child-SP RetAddr : Args to Child : Call Site 00 000000f6`6f07eea8 00007ffc`6e68ee41 : 00000000`00000100 00000000`00001010 00000000`00000000 0000029d`19120000 : ntdll!LdrLoadDll 01 000000f6`6f07eeb0 00007ffc`6e50d132 : 00000000`00000000 00007ffc`6e5a9b10 00007ffc`6e5b7878 00000000`00000000 : KERNELBASE!LoadLibraryExW+0x161 02 000000f6`6f07ef20 00007ffc`6e50d095 : 00007ffc`6e5a9b10 00007ffc`6e5a9b14 ffffffff`ffffffff 00000000`00000040 : ucrtbase!try_get_module+0x4a 03 000000f6`6f07ef50 00007ffc`6ead92bb : 0000029d`19137ea0 00000000`00000000 00007ffc`6eb662b0 00007ffc`6eae3657 : ucrtbase!_lock_locales+0x585 04 000000f6`6f07ef80 00007ffc`6ead543d : 00000000`00000000 00007ffc`6e5009ed 0000029d`19137ea0 00000000`00000000 : msvcp_win!std::locale::_Init+0x2b 05 000000f6`6f07efd0 00007ffc`6ead114e : 00007ffc`6eb28410 00000000`00000005 00007ffc`6ead0000 00000000`00000001 : msvcp_win!std::basic_filebuf<unsigned short,std::char_traits<unsigned short> >::basic_filebuf<unsigned short,std::char_traits<unsigned short> >+0x3d 06 000000f6`6f07f010 00007ffc`6e50dab3 : 00000000`0000001f 00000000`7ffe0300 000000f6`6f07f3d0 00007ffc`6e505774 : msvcp_win!std::`dynamic initializer for 'wfout''+0x1e 07 000000f6`6f07f040 00007ffc`6eae31a2 : 00000000`7ffe0300 000000f6`6f07f3d0 000000f6`6f07f8e0 00007ffc`721b6a03 : ucrtbase!initterm+0x43 08 000000f6`6f07f070 00007ffc`6eae3324 : 00000000`7ffe0385 000000f6`6f07f8e0 00000000`7ffe0300 00000000`00000001 : msvcp_win!dllmain_crt_process_attach+0x9a 09 000000f6`6f07f0a0 00007ffc`721b8f07 : 00007ffc`6ead0000 00000000`00000001 000000f6`6f07f8e0 00000000`7ffe0385 : msvcp_win!dllmain_dispatch+0x74 0a 000000f6`6f07f100 00007ffc`721b4865 : 0000029d`19127410 00007ffc`6ead0000 00000000`00000001 0000029d`19127900 : ntdll!LdrpCallInitRoutine+0x6f 0b 000000f6`6f07f170 00007ffc`721b4648 : 0000029d`19127560 0000029d`19127500 000000f6`6f07f301 0000029d`00000001 : ntdll!LdrpInitializeNode+0x1c1 0c 000000f6`6f07f2c0 00007ffc`721b4672 : 0000029d`19124a00 0000029d`19126750 000000f6`6f07f3d0 0000029d`191285e0 : ntdll!LdrpInitializeGraphRecurse+0x80 0d 000000f6`6f07f300 00007ffc`721b4672 : 00007ffc`722d5200 0000029d`19122b00 000000f6`6f07f3d0 0000029d`1912e460 : ntdll!LdrpInitializeGraphRecurse+0xaa 0e 000000f6`6f07f340 00007ffc`722462ca : 00000000`00000000 00000000`00000010 00000000`00000000 00007ffc`7229d100 : ntdll!LdrpInitializeGraphRecurse+0xaa 0f 000000f6`6f07f380 00007ffc`72233879 : 00000000`00000001 00000000`00000000 00000000`00000000 00000000`00000001 : ntdll!LdrpInitializeProcess+0x1e16 10 000000f6`6f07f7c0 00007ffc`721e56c3 : 00000000`00000000 00007ffc`72170000 00000000`00000000 000000f6`6efc9000 : ntdll!_LdrpInitialize+0x4e19d 11 000000f6`6f07f860 00007ffc`721e566e : 000000f6`6f07f8e0 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!LdrpInitialize+0x3b 12 000000f6`6f07f890 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!LdrInitializeThunk+0xe "kernel32" +0x000 Length : 0x10 +0x002 MaximumLength : 0x12 +0x008 Buffer : 0x00007ffc`6e5b7878 "kernel32" ntdll!LdrLoadDll: 00007ffc`721b57d0 48895c2410 mov qword ptr [rsp+10h],rbx ss:000000f6`6f07eeb8=0000000000001010
上記コールスタックでは、ucrtbase!try_get_module 内部から KERNELBASE!LoadLibraryExW 経由で "kernel32" DLL のロード要求が発生していますが、通常の DLL ロード要求の場合、上記のようにコール スタックがいきなり ntdll!LdrLoadDll で始まることはありません。
今回提示されている、いきなり ntdll!LdrLoadDll で始まる典型的なスレッドが、外部プロセスから DLL Injection です。
該当プロセスはデバッガ環境下で実行されているので、VS デバッガが DLL Injection を仕掛けている可能性も考えられますが、それ以外のプロセスによる DLL Injection である可能性も現状では否定できません。
なので、今回の ntdll!LdrLoadDll コールで何の DLL モジュールをロードしようとしているのか、きちんと確認されることをお薦めします。
- 編集済み お馬鹿 2019年6月12日 6:56
-
ありがとうございます!勉強になります。
>VS デバッガには関数呼び出し時のパラメータ値を表示させる機能があるので、それを使えば確認できます。
とのことですが、これは、「呼び出し履歴」の画面で右クリックして「パラメータ値の表示」にチェックを入れるのですよね?どこに表示されるのでしょうか?それとも操作を間違ってますか?
初歩的な質問で申し訳ありません。
※DLL Injectionとなると怪しいと思われるのはトレンドマイクロのウィルスバスター(コーポレート版)かもしれないです。他のプログラムのデバッグ時にProcess ExplorerでThreadを監視していると、トレンドマイクロのDLLがスレッドに現れてるのをよく見かけるので。そうなのかを確認したいのですが、呼び出し時のパラメータ値の表示の仕方がわかりません。よろしくお願いします。
-
VS デバッガだと、外部モジュールの詳しい情報は表示してくれないんですね。。。。失礼しました。
私、いつも WinDBG でデバッグしているので、VS のデバッガはあんまり詳しくないのですが。。。。
(VS のデバッガ、私には超使いにくい。。。)VS のデバッガは WinDBG のように綺麗にコールスタックを表示してくれないし、自分以外のモジュールのパラメータ情報を表示してくれないから、スタック フレームを自分で漁るしかないのかも。
x86 環境の場合、"Debug.ListRegisters" コマンドの esp や ebp でスタック フレームを確認して、そこから自分でオフセットを数えていくか、あるいは UNICODE_STRING 構造体っぽいデータを漁るか。。。。
そこら辺は、VS でデバッグしている人の方が詳しいかも。もう1つ思いついたのは。。。。
例外発生で VS デバッガに Break-in している状態から、タスク マネージャーからプロセス ダンプを生成して、そのプロセス ダンプ ファイルから確認するとか。 -
色々教えていただきありがとうございます。
プロセスダンプを取ってWinDBGで解析してみました。
Microsoft (R) Windows Debugger Version 6.3.9600.17298 X86 Copyright (c) Microsoft Corporation. All rights reserved. Loading Dump File [F:\Temp\ファイル検索\file_search2\file_search2.dmp] User Mini Dump File with Full Memory: Only application data is available ************* Symbol Path validation summary ************** Response Time (ms) Location Deferred SRV*c:\symbols*https://msdl.microsoft.com/download/symbols Symbol search path is: SRV*c:\symbols*https://msdl.microsoft.com/download/symbols Executable search path is: Windows 7 Version 7601 (Service Pack 1) MP (4 procs) Free x86 compatible Product: WinNt, suite: SingleUserTS Machine Name: Debug session time: Thu Jun 13 08:53:30.000 2019 (UTC + 9:00) System Uptime: 0 days 1:54:33.917 Process Uptime: 0 days 0:05:26.000 .............. eax=00000187 ebx=00000000 ecx=7ffde000 edx=0043f964 esi=778d8340 edi=00000000 eip=77846c04 esp=0043f95c ebp=0043f9c0 iopl=0 nv up ei pl zr na pe cy cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000247 ntdll!KiFastSystemCallRet: 77846c04 c3 ret 0:000> !analyze -v ******************************************************************************* * * * Exception Analysis * * * ******************************************************************************* *** WARNING: Unable to verify checksum for file_search2.exe GetUrlPageData2 (WinHttp) failed: 12002. FAULTING_IP: +74ca000003e7d9a0 00000000 ?? ??? EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff) ExceptionAddress: 00000000 ExceptionCode: 80000003 (Break instruction exception) ExceptionFlags: 00000000 NumberParameters: 0 CONTEXT: 00000000 -- (.cxr 0x0;r) eax=00000187 ebx=00000000 ecx=7ffde000 edx=0043f964 esi=778d8340 edi=00000000 eip=77846c04 esp=0043f95c ebp=0043f9c0 iopl=0 nv up ei pl zr na pe cy cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000247 ntdll!KiFastSystemCallRet: 77846c04 c3 ret FAULTING_THREAD: 00002e44 DEFAULT_BUCKET_ID: STATUS_BREAKPOINT PROCESS_NAME: file_search2.exe ERROR_CODE: (NTSTATUS) 0x80000003 - { EXCEPTION_CODE: (NTSTATUS) 0x80000003 (2147483651) - { NTGLOBALFLAG: 0 APPLICATION_VERIFIER_FLAGS: 0 APP: file_search2.exe ANALYSIS_VERSION: 6.3.9600.17336 (debuggers(dbg).150226-1500) x86fre PRIMARY_PROBLEM_CLASS: STATUS_BREAKPOINT BUGCHECK_STR: APPLICATION_FAULT_STATUS_BREAKPOINT LAST_CONTROL_TRANSFER: from 778465ac to 77846c04 STACK_TEXT: 0043f958 778465ac 77831db1 00000020 00000000 ntdll!KiFastSystemCallRet 0043f95c 77831db1 00000020 00000000 00000000 ntdll!NtWaitForSingleObject+0xc 0043f9c0 77831c95 00000000 00000000 0043fa28 ntdll!RtlpWaitOnCriticalSection+0x13e 0043f9e8 7785f82b 778d8340 77ad8961 64f618a0 ntdll!RtlEnterCriticalSection+0x150 0043fa84 7786208c 76860000 0043fac0 00000000 ntdll!LdrGetProcedureAddressEx+0x159 0043faa0 757b6d18 76860000 0043fac0 00000000 ntdll!LdrGetProcedureAddress+0x18 0043fac8 64f6a79f 76860000 64f618a0 76860000 KERNELBASE!GetProcAddress+0x44 0043fadc 64f6a59c 64f618a0 64f61898 64f618a0 VCRUNTIME140D!try_get_proc_address_from_first_available_module+0x2f 0043fb00 64f6a4b9 00000002 64f618a0 64f61898 VCRUNTIME140D!try_get_function+0x4c 0043fb18 64f6a89b 0043fb3c 0fa59122 00000004 VCRUNTIME140D!try_get_FlsGetValue+0x19 0043fb2c 64f6a327 00000004 00000000 0043fb48 VCRUNTIME140D!__vcrt_FlsGetValue+0xb 0043fb44 64f69c5b 0043fb60 0043fc58 0043fb64 VCRUNTIME140D!__vcrt_getptd_noinit+0x27 0043fb58 0fce4838 0043fc50 001522a1 466c223c VCRUNTIME140D!__uncaught_exception+0xb 0043fb60 001522a1 466c223c 0043fdbc 0043fc58 MSVCP140D!std::uncaught_exception+0x8 0043fc50 00151c62 466c23a0 0043feac 0043fde0 file_search2+0x122a1 0043fdcc 0015263f 0fd5cbe0 00159b30 001512a3 file_search2+0x11c62 0043feac 00152e43 00000001 0022d538 0022f1b8 file_search2+0x1263f 0043fecc 00152c97 466c2144 00000000 00000000 file_search2+0x12e43 0043ff28 00152b2d 0043ff38 00152ec8 0043ff44 file_search2+0x12c97 0043ff30 00152ec8 0043ff44 768aef3c 7ffdf000 file_search2+0x12b2d 0043ff38 768aef3c 7ffdf000 0043ff84 77863618 file_search2+0x12ec8 0043ff44 77863618 7ffdf000 77ad8c61 00000000 kernel32!BaseThreadInitThunk+0xe 0043ff84 778635eb 001513b1 7ffdf000 00000000 ntdll!__RtlUserThreadStart+0x70 0043ff9c 00000000 001513b1 7ffdf000 00000000 ntdll!_RtlUserThreadStart+0x1b FOLLOWUP_IP: VCRUNTIME140D!try_get_proc_address_from_first_available_module+2f [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_downlevel.cpp @ 183] 64f6a79f 8be5 mov esp,ebp FAULTING_SOURCE_LINE: d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_downlevel.cpp FAULTING_SOURCE_FILE: d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_downlevel.cpp FAULTING_SOURCE_LINE_NUMBER: 183 SYMBOL_STACK_INDEX: 7 SYMBOL_NAME: vcruntime140d!try_get_proc_address_from_first_available_module+2f FOLLOWUP_NAME: MachineOwner MODULE_NAME: VCRUNTIME140D IMAGE_NAME: VCRUNTIME140D.dll DEBUG_FLR_IMAGE_TIMESTAMP: 5ccadb35 STACK_COMMAND: dt ntdll!LdrpLastDllInitializer BaseDllName ; dt ntdll!LdrpFailureData ; ~0s; .ecxr ; kb FAILURE_BUCKET_ID: STATUS_BREAKPOINT_80000003_VCRUNTIME140D.dll!try_get_proc_address_from_first_available_module BUCKET_ID: APPLICATION_FAULT_STATUS_BREAKPOINT_vcruntime140d!try_get_proc_address_from_first_available_module+2f ANALYSIS_SOURCE: UM FAILURE_ID_HASH_STRING: um:status_breakpoint_80000003_vcruntime140d.dll!try_get_proc_address_from_first_available_module FAILURE_ID_HASH: {8ae96455-5f56-0857-0a17-317572e9744b} Followup: MachineOwner ---------
スタックトレースにntdll!LdrLoadDllらしきものが見当たりませんが、もしかして、アプリを子プロセスとして起動しているVsDebugConsole.exeのダンプが必要なんでしょうか?
ただ、気になるのは、例外が発生してVSにブレークインした時に、アプリの子プロセスにcmd.exeが無いのですよね。デバッグ無しでの起動ならcmd.exeが子プロセスで起動するのですが。(このときは::system("pause")でキー入力待ちにしています)
-
VsDebugConsole.exeのダンプも取ってみました。
Microsoft (R) Windows Debugger Version 6.3.9600.17298 X86 Copyright (c) Microsoft Corporation. All rights reserved. Loading Dump File [F:\Temp\ファイル検索\file_search2\VsDebugConsole.dmp] User Mini Dump File with Full Memory: Only application data is available ************* Symbol Path validation summary ************** Response Time (ms) Location Deferred SRV*c:\symbols*https://msdl.microsoft.com/download/symbols Symbol search path is: SRV*c:\symbols*https://msdl.microsoft.com/download/symbols Executable search path is: Windows 7 Version 7601 (Service Pack 1) MP (4 procs) Free x86 compatible Product: WinNt, suite: SingleUserTS Machine Name: Debug session time: Thu Jun 13 08:59:59.000 2019 (UTC + 9:00) System Uptime: 0 days 2:01:02.527 Process Uptime: 0 days 0:11:57.000 ........................ eax=00000185 ebx=002bfd64 ecx=76afab78 edx=002bfd1c esi=00000002 edi=00000000 eip=77846c04 esp=002bfd14 ebp=002bfdb0 iopl=0 nv up ei pl zr na pe cy cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000247 ntdll!KiFastSystemCallRet: 77846c04 c3 ret 0:000> !analyze -v ******************************************************************************* * * * Exception Analysis * * * ******************************************************************************* *** ERROR: Symbol file could not be found. Defaulted to export symbols for tmmon.dll - *** ERROR: Symbol file could not be found. Defaulted to export symbols for TmUmEvt.dll - GetUrlPageData2 (WinHttp) failed: 12002. FAULTING_IP: +5d749f003e8d3a0 00000000 ?? ??? EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff) ExceptionAddress: 00000000 ExceptionCode: 80000003 (Break instruction exception) ExceptionFlags: 00000000 NumberParameters: 0 CONTEXT: 00000000 -- (.cxr 0x0;r) eax=00000185 ebx=002bfd64 ecx=76afab78 edx=002bfd1c esi=00000002 edi=00000000 eip=77846c04 esp=002bfd14 ebp=002bfdb0 iopl=0 nv up ei pl zr na pe cy cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000247 ntdll!KiFastSystemCallRet: 77846c04 c3 ret FAULTING_THREAD: 00002d24 DEFAULT_BUCKET_ID: STATUS_BREAKPOINT PROCESS_NAME: VsDebugConsole.exe ERROR_CODE: (NTSTATUS) 0x80000003 - { EXCEPTION_CODE: (NTSTATUS) 0x80000003 (2147483651) - { NTGLOBALFLAG: 0 APPLICATION_VERIFIER_FLAGS: 0 APP: vsdebugconsole.exe ANALYSIS_VERSION: 6.3.9600.17336 (debuggers(dbg).150226-1500) x86fre PRIMARY_PROBLEM_CLASS: STATUS_BREAKPOINT BUGCHECK_STR: APPLICATION_FAULT_STATUS_BREAKPOINT LAST_CONTROL_TRANSFER: from 7784658c to 77846c04 STACK_TEXT: 002bfd10 7784658c 757b6a8e 00000002 002bfd64 ntdll!KiFastSystemCallRet 002bfd14 757b6a8e 00000002 002bfd64 00000001 ntdll!NtWaitForMultipleObjects+0xc 002bfdb0 768abf46 002bfd64 002bfdd8 00000000 KERNELBASE!WaitForMultipleObjectsEx+0x100 002bfdf8 768abfb4 00000002 7ffdf000 00000000 kernel32!WaitForMultipleObjectsExImplementation+0xe0 002bfe14 003979db 00000002 002bfe34 00000000 kernel32!WaitForMultipleObjects+0x18 002bfe40 00397d44 000000dc 7ffdf000 000daf10 VsDebugConsole!WaitForInput+0x2e 002bfe78 003983fd 00000003 000daf10 000e74c0 VsDebugConsole!wmain+0x133 002bfec0 768aef3c 7ffdf000 002bff0c 77863618 VsDebugConsole!__scrt_common_main_seh+0xf8 002bfecc 77863618 7ffdf000 77c5a357 00000000 kernel32!BaseThreadInitThunk+0xe 002bff0c 778635eb 00398473 7ffdf000 00000000 ntdll!__RtlUserThreadStart+0x70 002bff24 00000000 00398473 7ffdf000 00000000 ntdll!_RtlUserThreadStart+0x1b STACK_COMMAND: ~0s; .ecxr ; kb FOLLOWUP_IP: VsDebugConsole!WaitForInput+2e 003979db 83e800 sub eax,0 SYMBOL_STACK_INDEX: 5 SYMBOL_NAME: vsdebugconsole!WaitForInput+2e FOLLOWUP_NAME: MachineOwner MODULE_NAME: VsDebugConsole IMAGE_NAME: VsDebugConsole.exe DEBUG_FLR_IMAGE_TIMESTAMP: 5cf832f0 FAILURE_BUCKET_ID: STATUS_BREAKPOINT_80000003_VsDebugConsole.exe!WaitForInput BUCKET_ID: APPLICATION_FAULT_STATUS_BREAKPOINT_vsdebugconsole!WaitForInput+2e ANALYSIS_SOURCE: UM FAILURE_ID_HASH_STRING: um:status_breakpoint_80000003_vsdebugconsole.exe!waitforinput FAILURE_ID_HASH: {19b59c22-7bce-aaf5-ddd5-382215c23f89} Followup: MachineOwner ---------
-
頑張りますねぇ。
このフォーラムで、私からの提案をこんなに前向きに聞いてくれる人って、はじめてかも。
(しかも、こっちが説明していないことも、ちゃんと自分で調べているし。)
私の投稿は大抵の場合、「お前は何を言っている?」的な扱いなので。www
ちょっとびっくり。(ちょっとうれしい。)今回はユーザ モード側の解析なので、必要なダンプは、デバッグ対象となるプロセスだけ、つまりコンソール アプリのプロセスだけでいいです。
(余談ですが、Hyper-V や VMWare などの仮想環境下でのデバッグ環境を持っているなら、WinDBG をカーネル デバッグ モードで接続しておくととても便利です。)ntdll!LdrLoadDll が見当たらないのは、プロセス ダンプを採取したタイミングで Active だったのが別の Thread だったから。。。ということなんだろうと思います。
そのプロセス内の全部のスレッドを表示させたい場合は、"~*kvn" です。
(ちなみに、画面をクリアするのは ".cls")
とりあえず、"~*kvn" の出力結果をコピペしてみてください。 -
まあ、こんなに頑張らなくても、VSのオプションにチェックを入れて、::system("pause")でデバッグすればいいのですけど(^^;)、わけが分からずに対処療法的なやり方はどうも不安感が拭えなくて。
下記が"~*kvn"の結果です。これ見ると、ntdll!LdrLoadDllのフレームが壊れているようなワーニングが出てます。むむむ???どういうことでしょう?
0:000> ~*kvn . 0 Id: 2e40.2e44 Suspend: 0 Teb: 7ffde000 Unfrozen # ChildEBP RetAddr Args to Child 00 0043f958 778465ac 77831db1 00000020 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0]) 01 0043f95c 77831db1 00000020 00000000 00000000 ntdll!NtWaitForSingleObject+0xc (FPO: [3,0,0]) 02 0043f9c0 77831c95 00000000 00000000 0043fa28 ntdll!RtlpWaitOnCriticalSection+0x13e (FPO: [Non-Fpo]) 03 0043f9e8 7785f82b 778d8340 77ad8961 64f618a0 ntdll!RtlEnterCriticalSection+0x150 (FPO: [Non-Fpo]) 04 0043fa84 7786208c 76860000 0043fac0 00000000 ntdll!LdrGetProcedureAddressEx+0x159 (FPO: [Non-Fpo]) 05 0043faa0 757b6d18 76860000 0043fac0 00000000 ntdll!LdrGetProcedureAddress+0x18 (FPO: [Non-Fpo]) 06 0043fac8 64f6a79f 76860000 64f618a0 76860000 KERNELBASE!GetProcAddress+0x44 (FPO: [Non-Fpo]) 07 0043fadc 64f6a59c 64f618a0 64f61898 64f618a0 VCRUNTIME140D!try_get_proc_address_from_first_available_module+0x2f (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_downlevel.cpp @ 183] 08 0043fb00 64f6a4b9 00000002 64f618a0 64f61898 VCRUNTIME140D!try_get_function+0x4c (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_downlevel.cpp @ 211] 09 0043fb18 64f6a89b 0043fb3c 0fa59122 00000004 VCRUNTIME140D!try_get_FlsGetValue+0x19 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_downlevel.cpp @ 254] 0a 0043fb2c 64f6a327 00000004 00000000 0043fb48 VCRUNTIME140D!__vcrt_FlsGetValue+0xb (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_downlevel.cpp @ 281] 0b 0043fb44 64f69c5b 0043fb60 0043fc58 0043fb64 VCRUNTIME140D!__vcrt_getptd_noinit+0x27 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\per_thread_data.cpp @ 152] 0c 0043fb58 0fce4838 0043fc50 001522a1 466c223c VCRUNTIME140D!__uncaught_exception+0xb (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\eh\uncaught_exception.cpp @ 21] *** WARNING: Unable to verify checksum for file_search2.exe *** ERROR: Module load completed but symbols could not be loaded for file_search2.exe 0d 0043fb60 001522a1 466c223c 0043fdbc 0043fc58 MSVCP140D!std::uncaught_exception+0x8 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdcpp\uncaught_exception.cpp @ 9] WARNING: Stack unwind information not available. Following frames may be wrong. 0e 0043fc50 00151c62 466c23a0 0043feac 0043fde0 file_search2+0x122a1 0f 0043fdcc 0015263f 0fd5cbe0 00159b30 001512a3 file_search2+0x11c62 10 0043feac 00152e43 00000001 0022d538 0022f1b8 file_search2+0x1263f 11 0043fecc 00152c97 466c2144 00000000 00000000 file_search2+0x12e43 12 0043ff28 00152b2d 0043ff38 00152ec8 0043ff44 file_search2+0x12c97 13 0043ff30 00152ec8 0043ff44 768aef3c 7ffdf000 file_search2+0x12b2d 14 0043ff38 768aef3c 7ffdf000 0043ff84 77863618 file_search2+0x12ec8 15 0043ff44 77863618 7ffdf000 77ad8c61 00000000 kernel32!BaseThreadInitThunk+0xe (FPO: [Non-Fpo]) 16 0043ff84 778635eb 001513b1 7ffdf000 00000000 ntdll!__RtlUserThreadStart+0x70 (FPO: [Non-Fpo]) 17 0043ff9c 00000000 001513b1 7ffdf000 00000000 ntdll!_RtlUserThreadStart+0x1b (FPO: [Non-Fpo]) 1 Id: 2e40.2e88 Suspend: 0 Teb: 7ffdd000 Unfrozen # ChildEBP RetAddr Args to Child 00 005af448 778609ba 77b48721 00000001 00000000 ntdll!RtlActivateActivationContextUnsafeFast+0x9c (FPO: [Non-Fpo]) 01 005af4c4 7785fa3e 0022eb70 778d82e0 00000000 ntdll!LdrpProcessStaticImports+0x1b8 (FPO: [Non-Fpo]) 02 005af640 77862105 005af694 778d82e0 00000000 ntdll!LdrpLoadDll+0x33d (FPO: [Non-Fpo]) 03 005af678 000700c5 00000000 00000000 005af694 ntdll!LdrLoadDll+0xaf (FPO: [Non-Fpo]) WARNING: Frame IP not in any known module. Following frames may be wrong. 04 005af6b8 77846acd 00070000 00000000 00000000 0x700c5 05 005af9e8 77863486 005afa0c 77800000 00000000 ntdll!KiUserApcDispatcher+0x25 06 005af9f8 00000000 005afa0c 77800000 00000000 ntdll!LdrInitializeThunk+0x10 (FPO: [Non-Fpo])
追記:最初コメント頂いたときアカウント名があれだし(笑)、「ん?どう見てもVSの問題じゃないの?」と正直思いました(笑)。でも、せっかくお付き合いしてくださってるんだし頑張ってみるかと。でも、DLL Injectonじゃないのかと言われたときは、「ああ、なるほど。それがあるのか」と思いました。ここは経験の差ですね。ACCESS_VIOLATIONはたまに遭遇するのですが、よくわからない場合が多いので、トライ・アンド・エラー的な対応しかやってなかったので、この際いい機会なのでとちょっと頑張ってます。
-
このアカウント名は、超お気に入りです。
もっともこのアカウント名が原因 (?) で、私は Microsoft コミュニティを追放されましたけど。wwwwCall Stack の表示で waring が出るのは、よくあることです。
warnig が出る理由は。。。。
Stack Frame はシステム (NT カーネル?) により最適化される場合があるので、その場合関数コール時のパラメータ値が Stack Frame に残っていないケースがあり、そのときに warining が出るようです。
つまり、「この Stack Frame を調べるときは注意しろ!!」という意味なんだと思います。
もっとも x64 環境の場合は、関数コール時の Parameter 1~4 まではレジスタ経由になってしまったので、昨今のデバッグでは Stack Frame を無条件で信頼するケースはほとんどありませんけど。で、全スレッドの Call Stack ですが、Thread 1 はやっぱり外部プロセスからの DLL Injection 用に生成された Thread っぽいですね。
しかも、KERNELBASE!LoadLibraryExW ぢゃなくて ntdll!LdrLoadDll を利用してくるとは。wwww
今回のダンプは幸いにも 32 Bit Process なので、以下のコマンドでロードしようとしている DLL を特定できると思います。
(ちなみに、DLL Injection を仕掛けたプロセスを知りたいなら、"Process Monitor" と併用して調べれば特定できると思います。)dt ntdll!_UNICODE_STRING 005af694 -r -
でました。
0:000> dt ntdll!_UNICODE_STRING 005af694 -r "C:\Windows\system32\tmumh\20019\AddOn\7.0.0.1162\TmUmEvt.dll" +0x000 Length : 0x78 +0x002 MaximumLength : 0x78 +0x004 Buffer : 0x00070428 "C:\Windows\system32\tmumh\20019\AddOn\7.0.0.1162\TmUmEvt.dll"
予想通り、トレンドマイクロのウィルスバスター関係のDLLでした。(DLLの詳細を見ると、「Trend Micro User-Mode Hook Event Module」というものらしいです。
推測ですが、VSのデバッガーがコンソールウィンドウを閉じないようにするためにシステムを何かHookするような処理がウィルスバスターのリアルタイム検出の処理がなにかバッティングしてるんでしょうね。(ウィルスバスターがウィルスみたいな行為をしてるようにも見えますが。)
ここまでですね。これ以上はウィルスバスターを外さないとだめなので。(コーポレートエディションなので一時的に無効にしたりできない)。うちのシステム担当に報告してもいいけどそれもまた面倒だし、トレンドマイクロがすぐに対応してくれるとは限らないので。
色々とお付き合いして頂きありがとうございました。また、何かの機会がありましたらよろしくおねがいします。
ではでは。
-
うーーーーーん。。。。謎がさらに深まってしまいました。
"TmUmEvt.dll" は恐らく API Hook 用の DLL だと思いますが、ロード要求のタイミングが遅すぎる。
一般的に、アンチウィルス系ソフトウェアは、カーネル モード側でプロセスやスレッドの生成/消滅状況を監視していて、生成要求が発生すると、その初期段階で API Hook DLL をターゲット プロセス内にインジェクションします。
そう考えると、Thread 1 の "TmUmEvt.dll" ロード要求は、明らかに遅すぎる。
根本原因は、もっと別のところにありそうな気がします。もしまだ調べる気があるなら、Thread 0 と Thread 1 の相関関係を調べれば何かわかるかも。
Thread 1 の "ntdll!RtlActivateActivationContextUnsafeFast+0x9c" での STATUS_ACCESS_VIOLATION (0xC0000005) が発生するとき、メイン スレッドである Thread 0 の状態が常に同じならば、問題は Visual Studio 側にあるような気がしてきました。
Thread 0 の以下の部分で何が起きたのが、非常に気になる。。。0d 0043fb60 001522a1 466c223c 0043fdbc 0043fc58 MSVCP140D!std::uncaught_exception+0x8 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdcpp\uncaught_exception.cpp @ 9] 0e 0043fc50 00151c62 466c23a0 0043feac 0043fde0 file_search2+0x122a1
-
> Thread 1 の "ntdll!RtlActivateActivationContextUnsafeFast+0x9c" での STATUS_ACCESS_VIOLATION (0xC0000005) が発生するとき、メイン スレッドである Thread 0 の状態が常に同じならば、問題は Visual Studio 側にあるような気がしてきました。
これ、具体的にどうやって何を調べんたらいいんでしょう?(まだ調べることは可能です)
ウィルスバスターで読み込まれるDLLはもう一つあるようで、「tmmon.dll」というDLLで、User Monitor Hookingのエンジンらしいです。(例外発生時にはまだ読み込まれていないみたいですが)
それと、Windows10 x64では起きないって言いましたけど、32bitアプリとしてコンソールアプリを動かしたときは起きないのですが、64bitアプリとしてコンソールアプリを起動したときは発生することがわかりました。でも、エラー内容が違います。
例外の内容は、
例外がスローされました:読み取りアクセス違反。
wer_NULL_THUNK_DATA_DLA が 0x11101110111011A でした。
で、呼出履歴は、
> combase.dll!Microsoft::WRL::Module<1,Microsoft::WRL::Details::DefaultModule<1> >::Create() 行 1471 C++ combase.dll!Microsoft::WRL::Module<1,Microsoft::WRL::Details::DefaultModule<1> >::StaticInitialize() 行 1447 C++ combase.dll!`dynamic initializer for 'Microsoft::WRL::Module<1,Microsoft::WRL::Details::DefaultModule<1> >::isInitialized''() 行 1554 C++ ucrtbase.dll!_initterm() 不明 combase.dll!dllmain_crt_process_attach(HINSTANCE__ * const instance=0x00007ffb60ca0000, void * const reserved=0x0000000000000000) 行 65 C++ combase.dll!dllmain_dispatch(HINSTANCE__ * const instance=0x00007ffb60ca0000, const unsigned long reason=1, void * const reserved=0x0000000000000000) 行 194 C++ ntdll.dll!LdrpCallInitRoutine() 不明 ntdll.dll!LdrpInitializeNode() 不明 ntdll.dll!LdrpInitializeGraphRecurse() 不明 ntdll.dll!LdrpInitializeGraphRecurse() 不明 ntdll.dll!LdrpInitializeGraphRecurse() 不明 ntdll.dll!LdrpPrepareModuleForExecution() 不明 ntdll.dll!LdrpLoadDllInternal() 不明 ntdll.dll!LdrpLoadDll() 不明 ntdll.dll!LdrLoadDll() 不明 0000028e28900124() 不明
と、なっており、例外発生はntdll.dllではなくcombase.dllになっていました。
実は、今月末くらいで、会社のデスクトップがWindows10 x64に切り替わる事になっていて、実際の移行には時間がかかりますが、精々来月半ばくらいまでがWindows7 x86で確認できるリミットになると思います。
(Windows7も来年早々にサポート切れになるので)
-
> これ、具体的にどうやって何を調べんたらいいんでしょう?(まだ調べることは可能です)
前回同様、VS 2019 上で対象プログラムを実行し例外現象を発生させ、その状態のプロセス ダンプを複数個採取してください。
それら採取した複数のダンプ ファイルを WinDBG 上で開き、"~*kvn" コマンドで Thread 0, 1 の状態を確認し、それぞれの Thread の Call Stack の状態が常に同じなのか、それとも異なるのかを確認してみてください。何を気にしているかというと。。。。
外部プロセスからの DLL Injection が今回の例外の要因になっているとしても、それが STATUS_ACCESS_VIOLATION エラー発生の理由にはなり得ないと思うのです。
DLL Injection の処理自体が、STATUS_ACCESS_VIOLATION を発生させるわけでもないし、とにかくこの現象を説明できるシナリオが思い浮かばない。(要するに、論理的にこの現象を説明できない。)
となると、今回確認した DLL Injection は単にタイミング的にそうなっただけで、それ以外にも例外が発生するケースがあるのでは。。。。と思えてきたのです。
なので、同一状況下での複数のダンプを採取し、それらの共通項を見つけられれば、この問題の根本原因を突き止められるのでは。。。。と思うのです。
なお、x64 環境でのデバッグは x86 よりも面倒なので、コールスタックだけを見ても、なんともいえません。 -
それぞれ3~4分間をおいて3回取りました。
1回め
0:000> ~*kvn . 0 Id: 15e8.2608 Suspend: 0 Teb: 7ffde000 Unfrozen # ChildEBP RetAddr Args to Child 00 0031f7cc 770a65ac 77091db1 00000020 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0]) 01 0031f7d0 77091db1 00000020 00000000 00000000 ntdll!NtWaitForSingleObject+0xc (FPO: [3,0,0]) 02 0031f834 77091c95 00000000 00000000 0031f89c ntdll!RtlpWaitOnCriticalSection+0x13e (FPO: [Non-Fpo]) 03 0031f85c 770bf82b 77138340 76f0ef11 0f5e18a0 ntdll!RtlEnterCriticalSection+0x150 (FPO: [Non-Fpo]) 04 0031f8f8 770c208c 757f0000 0031f934 00000000 ntdll!LdrGetProcedureAddressEx+0x159 (FPO: [Non-Fpo]) 05 0031f914 750a6d18 757f0000 0031f934 00000000 ntdll!LdrGetProcedureAddress+0x18 (FPO: [Non-Fpo]) 06 0031f93c 0f5ea79f 757f0000 0f5e18a0 757f0000 KERNELBASE!GetProcAddress+0x44 (FPO: [Non-Fpo]) 07 0031f950 0f5ea59c 0f5e18a0 0f5e1898 0f5e18a0 VCRUNTIME140D!try_get_proc_address_from_first_available_module+0x2f (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_downlevel.cpp @ 183] 08 0031f974 0f5ea4b9 00000002 0f5e18a0 0f5e1898 VCRUNTIME140D!try_get_function+0x4c (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_downlevel.cpp @ 211] 09 0031f98c 0f5ea89b 0031f9b0 0f899122 00000004 VCRUNTIME140D!try_get_FlsGetValue+0x19 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_downlevel.cpp @ 254] 0a 0031f9a0 0f5ea327 00000004 00000000 0031f9bc VCRUNTIME140D!__vcrt_FlsGetValue+0xb (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_downlevel.cpp @ 281] 0b 0031f9b8 0f5e9c5b 0031f9d4 0031facc 0031f9d8 VCRUNTIME140D!__vcrt_getptd_noinit+0x27 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\per_thread_data.cpp @ 152] 0c 0031f9cc 10004838 0031fac4 00f123c1 c512599b VCRUNTIME140D!__uncaught_exception+0xb (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\eh\uncaught_exception.cpp @ 21] *** WARNING: Unable to verify checksum for file_search2.exe 0d 0031f9d4 00f123c1 c512599b 0031fc30 0031facc MSVCP140D!std::uncaught_exception+0x8 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdcpp\uncaught_exception.cpp @ 9] 0e 0031fac4 00f11cd2 c5125f1f 0031fd3c 00000000 file_search2+0x123c1 (FPO: [Non-Fpo]) 0f 0031fc40 00f12885 1007cbe0 00f19b58 c5125e13 file_search2+0x11cd2 (FPO: [Non-Fpo]) 10 0031fd4c 00f131f3 00000001 000fd398 000ff0a8 file_search2+0x12885 (FPO: [Non-Fpo]) 11 0031fd6c 00f13047 c5125e97 00000000 00000000 file_search2+0x131f3 (FPO: [Non-Fpo]) 12 0031fdc8 00f12edd 0031fdd8 00f13278 0031fde4 file_search2+0x13047 (FPO: [Non-Fpo]) 13 0031fdd0 00f13278 0031fde4 7583ef3c 7ffdf000 file_search2+0x12edd (FPO: [Non-Fpo]) 14 0031fdd8 7583ef3c 7ffdf000 0031fe24 770c3618 file_search2+0x13278 (FPO: [Non-Fpo]) 15 0031fde4 770c3618 7ffdf000 76f0e9cd 00000000 kernel32!BaseThreadInitThunk+0xe (FPO: [Non-Fpo]) 16 0031fe24 770c35eb 00f113e3 7ffdf000 00000000 ntdll!__RtlUserThreadStart+0x70 (FPO: [Non-Fpo]) 17 0031fe3c 00000000 00f113e3 7ffdf000 00000000 ntdll!_RtlUserThreadStart+0x1b (FPO: [Non-Fpo]) 1 Id: 15e8.2c48 Suspend: 0 Teb: 7ffdd000 Unfrozen # ChildEBP RetAddr Args to Child 00 0052f3c8 770c09ba 7693e3ad 00000001 00000000 ntdll!RtlActivateActivationContextUnsafeFast+0x9c (FPO: [Non-Fpo]) 01 0052f444 770bfa3e 000fe9d0 771382e0 00000000 ntdll!LdrpProcessStaticImports+0x1b8 (FPO: [Non-Fpo]) 02 0052f5c0 770c2105 0052f614 771382e0 00000000 ntdll!LdrpLoadDll+0x33d (FPO: [Non-Fpo]) 03 0052f5f8 000700c5 00000000 00000000 0052f614 ntdll!LdrLoadDll+0xaf (FPO: [Non-Fpo]) WARNING: Frame IP not in any known module. Following frames may be wrong. 04 0052f638 770a6acd 00070000 00000000 00000000 0x700c5 05 0052f968 770c3486 0052f98c 77060000 00000000 ntdll!KiUserApcDispatcher+0x25 06 0052f978 00000000 0052f98c 77060000 00000000 ntdll!LdrInitializeThunk+0x10 (FPO: [Non-Fpo])
2回め
0:000> ~*kvn . 0 Id: 248c.3598 Suspend: 0 Teb: 7ffdf000 Unfrozen # ChildEBP RetAddr Args to Child 00 0015f31c 770a65ac 77091db1 00000020 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0]) 01 0015f320 77091db1 00000020 00000000 00000000 ntdll!NtWaitForSingleObject+0xc (FPO: [3,0,0]) 02 0015f384 77091c95 00000000 00000000 0015f3ec ntdll!RtlpWaitOnCriticalSection+0x13e (FPO: [Non-Fpo]) 03 0015f3ac 770bf82b 77138340 76d1f817 0f9118a0 ntdll!RtlEnterCriticalSection+0x150 (FPO: [Non-Fpo]) 04 0015f448 770c208c 757f0000 0015f484 00000000 ntdll!LdrGetProcedureAddressEx+0x159 (FPO: [Non-Fpo]) 05 0015f464 750a6d18 757f0000 0015f484 00000000 ntdll!LdrGetProcedureAddress+0x18 (FPO: [Non-Fpo]) 06 0015f48c 0f91a79f 757f0000 0f9118a0 757f0000 KERNELBASE!GetProcAddress+0x44 (FPO: [Non-Fpo]) 07 0015f4a0 0f91a59c 0f9118a0 0f911898 0f9118a0 VCRUNTIME140D!try_get_proc_address_from_first_available_module+0x2f (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_downlevel.cpp @ 183] 08 0015f4c4 0f91a4b9 00000002 0f9118a0 0f911898 VCRUNTIME140D!try_get_function+0x4c (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_downlevel.cpp @ 211] 09 0015f4dc 0f91a89b 0015f500 0fd39122 00000004 VCRUNTIME140D!try_get_FlsGetValue+0x19 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_downlevel.cpp @ 254] 0a 0015f4f0 0f91a327 00000004 00000000 0015f50c VCRUNTIME140D!__vcrt_FlsGetValue+0xb (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_downlevel.cpp @ 281] 0b 0015f508 0f919c5b 0015f524 0015f61c 0015f528 VCRUNTIME140D!__vcrt_getptd_noinit+0x27 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\per_thread_data.cpp @ 152] 0c 0015f51c 0f2d4838 0015f614 00f123c1 c5653452 VCRUNTIME140D!__uncaught_exception+0xb (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\eh\uncaught_exception.cpp @ 21] *** WARNING: Unable to verify checksum for file_search2.exe 0d 0015f524 00f123c1 c5653452 0015f780 0015f61c MSVCP140D!std::uncaught_exception+0x8 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdcpp\uncaught_exception.cpp @ 9] 0e 0015f614 00f11cd2 c56535d6 0015f88c 00000000 file_search2+0x123c1 (FPO: [Non-Fpo]) 0f 0015f790 00f12885 0f34cbe0 00f19b58 c5653ada file_search2+0x11cd2 (FPO: [Non-Fpo]) 10 0015f89c 00f131f3 00000001 0037d398 0037f0a8 file_search2+0x12885 (FPO: [Non-Fpo]) 11 0015f8bc 00f13047 c5653b5e 00000000 00000000 file_search2+0x131f3 (FPO: [Non-Fpo]) 12 0015f918 00f12edd 0015f928 00f13278 0015f934 file_search2+0x13047 (FPO: [Non-Fpo]) 13 0015f920 00f13278 0015f934 7583ef3c 7ffdd000 file_search2+0x12edd (FPO: [Non-Fpo]) 14 0015f928 7583ef3c 7ffdd000 0015f974 770c3618 file_search2+0x13278 (FPO: [Non-Fpo]) 15 0015f934 770c3618 7ffdd000 76d1f52b 00000000 kernel32!BaseThreadInitThunk+0xe (FPO: [Non-Fpo]) 16 0015f974 770c35eb 00f113e3 7ffdd000 00000000 ntdll!__RtlUserThreadStart+0x70 (FPO: [Non-Fpo]) 17 0015f98c 00000000 00f113e3 7ffdd000 00000000 ntdll!_RtlUserThreadStart+0x1b (FPO: [Non-Fpo]) 1 Id: 248c.2bc8 Suspend: 0 Teb: 7ffde000 Unfrozen # ChildEBP RetAddr Args to Child 00 002bf438 770c09ba 76eff8eb 00000001 00000000 ntdll!RtlActivateActivationContextUnsafeFast+0x9c (FPO: [Non-Fpo]) 01 002bf4b4 770bfa3e 0037e9d0 771382e0 00000000 ntdll!LdrpProcessStaticImports+0x1b8 (FPO: [Non-Fpo]) 02 002bf630 770c2105 002bf684 771382e0 00000000 ntdll!LdrpLoadDll+0x33d (FPO: [Non-Fpo]) 03 002bf668 001700c5 00000000 00000000 002bf684 ntdll!LdrLoadDll+0xaf (FPO: [Non-Fpo]) WARNING: Frame IP not in any known module. Following frames may be wrong. 04 002bf6a8 770a6acd 00170000 00000000 00000000 0x1700c5 05 002bf9d8 770c3486 002bf9fc 77060000 00000000 ntdll!KiUserApcDispatcher+0x25 06 002bf9e8 00000000 002bf9fc 77060000 00000000 ntdll!LdrInitializeThunk+0x10 (FPO: [Non-Fpo])
3回目
0:000> ~*kvn . 0 Id: 3298.251c Suspend: 0 Teb: 7ffde000 Unfrozen # ChildEBP RetAddr Args to Child 00 002af5a4 770a65ac 77091db1 00000020 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0]) 01 002af5a8 77091db1 00000020 00000000 00000000 ntdll!NtWaitForSingleObject+0xc (FPO: [3,0,0]) 02 002af60c 77091c95 00000000 00000000 002af674 ntdll!RtlpWaitOnCriticalSection+0x13e (FPO: [Non-Fpo]) 03 002af634 770bf82b 77138340 76e32319 0f4c18a0 ntdll!RtlEnterCriticalSection+0x150 (FPO: [Non-Fpo]) 04 002af6d0 770c208c 757f0000 002af70c 00000000 ntdll!LdrGetProcedureAddressEx+0x159 (FPO: [Non-Fpo]) 05 002af6ec 750a6d18 757f0000 002af70c 00000000 ntdll!LdrGetProcedureAddress+0x18 (FPO: [Non-Fpo]) 06 002af714 0f4ca79f 757f0000 0f4c18a0 757f0000 KERNELBASE!GetProcAddress+0x44 (FPO: [Non-Fpo]) 07 002af728 0f4ca59c 0f4c18a0 0f4c1898 0f4c18a0 VCRUNTIME140D!try_get_proc_address_from_first_available_module+0x2f (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_downlevel.cpp @ 183] 08 002af74c 0f4ca4b9 00000002 0f4c18a0 0f4c1898 VCRUNTIME140D!try_get_function+0x4c (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_downlevel.cpp @ 211] 09 002af764 0f4ca89b 002af788 0f249122 00000004 VCRUNTIME140D!try_get_FlsGetValue+0x19 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_downlevel.cpp @ 254] 0a 002af778 0f4ca327 00000004 00000000 002af794 VCRUNTIME140D!__vcrt_FlsGetValue+0xb (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_downlevel.cpp @ 281] 0b 002af790 0f4c9c5b 002af7ac 002af8a4 002af7b0 VCRUNTIME140D!__vcrt_getptd_noinit+0x27 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\per_thread_data.cpp @ 152] 0c 002af7a4 0fb74838 002af89c 00f123c1 84a6c7d0 VCRUNTIME140D!__uncaught_exception+0xb (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\eh\uncaught_exception.cpp @ 21] *** WARNING: Unable to verify checksum for file_search2.exe 0d 002af7ac 00f123c1 84a6c7d0 002afa08 002af8a4 MSVCP140D!std::uncaught_exception+0x8 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdcpp\uncaught_exception.cpp @ 9] 0e 002af89c 00f11cd2 84a6c554 002afb14 00000000 file_search2+0x123c1 (FPO: [Non-Fpo]) 0f 002afa18 00f12885 0fbecbe0 00f19b58 84a6c468 file_search2+0x11cd2 (FPO: [Non-Fpo]) 10 002afb24 00f131f3 00000001 005bd398 005bf0a8 file_search2+0x12885 (FPO: [Non-Fpo]) 11 002afb44 00f13047 84a6c4ec 00000000 00000000 file_search2+0x131f3 (FPO: [Non-Fpo]) 12 002afba0 00f12edd 002afbb0 00f13278 002afbbc file_search2+0x13047 (FPO: [Non-Fpo]) 13 002afba8 00f13278 002afbbc 7583ef3c 7ffdf000 file_search2+0x12edd (FPO: [Non-Fpo]) 14 002afbb0 7583ef3c 7ffdf000 002afbfc 770c3618 file_search2+0x13278 (FPO: [Non-Fpo]) 15 002afbbc 770c3618 7ffdf000 76e32e35 00000000 kernel32!BaseThreadInitThunk+0xe (FPO: [Non-Fpo]) 16 002afbfc 770c35eb 00f113e3 7ffdf000 00000000 ntdll!__RtlUserThreadStart+0x70 (FPO: [Non-Fpo]) 17 002afc14 00000000 00f113e3 7ffdf000 00000000 ntdll!_RtlUserThreadStart+0x1b (FPO: [Non-Fpo]) 1 Id: 3298.34c0 Suspend: 0 Teb: 7ffdd000 Unfrozen # ChildEBP RetAddr Args to Child 00 0048f4c8 770c09ba 7681208d 00000001 00000000 ntdll!RtlActivateActivationContextUnsafeFast+0x9c (FPO: [Non-Fpo]) 01 0048f544 770bfa3e 005be9d0 771382e0 00000000 ntdll!LdrpProcessStaticImports+0x1b8 (FPO: [Non-Fpo]) 02 0048f6c0 770c2105 0048f714 771382e0 00000000 ntdll!LdrpLoadDll+0x33d (FPO: [Non-Fpo]) 03 0048f6f8 000700c5 00000000 00000000 0048f714 ntdll!LdrLoadDll+0xaf (FPO: [Non-Fpo]) WARNING: Frame IP not in any known module. Following frames may be wrong. 04 0048f738 770a6acd 00070000 00000000 00000000 0x700c5 05 0048fa68 770c3486 0048fa8c 77060000 00000000 ntdll!KiUserApcDispatcher+0x25 06 0048fa78 00000000 0048fa8c 77060000 00000000 ntdll!LdrInitializeThunk+0x10 (FPO: [Non-Fpo])
どこを比較すればいいのか・・・。実行の度にアドレスが変わるので。
よろしくおねがいします。
-
3 つとも、Thread 0 と 1 の状態が全く同じ。。。。ということは、Thread 1 での ntdll!LdrLoadDll が問題なのではなく、Thread 0 の file_search2+0x123c1 での例外が、Thread 1 の ntdll!LdrLoadDll を誘発させている可能性があります。
VS デバッガ上で例外が発生したときに、デバッグ対象スレッドをコンソール プログラムのメイン スレッドんび切り替え、file_search2+0x123c1 で何の処理を行っているのか、確認してみてください。
(VS デバッガの場合、デバッグ 対象スレッドの切り替えは、画面上部の "スレッド" リスト ボックスで変更できるみたいです。) -
メインスレッドに切り替えるとソースコードでは「cout << "Hello world!" << endl;」を指していました。アセンブラで見ると
010E286E mov dword ptr [ebp-4],0 std::cout << "Hello World!" << std::endl; 010E2875 push offset string "Hello World!" (010E9B58h) 010E287A mov eax,dword ptr [_imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A (010ED0D4h)] 010E287F push eax 010E2880 call std::operator<<<std::char_traits<char> > (010E1221h) 010E2885 add esp,8 010E2888 mov dword ptr [ebp-0ECh],eax 010E288E mov esi,esp 010E2890 push offset std::endl<char,std::char_traits<char> > (010E12C6h) 010E2895 mov ecx,dword ptr [ebp-0ECh] 010E289B call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (010ED0A0h)] 010E28A1 cmp esi,esp 010E28A3 call __RTC_CheckEsp (010E12A3h)
「アドレス010E2885 add esp,8」を指しているので、その直前のcall文で例外が発生しているようです。
コンソールにはHello world!は表示されているので、表示した直後ということなのでしょうね。
追記:
実際にアセンブラ表示でステップ実行してみました。やはりcall文の中の何処かのようです。アセンブラ表示に切り替えてステップ実行で見てみましたが、なかなか難しいですね。(何年ぶりだろうアセンブラでデバッグしたのは・・・)
追追記:
意地になってアセンブラを追いかけてみました。どうも<ostrem>の~sentryの中で呼ばれているuncaught_exceptionの中の、__vcrt_FlsGetValueの、_LdrGetProcedureAddressExの中で落ちていました。
ostremaのC++ライブラリが臭い?
- 編集済み pine 2019年6月14日 8:23
-
> 010E2880 call std::operator<<<std::char_traits<char> > (010E1221h)
上記のようなアドレス表示になっている場合は、以下のコマンドを入力し、その出力結果を教えてください。
(要するに、カッコ表示されているアドレスで u コマンドを実行してほしいです。)u 010E1221 10
それから、Build 時の Run-time Library を以下の設定に変更したバイナリで、もう一度試してもらえますか?
--------------------------------
<お願いしたいこと>
Target Project のプロパティを開き、[構成プロパティ] -> [C/C++] -> [コード生成] の「ランタイム ライブラリ」の設定を確認してください。
現在は恐らく、「マルチスレッド デバッグ DLL (/MDd)」になっていると思います。
これを「マルチスレッド デバッグ (/MTd)」 および「マルチスレッド DLL (/MD)」に変更し、リビルドおよびデバッグ実行した場合の結果が知りたい。
-------------------------------- -
VS デバッガ上で "std::cout << "Hello World!" << std::endl;" の行に Breakpoint を設定後実行し、ここに Break-in した状態で以下のコマンドを実行し、その出力結果を教えてください。
なお下記のアドレス部分は、先に提示された下記逆アセンブリ コードを基にしたものですが、リビルド等によりアドレスが変化している可能性があるので、事前に確認してからコマンド結果を採取して下ください。
コマンド採取例の前提となるコード
010E286E mov dword ptr [ebp-4],0 std::cout << "Hello World!" << std::endl; 010E2875 push offset string "Hello World!" (010E9B58h) 010E287A mov eax,dword ptr [_imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A (010ED0D4h)] 010E287F push eax 010E2880 call std::operator<<<std::char_traits<char> > (010E1221h) 010E2885 add esp,8 010E2888 mov dword ptr [ebp-0ECh],eax 010E288E mov esi,esp 010E2890 push offset std::endl<char,std::char_traits<char> > (010E12C6h) 010E2895 mov ecx,dword ptr [ebp-0ECh] 010E289B call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (010ED0A0h)] 010E28A1 cmp esi,esp 010E28A3 call __RTC_CheckEsp (010E12A3h)
-------------------------------------
<確認してほしいコマンド>
☆ db 0x010E9B58
☆ u 0x010ED0D4
☆ u 0x010E1221
-------------------------------------比較参考のため、私が (不慣れな) VS デバッガで採取した結果を添付しておきます。
9: std::cout << "Hello World!" << std::endl; 012B243E 8B F4 mov esi,esp 012B2440 68 96 10 2B 01 push offset std::endl<char,std::char_traits<char> > (012B1096h) ^^^^^^^^^^^ ① 012B2445 68 30 8B 2B 01 push offset string "Hello World!" (012B8B30h) ^^^^^^^^^^^ ② 012B244A A1 D4 C0 2B 01 mov eax,dword ptr [_imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A (012BC0D4h)] ^^^^^^^^^^^ ③ 012B244F 50 push eax 012B2450 E8 25 EF FF FF call std::operator<<<std::char_traits<char> > (012B137Ah) ^^^^^^^^^^^ ④ 012B2455 83 C4 08 add esp,8 012B2458 8B C8 mov ecx,eax 012B245A FF 15 A0 C0 2B 01 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (012BC0A0h)] 012B2460 3B F4 cmp esi,esp 012B2462 E8 FC EC FF FF call __RTC_CheckEsp (012B1163h)
++++++++++++++++++++++++++++
①
>u 0x012b1096
std::endl<char,std::char_traits<char> >:
012B1096 jmp std::endl<char,std::char_traits<char> > (012B1DB0h)
^^^^^^^^>u 0x012B1DB0
--- c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.14.26428\include\ostream
012B1DB0 push ebp
012B1DB1 mov ebp,esp
012B1DB3 sub esp,0C0h
012B1DB9 push ebx
012B1DBA push esi
012B1DBB push edi
012B1DBC lea edi,[ebp-0C0h]
012B1DC2 mov ecx,30h
++++++++++++++++++++++++++++
②
>db 0x012B8B30
0x012B8B30 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 00 00 00 00
^^^^^^^^^^^^^^^^^^^^^^^
Hello World!
++++++++++++++++++++++++++++
③
>u 0x012BC0D4
012BC0D4 loopne KERNEL32_NULL_THUNK_DATA+35h (012BC091h)
012BC0D6 stc
012BC0D7 push ecx
012BC0D8 ror byte ptr [edx+esi*8+51h],0
012BC0DD add byte ptr [eax],al
012BC0DF add byte ptr [eax],al
012BC0E1 add byte ptr [eax],al
012BC0E3 add byte ptr [eax],al0x012BC0D4 : ConsoleApplication1!_imp_?coutstd:
++++++++++++++++++++++++++++
④
>u 0x012b137a
std::operator<<<std::char_traits<char> >:
012B137A jmp std::operator<<<std::char_traits<char> > (012B17E0h)
_sprintf_s:
012B137F jmp sprintf_s (012B3470h)
_InitializeSListHead@4:
012B1384 jmp _InitializeSListHead@4 (012B58FDh)
___scrt_stub_for_is_c_termination_complete:
012B1389 jmp __scrt_stub_for_is_c_termination_complete (012B5990h)>u 0x012B17E0
--- c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.14.26428\include\ostream
std::operator<<<std::char_traits<char> >:
012B17E0 push ebp
012B17E1 mov ebp,esp
012B17E3 push 0FFFFFFFFh
012B17E5 push 12B6D58h
012B17EA mov eax,dword ptr fs:[00000000h]
012B17F0 push eax
012B17F1 push ecx
012B17F2 sub esp,154h
++++++++++++++++++++++++++++
- 編集済み お馬鹿 2019年6月15日 5:46
-
おはようございます。
もし、足りないものがあれば言ってください。
00C3283E mov dword ptr [ebp-4],0 std::cout << "Hello World!" << std::endl; 00C32845 push offset string "Hello World!" (0C38B58h) 00C3284A mov eax,dword ptr [_imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A (0C3C0D4h)] 00C3284F push eax 00C32850 call std::operator<<<std::char_traits<char> > (0C3121Ch) 00C32855 add esp,8 00C32858 mov dword ptr [ebp-0ECh],eax 00C3285E mov esi,esp 00C32860 push offset std::endl<char,std::char_traits<char> > (0C312C1h) 00C32865 mov ecx,dword ptr [ebp-0ECh] 00C3286B call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0C3C0A0h)] 00C32871 cmp esi,esp 00C32873 call __RTC_CheckEsp (0C3129Eh) >db 0x0c38B58 0x00C38B58 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 00 00 00 00 >u 0x0C3C0D4 00C3C0D4 loopne __imp_std::basic_ostream<char,std::char_traits<char> >::operator<<+1h (0C3C0A1h) 00C3C0D6 cmps byte ptr [esi],byte ptr es:[edi] 00C3C0D7 wrmsr 00C3C0D9 dec eax 00C3C0DA lahf 00C3C0DB sldt word ptr [eax] 00C3C0DE add byte ptr [eax],al 00C3C0E0 add byte ptr [eax],al >u 0x0C3121C std::operator<<<std::char_traits<char> >: 00C3121C jmp std::operator<<<std::char_traits<char> > (0C31850h) std::basic_ostream<char,std::char_traits<char> >::operator<<: 00C31221 jmp std::basic_ostream<char,std::char_traits<char> >::operator<< (0C329EAh) ___scrt_is_nonwritable_in_current_image: 00C31226 jmp __scrt_is_nonwritable_in_current_image (0C33EF3h) std::basic_ios<char,std::char_traits<char> >::widen: 00C3122B jmp std::basic_ios<char,std::char_traits<char> >::widen (0C329DEh) _GetCurrentProcessId@0: 00C31230 jmp _GetCurrentProcessId@0 (0C34FBAh) __initterm: 00C31235 jmp __initterm (0C34EE2h) __JustMyCode_Default: 00C3123A jmp _JustMyCode_Default (0C327E0h) __RTC_SetErrorFunc: 00C3123F jmp _RTC_SetErrorFunc (0C33BC6h) >u 0x0C31850 --- C:\Program Files\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.21.27702\include\ostream std::operator<<<std::char_traits<char> >: 00C31850 push ebp 00C31851 mov ebp,esp 00C31853 push 0FFFFFFFFh 00C31855 push 0C363A8h 00C3185A mov eax,dword ptr fs:[00000000h] 00C31860 push eax 00C31861 push ecx 00C31862 sub esp,154h
-
うーーーーーん、全く問題ありませんね。。。。まぁ、当然なんですけど。。。根本的な発想が間違ってるのかな。。。。
Thread 1 の DLL Injection のスレッドで例外が発生するとき、Thread 0 の状態は常に同じ。。。。ということは、Thread 1 は Thread 0 での何らかの処理に起因して生成されていると思うのです。
で、それが本問題の一番大元となる要因では。。。と考え、とりあえず "Hello World!" 文字列出力処理での各関数が仮想メモリ上にロードされているかを確認してもらったわけですけど、当然それらはロードされていた。
となると、Thread 0 の "KERNELBASE!GetProcAddress" では、なんの関数アドレスを調べてるんだろう?。。。。という訳で、以下の内容を確認してもらえますか?-----------------------------------------------------
<確認してほしいこと>どれでもいいので、過去に採取したプロセス ダンプを WinDBG で開き、Thread 0 の下記 Frame 06 部分に着目してください。
06 002af714 0f4ca79f 757f0000 0f4c18a0 757f0000 KERNELBASE!GetProcAddress+0x44 (FPO: [Non-Fpo])
で、以下のコマンドを実行し、モジュールの先頭アドレスが "757f0000" の DLL と、"0f4c18a0" にセットされている関数名を確認してください。
~*kvn
lmi
da 0f4c18a0
------------------------------------------------------ 編集済み お馬鹿 2019年6月17日 1:17
-
KERNEBASE.DLLのFlsGetValue関数ですね。06 0031f93c 0f5ea79f 757f0000 0f5e18a0 757f0000 KERNELBASE!GetProcAddress+0x44 (FPO: [Non-Fpo])
0:000> lmi start end module name 00f00000 00f23000 file_search2 C (no symbols) 0f5e0000 0f5fb000 VCRUNTIME140D (private pdb symbols) VCRUNTIME140D.dll 0f7f0000 0f964000 ucrtbased (deferred) 0ffd0000 10088000 MSVCP140D (private pdb symbols) MSVCP140D.dll 68600000 68603000 api_ms_win_core_file_l1_2_0 (deferred) 68610000 68613000 api_ms_win_core_processthreads_l1_1_1 (deferred) 68620000 68623000 api_ms_win_core_localization_l1_2_0 (deferred) 68630000 68633000 api_ms_win_core_file_l2_1_0 (deferred) 68640000 68643000 api_ms_win_core_timezone_l1_1_0 (deferred) 6ffd0000 6ffd3000 api_ms_win_core_synch_l1_2_0 (deferred) 74740000 747d1000 TmUmEvt (deferred) 750a0000 750eb000 KERNELBASE (pdb symbols) KERNELBASE.dll 757f0000 758c5000 kernel32 (pdb symbols) kernel32.dll 77060000 771a2000 ntdll (pdb symbols) ntdll.dll 0:000> da 0f5e18a0 0f5e18a0 "FlsGetValue"
-
> ということは、Thread 1 は Thread 0 での何らかの処理に起因して生成されていると思うのです。
これをヒントにデバッグオプションの「デバッグの停止時に自動的にコンソールを閉じる」にチェックを入れた場合(例外は起きない)と外した場合(例外が起きる)で、std::coutでブレークインしたときのスレッドを確認してみました。チェックを入れたときは
で、チェックを外したときは、
でした。チェックを入れたときはウィルスバスター関係のDLLが入っていますが、チェックを外したときつまり例外が発生するときは、ntdll.dll!_DbgUiRemoteBreakinというスレッドが動いています。起因となっているのはこの関数じゃないでしょうか?
- 編集済み pine 2019年6月17日 2:18
-
WinDBG から該当アプリを起動させ、起動直後に Break-in したタイミングで下記 Breakpoint をセットし、ここに引っかかるか確認してみてください。
もし WinDBG 環境でヒットしないのであれば、確かにこれが要因になってるのかも。bp ntdll!DbgUiRemoteBreakin ".echo \"-----------------------------\"; .echo \"!!!!! Hit ntdll!DbgUiRemoteBreakin !!!!!\"; kvn; g"ちなみに、私は VS デバッガに関しては全くの素人なのですが、VS デバッガ上で "ntdll.dll" や "kernelbase.dll" といった外部モジュール内の関数に "Breakpoint" を張るのって、どーやればいいんですかね?
VS に詳しい人、教えてください。 -
ヒットしないです。
デバッグオプションのチェックの有無で、アプリの実行形態が変わっています。以下は、Process Explorerでcoutでブレークしたときの状態です。
チェックなし
チェックあり
このVsDebugConsole.exeの子プロセスとして動くときは例外が出て、devenv.exe直接の子プロセスとしてアプリが動くときは、例外が出ません。たぶん、VsDebugConsole.exeがアプリが終了してもコンソール画面を表示し続けるためのプロセスだと思いますが、これが例外を起こしている可能性が高いのでしょうね。
(となるとVisual Stduio側の問題になりますかね・・・)
-
VS デバッガ上で "ntdll.dll" や "kernelbase.dll" といった外部モジュール内の関数に "Breakpoint" を張るのって、どーやればいいんですかね?
関数ブレークポイントで設定できますよ。ntdll!DbgUiRemoteBreakinという指定方法も受け付けます。 -
これは、WinDBGのコマンドですよね。
0:000> x kernelbase!Debug* 750d4b65 KERNELBASE!DebugBreak (<no parameter info>) 0:000> !chkimg -db kernelbase 0 errors : kernelbase 0:000> x ntdll!Dbg* 770fed23 ntdll!DbgUiDebugActiveProcess (<no parameter info>) 77093c44 ntdll!DbgUserBreakPoint (<no parameter info>) 770febf8 ntdll!DbgUiSetThreadDebugObject (<no parameter info>) 770feb94 ntdll!DbgUiConnectToDbg (<no parameter info>) 770fec83 ntdll!DbgUiRemoteBreakin (<no parameter info>) 770fed65 ntdll!DbgUiConvertStateChangeStructure (<no parameter info>) 77108f54 ntdll!DbgPrompt (<no parameter info>) 770febe6 ntdll!DbgUiGetThreadDebugObject (<no parameter info>) 770fecdc ntdll!DbgUiIssueRemoteBreakin (<no parameter info>) 77109019 ntdll!DbgPrintReturnControlC (<no parameter info>) 770fec3c ntdll!DbgUiContinue (<no parameter info>) 770fec15 ntdll!DbgUiWaitStateChange (<no parameter info>) 77093c48 ntdll!DbgBreakPoint (<no parameter info>) 770fec61 ntdll!DbgUiStopDebugging (<no parameter info>) 7707f7eb ntdll!DbgPrint (<no parameter info>) 77093c3c ntdll!DbgBreakPointWithStatus (<no parameter info>) 77108faa ntdll!DbgSetDebugFilterState (<no parameter info>) 77108f9a ntdll!DbgQueryDebugFilterState (<no parameter info>) 77081c7e ntdll!DbgPrintEx (<no parameter info>) 0:000> !chkimg -db ntdll 0 errors : ntdll
両方共エラーなしですね。 -
> 関数ブレークポイントで設定できますよ。
> ntdll!DbgUiRemoteBreakinという指定方法も受け付けます。ご教授いただき、ありがとうございます。
おかげ様で Breakpoint の設定ができました。> 両方共エラーなしですね。????
"!chkimg -db kernelbase" と "!chkimg -db ntdll" が "0 errors" ?
ぢゃぁ、TmUmEvt.dll はなにをしているんだろう。。。。てっきり API Hook しているんだと思ってたけど。
ウィルスバスターって、監視を除外する例外設定ってできるんですよね?
コンソール アプリと "VsDebugConsole.exe" を、ウィルスバスター監視下から除外する設定をした場合にどうなるか、試してもらえますか?
それで変化が無ければ、申し訳ないけど私にはお手上げ。 -
chkimgコマンドですけど、例外発生後にプロセスダンプしたものや、EXEをロードして1ステップ実行後にやってみたりとかやりましたけど、エラーなしでした。
> ウィルスバスターって、監視を除外する例外設定ってできるんですよね?
> コンソール アプリと "VsDebugConsole.exe" を、ウィルスバスター監視下から除外する設定をした場合にどうなるか、試してもらえますか?ああ、自動検索除外はコーポレート版なのでシステム管理者にお願いしないとできないんですよ。それも絶対パスを指定しなといけないので、プログラム開発者からしたらはっきり言って使えないです。(手動検索の除外設定は各PCで設定できるんですけどね。ただし絶対パス。なので、一時的にアンインストールするしか無いのですが、パスワードでアンインストできないように保護されているし・・・)
英語のフォーラムを少し覗いてみたんですが、VS2017で同じような例外に遭遇してる人がいるみたいです。ただ、デバッグオプションのチェックにまで言及しているものはなくて、全く同じかどうか不明です。また、「対応をしているところです」的な返信もあるんですけど、解決したかどうかが動きがないのでわからない。
Virtual PCでゲストOSにVS2019をインストールして確かめる手はありそうですが、そこまでやるかどうか悩みどころ。
追記:例外が発生してブレークインした時にProcess Explorerで見ると、VsDebugConsole.exeのThreadにはTmUmEvt.dllとtmmon.dllが動いていますが、コンソールアプリの方のThreadにはこの2つは見当たらないです。
- 編集済み pine 2019年6月17日 8:31
-
あんまり意味ないかもしれませんが、一応下記コマンドも実行してみてください。(WinDBG で。)!chkimg -db kernel32
> 英語のフォーラムを少し覗いてみたんですが、
> VS2017で同じような例外に遭遇してる人がいるみたいです。US の OSR とかのフォーラムでは VS2013, 2015, 2017 で、今回と同じようなコール スタック状態で落ちている事例がいくつか報告されています。
そのうちのいくつかは、「デバッグの停止時に自動的にコンソールを閉じる」をチェックすることで改善することも確認されています。
つまり今回と同じ現象なんですけど、いずれも未解決。。。
個人的には、該当プロセスにインジェクションされた 3rd ベンダー製 DLL の影響だと思うんですけど、いまいち確証が得られない。。。
TmUmEvt.dll が何をやってるのか、ちょっと調べたい気もするけど、その手順を説明するのもさすがにめんどくさいし。。。
あとは、TmUmEvt.dll を強制的に Unload させた場合にどうなるか。。。くらいしか思い浮かばないです。追記
> 例外が発生してブレークインした時にProcess Explorerで見ると、
> VsDebugConsole.exeのThreadにはTmUmEvt.dllとtmmon.dllが動いていますが、
> コンソールアプリの方のThreadにはこの2つは見当たらないです。採取したダンプを lmi コマンドで確認する限り、TmUmEvt.dll はロードされているようなのですが、以下のコマンドで TmUmEvt.dll の PE Header が読めるか確認してもらえますか?
!dh -a TmUmEvt
- 編集済み お馬鹿 2019年6月17日 9:22
-
> あんまり意味ないかもしれませんが、一応下記コマンドも実行してみてください。(WinDBG で。)> !chkimg -db kernel32
エラーなしですね。
cout直前でブレークし、VsDebugConsole.exeに張り付いているトレンドマイクロのDLLをProcess ExplorerでSuspend状態にした後に実行しましたが同じでした。例外発生後も活動してないことは確認済み。(例外が出てるのがコンソールアプリの方なのでそうでしょうね。)
確かにウイルスバスターの無い環境でどうなのかは見てみたいところですよね・・・。
x64のコンソールアプリで落ちている例もUSサイトにありましたね。それも未解決みたいですが。デバッグオプションにチェックを入れたら改善するので、MSもあまりやる気がでないのかも?
-
dhコマンドに i オプションがないと言われたので、f オプションで表示させました。
0:000> lmi start end module name 00c40000 00c62000 file_search2 (deferred) 0f1c0000 0f1d3000 VCRUNTIME140 (deferred) 0f460000 0f47b000 VCRUNTIME140D (deferred) 0f8d0000 0f988000 MSVCP140D (deferred) 0fd60000 0fed4000 ucrtbased (deferred) 63910000 63913000 api_ms_win_crt_locale_l1_1_0 (deferred) 63980000 63a5f000 ucrtbase (deferred) 63ae0000 63ae5000 api_ms_win_crt_math_l1_1_0 (deferred) 63c50000 63c54000 api_ms_win_crt_convert_l1_1_0 (deferred) 63c60000 63c64000 api_ms_win_crt_stdio_l1_1_0 (deferred) 63c70000 63c73000 api_ms_win_crt_heap_l1_1_0 (deferred) 63c80000 63c84000 api_ms_win_crt_string_l1_1_0 (deferred) 63c90000 63c93000 api_ms_win_core_file_l1_2_0 (deferred) 63ca0000 63ca3000 api_ms_win_core_processthreads_l1_1_1 (deferred) 63f10000 63f13000 api_ms_win_core_localization_l1_2_0 (deferred) 63f20000 63f23000 api_ms_win_core_file_l2_1_0 (deferred) 64130000 64133000 api_ms_win_core_timezone_l1_1_0 (deferred) 65440000 65444000 api_ms_win_crt_runtime_l1_1_0 (deferred) 6fe60000 6fe63000 api_ms_win_core_synch_l1_2_0 (deferred) 74e90000 74edb000 KERNELBASE (deferred) 75600000 756d5000 kernel32 (deferred) 76e90000 76fd2000 ntdll (pdb symbols) C:\Windows\SYSTEM32\ntdll.dll 0:000> !dh -f file_search2 File Type: EXECUTABLE IMAGE FILE HEADER VALUES 14C machine (i386) 9 number of sections 5D035CAD time date stamp Fri Jun 14 17:37:01 2019 0 file pointer to symbol table 0 number of symbols E0 size of optional header 102 characteristics Executable 32 bit word machine OPTIONAL HEADER VALUES 10B magic # 14.21 linker version 6600 size of code 5200 size of initialized data 0 size of uninitialized data 113D4 address of entry point 1000 base of code ----- new ----- 00c40000 image base 1000 section alignment 200 file alignment 3 subsystem (Windows CUI) 6.00 operating system version 0.00 image version 6.00 subsystem version 22000 size of image 400 size of headers 0 checksum 00100000 size of stack reserve 00001000 size of stack commit 00100000 size of heap reserve 00001000 size of heap commit 8140 DLL characteristics Dynamic base NX compatible Terminal server aware 0 [ 0] address [size] of Export Directory 1C2FC [ C8] address [size] of Import Directory 20000 [ 43C] address [size] of Resource Directory 0 [ 0] address [size] of Exception Directory 0 [ 0] address [size] of Security Directory 21000 [ 458] address [size] of Base Relocation Directory 194D0 [ 38] address [size] of Debug Directory 0 [ 0] address [size] of Description Directory 0 [ 0] address [size] of Special Directory 0 [ 0] address [size] of Thread Storage Directory 19508 [ 40] address [size] of Load Configuration Directory 0 [ 0] address [size] of Bound Import Directory 1C000 [ 2FC] address [size] of Import Address Table Directory 0 [ 0] address [size] of Delay Import Directory 0 [ 0] address [size] of COR20 Header Directory 0 [ 0] address [size] of Reserved Directory
-
> dhコマンドに i オプションがないと言われたので、f オプションで表示させました。
ない訳ないと思います。
実際に、"file_search2" の IAT には、Import Function が定義されてるし。1C000 [ 2FC] address [size] of Import Address Table Directory
"!dh -?" の出力はっどうなってますか?1: kd> !dh -?
Usage: dh [options] addressDumps headers from an image based at addressOptions:-a Dump everything
-f Dump file headers
-s Dump section headers
-e Dump exports
-i Dump imports -
使ってる WinDBG かなり古いですね。。。。10年ぐらい前のやつ?
新しくインストールするなら、"WinDbg Preview" がお勧めです。
Microsoft ストアーから単体でインストールできます。
"WinDbg Preview" では TTD (Time Travel Debugging) という機能がサポートされているので、アプリ開発でのデバッグでは、VS デバッガより強力かも。ちなみに PE Header のIAT は、 d コマンドでも一応確認出来ます。
例えば、"!dh -f" で以下のように IAT の Offset およびサイズが判明している場合、0:000> !dh -f file_search2
.....
1C000 [ 2FC] address [size] of Import Address Table Directory
.....以下のコマンドで Import Function のリストを表示できます。
dds file_search2+0x1C000 file_search2+0x1C000+0x2FC
もっとも、"!dh -i" 方が見やすいですけど。 -
5年前ですね。Windows Kits 8.1ってやつです。
WinDBG PreviewはWindows10でないと使えない?
とりあえず、ddsコマンドの内容を貼り付けます。
0:000> dds file_search2+0x1C000 file_search2+0x1C000+0x2FC 0012c000 7564ff05 kernel32!GetProcessHeapStub 0012c004 75647ff2 kernel32!IsDebuggerPresentStub 0012c008 7563f362 kernel32!RaiseExceptionStub 0012c00c 7564f0d7 kernel32!MultiByteToWideCharStub 0012c010 7564f0ca kernel32!WideCharToMultiByteStub 0012c014 756608b9 kernel32!UnhandledExceptionFilter 0012c018 7564f6cb kernel32!SetUnhandledExceptionFilter 0012c01c 7564d970 kernel32!GetCurrentProcessStub 0012c020 75642e0d kernel32!TerminateProcessStub 0012c024 75656e4e kernel32!IsProcessorFeaturePresent 0012c028 7564c5f2 kernel32!QueryPerformanceCounterStub 0012c02c 7564d985 kernel32!GetCurrentProcessIdStub 0012c030 7564d9e6 kernel32!GetSystemTimeAsFileTimeStub 0012c034 76ef5d85 ntdll!RtlInitializeSListHead 0012c038 7564e4ad kernel32!GetStartupInfoWStub 0012c03c 7564ce7c kernel32!GetModuleHandleWStub 0012c040 7564cfb0 kernel32!GetLastErrorStub 0012c044 7564ce64 kernel32!GetProcAddressStub 0012c048 7564f137 kernel32!FreeLibraryStub 0012c04c 75656e6f kernel32!VirtualQueryStub 0012c050 7564c5e0 kernel32!GetCurrentThreadIdStub 0012c054 7564c590 kernel32!HeapFree 0012c058 76ee296e ntdll!RtlAllocateHeap 0012c05c 00000000 0012c060 00000000 0012c064 00000000 0012c068 00000000 0012c06c 00000000 0012c070 00000000 0012c074 00000000 0012c078 00000000 0012c07c 00000000 0012c080 00000000 0012c084 00000000 0012c088 00000000 0012c08c 00000000 0012c090 00000000 0012c094 00000000 0012c098 0f7baf10 MSVCP140D!std::basic_ostream<char,std::char_traits<char> >::flush [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ostream @ 507] 0012c09c 0f803d00 MSVCP140D!std::basic_ostream<char,std::char_traits<char> >::put [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ostream @ 470] 0012c0a0 0f7f8770 MSVCP140D!std::basic_ostream<char,std::char_traits<char> >::operator<< [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ostream @ 171] 0012c0a4 0f7bae30 MSVCP140D!std::basic_ostream<char,std::char_traits<char> >::_Osfx [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ostream @ 142] 0012c0a8 0f7b71b0 MSVCP140D!std::basic_ios<char,std::char_traits<char> >::widen [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ios @ 110] 0012c0ac 0f7fec00 MSVCP140D!std::basic_ios<char,std::char_traits<char> >::fill [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ios @ 96] 0012c0b0 0f7bb000 MSVCP140D!std::basic_ios<char,std::char_traits<char> >::rdbuf [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ios @ 76] 0012c0b4 0f7bb020 MSVCP140D!std::basic_ios<char,std::char_traits<char> >::tie [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ios @ 66] 0012c0b8 0f7b6630 MSVCP140D!std::basic_ios<char,std::char_traits<char> >::setstate [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ios @ 49] 0012c0bc 0f8070a0 MSVCP140D!std::basic_streambuf<char,std::char_traits<char> >::sputn [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\streambuf @ 167] 0012c0c0 0f7c1670 MSVCP140D!std::basic_streambuf<char,std::char_traits<char> >::sputc [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\streambuf @ 162] 0012c0c4 0f7b73c0 MSVCP140D!std::ios_base::width [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\xiosbase @ 392] 0012c0c8 0f7b7400 MSVCP140D!std::ios_base::width [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\xiosbase @ 388] 0012c0cc 0f7b4e50 MSVCP140D!std::ios_base::flags [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\xiosbase @ 351] 0012c0d0 0f7b4f60 MSVCP140D!std::ios_base::good [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\xiosbase @ 320] 0012c0d4 0f83cbe0 MSVCP140D!std::cout 0012c0d8 0f7c4830 MSVCP140D!std::uncaught_exception [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdcpp\uncaught_exception.cpp @ 7] 0012c0dc 00000000 0012c0e0 00000000 0012c0e4 00000000 0012c0e8 00000000 0012c0ec 00000000 0012c0f0 00000000 0012c0f4 00000000 0012c0f8 00000000 0012c0fc 00000000 0012c100 00000000 0012c104 00000000 0012c108 00000000 0012c10c 00000000 0012c110 00000000 0012c114 000f7cc0 VCRUNTIME140!__vcrt_GetModuleFileNameW [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_thunks.cpp @ 20] 0012c118 000f4080 VCRUNTIME140!_except_handler4_common [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\eh\i386\chandler4.c @ 316] 0012c11c 000fd7e0 VCRUNTIME140!__CxxFrameHandler2 [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\eh\i386\trnsctrl.cpp @ 196] 0012c120 000f7cf0 VCRUNTIME140!__vcrt_LoadLibraryExW [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_thunks.cpp @ 60] 0012c124 000f3930 VCRUNTIME140!memset [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\string\i386\memset.asm @ 61] 0012c128 000f75c0 VCRUNTIME140!__std_type_info_destroy_list [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\eh\std_type_info.cpp @ 139] 0012c12c 000f7540 VCRUNTIME140!__std_exception_destroy [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\eh\std_exception.cpp @ 43] 0012c130 00000000 0012c134 00000000 0012c138 00000000 0012c13c 00000000 0012c140 00000000 0012c144 00000000 0012c148 00000000 0012c14c 00000000 0012c150 00000000 0012c154 00000000 0012c158 00000000 0012c15c 00000000 0012c160 639bf990 ucrtbase!_set_new_mode 0012c164 639b0740 ucrtbase!free 0012c168 00000000 0012c16c 00000000 0012c170 00000000 0012c174 00000000 0012c178 00000000 0012c17c 00000000 0012c180 00000000 0012c184 00000000 0012c188 00000000 0012c18c 00000000 0012c190 00000000 0012c194 639bf310 ucrtbase!_configthreadlocale 0012c198 00000000 0012c19c 00000000 0012c1a0 00000000 0012c1a4 00000000 0012c1a8 00000000 0012c1ac 00000000 0012c1b0 00000000 0012c1b4 00000000 0012c1b8 00000000 0012c1bc 00000000 0012c1c0 00000000 0012c1c4 63a276c0 ucrtbase!__setusermatherr 0012c1c8 00000000 0012c1cc 00000000 0012c1d0 00000000 0012c1d4 00000000 0012c1d8 00000000 0012c1dc 00000000 0012c1e0 00000000 0012c1e4 00000000 0012c1e8 00000000 0012c1ec 00000000 0012c1f0 00000000 0012c1f4 63a07d80 ucrtbase!terminate 0012c1f8 639ad440 ucrtbase!_initialize_onexit_table 0012c1fc 63a084f0 ucrtbase!__p___argv 0012c200 639bec50 ucrtbase!_controlfp_s 0012c204 63a09da0 ucrtbase!_crt_at_quick_exit 0012c208 63a09d40 ucrtbase!_register_thread_local_exe_atexit_callback 0012c20c 639bfb50 ucrtbase!_crt_atexit 0012c210 639b4d90 ucrtbase!_execute_onexit_table 0012c214 639c03f0 ucrtbase!__p___argc 0012c218 63a09d00 ucrtbase!_c_exit 0012c21c 63a09ce0 ucrtbase!_Exit 0012c220 639a9c00 ucrtbase!exit 0012c224 639ac2a0 ucrtbase!_initterm_e 0012c228 639bcef0 ucrtbase!_initterm 0012c22c 63a33bc0 ucrtbase!_get_initial_narrow_environment 0012c230 639c0a60 ucrtbase!_initialize_narrow_environment 0012c234 639bc900 ucrtbase!_configure_narrow_argv 0012c238 63a06ff0 ucrtbase!_seh_filter_dll 0012c23c 639c00a0 ucrtbase!_set_app_type 0012c240 639a5c90 ucrtbase!_seh_filter_exe 0012c244 639afb30 ucrtbase!_register_onexit_function 0012c248 63a37bc0 ucrtbase!system 0012c24c 63a09d20 ucrtbase!_cexit 0012c250 00000000 0012c254 00000000 0012c258 00000000 0012c25c 00000000 0012c260 00000000 0012c264 00000000 0012c268 00000000 0012c26c 00000000 0012c270 00000000 0012c274 00000000 0012c278 00000000 0012c27c 00000000 0012c280 00000000 0012c284 00000000 0012c288 00000000 0012c28c 639b9870 ucrtbase!__stdio_common_vsprintf_s 0012c290 639bfe80 ucrtbase!__p__commode 0012c294 639bf960 ucrtbase!_set_fmode 0012c298 00000000 0012c29c 00000000 0012c2a0 00000000 0012c2a4 00000000 0012c2a8 00000000 0012c2ac 00000000 0012c2b0 00000000 0012c2b4 00000000 0012c2b8 00000000 0012c2bc 00000000 0012c2c0 00000000 0012c2c4 639c1410 ucrtbase!strcpy_s 0012c2c8 639c1220 ucrtbase!strcat_s 0012c2cc 639c1720 ucrtbase!strlen 0012c2d0 00000000 0012c2d4 00000000 0012c2d8 00000000 0012c2dc 00000000 0012c2e0 00000000 0012c2e4 00000000 0012c2e8 00000000 0012c2ec 00000000 0012c2f0 00000000 0012c2f4 00000000 0012c2f8 00000000 0012c2fc 0001c45c
-
Windows10のパソコンにWinDBG Previewを入れて、Windows7で採取したプロセスダンプとPDBファイルを読み込ませて、dh -iで出力させました。
0:000> !dh -i file_search2 _IMAGE_IMPORT_DESCRIPTOR 0012c2fc MSVCP140D.dll 0012C098 Import Address Table 0012C45C Import Name Table 0 time date stamp 0 Index of first forwarder reference 0F7BAF10 370 ?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ 0F803D00 469 ?put@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@D@Z 0F7F8770 10C ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z 0F7BAE30 24C ?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ 0F7B71B0 53C ?widen@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDD@Z 0F7FEC00 369 ?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDXZ 0F7BB000 48F ?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ 0F7BB020 512 ?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ 0F7B6630 4CD ?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z 0F8070A0 4E9 ?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAE_JPBD_J@Z 0F7C1670 4E6 ?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z 0F7B73C0 545 ?width@ios_base@std@@QAE_J_J@Z 0F7B7400 546 ?width@ios_base@std@@QBE_JXZ 0F7B4E50 36F ?flags@ios_base@std@@QBEHXZ 0F7B4F60 3CD ?good@ios_base@std@@QBE_NXZ 0F83CBE0 2BC ?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A 0F7C4830 526 ?uncaught_exception@std@@YA_NXZ _IMAGE_IMPORT_DESCRIPTOR 0012c310 VCRUNTIME140.dll 0012C114 Import Address Table 0012C4D8 Import Name Table 0 time date stamp 0 Index of first forwarder reference 000F7CC0 2E __vcrt_GetModuleFileNameW 000F4080 35 _except_handler4_common 000FD7E0 10 __CxxFrameHandler3 000F7CF0 31 __vcrt_LoadLibraryExW 000F3930 48 memset 000F75C0 25 __std_type_info_destroy_list 000F7540 22 __std_exception_destroy _IMAGE_IMPORT_DESCRIPTOR 0012c324 api-ms-win-crt-runtime-l1-1-0.dll 0012C1F4 Import Address Table 0012C5B8 Import Name Table 0 time date stamp 0 Index of first forwarder reference 63A07D80 6A terminate 639AD440 36 _initialize_onexit_table 63A084F0 6 __p___argv 639BEC50 1D _controlfp_s 63A09DA0 1E _crt_at_quick_exit 63A09D40 3F _register_thread_local_exe_atexit_callback 639BFB50 1F _crt_atexit 639B4D90 24 _execute_onexit_table 639C03F0 5 __p___argc 63A09D00 16 _c_exit 63A09CE0 25 _exit 639A9C00 58 exit 639AC2A0 39 _initterm_e 639BCEF0 38 _initterm 63A33BC0 2A _get_initial_narrow_environment 639C0A60 35 _initialize_narrow_environment 639BC900 19 _configure_narrow_argv 63A06FF0 41 _seh_filter_dll 639C00A0 44 _set_app_type 639A5C90 42 _seh_filter_exe 639AFB30 3E _register_onexit_function 63A37BC0 69 system 63A09D20 17 _cexit _IMAGE_IMPORT_DESCRIPTOR 0012c338 api-ms-win-crt-string-l1-1-0.dll 0012C2C4 Import Address Table 0012C688 Import Name Table 0 time date stamp 0 Index of first forwarder reference 639C1410 89 strcpy_s 639C1220 85 strcat_s 639C1720 8B strlen _IMAGE_IMPORT_DESCRIPTOR 0012c34c api-ms-win-crt-math-l1-1-0.dll 0012C1C4 Import Address Table 0012C588 Import Name Table 0 time date stamp 0 Index of first forwarder reference 63A276C0 2E __setusermatherr _IMAGE_IMPORT_DESCRIPTOR 0012c360 api-ms-win-crt-stdio-l1-1-0.dll 0012C28C Import Address Table 0012C650 Import Name Table 0 time date stamp 0 Index of first forwarder reference 639B9870 F __stdio_common_vsprintf_s 639BFE80 1 __p__commode 639BF960 54 _set_fmode _IMAGE_IMPORT_DESCRIPTOR 0012c374 api-ms-win-crt-locale-l1-1-0.dll 0012C194 Import Address Table 0012C558 Import Name Table 0 time date stamp 0 Index of first forwarder reference 639BF310 8 _configthreadlocale _IMAGE_IMPORT_DESCRIPTOR 0012c388 api-ms-win-crt-heap-l1-1-0.dll 0012C160 Import Address Table 0012C524 Import Name Table 0 time date stamp 0 Index of first forwarder reference 639BF990 16 _set_new_mode 639B0740 18 free _IMAGE_IMPORT_DESCRIPTOR 0012c39c KERNEL32.dll 0012C000 Import Address Table 0012C3C4 Import Name Table 0 time date stamp 0 Index of first forwarder reference 7564FF05 2B4 GetProcessHeap 75647FF2 37F IsDebuggerPresent 7563F362 462 RaiseException 7564F0D7 3EF MultiByteToWideChar 7564F0CA 5FE WideCharToMultiByte 756608B9 5AD UnhandledExceptionFilter 7564F6CB 56D SetUnhandledExceptionFilter 7564D970 217 GetCurrentProcess 75642E0D 58C TerminateProcess 75656E4E 386 IsProcessorFeaturePresent 7564C5F2 44D QueryPerformanceCounter 7564D985 218 GetCurrentProcessId 7564D9E6 2E9 GetSystemTimeAsFileTime 76EF5D85 363 InitializeSListHead 7564E4AD 2D0 GetStartupInfoW 7564CE7C 278 GetModuleHandleW 7564CFB0 261 GetLastError 7564CE64 2AE GetProcAddress 7564F137 1AB FreeLibrary 75656E6F 5CE VirtualQuery 7564C5E0 21C GetCurrentThreadId 7564C590 349 HeapFree 76EE296E 345 HeapAlloc
-
"WinDbg Preview" は、Windows 7 でも使えたはず。
Windows 8.1 では絶対に使える。何気に以下の関数アドレスが、モジュールのマップ状態を一致していませんねぇ。
0012c098 0f7baf10 MSVCP140D!std::basic_ostream<char,std::char_traits<char> >::flush [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ostream @ 507] 0012c09c 0f803d00 MSVCP140D!std::basic_ostream<char,std::char_traits<char> >::put [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ostream @ 470] 0012c0a0 0f7f8770 MSVCP140D!std::basic_ostream<char,std::char_traits<char> >::operator<< [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ostream @ 171] 0012c0a4 0f7bae30 MSVCP140D!std::basic_ostream<char,std::char_traits<char> >::_Osfx [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ostream @ 142] 0012c0a8 0f7b71b0 MSVCP140D!std::basic_ios<char,std::char_traits<char> >::widen [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ios @ 110] 0012c0ac 0f7fec00 MSVCP140D!std::basic_ios<char,std::char_traits<char> >::fill [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ios @ 96] 0012c0b0 0f7bb000 MSVCP140D!std::basic_ios<char,std::char_traits<char> >::rdbuf [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ios @ 76] 0012c0b4 0f7bb020 MSVCP140D!std::basic_ios<char,std::char_traits<char> >::tie [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ios @ 66] 0012c0b8 0f7b6630 MSVCP140D!std::basic_ios<char,std::char_traits<char> >::setstate [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ios @ 49] 0012c0bc 0f8070a0 MSVCP140D!std::basic_streambuf<char,std::char_traits<char> >::sputn [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\streambuf @ 167] 0012c0c0 0f7c1670 MSVCP140D!std::basic_streambuf<char,std::char_traits<char> >::sputc [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\streambuf @ 162] 0012c0c4 0f7b73c0 MSVCP140D!std::ios_base::width [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\xiosbase @ 392] 0012c0c8 0f7b7400 MSVCP140D!std::ios_base::width [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\xiosbase @ 388] 0012c0cc 0f7b4e50 MSVCP140D!std::ios_base::flags [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\xiosbase @ 351] 0012c0d0 0f7b4f60 MSVCP140D!std::ios_base::good [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\xiosbase @ 320] 0012c0d4 0f83cbe0 MSVCP140D!std::cout 0012c0d8 0f7c4830 MSVCP140D!std::uncaught_exception [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdcpp\uncaught_exception.cpp @ 7] 0012c114 000f7cc0 VCRUNTIME140!__vcrt_GetModuleFileNameW [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_thunks.cpp @ 20] 0012c118 000f4080 VCRUNTIME140!_except_handler4_common [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\eh\i386\chandler4.c @ 316] 0012c11c 000fd7e0 VCRUNTIME140!__CxxFrameHandler2 [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\eh\i386\trnsctrl.cpp @ 196] 0012c120 000f7cf0 VCRUNTIME140!__vcrt_LoadLibraryExW [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_thunks.cpp @ 60] 0012c124 000f3930 VCRUNTIME140!memset [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\string\i386\memset.asm @ 61] 0012c128 000f75c0 VCRUNTIME140!__std_type_info_destroy_list [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\eh\std_type_info.cpp @ 139] 0012c12c 000f7540 VCRUNTIME140!__std_exception_destroy [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\eh\std_exception.cpp @ 43] 0012c2fc 0001c45c
このダンプで lmi コマンドを実行した際の各関数アドレスは、下記のように表示されてますか?
0:000> lmi
start end module name
00c40000 00c62000 file_search2 (deferred)
0f1c0000 0f1d3000 VCRUNTIME140 (deferred)
0f460000 0f47b000 VCRUNTIME140D (deferred)
0f8d0000 0f988000 MSVCP140D (deferred)
0fd60000 0fed4000 ucrtbased (deferred)
63910000 63913000 api_ms_win_crt_locale_l1_1_0 (deferred)
63980000 63a5f000 ucrtbase (deferred)
63ae0000 63ae5000 api_ms_win_crt_math_l1_1_0 (deferred)
63c50000 63c54000 api_ms_win_crt_convert_l1_1_0 (deferred)
63c60000 63c64000 api_ms_win_crt_stdio_l1_1_0 (deferred)
63c70000 63c73000 api_ms_win_crt_heap_l1_1_0 (deferred)
63c80000 63c84000 api_ms_win_crt_string_l1_1_0 (deferred)
63c90000 63c93000 api_ms_win_core_file_l1_2_0 (deferred)
63ca0000 63ca3000 api_ms_win_core_processthreads_l1_1_1 (deferred)
63f10000 63f13000 api_ms_win_core_localization_l1_2_0 (deferred)
63f20000 63f23000 api_ms_win_core_file_l2_1_0 (deferred)
64130000 64133000 api_ms_win_core_timezone_l1_1_0 (deferred)
65440000 65444000 api_ms_win_crt_runtime_l1_1_0 (deferred)
6fe60000 6fe63000 api_ms_win_core_synch_l1_2_0 (deferred)
74e90000 74edb000 KERNELBASE (deferred)
75600000 756d5000 kernel32 (deferred)
76e90000 76fd2000 ntdll (pdb symbols) C:\Windows\SYSTEM32\ntdll.d
追記
やっぱり VCRUNTIME140.dll と VCRUNTIME140D.dll 内の関数アドレスが、モジュールのロード アドレスと一致してませんねぇ。
っていうことは、わざわざ Code Injection をしているのかなぁ。。。。
とりあえず、そのダンプで以下のコマンドの出力結果が見たいです。u 000F7CF0 l10
- 編集済み お馬鹿 2019年6月18日 6:59 誤記訂正
-
"WinDbg Preview" では TTD (Time Travel Debugging) という機能がサポートされているので、アプリ開発でのデバッグでは、VS デバッガより強力かも。
Visual Studioの場合、Time Travel DebuggingはEnterprise限定の機能として提供されていますね。 -
lmiの結果です。
0:000> lmi start end module name 000f0000 00103000 VCRUNTIME140 (deferred) 00110000 00132000 file_search2 C (pdb symbols) file_search2.exe 004a0000 00614000 ucrtbased (deferred) 0f790000 0f848000 MSVCP140D (private pdb symbols) MSVCP140D.dll 0fe50000 0fe6b000 VCRUNTIME140D (private pdb symbols) VCRUNTIME140D.dll 63910000 63913000 api_ms_win_crt_locale_l1_1_0 (deferred) 63980000 63a5f000 ucrtbase (deferred) 63ae0000 63ae5000 api_ms_win_crt_math_l1_1_0 (deferred) 63c50000 63c54000 api_ms_win_crt_convert_l1_1_0 (deferred) 63c60000 63c64000 api_ms_win_crt_stdio_l1_1_0 (deferred) 63c70000 63c73000 api_ms_win_crt_heap_l1_1_0 (deferred) 63c80000 63c84000 api_ms_win_crt_string_l1_1_0 (deferred) 63c90000 63c93000 api_ms_win_core_file_l1_2_0 (deferred) 63ca0000 63ca3000 api_ms_win_core_processthreads_l1_1_1 (deferred) 63f10000 63f13000 api_ms_win_core_localization_l1_2_0 (deferred) 63f20000 63f23000 api_ms_win_core_file_l2_1_0 (deferred) 64130000 64133000 api_ms_win_core_timezone_l1_1_0 (deferred) 65440000 65444000 api_ms_win_crt_runtime_l1_1_0 (deferred) 6fe60000 6fe63000 api_ms_win_core_synch_l1_2_0 (deferred) 74470000 74501000 TmUmEvt (deferred) 74e90000 74edb000 KERNELBASE (pdb symbols) KERNELBASE.dll 75600000 756d5000 kernel32 (pdb symbols) kernel32.dll 76e90000 76fd2000 ntdll (pdb symbols) ntdll.dll
TmUmEvtは今までなかったのに出ていますね。なんで?
u 000F7CF0 10は以下のようにRange errorが出ます。
0:000> u 000F7CF0 10 ^ Range error in 'u 000F7CF0 10'
-
少なくとも今日の分は全く同じダンプファイルを使ってるんですが。。。
さっきWinDBGのバージョンが古いということで、SDK 8.1のインストールをやり直したせいでしょうか?
モジュールの位置がいくつか変わってますよね。TmUmEvtが出現しているし・・・。
とりあえず再度取り直しました。
0:000> lmi start end module name 000f0000 00103000 VCRUNTIME140 (deferred) 00110000 00132000 file_search2 (deferred) 004a0000 00614000 ucrtbased (deferred) 0f790000 0f848000 MSVCP140D (deferred) 0fe50000 0fe6b000 VCRUNTIME140D (deferred) 63910000 63913000 api_ms_win_crt_locale_l1_1_0 (deferred) 63980000 63a5f000 ucrtbase (deferred) 63ae0000 63ae5000 api_ms_win_crt_math_l1_1_0 (deferred) 63c50000 63c54000 api_ms_win_crt_convert_l1_1_0 (deferred) 63c60000 63c64000 api_ms_win_crt_stdio_l1_1_0 (deferred) 63c70000 63c73000 api_ms_win_crt_heap_l1_1_0 (deferred) 63c80000 63c84000 api_ms_win_crt_string_l1_1_0 (deferred) 63c90000 63c93000 api_ms_win_core_file_l1_2_0 (deferred) 63ca0000 63ca3000 api_ms_win_core_processthreads_l1_1_1 (deferred) 63f10000 63f13000 api_ms_win_core_localization_l1_2_0 (deferred) 63f20000 63f23000 api_ms_win_core_file_l2_1_0 (deferred) 64130000 64133000 api_ms_win_core_timezone_l1_1_0 (deferred) 65440000 65444000 api_ms_win_crt_runtime_l1_1_0 (deferred) 6fe60000 6fe63000 api_ms_win_core_synch_l1_2_0 (deferred) 74470000 74501000 TmUmEvt (deferred) 74e90000 74edb000 KERNELBASE (deferred) 75600000 756d5000 kernel32 (deferred) 76e90000 76fd2000 ntdll (pdb symbols) ntdll.dll 0:000> !dh -f file_search2 File Type: EXECUTABLE IMAGE FILE HEADER VALUES 14C machine (i386) 9 number of sections 5D035CAD time date stamp Fri Jun 14 17:37:01 2019 0 file pointer to symbol table 0 number of symbols E0 size of optional header 102 characteristics Executable 32 bit word machine OPTIONAL HEADER VALUES 10B magic # 14.21 linker version 6600 size of code 5200 size of initialized data 0 size of uninitialized data 113D4 address of entry point 1000 base of code ----- new ----- 00110000 image base 1000 section alignment 200 file alignment 3 subsystem (Windows CUI) 6.00 operating system version 0.00 image version 6.00 subsystem version 22000 size of image 400 size of headers 0 checksum 00100000 size of stack reserve 00001000 size of stack commit 00100000 size of heap reserve 00001000 size of heap commit 8140 DLL characteristics Dynamic base NX compatible Terminal server aware 0 [ 0] address [size] of Export Directory 1C2FC [ C8] address [size] of Import Directory 20000 [ 43C] address [size] of Resource Directory 0 [ 0] address [size] of Exception Directory 0 [ 0] address [size] of Security Directory 21000 [ 458] address [size] of Base Relocation Directory 194D0 [ 38] address [size] of Debug Directory 0 [ 0] address [size] of Description Directory 0 [ 0] address [size] of Special Directory 0 [ 0] address [size] of Thread Storage Directory 19508 [ 40] address [size] of Load Configuration Directory 0 [ 0] address [size] of Bound Import Directory 1C000 [ 2FC] address [size] of Import Address Table Directory 0 [ 0] address [size] of Delay Import Directory 0 [ 0] address [size] of COR20 Header Directory 0 [ 0] address [size] of Reserved Directory 0:000> dds file_search2+0x1C000 file_search2+0x1C000+0x2FC 0012c000 7564ff05 kernel32!GetProcessHeapStub 0012c004 75647ff2 kernel32!IsDebuggerPresentStub 0012c008 7563f362 kernel32!RaiseExceptionStub 0012c00c 7564f0d7 kernel32!MultiByteToWideCharStub 0012c010 7564f0ca kernel32!WideCharToMultiByteStub 0012c014 756608b9 kernel32!UnhandledExceptionFilter 0012c018 7564f6cb kernel32!SetUnhandledExceptionFilter 0012c01c 7564d970 kernel32!GetCurrentProcessStub 0012c020 75642e0d kernel32!TerminateProcessStub 0012c024 75656e4e kernel32!IsProcessorFeaturePresent 0012c028 7564c5f2 kernel32!QueryPerformanceCounterStub 0012c02c 7564d985 kernel32!GetCurrentProcessIdStub 0012c030 7564d9e6 kernel32!GetSystemTimeAsFileTimeStub 0012c034 76ef5d85 ntdll!RtlInitializeSListHead 0012c038 7564e4ad kernel32!GetStartupInfoWStub 0012c03c 7564ce7c kernel32!GetModuleHandleWStub 0012c040 7564cfb0 kernel32!GetLastErrorStub 0012c044 7564ce64 kernel32!GetProcAddressStub 0012c048 7564f137 kernel32!FreeLibraryStub 0012c04c 75656e6f kernel32!VirtualQueryStub 0012c050 7564c5e0 kernel32!GetCurrentThreadIdStub 0012c054 7564c590 kernel32!HeapFree 0012c058 76ee296e ntdll!RtlAllocateHeap 0012c05c 00000000 0012c060 00000000 0012c064 00000000 0012c068 00000000 0012c06c 00000000 0012c070 00000000 0012c074 00000000 0012c078 00000000 0012c07c 00000000 0012c080 00000000 0012c084 00000000 0012c088 00000000 0012c08c 00000000 0012c090 00000000 0012c094 00000000 0012c098 0f7baf10 MSVCP140D!std::basic_ostream<char,std::char_traits<char> >::flush [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ostream @ 507] 0012c09c 0f803d00 MSVCP140D!std::basic_ostream<char,std::char_traits<char> >::put [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ostream @ 470] 0012c0a0 0f7f8770 MSVCP140D!std::basic_ostream<char,std::char_traits<char> >::operator<< [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ostream @ 171] 0012c0a4 0f7bae30 MSVCP140D!std::basic_ostream<char,std::char_traits<char> >::_Osfx [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ostream @ 142] 0012c0a8 0f7b71b0 MSVCP140D!std::basic_ios<char,std::char_traits<char> >::widen [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ios @ 110] 0012c0ac 0f7fec00 MSVCP140D!std::basic_ios<char,std::char_traits<char> >::fill [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ios @ 96] 0012c0b0 0f7bb000 MSVCP140D!std::basic_ios<char,std::char_traits<char> >::rdbuf [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ios @ 76] 0012c0b4 0f7bb020 MSVCP140D!std::basic_ios<char,std::char_traits<char> >::tie [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ios @ 66] 0012c0b8 0f7b6630 MSVCP140D!std::basic_ios<char,std::char_traits<char> >::setstate [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\ios @ 49] 0012c0bc 0f8070a0 MSVCP140D!std::basic_streambuf<char,std::char_traits<char> >::sputn [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\streambuf @ 167] 0012c0c0 0f7c1670 MSVCP140D!std::basic_streambuf<char,std::char_traits<char> >::sputc [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\streambuf @ 162] 0012c0c4 0f7b73c0 MSVCP140D!std::ios_base::width [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\xiosbase @ 392] 0012c0c8 0f7b7400 MSVCP140D!std::ios_base::width [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\xiosbase @ 388] 0012c0cc 0f7b4e50 MSVCP140D!std::ios_base::flags [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\xiosbase @ 351] 0012c0d0 0f7b4f60 MSVCP140D!std::ios_base::good [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdhpp\xiosbase @ 320] 0012c0d4 0f83cbe0 MSVCP140D!std::cout 0012c0d8 0f7c4830 MSVCP140D!std::uncaught_exception [d:\agent\_work\4\s\src\vctools\crt\crtw32\stdcpp\uncaught_exception.cpp @ 7] 0012c0dc 00000000 0012c0e0 00000000 0012c0e4 00000000 0012c0e8 00000000 0012c0ec 00000000 0012c0f0 00000000 0012c0f4 00000000 0012c0f8 00000000 0012c0fc 00000000 0012c100 00000000 0012c104 00000000 0012c108 00000000 0012c10c 00000000 0012c110 00000000 0012c114 000f7cc0 VCRUNTIME140!__vcrt_GetModuleFileNameW [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_thunks.cpp @ 20] 0012c118 000f4080 VCRUNTIME140!_except_handler4_common [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\eh\i386\chandler4.c @ 316] 0012c11c 000fd7e0 VCRUNTIME140!__CxxFrameHandler2 [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\eh\i386\trnsctrl.cpp @ 196] 0012c120 000f7cf0 VCRUNTIME140!__vcrt_LoadLibraryExW [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_thunks.cpp @ 60] 0012c124 000f3930 VCRUNTIME140!memset [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\string\i386\memset.asm @ 61] 0012c128 000f75c0 VCRUNTIME140!__std_type_info_destroy_list [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\eh\std_type_info.cpp @ 139] 0012c12c 000f7540 VCRUNTIME140!__std_exception_destroy [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\eh\std_exception.cpp @ 43] 0012c130 00000000 0012c134 00000000 0012c138 00000000 0012c13c 00000000 0012c140 00000000 0012c144 00000000 0012c148 00000000 0012c14c 00000000 0012c150 00000000 0012c154 00000000 0012c158 00000000 0012c15c 00000000 0012c160 639bf990 ucrtbase!_set_new_mode 0012c164 639b0740 ucrtbase!free 0012c168 00000000 0012c16c 00000000 0012c170 00000000 0012c174 00000000 0012c178 00000000 0012c17c 00000000 0012c180 00000000 0012c184 00000000 0012c188 00000000 0012c18c 00000000 0012c190 00000000 0012c194 639bf310 ucrtbase!_configthreadlocale 0012c198 00000000 0012c19c 00000000 0012c1a0 00000000 0012c1a4 00000000 0012c1a8 00000000 0012c1ac 00000000 0012c1b0 00000000 0012c1b4 00000000 0012c1b8 00000000 0012c1bc 00000000 0012c1c0 00000000 0012c1c4 63a276c0 ucrtbase!__setusermatherr 0012c1c8 00000000 0012c1cc 00000000 0012c1d0 00000000 0012c1d4 00000000 0012c1d8 00000000 0012c1dc 00000000 0012c1e0 00000000 0012c1e4 00000000 0012c1e8 00000000 0012c1ec 00000000 0012c1f0 00000000 0012c1f4 63a07d80 ucrtbase!terminate 0012c1f8 639ad440 ucrtbase!_initialize_onexit_table 0012c1fc 63a084f0 ucrtbase!__p___argv 0012c200 639bec50 ucrtbase!_controlfp_s 0012c204 63a09da0 ucrtbase!_crt_at_quick_exit 0012c208 63a09d40 ucrtbase!_register_thread_local_exe_atexit_callback 0012c20c 639bfb50 ucrtbase!_crt_atexit 0012c210 639b4d90 ucrtbase!_execute_onexit_table 0012c214 639c03f0 ucrtbase!__p___argc 0012c218 63a09d00 ucrtbase!_c_exit 0012c21c 63a09ce0 ucrtbase!_Exit 0012c220 639a9c00 ucrtbase!exit 0012c224 639ac2a0 ucrtbase!_initterm_e 0012c228 639bcef0 ucrtbase!_initterm 0012c22c 63a33bc0 ucrtbase!_get_initial_narrow_environment 0012c230 639c0a60 ucrtbase!_initialize_narrow_environment 0012c234 639bc900 ucrtbase!_configure_narrow_argv 0012c238 63a06ff0 ucrtbase!_seh_filter_dll 0012c23c 639c00a0 ucrtbase!_set_app_type 0012c240 639a5c90 ucrtbase!_seh_filter_exe 0012c244 639afb30 ucrtbase!_register_onexit_function 0012c248 63a37bc0 ucrtbase!system 0012c24c 63a09d20 ucrtbase!_cexit 0012c250 00000000 0012c254 00000000 0012c258 00000000 0012c25c 00000000 0012c260 00000000 0012c264 00000000 0012c268 00000000 0012c26c 00000000 0012c270 00000000 0012c274 00000000 0012c278 00000000 0012c27c 00000000 0012c280 00000000 0012c284 00000000 0012c288 00000000 0012c28c 639b9870 ucrtbase!__stdio_common_vsprintf_s 0012c290 639bfe80 ucrtbase!__p__commode 0012c294 639bf960 ucrtbase!_set_fmode 0012c298 00000000 0012c29c 00000000 0012c2a0 00000000 0012c2a4 00000000 0012c2a8 00000000 0012c2ac 00000000 0012c2b0 00000000 0012c2b4 00000000 0012c2b8 00000000 0012c2bc 00000000 0012c2c0 00000000 0012c2c4 639c1410 ucrtbase!strcpy_s 0012c2c8 639c1220 ucrtbase!strcat_s 0012c2cc 639c1720 ucrtbase!strlen 0012c2d0 00000000 0012c2d4 00000000 0012c2d8 00000000 0012c2dc 00000000 0012c2e0 00000000 0012c2e4 00000000 0012c2e8 00000000 0012c2ec 00000000 0012c2f0 00000000 0012c2f4 00000000 0012c2f8 00000000 0012c2fc 0001c45c
000f7cf0のアドレスは VCRUNTIME140!__vcrt_LoadLibraryExWのアドレスですよね?
uコマンドですが、WinDBGが古いので、10の引数がいらないのかもと打ち込むと次のように出ました。
0:000> u 0x000f7cf0 VCRUNTIME140!__vcrt_LoadLibraryExW [d:\agent\_work\4\s\src\vctools\crt\vcruntime\src\internal\winapi_thunks.cpp @ 60]: 000f7cf0 55 push ebp 000f7cf1 8bec mov ebp,esp 000f7cf3 ff7510 push dword ptr [ebp+10h] 000f7cf6 ff750c push dword ptr [ebp+0Ch] 000f7cf9 ff7508 push dword ptr [ebp+8] 000f7cfc ff1530001000 call dword ptr [VCRUNTIME140!_imp__LoadLibraryExW (00100030)] 000f7d02 5d pop ebp 000f7d03 c3 ret
-
dh -iは使えないので!dh -fでアドレスとサイズを得てからddsで取りました。
0:000> u 0001c45c l10 0001c45c 0000 add byte ptr [eax],al 0001c45e 0000 add byte ptr [eax],al 0001c460 0000 add byte ptr [eax],al 0001c462 0000 add byte ptr [eax],al 0001c464 0000 add byte ptr [eax],al 0001c466 0000 add byte ptr [eax],al 0001c468 0000 add byte ptr [eax],al 0001c46a 0000 add byte ptr [eax],al 0001c46c 0000 add byte ptr [eax],al 0001c46e 0000 add byte ptr [eax],al 0001c470 0000 add byte ptr [eax],al 0001c472 0000 add byte ptr [eax],al 0001c474 0000 add byte ptr [eax],al 0001c476 0000 add byte ptr [eax],al 0001c478 0000 add byte ptr [eax],al 0001c47a 0000 add byte ptr [eax],al 0:000> dds 00100030 l2 00100030 756452d1 kernel32!LoadLibraryExWStub 00100034 7564ce64 kernel32!GetProcAddressStub 0:000> !dh -i TmUmEvt Usage: dh [options] address Dumps headers from an image based at address Options: -a Dump everything -f Dump file headers -s Dump section headers 0:000> !dh -f TmUmEvt File Type: DLL FILE HEADER VALUES 14C machine (i386) 5 number of sections 5BA22BB3 time date stamp Wed Sep 19 19:57:55 2018 0 file pointer to symbol table 0 number of symbols E0 size of optional header 2102 characteristics Executable 32 bit word machine DLL OPTIONAL HEADER VALUES 10B magic # 11.00 linker version 54A00 size of code 39E00 size of initialized data 0 size of uninitialized data 3855E address of entry point 1000 base of code ----- new ----- 74470000 image base 1000 section alignment 200 file alignment 2 subsystem (Windows GUI) 5.01 operating system version 0.00 image version 5.01 subsystem version 91000 size of image 400 size of headers 96D9E checksum 00100000 size of stack reserve 00001000 size of stack commit 00100000 size of heap reserve 00001000 size of heap commit 140 DLL characteristics Dynamic base NX compatible 7EAF0 [ DA] address [size] of Export Directory 7DDA4 [ 64] address [size] of Import Directory 8B000 [ 6F0] address [size] of Resource Directory 0 [ 0] address [size] of Exception Directory 8AE00 [ 80D0] address [size] of Security Directory 8C000 [ 4B24] address [size] of Base Relocation Directory 563B0 [ 38] address [size] of Debug Directory 0 [ 0] address [size] of Description Directory 0 [ 0] address [size] of Special Directory 0 [ 0] address [size] of Thread Storage Directory 7BE70 [ 40] address [size] of Load Configuration Directory 0 [ 0] address [size] of Bound Import Directory 56000 [ 23C] address [size] of Import Address Table Directory 0 [ 0] address [size] of Delay Import Directory 0 [ 0] address [size] of COR20 Header Directory 0 [ 0] address [size] of Reserved Directory 0:000> dds TmUmEvt+0x56000 TmUmEvt+0x56000+0x23C 744c6000 0007e65c 744c6004 0007e648 744c6008 0007e638 744c600c 0007e62a 744c6010 0007e694 744c6014 00000000 744c6018 0007ea76 744c601c 0007ea68 744c6020 0007ea52 744c6024 0007e0e4 744c6028 0007e0fc 744c602c 0007e114 744c6030 0007e120 744c6034 0007e130 744c6038 0007e13e 744c603c 0007e14e 744c6040 0007e160 744c6044 0007e176 744c6048 0007e18a 744c604c 0007e19a 744c6050 0007e1b0 744c6054 0007e1ce 744c6058 0007e1de 744c605c 0007e1f4 744c6060 0007e202 744c6064 0007e214 744c6068 0007e224 744c606c 0007e240 744c6070 0007e258 744c6074 0007e270 744c6078 0007e288 744c607c 0007e29e 744c6080 0007e2b8 744c6084 0007e2c0 744c6088 0007e2ce 744c608c 0007e2e4 744c6090 0007e2f4 744c6094 0007e310 744c6098 0007e320 744c609c 0007e33a 744c60a0 0007e356 744c60a4 0007e364 744c60a8 0007ea84 744c60ac 0007e388 744c60b0 0007e39a 744c60b4 0007e3b4 744c60b8 0007e3c8 744c60bc 0007e3e6 744c60c0 0007e408 744c60c4 0007e418 744c60c8 0007e428 744c60cc 0007e43a 744c60d0 0007e44a 744c60d4 0007e462 744c60d8 0007e478 744c60dc 0007e48a 744c60e0 0007e49a 744c60e4 0007e4a8 744c60e8 0007e4ba 744c60ec 0007e4ce 744c60f0 0007e4e2 744c60f4 0007e4f6 744c60f8 0007e50a 744c60fc 0007e526 744c6100 0007e536 744c6104 0007e546 744c6108 0007e554 744c610c 0007e560 744c6110 0007e56e 744c6114 0007e57c 744c6118 0007e594 744c611c 0007eada 744c6120 0007e5b6 744c6124 0007e5c2 744c6128 0007e5d2 744c612c 0007e5e2 744c6130 0007e5f0 744c6134 0007e606 744c6138 0007ea94 744c613c 0007eaa6 744c6140 0007eaba 744c6144 0007eaca 744c6148 0007e378 744c614c 0007e5aa 744c6150 0007e6b2 744c6154 0007e6c8 744c6158 0007e6de 744c615c 0007e6f2 744c6160 0007e702 744c6164 0007e712 744c6168 0007e724 744c616c 0007e730 744c6170 0007e744 744c6174 0007e760 744c6178 0007e76c 744c617c 0007e778 744c6180 0007e78e 744c6184 0007e7a0 744c6188 0007e7b0 744c618c 0007e7c8 744c6190 0007e7d6 744c6194 0007e7e8 744c6198 0007e7f4 744c619c 0007e804 744c61a0 0007e820 744c61a4 0007e83e 744c61a8 0007e866 744c61ac 0007e87a 744c61b0 0007e884 744c61b4 0007e896 744c61b8 0007e8aa 744c61bc 0007e8bc 744c61c0 0007e8c6 744c61c4 0007e8d2 744c61c8 0007e8de 744c61cc 0007e8f0 744c61d0 0007e902 744c61d4 0007e910 744c61d8 0007e926 744c61dc 0007e940 744c61e0 0007e95a 744c61e4 0007e974 744c61e8 0007e984 744c61ec 0007e99a 744c61f0 0007e9ac 744c61f4 0007e9bc 744c61f8 0007e9d4 744c61fc 0007e9e6 744c6200 0007e9f8 744c6204 0007ea0a 744c6208 0007ea1a 744c620c 0007ea2c 744c6210 0007ea3c 744c6214 00000000 744c6218 0007e05a 744c621c 0007e070 744c6220 0007e088 744c6224 0007e044 744c6228 00000000 744c622c 0007e0bc 744c6230 0007e0ca 744c6234 0007e0aa 744c6238 00000000 744c623c 00000000
-
とりあえず、Windows10のPCにインストールしたWinDBG Previewにダンプファイルとシンボルを読み込ませて取り直しました。取り直したのは、!dh -i TmUmEvtまでです。
0:000> lmi start end module name 000f0000 00103000 VCRUNTIME140 (deferred) 00110000 00132000 file_search2 C (pdb symbols) file_search2.exe 004a0000 00614000 ucrtbased (deferred) 0f790000 0f848000 MSVCP140D (private pdb symbols) MSVCP140D.dll 0fe50000 0fe6b000 VCRUNTIME140D (private pdb symbols) VCRUNTIME140D.dll 63910000 63913000 api_ms_win_crt_locale_l1_1_0 (deferred) 63980000 63a5f000 ucrtbase (deferred) 63ae0000 63ae5000 api_ms_win_crt_math_l1_1_0 (deferred) 63c50000 63c54000 api_ms_win_crt_convert_l1_1_0 (deferred) 63c60000 63c64000 api_ms_win_crt_stdio_l1_1_0 (deferred) 63c70000 63c73000 api_ms_win_crt_heap_l1_1_0 (deferred) 63c80000 63c84000 api_ms_win_crt_string_l1_1_0 (deferred) 63c90000 63c93000 api_ms_win_core_file_l1_2_0 (deferred) 63ca0000 63ca3000 api_ms_win_core_processthreads_l1_1_1 (deferred) 63f10000 63f13000 api_ms_win_core_localization_l1_2_0 (deferred) 63f20000 63f23000 api_ms_win_core_file_l2_1_0 (deferred) 64130000 64133000 api_ms_win_core_timezone_l1_1_0 (deferred) 65440000 65444000 api_ms_win_crt_runtime_l1_1_0 (deferred) 6fe60000 6fe63000 api_ms_win_core_synch_l1_2_0 (deferred) 74470000 74501000 TmUmEvt (deferred) 74e90000 74edb000 KERNELBASE (pdb symbols) KERNELBASE.dll 75600000 756d5000 kernel32 (pdb symbols) kernel32.dll 76e90000 76fd2000 ntdll (pdb symbols) ntdll.dll 0:000> u 0001c45c l10 0001c45c 0000 add byte ptr [eax],al 0001c45e 0000 add byte ptr [eax],al 0001c460 0000 add byte ptr [eax],al 0001c462 0000 add byte ptr [eax],al 0001c464 0000 add byte ptr [eax],al 0001c466 0000 add byte ptr [eax],al 0001c468 0000 add byte ptr [eax],al 0001c46a 0000 add byte ptr [eax],al 0001c46c 0000 add byte ptr [eax],al 0001c46e 0000 add byte ptr [eax],al 0001c470 0000 add byte ptr [eax],al 0001c472 0000 add byte ptr [eax],al 0001c474 0000 add byte ptr [eax],al 0001c476 0000 add byte ptr [eax],al 0001c478 0000 add byte ptr [eax],al 0001c47a 0000 add byte ptr [eax],al 0:000> dds 00100030 l2 00100030 756452d1 kernel32!LoadLibraryExWStub 00100034 7564ce64 kernel32!GetProcAddressStub 0:000> !dh -i TmUmEvt _IMAGE_IMPORT_DESCRIPTOR 744edda4 PSAPI.DLL 744C6218 Import Address Table 744EE020 Import Name Table 0 time date stamp 0 Index of first forwarder reference 0007E05A E GetModuleBaseNameW 0007E070 10 GetModuleFileNameExW 0007E088 11 GetModuleInformation 0007E044 4 EnumProcessModules _IMAGE_IMPORT_DESCRIPTOR 744eddb8 SHLWAPI.dll 744C622C Import Address Table 744EE034 Import Name Table 0 time date stamp 0 Index of first forwarder reference 0007E0BC 6C PathIsUNCA 0007E0CA 71 PathIsUNCW 0007E0AA 45 PathFileExistsW _IMAGE_IMPORT_DESCRIPTOR 744eddcc KERNEL32.dll 744C6018 Import Address Table 744EDE20 Import Name Table 0 time date stamp 0 Index of first forwarder reference 0007EA76 2D2 HeapReAlloc 0007EA68 162 FreeLibrary 0007EA52 10F EnumSystemLocalesW 0007E0E4 2AF GetWindowsDirectoryW 0007E0FC 2A7 GetVolumeInformationW 0007E114 348 LocalFree 0007E120 202 GetLastError 0007E130 52 CloseHandle 0007E13E 357 MapViewOfFile 0007E14E 4D6 UnmapViewOfFile 0007E160 8C CreateFileMappingW 0007E176 379 OpenFileMappingW 0007E18A 2A4 GetVersionExW 0007E19A 2EC InterlockedExchange 0007E1B0 2E9 InterlockedCompareExchange 0007E1CE B5 CreateThread 0007E1DE 1C5 GetCurrentThreadId 0007E1F4 385 OpenThread 0007E202 4C1 TerminateThread 0007E214 413 ResumeThread 0007E224 2E2 InitializeCriticalSection 0007E240 EE EnterCriticalSection 0007E258 339 LeaveCriticalSection 0007E270 D1 DeleteCriticalSection 0007E288 4F9 WaitForSingleObject 0007E29E 4F7 WaitForMultipleObjects 0007E2B8 4B2 Sleep 0007E2C0 375 OpenEventW 0007E2CE 1C1 GetCurrentProcessId 0007E2E4 277 GetSystemTime 0007E2F4 415 RtlCaptureStackBackTrace 0007E310 4F1 VirtualQuery 0007E320 3A7 QueryPerformanceCounter 0007E33A 3A8 QueryPerformanceFrequency 0007E356 380 OpenProcess 0007E364 1C0 GetCurrentProcess 0007EA84 19A GetConsoleCP 0007E388 E8 DuplicateHandle 0007E39A 1DC GetEnvironmentVariableW 0007E3B4 81 CreateDirectoryW 0007E3C8 E AddVectoredExceptionHandler 0007E3E6 408 RemoveVectoredExceptionHandler 0007E408 354 LockResource 0007E418 341 LoadResource 0007E428 4B1 SizeofResource 0007E43A 14E FindResourceW 0007E44A 399 ProcessIdToSessionId 0007E462 367 MultiByteToWideChar 0007E478 245 GetProcAddress 0007E48A 4E9 VirtualAlloc 0007E49A 4EC VirtualFree 0007E4A8 4EF VirtualProtect 0007E4BA 218 GetModuleHandleW 0007E4CE 1C4 GetCurrentThread 0007E4E2 499 SetThreadPriority 0007E4F6 28E GetThreadPriority 0007E50A BE CreateToolhelp32Snapshot 0007E526 4C3 Thread32First 0007E536 4C4 Thread32Next 0007E546 344 LocalAlloc 0007E554 4C5 TlsAlloc 0007E560 4C7 TlsGetValue 0007E56E 4C8 TlsSetValue 0007E57C 2EF InterlockedIncrement 0007E594 238 GetOverlappedResult 0007EADA 157 FlushFileBuffers 0007E5B6 3C0 ReadFile 0007E5C2 293 GetTickCount 0007E5D2 85 CreateEventW 0007E5E2 8F CreateFileW 0007E5F0 217 GetModuleHandleExW 0007E606 214 GetModuleFileNameW 0007EA94 1AC GetConsoleMode 0007EAA6 467 SetFilePointerEx 0007EABA 487 SetStdHandle 0007EACA 524 WriteConsoleW 0007E378 24C GetProcessId 0007E5AA 525 WriteFile 0007E6B2 4E4 VerSetConditionMask 0007E6C8 4E8 VerifyVersionInfoW 0007E6DE 20F GetLongPathNameW 0007E6F2 EA EncodePointer 0007E702 CA DecodePointer 0007E712 3B1 RaiseException 0007E724 418 RtlUnwind 0007E730 300 IsDebuggerPresent 0007E744 304 IsProcessorFeaturePresent 0007E760 2CF HeapFree 0007E76C 2CB HeapAlloc 0007E778 511 WideCharToMultiByte 0007E78E 186 GetCommandLineA 0007E7A0 264 GetStdHandle 0007E7B0 2EB InterlockedDecrement 0007E7C8 119 ExitProcess 0007E7D6 15 AreFileApisANSI 0007E7E8 2D4 HeapSize 0007E7F4 473 SetLastError 0007E804 4D3 UnhandledExceptionFilter 0007E820 4A5 SetUnhandledExceptionFilter 0007E83E 2E3 InitializeCriticalSectionAndSpinCount 0007E866 4C0 TerminateProcess 0007E87A 4C6 TlsFree 0007E884 263 GetStartupInfoW 0007E896 AE CreateSemaphoreW 0007E8AA 30A IsValidCodePage 0007E8BC 168 GetACP 0007E8C6 237 GetOEMCP 0007E8D2 172 GetCPInfo 0007E8DE 24A GetProcessHeap 0007E8F0 269 GetStringTypeW 0007E902 1F3 GetFileType 0007E910 213 GetModuleFileNameA 0007E926 279 GetSystemTimeAsFileTime 0007E940 1DA GetEnvironmentStringsW 0007E95A 161 FreeEnvironmentStringsW 0007E974 120 FatalAppExitA 0007E984 38A OutputDebugStringW 0007E99A 33E LoadLibraryExW 0007E9AC 33F LoadLibraryW 0007E9BC 42D SetConsoleCtrlHandler 0007E9D4 1C8 GetDateFormatW 0007E9E6 297 GetTimeFormatW 0007E9F8 64 CompareStringW 0007EA0A 32D LCMapStringW 0007EA1A 206 GetLocaleInfoW 0007EA2C 30C IsValidLocale 0007EA3C 29B GetUserDefaultLCID _IMAGE_IMPORT_DESCRIPTOR 744edde0 ADVAPI32.dll 744C6000 Import Address Table 744EDE08 Import Name Table 0 time date stamp 0 Index of first forwarder reference 0007E65C 72 ConvertStringSecurityDescriptorToSecurityDescriptorW 0007E648 26E RegQueryValueExW 0007E638 261 RegOpenKeyExW 0007E62A 230 RegCloseKey 0007E694 165 GetUserNameW
u 0007e65c l10の結果は、Preview版でも同じ結果になります。
Windows7に最新版のWinDBGをインストールし直して取り直すのはちょっとお待ち下さい。
追記:
!dh -i file_search2の結果もつけておきます。
0:000> !dh -i file_search2 _IMAGE_IMPORT_DESCRIPTOR 0012c2fc MSVCP140D.dll 0012C098 Import Address Table 0012C45C Import Name Table 0 time date stamp 0 Index of first forwarder reference 0F7BAF10 370 ?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ 0F803D00 469 ?put@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@D@Z 0F7F8770 10C ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z 0F7BAE30 24C ?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ 0F7B71B0 53C ?widen@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDD@Z 0F7FEC00 369 ?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDXZ 0F7BB000 48F ?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ 0F7BB020 512 ?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ 0F7B6630 4CD ?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z 0F8070A0 4E9 ?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAE_JPBD_J@Z 0F7C1670 4E6 ?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z 0F7B73C0 545 ?width@ios_base@std@@QAE_J_J@Z 0F7B7400 546 ?width@ios_base@std@@QBE_JXZ 0F7B4E50 36F ?flags@ios_base@std@@QBEHXZ 0F7B4F60 3CD ?good@ios_base@std@@QBE_NXZ 0F83CBE0 2BC ?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A 0F7C4830 526 ?uncaught_exception@std@@YA_NXZ _IMAGE_IMPORT_DESCRIPTOR 0012c310 VCRUNTIME140.dll 0012C114 Import Address Table 0012C4D8 Import Name Table 0 time date stamp 0 Index of first forwarder reference 000F7CC0 2E __vcrt_GetModuleFileNameW 000F4080 35 _except_handler4_common 000FD7E0 10 __CxxFrameHandler3 000F7CF0 31 __vcrt_LoadLibraryExW 000F3930 48 memset 000F75C0 25 __std_type_info_destroy_list 000F7540 22 __std_exception_destroy _IMAGE_IMPORT_DESCRIPTOR 0012c324 api-ms-win-crt-runtime-l1-1-0.dll 0012C1F4 Import Address Table 0012C5B8 Import Name Table 0 time date stamp 0 Index of first forwarder reference 63A07D80 6A terminate 639AD440 36 _initialize_onexit_table 63A084F0 6 __p___argv 639BEC50 1D _controlfp_s 63A09DA0 1E _crt_at_quick_exit 63A09D40 3F _register_thread_local_exe_atexit_callback 639BFB50 1F _crt_atexit 639B4D90 24 _execute_onexit_table 639C03F0 5 __p___argc 63A09D00 16 _c_exit 63A09CE0 25 _exit 639A9C00 58 exit 639AC2A0 39 _initterm_e 639BCEF0 38 _initterm 63A33BC0 2A _get_initial_narrow_environment 639C0A60 35 _initialize_narrow_environment 639BC900 19 _configure_narrow_argv 63A06FF0 41 _seh_filter_dll 639C00A0 44 _set_app_type 639A5C90 42 _seh_filter_exe 639AFB30 3E _register_onexit_function 63A37BC0 69 system 63A09D20 17 _cexit _IMAGE_IMPORT_DESCRIPTOR 0012c338 api-ms-win-crt-string-l1-1-0.dll 0012C2C4 Import Address Table 0012C688 Import Name Table 0 time date stamp 0 Index of first forwarder reference 639C1410 89 strcpy_s 639C1220 85 strcat_s 639C1720 8B strlen _IMAGE_IMPORT_DESCRIPTOR 0012c34c api-ms-win-crt-math-l1-1-0.dll 0012C1C4 Import Address Table 0012C588 Import Name Table 0 time date stamp 0 Index of first forwarder reference 63A276C0 2E __setusermatherr _IMAGE_IMPORT_DESCRIPTOR 0012c360 api-ms-win-crt-stdio-l1-1-0.dll 0012C28C Import Address Table 0012C650 Import Name Table 0 time date stamp 0 Index of first forwarder reference 639B9870 F __stdio_common_vsprintf_s 639BFE80 1 __p__commode 639BF960 54 _set_fmode _IMAGE_IMPORT_DESCRIPTOR 0012c374 api-ms-win-crt-locale-l1-1-0.dll 0012C194 Import Address Table 0012C558 Import Name Table 0 time date stamp 0 Index of first forwarder reference 639BF310 8 _configthreadlocale _IMAGE_IMPORT_DESCRIPTOR 0012c388 api-ms-win-crt-heap-l1-1-0.dll 0012C160 Import Address Table 0012C524 Import Name Table 0 time date stamp 0 Index of first forwarder reference 639BF990 16 _set_new_mode 639B0740 18 free _IMAGE_IMPORT_DESCRIPTOR 0012c39c KERNEL32.dll 0012C000 Import Address Table 0012C3C4 Import Name Table 0 time date stamp 0 Index of first forwarder reference 7564FF05 2B4 GetProcessHeap 75647FF2 37F IsDebuggerPresent 7563F362 462 RaiseException 7564F0D7 3EF MultiByteToWideChar 7564F0CA 5FE WideCharToMultiByte 756608B9 5AD UnhandledExceptionFilter 7564F6CB 56D SetUnhandledExceptionFilter 7564D970 217 GetCurrentProcess 75642E0D 58C TerminateProcess 75656E4E 386 IsProcessorFeaturePresent 7564C5F2 44D QueryPerformanceCounter 7564D985 218 GetCurrentProcessId 7564D9E6 2E9 GetSystemTimeAsFileTime 76EF5D85 363 InitializeSListHead 7564E4AD 2D0 GetStartupInfoW 7564CE7C 278 GetModuleHandleW 7564CFB0 261 GetLastError 7564CE64 2AE GetProcAddress 7564F137 1AB FreeLibrary 75656E6F 5CE VirtualQuery 7564C5E0 21C GetCurrentThreadId 7564C590 349 HeapFree 76EE296E 345 HeapAlloc
- 編集済み pine 2019年6月19日 1:26
-
なるほど、この手があったか!!!
この方法は全く想定していませんでした。
(だからリバース エンジニアリングは面白い。wwww)
さすがはトレンド マイクロさん、伊達にセキュリティ ソフトを作ってませんね。この問題、やっぱりウィルスバスターの影響だと思います。
TmUmEvt.dll はかなり手の込んだ方法で API Hook をしているようです。
(具体的な手法はちゃんとデバッグ トレースして調べないと分かんないけど、少なくとも一般的に知られている API Hook とは別物。)TmUmEvt.dll を正常にアンロードさせることができれば、多分今回の問題現象は起きないと思いますが、ウィルスバスター側は恐らくそれも想定してブロックしてくるだろうから無理かな。
ダメ元で、以下のコードで実行してみてください。#include <iostream> #include <tchar.h> #include <windows.h> int main() { HMODULE hModule; while( TRUE ) { hModule = ::GetModuleHandle( TEXT("TmUmEvt.dll") ); if( hModule == NULL) { break; } ::FreeLibrary(hModule); } std::cout << "Hello World!" << std::endl; }
-
> なるほど、この手があったか!!!
> この方法は全く想定していませんでした。どういう手法なのでしょう?後学のために教えていただければ幸いです。
それと、FreeLibraryする方法はだめでした。元のソースでは"Hello world!"が表示されていましたが、今回は表示されずに例外発生しているので、whileループの中で落ちているのだと思います。
一応ダンプは保存したので、WinDBGで見ることは可能です。(lmiするとTmUmEvtがしっかりといました)
トレンドマイクロDLLの影響にはほぼ間違いなさそうですが、それを回避するようなデバッグができるようにVisual Studio側でなんとかできないのでしょうかね?そうでないとあのデバッグオプションは環境によっては使えないということになります。
-
> どういう手法なのでしょう?
私が自分でデバッグ トレースして詳細に調べたのでは無いので、すべてをきちんと把握している訳ではないですが、このログを見る限りインジェクションされたトレンドマイクロ DLL は、自身のため専用の システム DLL を二重にロードしているようです。
例えば今回のログから、PSAPI.DLL, SHLWAPI.dll, KERNEL32.dll, ADVAPI32.dll の3つの DLL を独自にロードおよび管理している形跡が読み取れます。
なんでそんなことをするのかというと、恐らく自分以外の「第三者」が仕込んだ API Hook の影響を排除するためと考えられます。
例えば。。。
マルウェアが CreateFile() や ReadFile(), WriteFile() 等の API に Hook を仕掛けていたとして、セキュリティ ソフトの DLL がそれら API を「そのまま」使うと、マルウェアの影響を受けてしまう。。。。つまり正しいセキュリティ監視が出来ないことになってしまう。
だからセキュリティ ソフトは、個々のユーザー モード プロセス空間の空き領域にそれら システム DLL を独自にロード (正確にはマップ。。。かな) させ、自身の DLL が使うそれら API コールはすべてそっちを使うように IAT も書き換える。
これによって、セキュリティ ソフトは「第三者」が仕込んだ API Hook の影響を排除することができる。
さらにこの Hook は、プロローグ コードの書き換えではなく IAT の書き換えと Code Injection をベースにしているので、恐らくマルウェア側からも見えにくいはず。
いずれにせよ TmUmEvt.dll はかなり手の込んだ方法で、API Hook をしているようです。
(それにしても灯台下暗し。。。目から鱗。。。)
> それと、FreeLibraryする方法はだめでした。そうでしょうね。
こんな手の込んだことしているセキュリティ ソフトが、あんなお手軽コードですり抜けられる訳がありませんね。wwww> 一応ダンプは保存したので、WinDBGで見ることは可能です。これ以上は、ユーザー モード ダンプを見ても、あんまり意味がないかも。
(個人的には、そのダンプ欲しいけど。www)
カーネル モード デバッグできっちりトレースしないと、具体的な挙動は把握できないと思います。> トレンドマイクロDLLの影響にはほぼ間違いなさそうですが、
> それを回避するようなデバッグができるようにVisual Studio側で
> なんとかできないのでしょうかね?それを私に聞かれも。。。
とりあえず「デバッグの停止時に自動的にコンソールを閉じる」の設定で回避するしかないと思います。
そもそもこの問題の原因は、マイクロソフトとトレンドマイクロのどっちが悪いのか、白黒つけるのが難しいと思いますし。
という訳で、私が手伝えるのはここまで。- 回答としてマーク pine 2019年6月19日 6:23