Это возможно, но требует некоторой работы.
Вы порождаете приложение, используя вашу собственную программу запуска, которая будет применять шим. Вы делаете это, позволяя вашей программе запуска создать процесс с достаточными правами для редактирования его памяти. Большинство функций API начинаются с двухбайтового nop, которому предшествует больше nops. Вы можете изменить двухбайтовый переход на короткий прыжок, а предыдущий - на длинный прыжок, куда бы вы ни захотели.
Альтернативное решение, которое я использовал в прошлом, состоит в том, чтобы загрузить исполняемый файл в виде DLL, но это может привести к дополнительной работе, поскольку зависит от того, насколько привередливое приложение. В моей ситуации мне пришлось загружать исполняемый файл как DLL-библиотеку только для данных и выполнять весь собственный импорт, но, к сожалению, предыдущее решение не было для меня возможным.
Я также однажды написал подключаемую DLL, которая использует аналогичные принципы, но это только вариант, если вы можете либо изменить источник для загрузки DLL, либо если процесс поддерживает подключаемые модули DLL.