Вы не можете использовать 2008 CRT, но вы можете запретить связывание новых функций DecodePointer / EncodePointer из ядра. Заменить новые функции на заглушки довольно просто.
Можно попытаться сделать следующее: Поместите такой код в исходный код main.cpp:
extern "C" {
void *__stdcall _imp__DecodePointer(void *x) {return x;}
void *__stdcall _imp__EncodePointer(void *x) {return x;}
};
Выше не работает. В то время как основная идея - звук, исполнение должно быть немного другим. Как описано snemarch в комментарии и , другой ответ , __imp__
не может быть вызовом функции, только указатель на нее. Поскольку кажется невозможным сгенерировать указатель непосредственно компилятором, вам необходимо собрать следующий код с MASM и связать его с созданным объектным файлом.
.model flat
.data
__imp__EncodePointer@4 dd dummy
__imp__DecodePointer@4 dd dummy
EXTERNDEF __imp__EncodePointer@4 : DWORD
EXTERNDEF __imp__DecodePointer@4 : DWORD
.code
dummy proc
mov eax, [esp+4]
ret 4
dummy endp
end
Символы из проекта имеют преимущество перед любыми символами из библиотек. Библиотеки DLL связаны с использованием частей .lib, которые содержат только __imp__
«векторов», переходящих в реальные функции. Заменяя __imp__
«векторы», вы не касаетесь связывания DLL, вы заменяете часть .lib. Я убедился, что больше нет никакой зависимости exe-файла от DecodePointer / EncodePointer.
Фон
Статически связанная библиотека вносит в приложение только используемые функции. Можно найти, какую конкретную функцию CRT привнести в эти новые API, используя подробный вывод прогресса компоновщика:
Found __imp__EncodePointer@4
Referenced in LIBCMT.lib(crtmboxw.obj)
Referenced in LIBCMT.lib(invarg.obj)
Referenced in LIBCMT.lib(handler.obj)
Referenced in LIBCMT.lib(onexit.obj)
Referenced in LIBCMT.lib(cmiscdat.obj)
Referenced in LIBCMT.lib(tidtable.obj)
Referenced in LIBCMT.lib(hooks.obj)
Referenced in LIBCMT.lib(winsig.obj)
Referenced in LIBCMT.lib(rand_s.obj)
Found __imp__DecodePointer@4
// ... same list, only order differs ...
Это показывает, что новые API используются в некоторых CRT для обеспечения большей безопасности для некоторых функций, которые, как считается, предоставляют частые векторы атак.
С некоторыми усилиями можно было бы использовать LoadLibrary / GetProcAddress, чтобы обеспечить реальную функциональность, в которой есть предложения ОС, но я не думаю, что это действительно что-то принесет. Функции времени выполнения, которые используют DecodePointer / EncodePointer, на самом деле не нуждаются в этом для обеспечения какой-либо кодировки, все, что им нужно, - это кодирование симметричным. На самом деле вам не нужна повышенная безопасность (среда выполнения VS 2008 также не предоставит ее вам).
Надеюсь, вас больше не ждут другие препятствия - у меня нет доступа к системе Win2k или XP pre SP2, поэтому я не могу попробовать. Если есть какие-либо флаги заголовка exe, предотвращающие даже попытку запуска exe в таких системах, их легко изменить.