混淆外部API调用C++; 我有一个C++代码,它调用外部库函数。我调用的函数是CreateProcess,如下所示 CreateProcess(NULL,pProcessName,NULL,NULL,false,CREATE_SUSPENDED, NULL,NULL,&suStartUpInformation,&piProcessInformation)

混淆外部API调用C++; 我有一个C++代码,它调用外部库函数。我调用的函数是CreateProcess,如下所示 CreateProcess(NULL,pProcessName,NULL,NULL,false,CREATE_SUSPENDED, NULL,NULL,&suStartUpInformation,&piProcessInformation),c++,windows,winapi,C++,Windows,Winapi,现在,当我编译代码并分解它时,程序集将纯文本显示为CreateProcess(args1、args2,…)。是否有任何方法可以混淆或加密对API的函数调用,这样,如果有人对其进行了伪装,他就永远不知道调用了哪些函数 谢谢 任何按名称导入的函数都将始终将名称嵌入二进制文件中(确切地说,在导入描述符thunk中),详细的参数信息是从PDB中获取的,正如Steve所提到的(但是,分析调试器(如ollydbg)可以推断args,因为符号名可用)。避免这种情况的唯一方法是加密到IAT(使用第三方打包机/虚

现在,当我编译代码并分解它时,程序集将纯文本显示为CreateProcess(args1、args2,…)。是否有任何方法可以混淆或加密对API的函数调用,这样,如果有人对其进行了伪装,他就永远不知道调用了哪些函数


谢谢

任何按名称导入的函数都将始终将名称嵌入二进制文件中(确切地说,在导入描述符thunk中),详细的参数信息是从PDB中获取的,正如Steve所提到的(但是,分析调试器(如ollydbg)可以推断args,因为符号名可用)。避免这种情况的唯一方法是加密到IAT(使用第三方打包机/虚拟机/二进制保护系统等,如enigma)或使用自定义版本的
GetModuleHandle
(基本上只是一个PEB探测工具)和
GetProcAddress
(这次是一个PE探测工具),然后,通过将您需要的所有api调用存储为运行时加密字符串,您就可以调用您需要的任何东西,而无需明文泄露(securerom可以做到这一点,尽管它直接使用
GetProcAddress
,并进行一些二进制混淆)

更新:

对于编译时的“模糊化”字符串,您可以使用如下内容(非常简单,但它应该是可移植的,如果您使用C++0x,这要容易得多):

#定义c(x)char((x)-1)//非常简单,复杂性取决于编码器
#定义un(x)字符((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)
{
如果(bOrd)
return GetProcAddress(hModule,reinterpret_cast(reinterpret_cast(szName)^ORD_MASK));//这要求序数存储为序数^ORD_MASK
char szFunc[128]={'\0'};
对于(int i=0;*szName;i++)
szFunc[i]=uc(*szName++);
返回GetProcAddress(hModule,szName);
}
MSGBOX pfMsgBox=static_cast(GetProcAddressEncrypted(GetHandleEncrypted(szUser32),szMessageBox));
或者,您可能希望使用MSVC来隐藏全局函数指针中的值(只要记住在调用它们时使用
DecodePointer


注意:代码未经测试,因为它只是我脑海中的一部分

您可以使用动态链接。在Windows中,使用LoadLibrary、LoadLibraryEx、GetProcAddress。现在,在您的代码中,以名称的模糊形式包含一些表单,而不是真正的库/符号名称,并在运行时对其进行解模糊

您可能希望使用动态分派(函数指针),以便无法从代码中轻松推断调用的函数

您可以将调用此函数的工作委托给另一个线程(使用某些IPC机制)


但是这是非常无用的,使用调试器很容易发现这个函数已经被调用了。而且检测流程是否已创建将非常简单。

好!这是解决办法。假设我想从“user32.dll”调用“MessageBoxA”。 下面是我将如何使用LoadLibraryA&GetProcAddress实现它

//好的,您可以在这里看到。
//我将DLL名称(user32.DLL)和DLL函数(MessageBoxA)作为字符串传递
//因此,我还可以对字符串执行加密和解密操作,并对其进行模糊处理。
//就像我可以加密字符串“user32.dll”并在运行时解密它并将其作为
//“LoadLibraryA”的一个参数,与函数名“MessageBoxA”的参数相同。
//代码是在DevC++4.9.9.2中编译的。
#包括
#包括
使用名称空间std;
void HelloWorld()
{
char*szMessage=“你好,世界!”;
char*szCaption=“你好!”;
HMODULE HMODULE=LoadLibraryA(“user32.dll”);
FARPROC fFuncProc=GetProcAddress(hModule,“MessageBoxA”);
((int(WINAPI*)(HWND,LPCSTR,LPCSTR,UINT))fFuncProc)(0,szMessage,szCaption,0);
}
int main()
{
HelloWorld();
}

听起来好像有人在构建特洛伊木马……或者更糟。你在西门子工作吗?:-)你是对的,我的朋友。这是一种AV旁路的东西。但不是为了伤害,而是为了测试保护水平。听说过按顺序进口吗?(虽然找到实际的函数名仍然很简单,但它不会存在于您的文件中)。@ben:是的,但通过序号导出的widows API(或其他API)并不多,winsock和ole是少数几种可以这样做的。谢谢!Necrolis,我不会使用任何第三方工具。我的问题很简单,你会如何对一个DLL进行模糊的调用,以及C++中的函数,这样它就不会在Enter Bulter中被揭示出来。我通过调用User32.dll中的MessageBoxA函数找到了一个示例。代码正在加载dll,但未正确调用函数。请参阅下面的代码。@Mudasir Khan:我没有看到任何代码,您可能已经达到了评论限制,所以请用您遇到问题的示例更新您的问题。请看最后一页。我已经成功地混淆了CreateProcess调用,但在下面的示例代码中,我给出了MessageBox的示例。谢谢ysdx。你很接近答案。我使用你提到的LoadLibraryA和GetProcAddress实现了这一点。从反汇编程序/反编译器发现调用的函数是MessageboxA非常简单。
#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));
//Ok here you can see.
//I am passing DLL name(user32.dll) and DLL function(MessageBoxA) as String
//So I can also perform Encrypt & Decrypt operation on Strings and obfuscate it. 
//Like i can encrypt the string "user32.dll" and at runtime decrypt it and pass it as 
//an argument to "LoadLibraryA" and same for the Function name "MessageBoxA".
//The code is compiled in DevC++ 4.9.9.2.

#include <windows.h>
#include <iostream>
using namespace std;

void HelloWorld()
{
        char* szMessage = "Hello World!";
        char* szCaption = "Hello!";
        HMODULE hModule         = LoadLibraryA( "user32.dll" );
        FARPROC fFuncProc       = GetProcAddress( hModule, "MessageBoxA" );
        ( ( int ( WINAPI *)( HWND, LPCSTR, LPCSTR, UINT ) ) fFuncProc )( 0, szMessage, szCaption, 0 );
}
int main()
{
    HelloWorld();
}