2016-12-24 4 views
0

私は実行可能ファイルを持っています。私はそれをプロセスとして実行し、その標準出力からライブ入力を読みたいと思う。しかし、出力はバッファリングされており、プロセスの終了時にしか取得できません。64ビットVisual C++実行可能ファイルに関数呼び出しを追加する

setbuf(stdout, NULL)コールをmain()メソッドに挿入したいとします。

IDAを使用しており、C STL関数がMSVCR120.DLLからインポートされていることがわかります。機能setbuf()/setvbuf()はインポートされておらず、flush()/fflush()もありません。 LoadLibrary()/GetProcAddress()はインポートされません。

バイナリにパッチを当てて、バッファされないようにするにはどうすればいいですか?stdout、どうすればいいですか?あるいは、私はMSVCR120.DLLについて何かできることがあり、すべてのプリントを一掃することができますか?

+1

もっと簡単な方法は、元のdllにすべての呼び出しを転送するmsvcr120.dllの代わりに、最初のIO呼び出しでsetvbufを追加する方法です。 –

答えて

1

まず、CRTソースを調べて、自動フラッシュをオンにするために使用できる設定があるかどうかを確認してください。ソースコードはVisual C++インストールディレクトリにあります(VCをインストールするときにもインストールする必要があります)。

これを行う設定がない場合。もう1つの方法は、vprintfまたはDLL Injectionで呼び出された後にフラッシングしたいものをフックすることです。インターネット上でのDLL注入とAPIフックに関する多くの記事があります。

0

IDAを使用して、実行ファイルが​​からMCVCR120.DLLを使用して印刷されていることがわかりました。

MSVCR.DLLながら知らDLLで、私の実行可能ファイルは、ので、私は、今、DLLのローカルコピーが使用されようとしている実行可能ファイルの作業ディレクトリへのシステムディレクトリからMSVCR120.DLLをコピーされないMSVCR120.DLLを指します。

次に、DLLをIDAで開き、エクスポートされた関数に​​が見つかりました。また、エクスポートされた機能はflush()_flushall()でした。私はstdoutをフラッシュするのに_flushall()を使うことに決めました。なぜならそれは引数を必要とせず、呼び出しも簡単だからです(しかし、すべてのストリームをフラッシュします)。

​​アセンブリコードを見て、call _lock_file命令をcall _flushall()に変更しました。Edit > Patch program > Assembleを使用しました。私はより良い方法を見つけるのが良いでしょうが、少なくとも今はクラッシュしません。実行ファイルはいずれのファイルにも書き込まないので、_lock_file()呼び出しがなければ正常に動作するはずです。

これで出力はすべての印刷でフラッシュされています。

関連する問題