在jadx中java层最后跟值如下,确定是在so层,定位为libnative-lib.so进入IDA,搜索导出表,搜索securityPsd,进去,把汇编代码变成伪代码
int __fastcall Java_com_XXX_SecurityUtils_securityPsd(int a1, int a2, int a3, int a4, int a5)
根据之前安卓逆向案例1将的原理,a1修改为JNIEnv* env,a2改为clazz, 后面3个参数根据对应java层的securityPsd修改
找到最底下的返回值v16,发现和上个案例不太一样,这so最后还是调用了java层的方法,查看v11、v18、v12、v15
v16 = _JNIEnv::CallStaticObjectMethod(env, v11, v18, v12, v15);
v11、v18调用了java的WeicoSecurityUtils类中securityPsd静态方法
v11 = (*env)->FindClass(env, "com/SecurityUtils");v18 = (*env)->GetStaticMethodID(env, v11, "securityPsd", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;");
v12为传入的pwd
v19 = v10->GetStringUTFChars(env, pwd, 0);v12 = (*env)->NewStringUTF(env, v19);
v15看IDA不知道是什么,待定。----->后面通过frida hook发现他就是公钥
二、返回java
查看java的WeicoSecurityUtils类中securityPsd静态方法
一眼RSA
RSA加密原理:RSA的逻辑是先传入字节流(byte),然后使用X509EncodedKeySpec对象包装成Java 能识别的公钥规范对象,然后用KeyFactory生成公钥
能看到使用了X509EncodedKeySpec对象,且KeyFactory.getInstance(KEY ALGORITHM) 中KEY ALGORITHM是RSA,符合RSA的加密流程
但知道了是RSA后,还缺少一个公钥,先在java的password加密时进行hook,看看公钥是什么?
三、frida hook
针对securityPsd进行hook,
frida -U -f com.sina.weibolite -l hookpwd.js
我靠,这不和v15里面的值一模一样吗,一下子就都明白了
学习自x1a0f3n9大佬的公开视频,外加整合了自己的一些分析
https://www.bilibili.com/video/BV17Xj2zHEKX?spm_id_from=333.788.videopod.sections&vd_source=fc6598fcf400242aefec0036f4e6838b