我在C ++中有一个从外部库调用函数的代码。我调用的函数是 CreateProcess ,如下所示。
CreateProcess(NULL,pProcessName,NULL,NULL,false,CREATE_SUSPENDED,
NULL,NULL,&suStartUpInformation,&piProcessInformation)
现在,当我编译代码并将其分解时,程序集将纯文本显示为 CreateProcess(args1,args2,...)。有没有办法对API的函数调用进行模糊处理或加密,这样如果有人将其分解,那么他就不会知道调用了哪些函数。
谢谢!
答案 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();
}