首页
社区
课程
招聘
[已解决] [求助]IDA反编译so文件,其中有一段关于tea加密的代码。分析完,想知道自己用python写的逻辑哪里不对????? 100.00雪花
发表于: 2021-7-27 11:48 5987

[已解决] [求助]IDA反编译so文件,其中有一段关于tea加密的代码。分析完,想知道自己用python写的逻辑哪里不对????? 100.00雪花

2021-7-27 11:48
5987

这是so文件解析出来的两段主要代码
第一部分是主要解密运算的核心逻辑:

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
unsigned int *__fastcall TEACrypt::TeaDecryptECB(unsigned int *result, int a2, _DWORD *a3)
{
  unsigned int v3; // [sp+10h] [bp-44h]
  unsigned int v4; // [sp+14h] [bp-40h]
  int v5; // [sp+18h] [bp-3Ch]
  int i; // [sp+1Ch] [bp-38h]
  int j; // [sp+1Ch] [bp-38h]
  int v8[8]; // [sp+34h] [bp-20h]
 
  v8[4] = *(_DWORD *)off_1F1E298;
  v3 = bswap32(*result);
  v4 = bswap32(result[1]);
  for ( i = 0; i <= 3; ++i )
  {
    result = (unsigned int *)(4 * i);
    v8[i] = bswap32(*(_DWORD *)(a2 + 4 * i));
  }
  v5 = -478700656;
  for ( j = 0; j <= 15; ++j )
  {
    v4 -= 16 * v3 + (v3 ^ v8[2]) + (v5 ^ (v3 >> 5)) + v8[3];
    result = (unsigned int *)(v4 >> 5);
    v3 -= 16 * v4 + (v4 ^ v8[0]) + (v5 ^ (v4 >> 5)) + v8[1];
    v5 += 1640531527;
  }
  *a3 = bswap32(v3);
  a3[1] = bswap32(v4);
  return result;
}

第二部分,是cbc模式的应用

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
int __fastcall TEACrypt::Tea_CBC_Decrypt(TEACrypt *a1, int a2, const unsigned __int8 *a3, _BYTE *a4, int *a5)
{
  _BYTE *v6; // r3
  int v7; // r2
  int v8; // r3
  int v13; // [sp+10h] [bp-3Ch]
  TEACrypt *v15; // [sp+14h] [bp-38h]
  int v16; // [sp+1Ch] [bp-30h]
  TEACrypt *v17; // [sp+20h] [bp-2Ch]
  int v18; // [sp+24h] [bp-28h]
  int v19; // [sp+28h] [bp-24h]
  int j; // [sp+28h] [bp-24h]
  int v21; // [sp+28h] [bp-24h]
  int i; // [sp+2Ch] [bp-20h]
  int k; // [sp+2Ch] [bp-20h]
  int v24; // [sp+30h] [bp-1Ch]
  unsigned __int8 v25[8]; // [sp+34h] [bp-18h] BYREF
  int v26; // [sp+3Ch] [bp-10h]
 
  v26 = *(_DWORD *)off_1F1E298;
  if ( (a2 & 7) != 0 || a2 <= 15 )
    return 0;
  TEACrypt::TeaDecryptECB(a1, a3, v25, v25);
  v24 = v25[0] & 7;
  if ( *a5 < a2 - 1 - v24 - 9 )
    return 0;
  *a5 = a2 - 1 - (v25[0] & 7) - 9;
  if ( *a5 < 0 )
    return 0;
  v17 = a1;
  v13 = a2 - 8;
  v15 = (TEACrypt *)((char *)a1 + 8);
  v18 = v24 + 1;
  v19 = 1;
  while ( v19 <= 2 )
  {
    if ( v18 <= 7 )
    {
      ++v18;
      ++v19;
    }
    if ( v18 == 8 )
    {
      TEACrypt::TeaDecryptECB(v15, a3, v25, v25);
      for ( i = 0; i <= 7; ++i )
        v25[i] ^= *((_BYTE *)v17 + i);
      v17 = v15;
      v13 -= 8;
      v15 = (TEACrypt *)((char *)v15 + 8);
      v18 = 0;
    }
  }
  v16 = *a5;
  while ( v16 )
  {
    if ( v18 > 7 )
    {
      if ( v18 == 8 )
      {
        TEACrypt::TeaDecryptECB(v15, a3, v25, v25);
        for ( j = 0; j <= 7; ++j )
          v25[j] ^= *((_BYTE *)v17 + j);
        v17 = v15;
        v13 -= 8;
        v15 = (TEACrypt *)((char *)v15 + 8);
        v18 = 0;
      }
    }
    else
    {
      v6 = a4++;
      v7 = v18++;
      *v6 = v25[v7];
      --v16;
    }
  }
  v21 = 1;
  while ( v21 <= 7 )
  {
    if ( v18 > 7 )
    {
      if ( v18 == 8 )
      {
        TEACrypt::TeaDecryptECB(v15, a3, v25, v25);
        for ( k = 0; k <= 7; ++k )
          v25[k] ^= *((_BYTE *)v17 + k);
        v17 = v15;
        v13 -= 8;
        v15 = (TEACrypt *)((char *)v15 + 8);
        v18 = 0;
      }
    }
    else
    {
      v8 = v18++;
      if ( v25[v8] )
        return 0;
      ++v21;
    }
  }
  return 1;
}

