能力值:
( LV4,RANK:40 )
|
-
-
2 楼
算法没有魔改过,直接原解密算法套过来解一下就好了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #include <stdio.h>
#include <stdint.h>
void decrypt(uint32_t *v, uint32_t *k)
{
uint32_t v0 = v[0], v1 = v[1], i;
uint32_t delta = 0x9e3779b9;
uint32_t sum = delta * 32;
uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];
for (i = 0; i < 32; i++)
{
v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
sum -= delta;
}
v[0] = v0; v[1] = v1;
}
int main() {
uint32_t key[4] = { 2, 2, 3, 4 };
uint32_t enc[8] = { 0xA85BBFA5, 0xB21C2C6A, 0xE29C1A1B, 0xCE7F8AAF,
0xAC46CCDC, 0x9A13C658, 0x803986D2, 0xAB72607A };
for ( int i = 0; i < 8; i+=2)
decrypt(enc + i, key);
printf ( "%s" , enc);
return 0;
}
|
|
|
-
-
3 楼
TubituX
算法没有魔改过,直接原解密算法套过来解一下就好了
```c
#include
#include
void decrypt(uint32_t *v, uint32_t *k)
{
...
但是为啥我ida的那个delta值转16进制不是0x9e3779b9,而是被魔改过的0x61C88647
|
能力值:
( LV4,RANK:40 )
|
-
-
4 楼
注意变量类型,-0x61C88647 和 +0x9e3779b9计算出来实际上是一样的
|
能力值:
( LV4,RANK:40 )
|
-
-
5 楼
hopeee
但是为啥我ida的那个delta值转16进制不是0x9e3779b9,而是被魔改过的0x61C88647
你切到汇编视图就能看到是0x9e3779b9了,只是IDA反编译问题而已,实际上一样的
最后于 2024-12-13 23:32
被TubituX编辑
,原因:
|
|
-
-
6 楼
TubituX
算法没有魔改过,直接原解密算法套过来解一下就好了
```c
#include
#include
void decrypt(uint32_t *v, uint32_t *k)
{
...
但是确实是用没魔改过的delta值才对,所以我是被那个delta值给骗了是吧,我真是服了aaa
|
|
-
-
7 楼
TubituX
算法没有魔改过,直接原解密算法套过来解一下就好了
```c
#include
#include
void decrypt(uint32_t *v, uint32_t *k)
{
...
感谢大佬
|
|
|