混淆外部API调用C ++

时间:2011-07-10 18:20:57

标签: c++ windows winapi

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

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

现在,当我编译代码并将其分解时,程序集将纯文本显示为 CreateProcess(args1,args2,...)。有没有办法对API的函数调用进行模糊处理或加密,这样如果有人将其分解,那么他就不会知道调用了哪些函数。

谢谢!

3 个答案:

答案 0 :(得分:3)

任何按名称导入的函数都会将名称嵌入到二进制文件中(确切地说是在导入描述符中),详细参数信息是从史蒂夫提到的pdbs中获取的(但是像ollydbg这样的分析调试器可以推导出来) args,由于符号名称可用)。避免这种情况的唯一方法是加密到IAT(使用第三方打包器/虚拟化器/二进制保护系统等,如enigma)或使用自定义版本的GetModuleHandle(基本上只是一个PEB探险工具)和{{ 1}}(这次是一个PE搜索工具),然后通过存储你需要的所有api调用作为运行时加密字符串,然后你可以调用你需要的任何东西而不用纯文本给你带走(securerom做了这个,虽然它使用{{1直接,以及一些二进制混淆)。

<强>更新

对于编译时“混淆”的字符串,你可以使用类似的东西(非常简单,但它应该是可移植的,如果你使用C ++ 0x,这会容易得多):

GetProcAddress

或者,您可能希望使用MSVC的EncodePointer来隐藏全局函数指针中的值(只需记住在调用它们时使用GetProcAddress)。

注意:代码未经测试,因为它只是我的头顶

答案 1 :(得分:2)

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

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

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

但它没用,使用调试器很容易发现已经调用了这个函数。检测到已创建进程非常简单。

答案 2 :(得分:1)

确定!这是解决方案。假设我想从“user32.dll”调用“MessageBoxA”。 所以这就是我将如何使用 LoadLibraryA &amp; GetProcAddress

//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();
}