gpt4 book ai didi

c++ - 混淆外部 API 调用 C++

转载 作者:可可西里 更新时间:2023-11-01 09:49:09 25 4
gpt4 key购买 nike

我有一段 C++ 代码可以调用外部库中的函数。我调用的函数是 CreateProcess,如下所示。

CreateProcess(NULL,pProcessName,NULL,NULL,false,CREATE_SUSPENDED,
NULL,NULL,&suStartUpInformation,&piProcessInformation)

现在,当我编译代码并将其反汇编时,程序集将纯文本显示为 CreateProcess(args1, args2, ...)。有没有什么方法可以混淆或加密对 API 的函数调用,这样如果有人对其进行伪装,他将永远不知道调用了哪些函数。

谢谢!

最佳答案

任何按名称导入的函数都会将名称嵌入到二进制文件中(准确地说是在导入描述符中),详细的参数信息是从 Steve 提到的 pdbs 中获取的(但是分析调试器如 ollydbg 可以推断出args,由于符号名称可用)。避免这种情况的唯一方法是加密到 IAT(使用第 3 方加壳器/虚拟器/二进制保护系统等,如 enigma)或使用自定义版本的 GetModuleHandle(基本上只是一个 PEB 探查工具)和 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)。

注意:代码未经测试,因为它就在我的脑海中

关于c++ - 混淆外部 API 调用 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6642980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com