编译后如何计算某些二进制功能(或基本块)的校验和
How to compute checksum of some binary function (or basic block) after compilation?
我想编程一些简单的篡改机制,该机制在运行时计算某些功能(或基本块)的校验和将其与固定的预定值进行比较。如果校验和匹配,那么一切都很好。否则该程序将终止。
我可以在运行时轻松计算校验和,但是我不知道如何计算固定值进行比较。
我想我要在编译后对二进制文件进行一些帖子处理,因为不可能在编译时知道校验和。
。但是,如何在与我的功能(或基本块)相对应的二进制代码中找到代码点?我有可能使用一些十六进制编辑器手动执行此操作,但我想自动化该过程。预先计算校验和后,我需要修改二进制文件以包括IT-但这再次需要能够在二进制中找到适当的位置。
有关解决方案的任何建议?
例如,您可以获得一个指针来函数并将其重新解释为uint8_t的数组。另外,如果您不希望编译器在某个循环中使用该函数的副本,则可以禁用对特定函数的内线。
uint8_t* pMain = (uint8_t*)&main;
然后,您必须尝试估计功能长度并计算校验和计算。
如果您的代码由您可以遵循机制的几个文件组成:
-
与您要在未来检查的函数编译文件
-
定位在编译的文件(最有可能.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包围;> - 计算函数的上面示例
写脚本以解析它 - 您需要地址和分解代码之间的十六进制代码
计算您的CRC,哈希或您需要的任何内容
存储CRC和块长度以后在运行时解码,该文件也将在文件中也将比也将汇编,当然您需要知道映射什么变量/恒定保留donftical crc
li>链接所有文件
如果可用的单个文件(完整可执行文件),则可以:
- 在源代码中定义常数/静态,以持有CRC
- DO CRC计算如上所述
- 在二进制(in .Data或.rodata部分)中找到您的var位置,然后更新
- 您很可能也需要修复可执行的CRC!
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- MPI 二进制文件 I/O 基本功能和性能问题
- 编写二进制文件模板功能
- 两个派生类(十六进制 二进制)的虚拟功能
- 搜索非二进制树C 的功能
- 简单的二进制搜索树非递归添加功能
- 编译后如何计算某些二进制功能(或基本块)的校验和
- 二进制树级别明智的打印功能不起作用
- 二进制搜索功能不起作用
- 将功能写入二进制文件
- C 功能具有3个参数,可在通用二进制输入中读取
- 为什么我的功能(在二进制树上)打印出意外的结果
- 二进制树搜索功能
- 二进制树高功能
- 平衡二进制搜索树搜索功能
- 使用boost范围转换适配器具有二进制功能
- 二进制搜索树(搜索功能)
- 需要帮助调试简单的更新二进制文件的功能