hacktricks/reversing/cryptographic-algorithms
2024-07-19 10:11:43 +00:00
..
README.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:11:43 +00:00
unpacking-binaries.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:11:43 +00:00

加密/压缩算法

加密/压缩算法

{% hint style="success" %} 学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE)
学习与实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)

支持 HackTricks
{% endhint %}

识别算法

如果你在代码中发现 使用了右移和左移、异或和多个算术操作,那么它很可能是 加密算法 的实现。这里将展示一些 识别所使用算法的方法,而无需逐步反向工程

API 函数

CryptDeriveKey

如果使用了此函数,可以通过检查第二个参数的值来找到 所使用的算法

在这里查看可能的算法及其分配值的表格:https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id

RtlCompressBuffer/RtlDecompressBuffer

压缩和解压缩给定的数据缓冲区。

CryptAcquireContext

来自 文档CryptAcquireContext 函数用于获取特定加密服务提供程序 (CSP) 中特定密钥容器的句柄。此返回的句柄用于调用使用所选 CSP 的 CryptoAPI 函数。

CryptCreateHash

初始化数据流的哈希。如果使用了此函数,可以通过检查第二个参数的值来找到 所使用的算法


在这里查看可能的算法及其分配值的表格:https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id

代码常量

有时,由于需要使用特殊且唯一的值,识别算法非常简单。

如果你在 Google 中搜索第一个常量,这就是你得到的结果:

因此,你可以假设反编译的函数是 sha256 计算器
你可以搜索其他常量,可能会得到相同的结果。

数据信息

如果代码没有任何显著的常量,它可能在 加载 .data 段中的信息
你可以访问该数据,将第一个 dword 分组,并像我们在前面的部分那样在 Google 中搜索:

在这种情况下,如果你搜索 0xA56363C6,你会发现它与 AES 算法的表 相关。

RC4 (对称加密)

特点

它由三个主要部分组成:

  • 初始化阶段/:创建一个 从 0x00 到 0xFF 的值表(总共 256 字节0x100。这个表通常称为 替代盒(或 SBox
  • 打乱阶段:将 循环遍历之前创建的表0x100 次迭代的循环),用 半随机 字节修改每个值。为了创建这些半随机字节,使用 RC4 密钥。RC4 密钥 的长度可以 在 1 到 256 字节之间,但通常建议长度超过 5 字节。通常RC4 密钥为 16 字节。
  • 异或阶段:最后,明文或密文与 之前创建的值进行异或。加密和解密的函数是相同的。为此,将对创建的 256 字节进行循环,循环次数根据需要而定。通常,在反编译的代码中可以通过 %256模 256 识别。

{% hint style="info" %} 为了在反汇编/反编译代码中识别 RC4你可以检查两个大小为 0x100 的循环(使用密钥),然后将输入数据与之前在两个循环中创建的 256 个值进行异或,可能使用 %256模 256 {% endhint %}

初始化阶段/替代盒:(注意用作计数器的数字 256 以及在 256 个字符的每个位置写入 0 的方式)

打乱阶段:

异或阶段:

AES (对称加密)

特点

  • 使用 替代盒和查找表
  • 由于使用特定查找表值(常量),可以 区分 AES注意 常量 可以 存储 在二进制中 或动态创建
  • 加密密钥 必须 可被 16 整除(通常为 32B并且通常使用 16B 的 IV

SBox 常量

Serpent (对称加密)

特点

  • 很少发现某些恶意软件使用它但有一些例子Ursnif
  • 根据其长度(极长的函数)简单判断算法是否为 Serpent

识别

在下图中注意常量 0x9E3779B9 的使用(注意该常量也被其他加密算法如 TEA -微型加密算法使用)。
还要注意 循环的大小132)和 反汇编 指令中的 异或操作 数量以及 代码 示例:

如前所述,这段代码可以在任何反编译器中可视化为 非常长的函数,因为其中 没有跳转。反编译的代码可能看起来如下:

因此,可以通过检查 魔法数字初始异或 来识别此算法,看到 非常长的函数比较 一些 指令实现(如左移 7 和左旋转 22

RSA (非对称加密)

特点

  • 比对称算法更复杂
  • 没有常量!(自定义实现难以确定)
  • KANAL加密分析器未能显示 RSA 的提示,因为它依赖于常量。

通过比较识别

  • 在第 11 行(左)有一个 +7) >> 3,与第 35 行(右)相同:+7) / 8
  • 第 12 行(左)检查 modulus_len < 0x040,而第 36 行(右)检查 inputLen+11 > modulusLen

MD5 & SHA哈希

特点

  • 3 个函数Init、Update、Final
  • 初始化函数相似

识别

Init

你可以通过检查常量来识别它们。注意 sha_init 有一个 MD5 没有的常量:

MD5 Transform

注意使用了更多常量

CRC哈希

  • 更小且更高效,因为它的功能是查找数据中的意外更改
  • 使用查找表(因此你可以识别常量)

识别

检查 查找表常量

一个 CRC 哈希算法看起来像:

APLib压缩

特点

  • 不可识别的常量
  • 你可以尝试用 Python 编写算法并在线搜索类似的东西

识别

图表相当大:

检查 3 个比较以识别它

{% hint style="success" %} 学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE)
学习与实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)

支持 HackTricks
{% endhint %}