【问题标题】:Checksum of a function in memory内存中函数的校验和
【发布时间】:2010-12-01 20:59:28
【问题描述】:

我正在为一个程序制作一种反黑客的东西,我希望能够创建一个函数字节的校验和,以查看它是否已被修改。我知道如何进行校验和,但是如何获得我应该校验和的多少字节?有没有办法获取我的函数的大小?

【问题讨论】:

  • 如果你正在做一个反黑客的事情,你怎么知道你的校验和功能没有改变?
  • 通过这样做,您添加了一个需要被黑客修补的位置。这值得付出努力吗?
  • 这可以通过生成汇编代码并在每个函数的末尾添加符号来完成(无论如何在 x86 上),但是......我不想维护它......然后它会如果应用任何形式的整个程序优化可能会中断,因为函数会在内存中移动。您想要做的事情既难又容易解决:)
  • @JimR:您假设(错误地)x86 编译器不会分解函数。我知道至少有一个编译器可以创建非连续函数。
  • @MSalters:这对我来说是新的,我不知道。那会是什么编译器?

标签: c++ function memory checksum


【解决方案1】:

甚至不要尝试。你不能假设一个函数在内存中是连续的:它的基本块的起始地址可能低于它的入口点;它可以与其他功能共享尾随基本块;它可能包含散布的数据或对齐字节,也可能完全消失,具体取决于调用站点(由于编译器决定内联函数)。

您的代码无法知道生成函数的大小。想想看:大小完全取决于编译器发出的内容,这取决于各种编译器设置和标志(想想优化、高度内联的发布版本与调试版本或使用 SSE 等增强指令集与不使用它们)。

此外,正如已经指出的那样,这样的校验和检查对于黑客来说是微不足道的 - 只是您必须反转的另一个分支。

最后,作为对好奇者的练习,因为潜在的恶意黑客也会使用它,我建议通过 IDA Pro 反汇编程序锁定您的二进制文件。这将使您预期的反黑客缓解措施的许多问题变得明显......

如果您真的想继续沿着这条路走下去,我建议您使用 antireversing resources 或在您的代码上运行一个后处理步骤
a)通过插入连接它们的跳转将所有功能链接在一起,这些跳转永远不会被采用。隐藏不透明谓词后面的分支。这将使反汇编难以阅读/理解,甚至会破坏一些进行静态流分析的反汇编程序,因为会产生巨大的函数大小。
b) 通过单个大分支函数重定向所有函数调用。这将对您的代码产生性能影响,但也会使调用图完全不可用/不可读。

【讨论】:

    【解决方案2】:

    理论上,您可以在可执行文件中使用指向函数的符号长度(假设您可以掌握它),但实际上并不要求它是正确的——系统不会关心,它只是转到函数的开头并运行直到函数返回。您可以尝试查找下一个函数的开始并假设函数是顺序的(除了填充,但没有理由不只是校验和),但这需要您知道哪个函数在您想要校验和的函数之后。无论哪种方式,您都必须让可执行文件在内存中分析自身以找到标头的那部分

    【讨论】:

      【解决方案3】:

      代码通常位于只读存储器中,因此无法更改。

      但是您可以为 DLL 嵌入校验和,以便在加载后立即验证自己的映像并在 DLL 磁盘映像已被修改时中止。但是操作系统还没有做到这一点吗?

      【讨论】:

      • 我猜这是为了保护一个软件免受具有计算机完全根访问权限的攻击者的攻击。
      • @Martin York,root 权限允许您更改内存页面标志,您可以将其从 r+e 更改为 r+w。
      • 我想他是担心最终用户拿走他的二进制文件并手动修改它,而不是流氓进程弄乱内存中的可执行文件
      • @SamJam:当然可以。在您自己的计算机上运行该程序,您可以在其中控制用户做什么和不做什么。当软件在另一个人的计算机上执行时,他可以用它做任何他喜欢的事情,只要他拥有(或可以获得)操作系统的 root/admin 访问权限,大多数用户都拥有。
      • @jalf 你是对的,所有软件安全问题的解决方案就是不要让任何人使用该软件。感谢您为这个问题添加有价值的内容。
      【解决方案4】:

      标准不允许使用函数作为sizeof 运算符的参数。所以没有可移植的方法来获取函数体的大小。此外,函数不一定要放在连续的内存块中。几个函数的一部分可以在一个地方改组(这就是 VS 在 Release 版本中所做的)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-20
        • 1970-01-01
        • 1970-01-01
        • 2012-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多