В связи с вышедшей уже достаточное время назад версией precomp 0.43 необходимо было снова придумывать как инжектить свой код в процесс, т.к. все сторонние библиотеки (zlib1.dll и packjpg_dll.dll) автором были слинкованы статически в precomp.exe. В импорте остались только msvcrt.dll и kernel32.dll.
Самый первый и самый простой путь инжекта является патч - правим precomp.exe чтобы он импортировал нашу некую внешнюю dll, а та уже в свою очередь перехватывала все функции вводы-вывода. Но этот метод по мне смотрится как минимум не красиво. Поэтому возникла мысль сэмулировать работу системной библиотеки mscvcrt.dll. Простым киданием своей msvcrt.dll в папку целевого процесса естественно ни к чему не приведет, т.к. эта библиотека неявно находится в списке KnownDLLs, которые грузятся ТОЛЬКО из системной папки. Но есть лазейка, называемая DLL Redirecting, введенная еще с Win2000. Суть заключается в создании папки с именем процесса и добавлением ".local" к концу. В нее складываются все длл, которые необходимо загрузить локально. НА WinXP все работает на ура. Можно даже эмулировать kernel32.dll
Но Win7 показала иные результаты - ни msvcrt.dll, ни kernel32.dll таким образом локально не загружаются. Дальше нашел еще один интересный способ - так называемые сборки библиотек, которые создаются используя файлы манифестов. Этим способом возможно на любой системе для конкретного ехе файла подменить любую библиотеку (кроме корневых системных), положив рядом манифест файл и папку с библиотеками. Все конечно было бы хорошо, если бы при загрузке .exe файла эти корневые системные библиотеки сами не использовали msvcrt.dll
Получается, что кроме функций, необходимых для .exe файла, необходимо эмулировать ВСЕ функции библиотеки msvcrt.dll, что крайне геморно, ибо необходимо учитывать все нюансы ее работы.
Итого имеем: либо некрасивый метод патча precomp.ехе, либо гемор с полной эмуляцией msvcrt.dll. Я выбрал нечто среднее: создаем msvcrt.dll, эмулирующую только часть функции, необходимых для .exe файла и соединяем precomp.exe и msvcrt.dll вместе с помощью утилиты Шелвина - dllmerge. На выходе: один .exe файл с подмененными функциями ввода-вывода.