Любая функция, которая импортируется по имени, всегда будет иметь имя, встроенное в двоичный файл (если быть точным, в дескриптор импорта thunk), подробная информация о параметрах получена из pdbs, как упомянул Стив (однако анализ отладчиков, таких как ollydbg, может вывести args, из-за доступного имени символа). Единственным способом избежать этого является либо шифрование в IAT (с использованием сторонних упаковщиков / виртуализаторов / бинарных систем защиты и т. Д., Например, enigma), либо использование пользовательской версии GetModuleHandle
(в основном просто инструмент для написания PEB) и GetProcAddress
( PE spelunking tool на этот раз), затем, сохраняя все необходимые вызовы API в виде зашифрованных строк времени выполнения, вы можете затем вызывать все, что вам нужно, без выдачи простого текста (securerom делает это, хотя использует непосредственно GetProcAddress
вместе с некоторое двоичное запутывание).
Обновление:
для «запутанных» строк во время компиляции вы можете использовать что-то вроде этого (очень просто, но оно должно быть переносимым, если вы используете C ++ 0x, это намного проще):
#define c(x) char((x) - 1) //really simple, complexity is up to the coder
#define un(x) char((x) + 1)
typedef int (WINAPI* MSGBOX)(HWND, LPCSTR, LPCSTR, UINT);
const int ORD_MASK = 0x10101010;
const char szMessageBoxA[] = {c('M'),c('e'),c('s'),c('s'),c('a'),c('g'),c('e'),c('B'),c('o'),c('x'),c('A')};
FARPROC GetProcAddressEncrypted(HMODULE hModule, const char* szName, BOOL bOrd = FALSE)
{
if(bOrd)
return GetProcAddress(hModule,reinterpret_cast<const char*>(reinterpret_cast<int>(szName) ^ ORD_MASK)); //this requires that ordinals be stored as ordinal ^ ORD_MASK
char szFunc[128] = {'\0'};
for(int i = 0; *szName; i++)
szFunc[i] = uc(*szName++);
return GetProcAddress(hModule,szName);
}
MSGBOX pfMsgBox = static_cast<MSGBOX>(GetProcAddressEncrypted(GetHandleEncrypted(szUser32),szMessageBox));
При желании вы можете использовать MSVC EncodePointer
, чтобы скрыть значения в глобальных указателях функций (просто не забывайте использовать DecodePointer
при их вызове).
примечание: код не проверен, так как он находится на моей голове