2016-12-24 2 views
0

У меня есть исполняемый файл. Я хочу запустить его как процесс и прочитать в реальном времени исходный текст. Однако вывод буферизуется, и я могу получить его только при завершении процесса.Добавление вызова функции в 64-разрядный исполняемый файл Visual C++

Я хочу вставить вызов setbuf(stdout, NULL) в метод main().

Я использую IDA, и я вижу, что функции C STL импортируются из MSVCR120.DLL. Функция setbuf()/setvbuf() не импортируется, а также flush()/fflush() есть. LoadLibrary()/GetProcAddress() не импортируются.

Мне интересно, как исправить двоичный файл, чтобы он не буферировал stdout, что я могу сделать? Или, может быть, я могу сделать что-то около MSVCR120.DLL и сделать все отпечатки флеша?

+1

Простым способом является запись замены для msvcr120.dll, которая перенаправляет каждый вызов исходной dll, но добавляет setvbuf при первом вызове ввода-вывода. –

ответ

1

Во-первых, вы должны попытаться изучить источник CRT, чтобы узнать, есть ли какие-либо конфигурации, которые мы можем использовать, чтобы включить авто-флеш. Исходный код доступен в каталоге установки Visual C++ (вы также должны установить его также при установке VC).

Если нет конфигураций для этого. Другой способ - подключить vprintf или что-нибудь, что вы хотите смыть после того, как его вызвали с помощью DLL Injection. Вы можете найти много статей о DLL Injection и API Hooking в Интернете.

0

Используя IDA, я узнал, что мои исполняемые отпечатки с использованием vprintf() от MCVCR120.DLL.

Хотя MSVCR.DLL является известный длл, мой исполняемый файл относится MSVCR120.DLL, который не является, поэтому я скопированный MSVCR120.DLL из системного каталога в рабочую директорию исполняемого, теперь локальная копия библиотеки DLL будет использоваться.

Затем я открыл DLL в IDA и нашел vprintf() в экспортируемых функциях. Были также проданы flush() и _flushall(). Я решил использовать _flushall(), чтобы сбросить stdout, потому что ему не нужны аргументы и его легко вызвать (все же стирает все потоки).

Я просмотрел код vprintf() и сменил команду call _lock_file на call _flushall() с использованием Edit > Patch program > Assemble. Мне лучше найти лучший способ вставить вызов, но, по крайней мере, он не сбой сейчас. В любом случае исполняемый файл не записывается ни в какие файлы, и он должен работать нормально без вызова _lock_file().

Теперь вывод производится при каждой печати.

Смежные вопросы