一、抓包
手机安装证书,开启VPN抓包,电脑上打开花瓶,在同一个局域网内抓包,这些老一套没什么可说的。
看看我们的抓包结果是不是很美丽,请求内容加密,返回内容也加密,猜测加密方式aes,加密参数sign是37位的,猜测MD5加密。
二、脱壳
上jadx打开,很快加载完了,猜测是加壳。
看见了关键信息。下面我们就开始脱壳吧。
这是我们脱的每个DEX,我不喜欢合并,就一个个看吧。
三、java层分析
直接在DEX搜索
很遗憾,通过搜索(加密参数和请求关键字)没有找到有用信息,说明加固的很严重。
通过搜索加载SO找到关键函数。
自吐算法看调用栈
自吐算法没有再日志中找到有用的信息。
看看安装路径下的可疑SO
app安装路径下有2个SO文件比较可疑。通过验证,确实找到了加密SO。
jnitrace找可疑可以SO文件。
或者frida-trace找到可以SO文件,可以观察一下频繁调用的方法和SO文件就能发现惊喜。
四、native层分析
直接搜索没有找到“Java_”,肯定是动态注册了,我们可以hook register native也可以直接分析“JNI_OnLoad”,后者在字符串窗口搜索"md5",我们就能定位到关键代码。
uint32_t __fastcall doMD5sign(const uint8_t *initial_msg, size_t initial_len, int8_t **digest)
{
signed int v4; // r0
int v5; // r2
signed int v6; // r0
int v7; // r2
signed int v8; // r2
signed int v9; // r0
int v10; // r2
size_t v11; // r4
int8_t *v12; // r0
uint8_t v14[16]; // [sp+0h] [bp-A8h] BYREF
char s[64]; // [sp+10h] [bp-98h] BYREF
char v16[20]; // [sp+50h] [bp-58h] BYREF
char v17[20]; // [sp+64h] [bp-44h] BYREF
char v18[20]; // [sp+78h] [bp-30h] BYREF
md5(initial_msg, initial_len, v14);
v4 = bytesToInt(v14, 0);
v5 = v4;
if ( v4 < 0 )
v5 = -v4;
sprintf(s, &byte_E0021, v5);
v6 = bytesToInt(v14, 4u);
v7 = v6;
if ( v6 < 0 )
v7 = -v6;
sprintf(v18, &byte_E0021, v7);
v8 = bytesToInt(v14, 8u);
if ( v8 <= -1 )
v8 = -v8;
sprintf(v17, &byte_E0021, v8);
v9 = bytesToInt(v14, 0xCu);
v10 = v9;
if ( v9 < 0 )
v10 = -v9;
sprintf(v16, &byte_E0021, v10);
strcat(s, v18);
strcat(s, v17);
strcat(s, v16);
v11 = strlen(s);
v12 = (int8_t *)malloc(v11);
*digest = v12;
qmemcpy(v12, s, v11);
return v11;
}
hook入参和结果,很友好,没有魔改,我们就把sign的算法找到了。
另外数据的加密和解密,aes算法也是在这个SO里面实现的。
通过分析我们找到了算法是AES,加密模式是ECB,我们直接HOOK验证找到KEY就好了。
五、算法还原
sign还原:
q参数: