【问题标题】:Compile time function encryption [closed]编译时函数加密
【发布时间】:2020-08-03 05:40:30
【问题描述】:

我想知道编译时函数加密之类的东西是否可能,如果可能的话,有人如何实现它? “编译时函数加密”是指在编译时加密函数代码,然后在运行时解密代码,当您需要调用该函数时。

提前致谢!

【问题讨论】:

  • 在你strip所有符号的二进制之后,它几乎被加密了。即使有人反汇编二进制文件,他们也无法理解每条装配线的作用。
  • 这样做的目的是什么?如果攻击者可以访问您的物理设备,那么在 HD 上对其进行加密就无关紧要了——他们可以在您加载库时读取内存。如果是通过传输线加密,发送端用公钥加密,接收端用对应的私钥解密即可。无需在 HD 上存储加密。
  • @Yksisarvinen 即使有人反汇编二进制文件,他们也无法理解每条装配线的作用。人和机器已经这样做了几十年。它被称为逆向工程。上世纪 80 年代早期的一项此类努力是创建与 IBM-PC 兼容的 BIOS,从而帮助创建了“克隆”PC 市场。

标签: c++ compile-time self-modifying


【解决方案1】:

标准 C++ 不允许将代码作为数据访问。

也就是说,

int f(int);

reinterpret_cast<int*>(&f) = 1;

无效,您不能将“代码”作为数据访问。 当然,您也无法在编译时将代码作为数据访问。 所以你既不能加密也不能解密你的油膏。

仍然有一些工具可以真正做到这一点。但它们依赖于运行时特定于实现的行为。在编译时他们只是添加了额外的步骤,这通常是编译器不知道的,并且在编译后通过篡改编译器输出发生。

有些东西可能在可移植 C++ 中起作用,至少在理论上,这不是您想要的,但它是您要求的“编译时函数加密”。

如果你为你的函数定义了一些语法,比如你可以解析const char* function = "(a, b, c) { return a + b * c; }",那么如果你可以添加constexpr加密函数,你的程序中就会有在编译时加密的函数,并且可以在执行前解密。

Sure Standard 也不需要调用 constexpr 函数来生成静态初始化数据确实发生在编译时,但这是一个好的实现所期望的。

【讨论】:

  • 我看到了一个使用汇编在运行时异或函数的例子。 rohitab.com/discuss/topic/… 我想知道这样的事情是否可以在编译期间实现。
  • 标准 C++ 不允许这样做。所以实现定义区域中的例子。理论上,实现可以定义如何在编译时更改函数。在实践中,你不能强制编译器这样做,但它仍然可以作为额外的构建步骤来完成
【解决方案2】:

不,在 c++ 中编译时加密和任何代码自修改都不可能。

【讨论】:

    猜你喜欢
    • 2011-11-08
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    相关资源
    最近更新 更多