下面是我自己用python写的解密逻辑:
第一部分对应cbc模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def cbc_decrypt(v:bytearray,k:bytearray) -> bytearray:
 
    plaintexts = b''
    plaintext0 = b''
    n = 0
    for _block in block(v):
        if n == 0 :
            plaintext = tea_block_decipher(_block, k)
            plaintexts += plaintext
            plaintext0 = _block
        else:
            plaintext = tea_block_decipher(_block, k)
            temp_plaintext = xor(plaintext, plaintext0)
            plaintext0 = _block
            plaintexts += temp_plaintext
        n += 1
    return plaintexts

第二部分对应核心运算逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def bytecipher(cipherer):
    def wrapper(v:bytearray,k:bytearray):
        v,k = pad_simple(v,l=8),pad_simple(k,l=16)
        v = struct.unpack('>II',v)
        k = struct.unpack('>IIII',k)
        result = cipherer(*v,*k)
        result = struct.pack('>II',*result)
        return result
    return wrapper
@bytecipher
def tea_block_decipher(v0,v1,k0,k1,k2,k3):
    delta = TEA_MAGIC
    v0,v1,k0,k1,k2,k3,_sum = [uint_32(v) for v in [v0,v1,k0,k1,k2,k3,-478700656]]
    for i in range(0,TEA_ROUNDS):
        # v1.value -= ((v0.value<<4) + k2.value) ^ (v0.value + _sum.value) ^ ((v0.value>>5) + k3.value)
        v1.value -= (v0.value<<4) + (v0.value ^ k2.value) + (_sum.value ^(v0.value>>5)) + k3.value
        v0.value -= (v1.value << 4) + (v1.value ^ k0.value) + (_sum.value ^ (v1.value >> 5)) + k1.value
        # v0.value -= ((v1.value<<4) + k0.value) ^ (v1.value + _sum.value) ^ ((v1.value>>5) + k1.value)
        _sum.value += delta
 
    return v0.value,v1.value

python代码已上传附件,望大神给指点下错误


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 1
支持
分享
最新回复 (10)
雪    币: 7
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
没人吗?小白真心求教
2021-7-27 13:02
0
雪    币: 3710
活跃值: (2669)
能力值: ( LV7,RANK:105 )
在线值:
发帖
回帖
粉丝
3
mb_mfdpqgiv 没人吗?小白真心求教
直接转成C++不是更快吗?
2021-7-28 10:04
0
雪    币: 13293
活跃值: (4017)
能力值: ( LV8,RANK:133 )
在线值:
发帖
回帖
粉丝
4
网上 有现成的 TEA 源码
2021-7-28 10:15
0
雪    币: 324
活跃值: (2834)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
https://blog.csdn.net/kowity/article/details/7443113
2021-7-28 16:07
0
雪    币: 7
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
飘零星夜 网上 有现成的 TEA 源码
我是照着git上面的源码改的,最好分析so文件时,发现核心运算逻辑与源码不一致,所以就照着so文件里的逻辑改了~~然后还是发现解密的文件不对,然后不知道问题出在哪儿
2021-7-28 17:56
0
雪    币: 7
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
红颜小学生 https://blog.csdn.net/kowity/article/details/7443113
感谢分享,但是我在代码里已经这样处理过了~~我主要的问题,还是不知道问题出在哪里了,导致加密算法破解不对~
2021-7-28 18:01
0
雪    币: 576
活跃值: (2035)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这种直接用扣的伪码最方便,如果你非要用其他语言重写,就只有配合调试对比确定每步计算一样。特别是要注意有符号无符号运算的区别。
2021-7-28 18:26
0
雪    币: 144
活跃值: (31)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
9
v1.value  v0.value 计算完 & 0xffffffff,转成32位。不然下次移位数据就不对了。
2021-7-30 16:33
0
雪    币: 187
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
找不到这个so的,加载不是这个路径
2021-7-30 17:48
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
请问LZ问题解决了吗?
2021-8-30 16:50
0
游客
登录 | 注册 方可回帖
返回
//