漸く期待通りの動作をする様になった

他の会社の人が作った DLL のログ( printf だか std::cout だかを使っていると思われる )が、俺が開いて標準出力に割り当てたファイルに出ましたよ。良かった。
デバッグ開始直後の ntdll.dll の DebugBreak で、@$ra に /1 でブレークを取り敢えず張って gc してですね、そのブレークに到達して止まったら as /x Alias... @eip でその値を保持してから、レジスタ情報を保存して、CreateFile, SetStdHandle, CreateFile, SetStdHandle ってやって( 無理矢理 eip, esp を弄って bp /1 Alias..., gc とするのを繰り返す )、更に eax = [@$peb + 0x10], [eax + 0x1c] = hStdout, [eax + 0x20] = hStderr としました( STARTUPINFOA 構造体の元 )。滅茶苦茶好い加減な説明ですけど、そんな感じです。
因みに、ファイル名には日付を入れていますよ。.logopen /t ってやると日付付きのログが出来るじゃないですか。それを as /c Alias... .logfile としてゲットして、ea @esp - 0x400 "Alias..." としてメモリに書き出して、ea @esp - 0x4xx "STDOUT" とかやってですね、STDOUT 用の日付入りログファイル名を作りました。STDERR も同様です。
最初は GetLocalTime, LoadLibrary, GetProcAddress( wsprintf ), wsprintf, FreeLibrary として STDOUT, STDERR 様の日付入りファイル名を作っていたのですが、GetProcAddress を行うと MSVCRT.dll の initio が走ってしまうという事が分かったので、使わない様に直しました。態々 LoadLibrary, GetProcAddress, FreeLibrary しているのは、user32 はチェックサムが合わないんだか何だかで怪しかったからです。若しかしたらこんな事はしなくても大丈夫なのかも知れません。ですが、GetProcAddress を使わないとしても、wsprintf を使う事によって恐らくは MSVCRT.dll の initio が走ると思うので、どっちみちこの構想は駄目じゃないかって思います。.logopen のファイル名から持って来た方が楽ですし、更に同じ日付になって綺麗ですし、こっちのやり方の方がどちらかと言うと良いかなあと思ってはいます。


そういや、たった二人しかいなかった女性がプロジェクトから抜けてしまうんですよ。あーあ…。右を向いても左を向いてもむさい野郎しか居ない嫌なプロジェクトになってしまうなあ。はあ…。