继续对frida进行学习,依旧是参考前一篇看雪前辈的帖子学习(https://bbs.pediy.com/thread-229597.htm)

找到判断字符串是否正确的逻辑是解题关键。此apk采用了美团的Robust热修复方案。
在mainactivity的oncreate的方法中发现有runRobust()方法,顾名思义猜测是来实现热修复的方法,并在执行完热修复后才执行的关键的onclick方法,猜测onclick方法被热修复了:

跟进runRobust()方法:根据网上的一些开发教程,找到了PatchManpulateImpl类用来实现自己的加载补丁策略。

跟进此类,按照网上教程实现加载补丁策略最终是通过PatchManpulateImpl类的fetchPatchList方法来实现:
下图教程参考:https://blog.csdn.net/liujinjiaer/article/details/72785004

按照开发教程,首先会实例化patch对象,之后利用实例化后对象实现加载补丁目的。
因此跟进PatchManpulateImpl类的fetchPatchList方法:发现了初始化Patch实例

之后应该就是实现加载补丁策略的实现,由代码可以看到,初始化后首先加载了一个BMP的文件,并写入到了GeekTan.jar中:

之后参考上面教程会调用patch对象的setPatchesInfoImplClassFullName方法,果不其然,发现了相关代码:

而对于补丁而言有三个文件比较重要:
1.PatchesInfoImpl 类 用于记录修改的类,及其对应的 ChangeQuickRedirect 接口的实现,也就是哪些类要被修复。
2.xxxPatchControl 类 它是 ChangeQuickRedirect 接口的具体实现,是一个代理,具体的替换方法是在 xxxPatch 类中。该方法最终会调用 accessDispatch 方法,该方法会根据传递过来的方法签名,然后调用xxxPatch的修改过的方法。:
3.xxxPatch 类 里面包含具体的替换方法

之后得调用PatchExecutor来进行补丁加载:

在PatchExecutor类中,首先获取补丁列表:

之后调用applyPatchList应用补丁,applyPathlist方法里最终会调用path方法加载补丁类。

上述教程参考:https://blog.csdn.net/qq_22393017/article/details/82224656

那么首先看下BMP文件,因为apk在调用patch对象的setPatchesInfoImplClassFullName方法之前首先对这个文件进行了某些操作。
将该BMP文件拖入010中进行查看,文件头缀位PK,意味着这是个压缩文件,并且发现后面有dex.035字样,说明该文件压缩的很可能是个dex文件,那么改BMP后缀位tar进行解压缩:

得到dex文件,拖入jadx-gui中进行分析:

首先看到的就是上面说的三个重要类的第一个:PatchesInfoImpl 类 ,里面记录了要被修复的类:MainActivity和MainActivity$1两个类

首先看MainActivity类,accessDispatch中可以看到要被修复的方法,也就是oncreate和Joseph()被修复,真正的执行逻辑被放到 mainActivityPatch中:

但是这里我们想找的是onclick的热修复方法,因此不对这两个方法进行深入,查看另一个要被修复的类MainActivity$1,accessDispatch中可以看到要被修复的方法:

果然找到了onclick方法,去MainActivity$1Patch中找到其真正执行的逻辑:

猜测一下,onclick实现的逻辑肯定是获取输入的字符串然后与经过某些运算得到的答案进行比较,然后Toast出flag或者跳转到另一个activity中然后settext(flag)。那么我们就按照这个逻辑来分析这个修复的onclick方法:
果不其然,onclick方法的最后会toast出恭喜的字样,从最后的输出也可以理解为函数的返回值往上追溯:

也看到了equal方法:

那么我们要找到反射获取输入字符串的代码以及获得答案的代码:
很明显,onclick方法开始处就是获取输入字符串的函数:最终结果放到了r04中,看上图equal后也出现了r04,猜想应该正确。

那么equal中既然r04是获取的字符串,那么正确答案就应该是str5:

由下至上进行溯源str5的形成过程:

就是一路append的操作,首先是DDCTF{,然后append了Joseph的返回值,这个Joseph我们刚刚在MainActivity中提到过只不过没有分析。然后又append了一次Joseph的返回值然后再加上}结束。

通过上面的分析,可以发现hook有2个思路:
1.hook EnhancedRobustUtils类下的invokeReflectMethod方法获取方法执行的返回值。
2.hook 动态加载的类MainActivityPatch的Joseph方法,直接调用它获取返回值。

1.invokeReflectMethod方法在java层,第一个参数为类名:
写出脚本如下:

hook结果如下:可见Joseph的两次调用返回值就是flag{}中的内容。

2.看雪前辈的教程是使用了frida的spawn方法,刚开始时提示Failed to spawn: the connection is closed(后来发现电脑中有两个版本的frida,pip uninstall了两次后重装了最新的版本,但是模拟器可以用,真机不能用…),所以这里先使用xpsoed来直接hook:

hook结果如下图所示:

与第一种frida hook方法的结果是一样的。将两次调用结果拼接起来即可。

使用frida进行hook(二)相关推荐

  1. 初识Frida--Android逆向之Java层hook (二)

    目录 初识Frida--Android逆向之Java层hook (二) apk的安装与分析 流程分析 hook点分析 JavaScript代码构造与执行 0x00 hook getMac() 0x01 ...

  2. 转载:使用 Frida 来 hook 加固的 Android 应用的 java 层

    Android 加固应用Hook方式 --- Frida:https://github.com/xiaokanghub/Android 转载:使用 frida 来 hook 加固的 Android 应 ...

  3. Frida Android hook

    From:https://eternalsakura13.com/2020/07/04/frida/ 目录 1.r0ysue 大佬 2.Frida 环境 2.1 pyenv 2.2 frida 安装 ...

  4. 安卓逆向_24( 一 ) --- Hook 框架 frida( Hook Java层 和 so层) )

    From:Hook 神器家族的 Frida 工具使用详解:https://blog.csdn.net/FlyPigYe/article/details/90258758 详解 Hook 框架 frid ...

  5. 最新微信hook二次开发c#源码介绍

    [最新微信hook二次开发c#源代码]中包含比较全面的功能. 江南鹤微信hook二次开发c#源代码,并不是具体怎么进行微信hook的源代码,而是直接调用c++语言编写的微信hook程序生成的dll的c ...

  6. 最新微信hook二次开发C#Demo之获取消息代码

    用[最新微信hook二次开发c#源代码]获取消息: 消息类型有以下几种 1 文本,2 图片,3 表情(gif),4 视频,5 文件,6 名片,7 位置,8 小程序,9 链接,10公众号文章列表 发送方 ...

  7. Frida模板Hook

    JAVA层HOOK: # -*- coding: utf-8 -*- """ Spyder EditorThis is a temporary script file.J ...

  8. 使用Frida 实现 Hook 功能

    Frida 通过 C 语言将 QuickJS 注入到目标进程中,获取完整的内存操作权限,达到在程序运行时实时地插入额外代码和数据的目的.官方将调用代码封装为 python 库,当然你也可以直接通过其他 ...

  9. frida hook java 函数_使用 Frida 来 Hook Java 类中的构造函数(构造函数带重载),获取解密后的js脚本...

    一个APP使用了Auto.js 的加密脚本.我们的任务是将其加密脚本进行解密并dump出来.在  https://www.52pojie.cn/thread-1112407-1-1.html 一文中, ...

最新文章

  1. 路由器snmp配置_基于keepalived配置数据库主从实现高可用
  2. command-line: line 0: Bad configuration option: PermitLocalCommand
  3. VSCODE常见问题(设置为4个空格)
  4. 黑马程序员 oc对象的方法成员变量
  5. 实现Web虚拟现实的最轻松方案—A-Frame框架
  6. Windows和Linux下apache-artemis-2.10.0安装配置
  7. java jtable刷新_使用Swing timer实现Jtable数据定时更新
  8. 【Android】关于Android控件EditText的属性InputType的一些经验
  9. POI LastRowNum and PhysicalNumberOfRows
  10. CodeForces - 906E Reverses(回文自动机+Palindrome Series优化dp)
  11. python中max函数用法_Python中max函数用法实例分析
  12. 【计算机科学基础】数据运算
  13. 苹果:我们一直在App Store上展示竞争对手的应用程序
  14. 计算机网络入门知识大全,计算机网络基础知识汇总(超全).doc
  15. HEVC视频转码解决办法
  16. 计算机的用户终端,计算机终端、客户端、服务端都是什么概念,他们之间的区别是什么?谢谢,大家,小弟是菜鸟...
  17. Python、Pycharm、Django及各插件安装经验汇总
  18. 《Mysql数据库》
  19. 超级码力在线编程大赛初赛第1场-1-树木规划题解
  20. 【讨论】怎么处理工作中的杂事?

热门文章

  1. java布尔变量_java布尔型变量理解
  2. react高阶组件、hooks
  3. html5开发页游(前话)
  4. [define的用法]define用法集锦
  5. 动态网站开发技术学习1:走进ASP.NET
  6. Windows声音图标消失解决教程
  7. 数学建模竞赛知识点汇总(四)——相关性检验
  8. Linux下安装jdk1.8
  9. 非root用户启动docker
  10. Zuul网关的4种路由配置