你好!
我正在反转为 ARM 架构编写的一个库(共享对象)。它被混淆或挤满了一些非常强大的东西,这使得在“长距离”上调试变得更加困难和几乎不可能。
有一个函数提供了一些奇怪算法的加密(至少对我来说)。
我现在研究的内容:
- 输入输出大小相同;
- 算法适用于4 个内存区域,这会影响结果(已测试):
- 大小 - 256 字节。这是 SBOX,但具有自定义值(值与 AES SBox 不同);
- 大小 - 256 字节。这是倒置的SBOX;
- 大小 - 16 字节。可能是初始化向量,但我不确定;
- 大小 - 128 字节。未知区域。
- 解密功能也适用于相同的内存区域。
现在我只知道算法中数据的第一个操作:
- 反转每个字节中的位 (
0x30 (00110000b) => 0xC (00001100b)
); - 反转字节 (
01 02 03 04 05 06 07 08 => 08 07 06 05 04 03 02 01
)
一些附加信息:
如果输入长度 < 15,它只是反转位和字节。
示例(十六进制字节):
01 01 01 01 01 01 01 01 => 80 80 80 80 80 80 80 80 80
如果输入长度为 15,则它反转除第 4 个字节以外的所有字节中的位。然后反转字节。
示例(十六进制字节):
01 01 01 02 01 01 01 01 01 01 01 01 01 01 01 =>
80 80 80 80 80 80 80 80 80 80 80 80 02 80 80 80
如果输入长度为 16,则反转位和字节,使用这种“未知”算法加密数据;
如果输入长度为 17-32,它将反转前 16 个字节中的位和字节,使用此算法加密前 16 个字节,并仅反转其余数据中的位和字节。
示例:(十六进制字节,粗体字节包含加密结果):
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 02 03 04 05 =>
50 D4 51 BD 59 42 30 A1 B3 5F 77 BD B3 BF A1 9A A0 20 C0 40
我有机会对任何数据进行加密并更改所有变量。我也有机会启动内置的解密功能。
也许有人知道它可以是什么,或者可以向我推荐一些额外的步骤来澄清这个算法的名称。
PS抱歉我的英语不好,希望我已经描述清楚了。