任何通过名称导入的函数都会将名称嵌入到二进制文件中(在导入描述符thunk中是准确的),详细的参数信息是从Steve提到的pdbs获得的(不过分析像ollydbg这样的调试器可以由于符号名称可用,推导出参数)。避免这种情况的唯一方法是加密到IAT(使用第三方包装器/虚拟器/二元保护系统等,如enigma)或使用定制版本GetModuleHandle
(基本上只是一个PEB spelunking工具)和GetProcAddress
(PE探测工具然后通过将所需的所有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
当你给他们打电话)。
注:代码是未经测试,因为它只是把我的头
听起来像有人正在建造一个木马... – themaestro
或更糟。你在西门子工作吗? :-) –
你是对的我frend。它的某种AV旁路东西。但不是为了伤害,而是为了测试保护级别。 –