9.2 KiB
密码/压缩算法
密码/压缩算法
☁️ HackTricks 云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥
- 你在一家网络安全公司工作吗?想要在 HackTricks 中看到你的公司广告吗?或者你想要获取最新版本的 PEASS 或下载 HackTricks 的 PDF吗?请查看订阅计划!
- 发现我们的独家NFTs收藏品——The PEASS Family
- 获取官方 PEASS & HackTricks 商品
- 加入💬 Discord 群组 或 电报群组,或者关注我在推特上的🐦@carlospolopm。
- 通过向hacktricks 仓库 和hacktricks-cloud 仓库 提交 PR 来分享你的黑客技巧。
识别算法
如果你遇到了一个使用移位操作、异或操作和其他多种算术操作的代码,很有可能它是一个密码算法的实现。下面将展示一些无需逆向每一步就能识别所使用的算法的方法。
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 (对称加密)
特征
它由 3 个主要部分组成:
- 初始化阶段/:创建一个从 0x00 到 0xFF 的值的表格(总共 256 字节,0x100)。这个表格通常被称为替代盒(或 SBox)。
- 混淆阶段:将在之前创建的表格上进行循环(再次循环 0x100 次),使用半随机字节修改每个值。为了创建这些半随机字节,使用了 RC4 密钥。RC4 密钥的长度可以在 1 到 256 字节之间,但通常建议长度超过 5 字节。通常,RC4 密钥的长度为 16 字节。
- XOR 阶段:最后,明文或密文与之前创建的值进行异或。加密和解密的函数是相同的。为此,将根据需要执行对创建的 256 字节的循环。在反编译的代码中,通常会使用**%256(mod 256)**来识别这一点。
{% hint style="info" %} 为了在反汇编/反编译代码中识别 RC4,你可以检查大小为 0x100 的 2 个循环(使用密钥),然后将输入数据与之前在 2 个循环中创建的 256 个值进行异或,可能使用了 %256(mod 256) {% endhint %}
初始化阶段/替代盒:(注意计数器使用的数字256以及如何在256个字符的每个位置上写入0)
混淆阶段:
XOR阶段:
AES(对称加密)
特征
- 使用替代盒和查找表
- 可以通过使用特定查找表值(常量)来区分AES。注意,常量可以存储在二进制中,也可以动态创建。
- 加密密钥必须是16的倍数(通常为32B),通常使用16B的IV。
SBox常量
Serpent(对称加密)
特征
- 很少发现使用它的恶意软件,但有一些例子(Ursnif)
- 可以根据其长度(非常长的函数)确定算法是否为Serpent。
识别
在下图中,请注意使用了常量0x9E3779B9(注意,此常量也被其他加密算法如TEA(Tiny Encryption Algorithm)使用)。
还请注意循环的大小(132)以及反汇编指令和代码示例中的XOR操作的数量:
正如之前提到的,可以在任何反编译器中将此代码视为非常长的函数,因为其中没有跳转。反编译后的代码可能如下所示:
因此,可以通过检查魔术数字和初始XOR,查看非常长的函数并将其与实现进行比较(如左移7位和左旋转22位)来识别此算法。
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变换
请注意使用了更多的常量
CRC(哈希)
- 较小且更高效,其功能是查找数据中的意外更改
- 使用查找表(因此可以识别常量)
识别
检查查找表常量:
CRC哈希算法如下所示:
APLib(压缩)
特征
- 无法识别的常量
- 可以尝试在Python中编写算法并在网上搜索类似的内容
识别
图形非常大:
检查3个比较以识别它:
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 您在网络安全公司工作吗?您想在HackTricks中看到您的公司广告吗?或者您想获得PEASS的最新版本或下载PDF格式的HackTricks吗?请查看SUBSCRIPTION PLANS!
- 发现我们的独家NFT收藏品The PEASS Family
- 获取官方PEASS和HackTricks衣物
- 加入💬 Discord群组或电报群组,或在Twitter上关注我🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享您的黑客技巧。