Visual C++ での同一ソース同一バイナリの実現方法を探る

Visual C++ で C/C++ のプログラムをコンパイル(ビルド)すると、ビルドのたびに微妙に異なるバイナリが生成されてしまいます。そのため、バイナリからソースを特定するのが面倒です。この問題を回避する方法を探ります。 動作確認環境 Windows 11 Home 21H2 Visual Studio Community 2019 課題 1. ビルド日時が埋め込まれる Visual C++ はバイナリにビルド日時を埋め込みます。次のプログラムで確認してみましょう。 ビルドします。 生成され […]

DLL_PROCESS_ATTACH やコンストラクタの実行タイミングを調査する

次の処理の実行タイミングを調査します。 EXE のロード DLL のロード DLL_PROCESS_ATTACH DLL_PROCESS_DETACH グローバル変数のコンストラクタ グローバル変数のデストラクタ メインルーチン mainCRTStartup _DllMainCRTStartup 動作確認環境 Windows 11 Home 21H2 Visual Studio Community 2019 結論 結論から書きます。 下図の青丸が起動時の処理順になります。 下図の赤丸が終了時の処 […]

api-ms-win-crt-runtime-l1-1-0.dll といった長い名前の DLL の実体は何か

「api-ms-win-crt-runtime-l1-1-0.dll」だとか「api-ms-win-crt-stdio-l1-1-0.dll」だとか、やたら長い名前の DLL が実行可能ファイルにリンクされていることがありますが、これは何なのでしょうか。 動作確認環境 Windows 11 Home 21H2 Visual Studio Community 2019 やたら長い名前の DLL メモ帳がリンクしている DLL を見てみます。 「api-ms-」から始まる長い名前の DLL がたくさ […]

Windows システムファイルのビルド日時が表示されない謎を探る

EXE ファイルや DLL ファイルにはビルド日時が埋め込まれており、dumpbin コマンドで表示できます。しかし、Windows のシステムファイルの多くは、ビルド日時が表示されません。OS のファイルなので特別扱いされているのでしょうか。調査します。 動作確認環境 Windows 11 Home 21H2 Visual Studio Community 2019 WORD のビルド日時を確認する 実行可能ファイル(ここでは EXE, DLL, SYS などを含む)のビルド日時は、Visua […]

何もしない長い命令、マルチバイト NOP (x86/x64)

x86/x64 CPU には、何もしないマシン語「90」(16進数)が存在します。アセンブリ言語でいうと「NOP」です。 では 2 バイト以上を何もしない命令でふさぎたい場合は「90」を繰り返せばいいのかというと、それでも構いませんが、 2 バイトの何もしないマシン語「66 90」 3 バイトの何もしないマシン語「0F 1F 00」 4 バイトの何もしないマシン語「0F 1F 40 00」 …… といった専用の命令が存在します。 こうした何もしない長い命令「マルチバイト NOP」について調べてみ […]

Windows プロセスの親子関係を見る

Windows プロセスの親子関係について調べます。 動作確認環境 Windows 11 Home 21H2 プロセスツリーを見る Windows では、あるプロセスから別のプロセスを生成すると、親子の関係になります。親子関係は Sysinternals のプロセスエクスプローラー (ProcExp.exe) で確認できます。 Windows のシェルである「エクスプローラー (explorer.exe)」から「Excel (excel.exe)」と「コマンドプロンプト (cmd.exe)」を起 […]

安全と言われる Rust はどのように配列の長さをチェックしているのか

Rust 言語では配列・バッファの長さチェックを行っており、既定のサイズを超えて使おうとすると実行時エラー(バッファオーバーラン)になるとのこと。配列を使う直前に毎回範囲チェックをしているのでしょうか。Rust を使うのは初めてですが、動作を確認してみます。 動作確認環境 Windows 11 Home 21H2 Rust 1.58.1 WinDbg 配列を使うプログラムを作る 配列を使う Rust のプログラムを書きます。 4 つの要素をもつ配列(buf[0] から buf[3] までが有効) […]

dumpbin /headers が想定外の値を返した話

「dumpbin /headers ファイル名」が想定外のビット数を報告してきて戸惑った話です。 動作確認環境 Windows 11 Home 21H2 Visual Studio Community 2019 System32 と SysWOW64 64bit 版 Windows では、64bit 版のシステムファイルが「C:\Windows\System32」内に、32bit 版のシステムファイルが 「C:\Windows\SysWOW64」に格納されています。 しかし、各ディレクトリにある […]

dumpbin.exe は link.exe の単なるラッパーだった

モジュールの調査でよく使う dumpbin ツールが、リンカーの単なるラッパーだったという話です。 動作確認環境 Windows 11 Home 21H2 Visual Studio Community 2019 便利な dumpbin EXE や DLL の調査に便利な dumpbin ツール。特に次のオプションはよく使います。 /headers : ヘッダー情報を表示 /dependents : 依存 DLL を表示 /exports : エクスポート情報を表示 /imports : インポ […]

exe ファイルの中にある ABCDEFG… は何なのか

exe ファイルやダンプファイルを見ていると、”ABCDEFGHIJKLMN…” といった文字列を目にすることがあります。これは何なのでしょうか。 動作確認環境 Windows 11 Home 21H2 Visual Studio Community 2019 ABCDEFG… の文字列 何の処理もしないプログラム「ctest1.c」を書きます。 Visual C++ でビルドします。 生成された「ctest1.exe」ファイルの中身を見てみます。 プログラムには書いてい […]