使用frida破解native层算法(原文)

使用frida破解native层算法

案例:就不放了

抓包分析

这里抓包分析的过程不详细说了
可以看到主要有两个参数
sign和signV1

反编译

1、 sign破解

搜索关键词定位以及跳转到声明之后,最后就是一个md5,用objection看看就完事了




这是java层的sign破解,完事。

2、*-sign-v1破解

这个算法主要是在native层,这里借助了frida进行破解,最后换成cpp代码。
这里定位到这个,刚开始我也不知道这里,就瞎找,分析到这里。

最后确定到这两个方法,用objection确定下,最后native走的那个方法

可以看到最后走的是getSignRequest这个方法,并且根据上图,就可以看到so是libsalt.so。

2.1 分析so
  • 导入jni头文件,这里没有jni_onload,就是静态注册的。
    Java_com_*_main_helpers_utils_*SignUtils_getSignRequest找到一个加密的函数,追下去看看。

    看到这么多函数,根据名字就猜测一下了,md5操作,看看是不是导出函数。



    果然是导出函数,直接frida就去Hook一下导出函数。
Interceptor.attach(Module.findExportByName("libsalt.so", "*_md5"), {onEnter: function (args) {console.log("*_md5 onEnter", Memory.readCString(args[0]))},onLeave: function (retvalue) {console.log("*_md5 onLeave", Memory.readCString(retvalue))}
})

Hook之后得到这么多

其实a4698cf0eea7a9b92a0194618079aba9是did2a0194618079aba9a4698cf0eea7a9b9
中间进行切割,然后交换位置。
5nhrec75lf3drenb09a349366a5b7eda4ee99d7a104fb38b8a5f746c1c9c99c0b458e1ed510845e5
是随机字符串+md5(a4698cf0eea7a9b92a0194618079aba9)+8a5f746c1c9c99c0b458e1ed510845e5的结果
8a5f746c1c9c99c0b458e1ed510845e5是固定值,随机字符串是java层算法。
python这一部分的实现

   did = '2a0194618079aba9a4698cf0eea7a9b9'rstr = 'yqkdfs6y4d2ci8wm'  # 随机字did[:符串new_did = did[len(did) // 2:] + len(did) // 2]did_md5 = get_md5(new_did)sss = rstr + did_md5 + '8a5f746c1c9c99c0b458e1ed510845e5'dest = get_md5(sss)

cpp实现:

    string did = "2a0194618079aba9a4698cf0eea7a9b9";string ranstr = "28npqz4cpmw6ifpc";string new_did = getStringSubs(did);string did_md5 = getMd5(new_did);string sss = ranstr + did_md5 + "8a5f746c1c9c99c0b458e1ed510845e5";string dest = getStringSubs(getMd5(sss));

上边的dest是新字符串拼接需要的

这里有一个json的操作,其实刚开始我也不知道干了什么,最后我用frida-trac 就轻松解决了。

frida-trace -FU -i "strlen"

array[i] = buffer[2 * i] & 0xF0 | buffer[2 * i + 1] & 0xF;

这个是对字符串进行了高低位的操作,也就是这个app的signV3唯一个非标准算法。
拿到高低位操作之后的字符串之后,拼接了之前的dest(我自己写的那个),然后进行sha1操作。
sha1之后取了第8位到最后的字符串,然后又中间进行切割,然后交换位置,最后生成的就是signV3的结果。
cpp最后实现的算法:

string getMd5(const string &message) {return MD5(message).toStr();
}
string getSha1(const string &message) {SHA1 checksum;checksum.update(message);const string hash = checksum.final();return hash;
}
string getStringSubs(const string &message) {string string1 = message.substr(0, message.length() / 2);string string2 = message.substr(message.length() / 2);return string2 + string1;
}
void SignV3() {string did = "2a0194618079aba9a4698cf0eea7a9b9";string ranstr = "28npqz4cpmw6ifpc";string new_did = getStringSubs(did);string did_md5 = getMd5(new_did);string sss = ranstr + did_md5 + "8a5f746c1c9c99c0b458e1ed510845e5";string dest = getStringSubs(getMd5(sss));string arr = "aid=fbef33334c2388ccee5757dc2dbb0b45&comments_sort=asc&isnewsession=false&mark_read_sid=361595316249559936&mcc=&mnc=&nextkey=&timestamp=1592463682&ua=Mozilla/5.0 (Linux; Android 8.1.0; AOSP on msm8996 Build/OPM4.171019.021.D1; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.98 Mobile Safari/537.36";
    const char *buffer = "aid=fbef33334c2388ccee5757dc2dbb0b45&comments_sort=asc&isnewsession=false&mark_read_sid=361595316249559936&mcc=&mnc=&nextkey=&timestamp=1592463682&ua=Mozilla/5.0 (Linux; Android 8.1.0; AOSP on msm8996 Build/OPM4.171019.021.D1; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.98 Mobile Safari/537.36";int i = 0;
//这里的算法可以看看ida的图 自己实现呐string new_sss = arr.substr(0, i) + dest;string sha1Res = getSha1(new_sss).substr(8);string sign_v3 = getStringSubs(sha1Res);cout << "_sign_v3=" << sign_v3;
}
int main() {SignV3();return 0;
}

