Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译器保持内联函数和数组值_C++_Reverse Engineering_Visual Studio 2019 - Fatal编程技术网

C++ 编译器保持内联函数和数组值

C++ 编译器保持内联函数和数组值,c++,reverse-engineering,visual-studio-2019,C++,Reverse Engineering,Visual Studio 2019,我正在尝试实现一种反分析技术,其中一些密钥函数被加密,仅在使用前解密,然后再次加密。 因此,我的实现涉及到一个数组,它将保存函数地址和长度,外部密码器将使用这些地址和长度来识别和加密所述函数 我的问题是编译器一直使用数组中的值作为常量,而不是访问,这使得加密程序无法定位函数等等,我尝试了几个编译器选项,但没有一个符合我的要求。我正在寻找一种方法,使函数数组有一个单一的副本,而不是内联,因为目前 编辑:编译器是VS2019 编辑2:澄清问题数组需要从二进制文件导出,即它需要是可执行文件符号表中的公

我正在尝试实现一种反分析技术,其中一些密钥函数被加密,仅在使用前解密,然后再次加密。 因此,我的实现涉及到一个数组,它将保存函数地址和长度,外部密码器将使用这些地址和长度来识别和加密所述函数

我的问题是编译器一直使用数组中的值作为常量,而不是访问,这使得加密程序无法定位函数等等,我尝试了几个编译器选项,但没有一个符合我的要求。我正在寻找一种方法,使函数数组有一个单一的副本,而不是内联,因为目前

编辑:编译器是VS2019
编辑2:澄清问题

数组需要从二进制文件导出,即它需要是可执行文件符号表中的公共符号

在Windows上,这将是:

using Function = ...;

__declspec(dllexport) const Function encrypted_functions[] = { f1, f2, ... };
在非Windows平台上,您需要使用黄金链接器并确保符号可见:

#ifdef __cplusplus
extern "C" {
#endif
__attribute__((visibility ("default")) const Functions encrypted_functions[] = ...;
#ifdef __cplusplus
}
#endif
然后将符号添加到导出表(或LLVM链接器中的等效项)。即使是C符号,名称也可能会损坏,因此您需要使用
objdump
检查对象文件以查看该数组的真正符号名称


但这有点傻,因为加密程序应该是构建过程的一部分,并且应该直接与对象文件交互。最好的方法是使用与LLVM项目捆绑在一起的
libObject
。请参阅、和。

您使用的编译器/工具链是什么?这听起来像是你需要在某些地方禁用优化,而不是使用链接时代码生成。这是一个用于研究、娱乐或教育目的的玩具项目,还是你希望它能够经受住实际的攻击?我不太确定我是否完全理解这里的行为。您有一些以某种方式加密的函数。要在运行时调用它们,您需要对函数进行解密,此时您将调用解密的例程,然后删除函数的解密版本。如果是这种情况,您是在试图阻止对加密函数进行解密的例程进行内联,还是在试图阻止对加密函数本身进行内联?如果是前者,我不知道为什么它很重要,如果是后者,那怎么可能呢?还有,你是不是用这些未加密的函数启动你的可执行文件?因为如果你是,那么你已经在防御任何你正在防御的东西方面失败了。如果你的问题是“如何阻止编译器内联”,那么这是一个重复: