安卓逆向入门之frida框架简单使用

举报
悦来客栈的老板 发表于 2020/12/28 22:48:30 2020/12/28
【摘要】 声明:本文只做技术交流,如有侵权,请告知删除,谢谢。 frida入门教程请参考Loco大神的文章,传送门: https://mp.weixin.qq.com/s/bfurT1h32A1bLiBHa73oJA 今天使用frida框架做一个简单的破解,假定你的手机已经root,电脑已经安装java环境和jadx工具,样例是52破解里面的crakeme,链接如下: ...


声明:本文只做技术交流,如有侵权,请告知删除,谢谢。

frida入门教程请参考Loco大神的文章,传送门:

https://mp.weixin.qq.com/s/bfurT1h32A1bLiBHa73oJA

  

今天使用frida框架做一个简单的破解,假定你的手机已经root,电脑已经安装java环境和jadx工具,样例是52破解里面的crakeme,链接如下:

https://www.52pojie.cn/thread-365394-1-1.html

  

下载附件并安装到手机或者模拟器都行,进行特征识别:

将apk文件拖入到 jadx工具中,进行字符搜索。

点击 工具栏中的 魔法棒,进行搜索(如用户名):

发现并没有相关的代码段,那我们再搜索 "username" 试试(中文搜不到,就试试英文咯):

看到第三行,有个checkSN函数,点击进去看看:

再看看在哪里调用,鼠标放在函数名上面,点击右键,选择 查找用例:

只有一处调用,在 onClick函数这里(为什么我不一开始就查找 onClick 函数呢,真是笨),

这就是我们点击注册时的处理逻辑了。

这段代码告诉我们,一个条件判断的语句执行不同的代码,关键就是这个 checkSN 函数了。

我们回到定义的地方,他只是一个私有的普通方法,非构造函数也非重载函数,那这样就好办了,我们开始请出我们的神器 frida吧!

PS:算法可以直接分析出来,不过主要介绍 frida 的用法,就不在这里分析了。

一,手机连接电脑,并开启 frida-server服务:

这样,我们就开启了 frida-server服务。

二,按照官方给的例子来改写代码,对 checkSN进行Hook,

官方的例子:


   
  1. https://www.frida.re/docs/examples/android/

需要更改的位置如下:

process = frida.get_usb_device().attach('com.example.seccon2015.rock_paper_scissors')

  

将这里的包名改成crakeme的包名,那包名是啥呢?

在 jadx工具,点击 AndroidManifest.xml,右边的 package 就是包名,如图:

将包名替换即可:

process = frida.get_usb_device().attach('com.droider.crackme0201')

  

现在来更改核心的地方: jscode代码段,


   
  1. jscode = """
  2. Java.perform(function () {
  3. var check = Java.use('com.droider.crackme0201.MainActivity');
  4. check.checkSN.implementation = function (a,b) {
  5. console.log('用户名:',a);
  6. console.log("注册码:",b)
  7. return true;
  8. }
  9. });
  10. """

这段代码改写也非常简单,定义一个变量check,指向当前的某个类,这里指向的是这个:

com.droider.crackme0201.MainActivity

  

这样,你对类里的成员方法或者变量进行Hook,当然也有需要注意的地方,比如构造函数的写法,重载函数的写法,都是不一样的,这里就是个普通的方法,所以可以直接写下来。

我们在控制台中打印出当前的参数值,并将结果强制变为true,这样就达到了爆破的效果:

手机端结果:

显示注册成功,怎么样,是不是非常的简单方便,既不用修改smali代码,也不用重新编译安装,简直不要太省事。

这只是爆破,我们来追它的算法吧:


   
  1. private boolean checkSN(String userName, String sn) {
  2. if (userName == null) {
  3. return false;
  4. }
  5. try {
  6. if (userName.length() == 0 || sn == null || sn.length() != 16) {
  7. return false;
  8. }
  9. MessageDigest digest = MessageDigest.getInstance("MD5");
  10. digest.reset();
  11. digest.update(userName.getBytes());
  12. String hexstr = toHexString(digest.digest(), "");
  13. StringBuilder sb = new StringBuilder();
  14. for (int i = 0; i < hexstr.length(); i += 2) {
  15. sb.append(hexstr.charAt(i));
  16. }
  17. if (sb.toString().equalsIgnoreCase(sn)) {
  18. return true;
  19. }
  20. return false;
  21. } catch (NoSuchAlgorithmException e) {
  22. e.printStackTrace();
  23. return false;
  24. }
  25. }

这段代码很容易理解,对username进行MD5加密,并换转为字符串,取出偶数位的字符,再与注册码进行比较,如果相等返回true,否则返回false。

这样,我们就很容易写出类似注册机效果的脚本,如图:

今天就说到这里吧,只是对 frida 框架进行一个简单的使用。

回复"太简单了",获取本文中的crakeme样本及frida脚本。

文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/109508039

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。