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] までが有効) […]

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

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

ディスクの内容を直接読むと、ほかのユーザーのファイルも見れてしまう件 (Visual C++)

Visual C++ で、ファイルではなく、ディスクそのものを読み込むプログラムを作ってみます。 動作確認環境 Windows 11 Home 21H2 Visual Studio Community 2019 ディスクを読み込むプログラム 「物理ディスク 0」の先頭 512 バイトを読み込むプログラムを以下に示します。ポイントは次の通りです。 CreateFile() のファイル名として、”\\\\.\\PHYSICALDRIVE0″ を指定する。 読み込む場所とサイズ […]

Visual C++ で末尾再帰の最適化を確認する

Visual C++ で末尾再帰の最適化を確認します。 動作確認環境 Windows 10 Home 21H2, 64bit Visual Studio Community 2019 普通の再帰プログラムを書く 1 から 100 までの数を合計するプログラムを、再帰を使って書きます。ループで書くなり計算で求めたりしたほうが効率的ですが、実験のため再帰を使います。 コンパイルして、実行します。Zi は「デバッグ情報生成」の意味です。 1 から 100 までの合計である 5050 が表示されました。 […]

メモリ内にパスワード残ってしまう話(続き)

前回、password バッファを SecureZeroMemory() でクリアしているにもかかわらず、ダンプファイル内にパスワードが残ってしまうという話をしました。なぜなのか、追っていきます。 動作確認環境 Windows 10 Home 21H2, 64bit Visual Studio Community 2019 WinDbg プログラム再掲 前回使ったプログラムを再掲します。 password バッファを SecureZeroMemory() でクリアしていますが、メモリ内にパスワー […]

メモリ内にパスワードが残ってしまう話

パスワードを格納したバッファをクリアしたつもりが実際にはクリアされず、パスワードが漏洩してしまう可能性についてお話しします。 動作確認環境 Windows 10 Home 21H2, 64bit Visual Studio Community 2019 WinDbg パスワードが漏洩するパターン 次のプログラムを準備します。 処理の概要は次の通りです。 ユーザー入力したパスワードを password という名前のバッファに格納。 password バッファの内容を表示。 password バッフ […]