算法检验


至于为什么最后不放python算法,实在是因为,还原成python之后,高低位操作的时候,部分数据不对了。。就只有cpp了
此文章仅用于学习交流,请勿商业用途和传播。

使用frida破解native层算法(原文)

使用frida破解native层算法相关推荐

  1. 看雪3万课程笔记-FRIDA高级API实用方法:Frida Hook Native层

    一.使用工具: apk:攻防世界中CTF题,安装后图表显示黑客精神 xman.apk 工具:IDA,jadx 二.知识点: 1.Module.findBaseAddress("libmyjn ...

  2. android Java层和Native层frida hook的一些系统参数的修改

    目的:解决一些App对于手机端指纹的风控 1.Java参考脚本`. // An highlighted block var system_mapping = {"ro.build.id&qu ...

  3. wifi定位算法 java_记一次APP的so层算法逆向(七)

    " 前言:初学逆向 请多多指教 好累 感觉每天这样肝 人有点受不了了..." 学习到的内容 - 1.新学习到IDA的一些分析时候的小技巧 2.算法还原代码实现的练习(有个参数没有分 ...

  4. 逆向so_记一次APP的so层算法逆向(七)

    " 前言:初学逆向 请多多指教 好累 感觉每天这样肝 人有点受不了了..." 学习到的内容 - 1.新学习到IDA的一些分析时候的小技巧 2.算法还原代码实现的练习(有个参数没有分 ...

  5. 利用系统提供的崩溃日志解Native层Bug

    2019独角兽企业重金招聘Python工程师标准>>> 对Android开发者来讲,尤其是使用NDK编写Native层代码的开发者,在编码过程中通常会碰到各种各样的问题.追踪问题的方 ...

  6. Android逆向之旅---Native层的Hook神器Cydia Substrate使用详解

    一.前言 在之前已经介绍过了Android中一款hook神器Xposed,那个框架使用非常简单,方法也就那几个,其实最主要的是我们如何找到一个想要hook的应用的那个突破点.需要逆向分析app即可.不 ...

  7. native层 安卓_安卓逆向学习入门之过反调试(一)

    前面有篇文章讲了 smail代码的简单修改,其实它有3个apk可以用来练手,今天来讲第二个apk,也是比较简单,大佬请飘过. 样本地址: https://github.com/wyhuan/owasp ...

  8. android 反调试 方案,【木马分析】使用高级反调试与反HOOK的安卓恶意ROOT软件的深度分析(一):NATIVE层的调试...

    预估稿费:180RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 前言 最近,我们发现了一个新的Android rootnik恶意软件,它使用开源的Android root ...

  9. Android基础架构:Native层 Looper、Handler、Message 研究

    Android基础架构:Native层 Looper.Handler.Message 研究1,参考: https://www.cnblogs.com/roger-yu/p/15099541.html ...

最新文章

  1. OPenCV膨胀函数dilate()的使用
  2. (一)数据结构与算法简介
  3. 使用Spring Boot进行面向方面的编程
  4. CSS布局说——可能是最全的
  5. 发邮件请领导审批文件怎么说_住建部:1月1日起,两项甲级资质实行告知承诺审批!...
  6. axios安装与基本方法
  7. 【数学建模】因子分析
  8. win7 SP1 64位 原版 百度网盘下载
  9. 猿创征文|人工智能啾养成之路 - 写代码三天,CSDN治好了我的精神内耗
  10. Visual Studio 2019 Community 许可证过期解决方法
  11. 基于重构误差的同构图分类模型
  12. Axure8.0基础教程 一
  13. 新一代网络技术与课程建设师资培训感悟
  14. Python添加pywin32
  15. linux中如何用ftp命令下载文件,linux中ftp下载文件命令的用法
  16. 面对海量IoT设备,如何打造高性能物联网平台接入层?
  17. vpd安全策略的使用
  18. 可视化数据结构的网站
  19. C++标准库(第2版)(侯捷译)PDF
  20. 傲腾无盘服务器,傲腾方案和顺网加速盘方案对比测试

热门文章

  1. plsql报ora-00911错误的解决
  2. 转---原码,反码,补码的深入理解与原理。
  3. Vue2.0中使用ES6
  4. Vue lrz localResizeIMG 压缩图片
  5. linux检索docx内容,linux 文件查找和内容过滤命令.docx
  6. Pandas截取列部分字符,并据此修改另一列的数据
  7. 阿里云的各种产品的用途?
  8. 一个男生走过多少路,才算得上一个男人
  9. 一个强大的ico,图片资源网站,http://findicons.com
  10. oracle还原system备份包,SYSTEM表空间管理及备份恢复