hello_py

jadx打开apk文件,查看MainActivity函数 ,猜测使用了chaquo框架

output.png

跟随函数调用

71c22dbec7d61688b3af7a5a0851d68.pngcbc3ca02a6cd121816c435d7ad75755.png

56bfa334572137d87ebbf9567527143.png

分析chaquo.python.Common

得知关键函数文件后缀名为 ‘.imy’,并且以Zip方式打开

bd5a0475f9beaf361945c63898a33f4.png

将apk文件后缀名改为zip打开

跟随文件路径如下

6a8b4c6daf49f4951d39df495f36651.png

将app.imy文件后缀名改为zip并打开

可以看到hello.py文件

7f5f221e26a4004f636ba53eca48d09.png

根据混淆特征知道是使用了Oxyry Python Obfuscator

目前没有找到去混淆的工具or脚本,只能人工手撸去混淆

通过特征值delta、MX等,猜测是XXTEA加密

去混淆得到大致代码逻辑如下

8d0ce57c021d83bdda01f8a614dcb13.png

编写解密脚本如下:

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
#include <stdio.h>
#include <stdint.h>
#define DELTA 0x9E3779B9
#define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))
void btea(uint32_t *v, int n, uint32_t const key[4])
{
uint32_t y, z, sum;
unsigned p, rounds, e;
if (n > 1) /* Coding Part */
{
rounds = 52/n+6;
sum = 0;
z = v[n-1];
do
{
sum += DELTA;
e = (sum >> 2) & 3;
for (p=0; p<n-1; p++)
{
y = v[p+1];
z = v[p] += MX;
}
y = v[0];
z = v[n-1] += MX;
}
while (--rounds);
printf("\n%x\n",sum);
}
else if (n < -1) /* Decoding Part */
{
n = -n;
rounds = 52/n+6;
sum = 0xcc623af3;
y = v[0];
do
{
e = (sum >> 2) & 3;
for (p=n-1; p>0; p--)
{
z = v[p-1];
y = v[p] -= MX;
}
z = v[n-1];
y = v[0] -= MX;
sum -= DELTA;
}
while (--rounds);
printf("\n%x\n",sum);
}
}
int main()
{
uint32_t v[11]= {689085350, 626885696, 1894439255, 1204672445, 1869189675, 475967424, 1932042439, 1280104741, 2808893494};
uint32_t const k[4]={12345678, 12398712, 91283904, 12378192};
int i,n= 9;
printf(" 解 密 前 原 始 数
据:%x %x %x %x %x %x %x %x %x %x %x\n",v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8]);
btea(v, -n, k);
printf(" 解 密 后 的 数
据:%x %x %x %x %x %x %x %x %x %x %x\n",v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8]);
for(i=0;i<9;i++)
{
printf("%c",v[i]&0xff);
printf("%c",(v[i]&0xff00)%0xff);
printf("%c",(v[i]&0xff0000)%0xffff);
printf("%c",(v[i]&0xff000000)%0xffffff);//c1f8ace6-4b46-4931-b25b-a1010a89c592
}
btea(v, n, k);
printf("\n 加 密 后 的 数
据:%x %x %x %x %x %x %x %x %x %x %x\n",v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8]);
system("pause");
return 0;
}