加载hello-jni.so 有一个public native String sign1(String str); 函数 点击按钮调用 参数为随机生成的16位字符
Ok进入 so文件看看吧 用ida 打开
定位到 public native String sign1(String str); 搜索导出函数并没有 应该动态调试 进入JNI_OnLoad
发现混淆到不行样子直接 用frida hook RegisterNatives 注册函数吧(用网上搜索)
把应用调试模式启动 用frida附加上启动 (注意要打开ddms)具体操作论坛有
jni 函数 sign1 offset: 0x10be8 注册地址找到了 那直接开干吧 跳转到 0x10be8
用idapro动态调试初步跑了一下参数记录 发现 sub_1494C4(&Out_Md5_Buff, 16LL, &Out_en_Buff) 执行完毕就是加密结果了
但具体参数怎么来的呢
参数1 Out_Md5_Buff 来源 sub_14141C()
参数2 是固定16位(加密后十六进制时长度)
参数3 &Out_en_Buff 就是结果了
Out_Md5_Buff() 来源于sub_14141C()下面开始分析
函数原型 sub_14141C(InputStr, inputlen, &Out_Md5_Buff)
参数1 为随机生成的字符
参数2 为随机生成的长度
参数3 输出的加密结果
进入函数内部
逻辑混淆没法正常看,把参数处理一下 搜索参数看看有没有发现 直接搜加密输出变量
都跳转去看看
没办法看清楚逻辑 用frida hook看看参数返回
发现被调用了一次 调用地址为 0x142804
sub_1390B8(“s123456789”, 0xa, _Out_Md5_Buff);
_Out_Md5_Buff =
这个就是加密后结果 继续跟踪
进入函数 继续搜索Out_Md5_Buff 看看谁在调用
都是sub_131ADC()调用 继续用frida看看参数返回
被调用了一次 调用地址0x13BA34 参数1:
不清楚是什么 感觉很像一个结构(应该是md5_ctx后面分析发现的)
然后加密结果也相同 那肯定加密就在里面了 我们进去看看
进入 sub_131ADC()函数 继续搜索输出变量
这里应该就是加密算法了 乍一看感觉有点眼熟那 加上返回的加密是32位 有理由怀疑是md5
搜了搜md5算法
感觉挺像的 返回调用函数地址看看 用什么值加密的
继续frida hook sub_10BB08() 看看
一共被调用4次
sub_10BB08(md5_ctx,421d38d938156606164a15d2e7f822d9,0x20) // MD5Update() 调用地址 0x139da0
sub_10BB08(md5_ctx,s123456789,0xa) // MD5Update() 调用地址 0x13ba28
下面两次是在md5内部调用() //sub_131ADC() MD5Final()
参数长度
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)