ディスクの内容を直接読むと、ほかのユーザーのファイルも見れてしまう件 (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 バッフ […]

Windows プログラムに埋め込まれた MS-DOS スタブのメッセージを表示する

MS-DOS スタブの「This program cannot be run in DOS mode.」というメッセージを表示するプログラムを作ります。 動作確認環境 Windows 10 Home 21H1, 64bit Visual Studio Community 2019 プログラムの作成 既存のほとんどのプログラムには、0x4e バイト目から「This program cannot be run in DOS mode.」という文字列が埋め込まれています。 例 1. メモ帳 例 2. […]

コンパイラは数を当てるマジックを解けるか

「任意の数を思い浮かべてもらい、特定の計算をしてもらい、その結果を当てる」という子供向けのマジックがあります。これを C 言語のコンパイラで解いてみましょう。 動作確認環境 Windows 10 Home 21H1, 64bit Visual Studio Community 2019 マジックの内容 このマジックは無限のバリエーションが作れますが、今回は次の計算をすることにします。 好きな数を思い浮かべてください。 その数に 5 を足してください。 2 倍してください。 4 を引いてください。 […]

rundll32 はなぜ __cdecl の関数も __stdcall の関数も呼び出せるのか

通常、関数を呼び出す際は、呼び出す側と呼び出される側とで呼び出し規約 (calling convention) を合わせておく必要があります。また、__stdcall 呼び出し規約では、引数の個数も合わせておく必要があります。しかし、rundll32 コマンドは、呼び出す関数の仕様を規定していません。なぜ、どんな関数も呼び出せるのでしょうか。 動作確認環境 Windows 10 Home 21H1, 64bit(ただし、今回は 32bit の C:\Windows\SysWOW64\rundll […]

メモ帳を別フォルダにコピーすると起動しない理由

あるときメモ帳 (notepad.exe) を別のフォルダにコピーしたところ、コピーしたメモ帳が起動しないことに気づきました。 たとえば、次の画面のように「C:\Windows」フォルダ内の「notepad.exe」を「C:\tmp」フォルダ内にコピーすると、コピー先の「notepad.exe」をダブルクリックしてもメモ帳が起動しません。 なぜ起動しないのか、原因を調べてみました。 動作確認環境 Windows 10 Home 21H1, 64bit Process Monitor による調査 […]