代码之家  ›  专栏  ›  技术社区  ›  Robert

逆向工程不是很危险吗?

  •  -2
  • Robert  · 技术社区  · 2 年前

    我花了几个小时阅读逆向工程,特别是与C/C++和Exif文件格式有关的内容。

    2个我找不到明确答案的问题:

    1. 为什么要使用Exif格式?让应用程序的程序集暴露的原因是什么?难道没有办法隐藏它,这样只有操作系统才能提取汇编代码来运行它吗?

    2. 如果我可以读取任何程序的汇编代码,那么为什么我不能执行以下示例:

    打开EXIF文件for excel,找到与检查程序激活相关的函数,并使其始终返回true?

    0 回复  |  直到 2 年前
        1
  •  2
  •   Brendan    2 年前

    为什么要使用Exif格式?让应用程序的程序集暴露的原因是什么?

    “exe”文件格式(可能是微软的PE32+文件格式)不包含任何汇编语言。相反,如果包含机器代码(CPU执行的一组数字)和数据;标题描述了程序的不同部分应该加载到内存中的位置。

    机器代码通常可以反汇编。这可以通过多种方式防止(自我修改代码、跳转到指令中间等巧妙技巧);但大多数工具(如C编译器、链接器等)不支持自我修改代码或巧妙的技巧,因此它们大多只在极端情况下使用(手工编写的程序集,旨在混淆调试器等)。

    另一种理论上可以防止反汇编的方法是加密;可能是操作系统在第一次执行时对页面/代码片段进行解密,并在短时间内未使用时丢弃解密的页面/代码片段。这不受任何操作系统的支持(据我所知);可能是因为它的性能成本很高。

    如果我可以读取任何程序的汇编代码,那么为什么我不能执行以下操作作为示例:打开EXIF file for excel,找到与检查程序激活相关的函数,并使其始终返回true?

    原始机器代码的反汇编不能只是“重新组装”成机器代码。如果修改机器代码,则可以更改原始程序(例如,禁用激活检查)。然而,有一些方法可以防止这种情况,包括:

    a) 数字签名。其基本思想是,可执行文件的发布者为其文件创建一个安全哈希(“大校验和”),然后用私钥对结果进行加密;其他任何人(操作系统)也可以创建文件的安全哈希,并将其与发布者的预期结果(使用发布者的公钥解密发布者的结果)进行比较,以确定文件发布后是否被修改(如果被篡改,则拒绝执行)。Windows、MacOS、UEFI安全引导等都使用/支持此功能。

    b) 没有返回“是或否”结果的激活函数(黑客很容易猜到返回的“正确”值),但有一个返回更复杂内容的激活函数(例如,解密所需配置或机密数据所需的加密密钥),黑客几乎不可能猜到返回的“正确”值。

    c) 将激活检查从可执行文件转移到其他文件(动态链接/共享库、操作系统、互联网上的远程服务器等)。