编译后如何计算某些二进制功能(或基本块)的校验和

How to compute checksum of some binary function (or basic block) after compilation?

本文关键字:功能 二进制 基本块 校验和 何计算 计算 编译      更新时间:2023-10-16

我想编程一些简单的篡改机制,该机制在运行时计算某些功能(或基本块)的校验和将其与固定的预定值进行比较。如果校验和匹配,那么一切都很好。否则该程序将终止。

我可以在运行时轻松计算校验和,但是我不知道如何计算固定值进行比较。

我想我要在编译后对二进制文件进行一些帖子处理,因为不可能在编译时知道校验和。

但是,如何在与我的功能(或基本块)相对应的二进制代码中找到代码点?我有可能使用一些十六进制编辑器手动执行此操作,但我想自动化该过程。预先计算校验和后,我需要修改二进制文件以包括IT-但这再次需要能够在二进制中找到适当的位置。

有关解决方案的任何建议?

例如,您可以获得一个指针来函数并将其重新解释为uint8_t的数组。另外,如果您不希望编译器在某个循环中使用该函数的副本,则可以禁用对特定函数的内线。

uint8_t* pMain = (uint8_t*)&main;

然后,您必须尝试估计功能长度并计算校验和计算。

如果您的代码由您可以遵循机制的几个文件组成:

  1. 与您要在未来检查的函数编译文件

  2. 定位在编译的文件(最有可能.o,.obj)功能位置 - 例如使用OBJDUMP或类似工具 - 它必须显示人类可读文本以及编译代码的HEX CODE

示例:

objdump a.o -d -insn -width = 10

  40064b:       48 89 e5                        mov    %rsp,%rbp
  40064e:       ff d0                           callq  *%rax
  400650:       5d                              pop    %rbp
  400651:       e9 7a ff ff ff                  jmpq   4005d0 <register_tm_clones>
0000000000400656 <calculate>:
  400656:       55                              push   %rbp
  400657:       48 89 e5                        mov    %rsp,%rbp
  40065a:       89 7d ec                        mov    %edi,-0x14(%rbp)
  40065d:       48 89 75 e0                     mov    %rsi,-0x20(%rbp)
  400661:       8b 05 f9 09 20 00               mov    0x2009f9(%rip),%eax        # 601060 <magicCRC1>
  400667:       89 c2                           mov    %eax,%edx
  400669:       48 8b 45 e0                     mov    -0x20(%rbp),%rax
  40066d:       89 10                           mov    %edx,(%rax)
  40066f:       48 8b 45 e0                     mov    -0x20(%rbp),%rax
  400673:       48 83 c0 04                     add    $0x4,%rax
  400677:       c7 00 01 00 00 00               movl   $0x1,(%rax)
  40067d:       c7 45 fc 00 00 00 00            movl   $0x0,-0x4(%rbp)
  400684:       eb 72                           jmp    4006f8 <calculate+0xa2>
  400686:       83 7d fc 01                     cmpl   $0x1,-0x4(%rbp)
  40068a:       75 1c                           jne    4006a8 <calculate+0x52>
  40068c:       8b 45 fc                        mov    -0x4(%rbp),%eax
  40068f:       48 98                           cltq   

因此,如果objdump函数名称将被&lt包围;> - 计算函数的上面示例

  1. 写脚本以解析它 - 您需要地址和分解代码之间的十六进制代码

  2. 计算您的CRC,哈希或您需要的任何内容

  3. 存储CRC和块长度以后在运行时解码,该文件也将在文件中也将比也将汇编,当然您需要知道映射什么变量/恒定保留donftical crc

    li>

    链接所有文件

如果可用的单个文件(完整可执行文件),则可以:

  1. 在源代码中定义常数/静态,以持有CRC
  2. DO CRC计算如上所述
  3. 在二进制(in .Data或.rodata部分)中找到您的var位置,然后更新
  4. 您很可能也需要修复可执行的CRC!