安卓逆向高阶之frida hook java层
文章目录
- 1. 初次hook Java 层函数
- 2. hook 修改函数返回值
- 3. hook调用静态函数和非静态函数
- 4. hook设置成员变量
- 5. hook内部类
- 6. hook 动态加载dex
- 7. 枚举class
1. 初次hook Java 层函数
登录走else if 逻辑,hook a 方法
function hook_java() {Java.perform(function () {console.log('进入hook。。。')var LoginActivity = Java.use("com.example.androiddemo.Activity.LoginActivity");console.log(LoginActivity);LoginActivity.a.overload('java.lang.String', 'java.lang.String').implementation = function (str, str2) {// LoginActivity.a.implementation = function(str, str2) {var result = this.a(str, str2); //调用原来的函数console.log("LoginActivity.a:", str, str2, result);return result;};console.log("hook_java");});
}
手机端随便输入用户名和密码:
frida
发现a方法的两个入参都是用户名,后面那个就是加密后的密码
可以复制一下这个密码登录,还用111做用户名:
成功进入第一关。
2. hook 修改函数返回值
点击第一关显示 Check Failed! 还进不了下一关,
跳到FridaActivity1声明:
我们还需要hook这里面的a方法的返回值让它恒等于那串字符串就ok了,接着往下写
function hook_java() {Java.perform(function () {console.log('进入hook。。。')var LoginActivity = Java.use("com.example.androiddemo.Activity.LoginActivity");console.log(LoginActivity);LoginActivity.a.overload('java.lang.String', 'java.lang.String').implementation = function (str, str2) {// LoginActivity.a.implementation = function(str, str2) {var result = this.a(str, str2); //调用原来的函数console.log("LoginActivity.a:", str, str2, result);return result;};console.log('aaaaaaaa66666')var FridaActivity1 = Java.use("com.example.androiddemo.Activity.FridaActivity1");console.log(FridaActivity1);//hook函数,没有调用原来的函数,直接返回值FridaActivity1.a.implementation = function (barr) {console.log("FridaActivity1.a");return "R4jSLLLLLLLLLLOrLE7/5B+Z6fsl65yj6BgC6YWz66gO6g2t65Pk6a+P65NK44NNROl0wNOLLLL=";};console.log("hook_java");});
}
运行后再点击成功进入第2关,
3. hook调用静态函数和非静态函数
进入第三关同理,需要我们跳到FridaActivity2的声明里看代码逻辑:
静态函数直接use class然后调用方法,非静态函数需要先choose实例然后调用。
hook代码:
function call_FridaActivity2() {//主动调用函数Java.perform(function () {console.log('进入hook FridaActivity2。。。')var FridaActivity2 = Java.use("com.example.androiddemo.Activity.FridaActivity2");FridaActivity2.setStatic_bool_var(); //调用静态函数// 调用非静态函数Java.choose("com.example.androiddemo.Activity.FridaActivity2", {onMatch: function (instance) {instance.setBool_var();},onComplete: function () {}});console.log('hook FridaActivity2结束')});
}
运行frida:
手机端点击一下就可以进入下一关了:
4. hook设置成员变量
跳转到下一关即第3关声明代码:
这里可以看出我们需要hook的是: static_bool_var 、bool_var和same_name_bool_var 三个成员变量。
注意:
设置成员变量的值,写法是xx.value = yy,其他方面和函数一样。
如果有一个成员变量和成员函数的名字相同,则在其前面加一个下划线
function call_FridaActivity3() {Java.perform(function () {console.log('进入hook call_FridaActivity3 ...')var FridaActivity3 = Java.use("com.example.androiddemo.Activity.FridaActivity3");FridaActivity3.static_bool_var.value = true; //设置静态成员变量console.log('当前FridaActivity3.static_bool_var的值:',FridaActivity3.static_bool_var.value);Java.choose("com.example.androiddemo.Activity.FridaActivity3", {onMatch: function (instance) {//设置非静态成员变量的值instance.bool_var.value = true;//设置有相同函数名的成员变量的值 (成员变量和成员函数的名字相同,则在其前面加一个下划线)instance._same_name_bool_var.value = true;console.log('当前same_name_bool_var的值:', instance._same_name_bool_var.value);console.log('当前bool_var的值:',instance.bool_var.value);},onComplete: function () {}});console.log('hook call_FridaActivity3完成')});
}
运行frida:
手机再点击就可以进入第四关了:
5. hook内部类
跳转到第四关的声明:
这里需要hook内部类的check1() - check6()
hook代码:
function hook_InnerClasses() {Java.perform(function () {console.log('hook进入 hook_InnerClasses')//hook内部类var InnerClasses = Java.use("com.example.androiddemo.Activity.FridaActivity4$InnerClasses");console.log('innerClasses',InnerClasses);InnerClasses.check1.implementation = function () {return true;};InnerClasses.check2.implementation = function () {return true;};InnerClasses.check3.implementation = function () {return true;};InnerClasses.check4.implementation = function () {return true;};InnerClasses.check5.implementation = function () {return true;};InnerClasses.check6.implementation = function () {return true;};console.log('hook_InnerClasses完成')});
}
或者枚举
function hook_mul_function() {Java.perform(function () {//hook 类的多个函数var class_name = "com.example.androiddemo.Activity.FridaActivity4$InnerClasses";var InnerClasses = Java.use(class_name);var all_methods = InnerClasses.class.getDeclaredMethods();for (var i = 0; i < all_methods.length; i++) {var method = (all_methods[i]);var methodStr = method.toString();var substring = methodStr.substr(methodStr.indexOf(class_name) + class_name.length + 1);var methodname = substring.substr(0, substring.indexOf("("));console.log(methodname);InnerClasses[methodname].implementation = function () {console.log("hook_mul_function:", this);return true;}}});
}
运行后成功hook,手机就可点击进入下一关:
6. hook 动态加载dex
跳转到第5关的声明:
想通过就走else if 逻辑,getDynamicDexCheck().check() 这个是动态加载dex ,调用check()方法,返回参数满足条件语句则通关成功。
可以通过enumerateClassLoaders来枚举加载进内存的classloader,再loader.findClass(xxx)寻找是否包括我们想要的interface的实现类,最后通过Java.classFactory.loader = loader来切换classloader,从而加载该实现类。
hook代码:
function hook_dyn_dex() {Java.perform(function () {console.log('hook进入 FridaActivity5...')var FridaActivity5 = Java.use("com.example.androiddemo.Activity.FridaActivity5");Java.choose("com.example.androiddemo.Activity.FridaActivity5", {onMatch: function (instance) {console.log('instance.getDynamicDexCheck().$className-->',instance.getDynamicDexCheck().$className);}, onComplete: function () {}});//hook 动态加载的dexJava.enumerateClassLoaders({onMatch: function (loader) {try {if (loader.findClass("com.example.androiddemo.Dynamic.DynamicCheck")) {console.log('loader-->',loader);Java.classFactory.loader = loader; //切换classloader}} catch (error) {}}, onComplete: function () {}});var DynamicCheck = Java.use("com.example.androiddemo.Dynamic.DynamicCheck");console.log('DynamicCheck--->',DynamicCheck);DynamicCheck.check.implementation = function () {console.log("进入DynamicCheck.check");return true;}console.log("hook dex完成");});
}
接着点击就可以进入下一关了:
7. 枚举class
跳转到第6关的声明:
Frida6Class0、Frida6Class1、Frida6Class2都是下面这种形式
可以挨个hook静态函数
function hook_FridaActivity6() {Java.perform(function () {console.log('进入hook_FridaActivity6')var Frida6Class0 = Java.use("com.example.androiddemo.Activity.Frida6.Frida6Class0");Frida6Class0.check.implementation = function () {return true;};var Frida6Class1 = Java.use("com.example.androiddemo.Activity.Frida6.Frida6Class1");Frida6Class1.check.implementation = function () {return true;};var Frida6Class2 = Java.use("com.example.androiddemo.Activity.Frida6.Frida6Class2");Frida6Class2.check.implementation = function () {return true;};console.log('hook_FridaActivity6 完成!')});
}
或者枚举class
function hook_mul_class() {Java.perform(function () {console.log('hook 进入枚举类')Java.enumerateLoadedClasses({onMatch: function (name, handle) {if (name.indexOf("com.example.androiddemo.Activity.Frida6") >= 0) {console.log(name);var fridaclass6 = Java.use(name);fridaclass6.check.implementation = function () {console.log("frida 6 check:", this);return true;};}}, onComplete: function () {}})console.log('hook6 完成!')});
}
之后再点击就可以进入下一关了:
到第7关结束。
安卓逆向高阶之frida hook java层相关推荐
- frida hook java层常用模板
文章转载于 安卓逆向菜鸟修炼记(微信公众号),个人感觉很实用,记录下来方便回顾,想看原文的请移步公众号. 1.JAVA层HOOK普通方法 import frida, sysjscode =" ...
- 安卓逆向_24( 一 ) --- Hook 框架 frida( Hook Java层 和 so层) )
From:Hook 神器家族的 Frida 工具使用详解:https://blog.csdn.net/FlyPigYe/article/details/90258758 详解 Hook 框架 frid ...
- frida hook java 函数_使用 Frida 来 Hook Java 类中的构造函数(构造函数带重载),获取解密后的js脚本...
一个APP使用了Auto.js 的加密脚本.我们的任务是将其加密脚本进行解密并dump出来.在 https://www.52pojie.cn/thread-1112407-1-1.html 一文中, ...
- 猿人学·爬虫逆向高阶课
我跟 virjar 出了一套爬虫课(猿人学·爬虫进阶培训课),包含:安卓逆向抓取.JS 高阶逆向抓取.安卓群控抓取.容器定制化等. 实际上我去年就在做这个爬虫课了,一直没有放到网课平台上公开宣传,但是 ...
- frida的用法--Hook Java层类方法
frida是一款方便并且易用的跨平台Hook工具,使用它不仅可以Hook Java写的应用程序,而且还可以Hook原生的应用程序. 1. 准备 frida分客户端环境和服务端环境.在客户端我们可以编写 ...
- 学 Frida 安卓逆向之快速搭建 Frida 安卓逆向环境
学 Frida 安卓逆向 快速搭建 Frida 安卓逆向环境 这段时间空闲的时间一直在跟着肉丝姐补课,手残把手机搞崩了,借着这个机会写一篇文章记录下如何从零完成 Frida 安卓逆向环境的搭建. 按照 ...
- Frida Hook Java动态加载DEX方法
Frida Hook动态加载的DEX里的方法,需要切换到ClassLoader下. Java package com.github.lastingyang.androiddemo.Activity;i ...
- frida hook so层方法大全
文章转载,仅供学习,如有需要请支持原文章创作:https://kevinspider.github.io/fridahookso/ 1.感谢 2. frida env https://github.c ...
- frida hook so层、protobuf 数据解析
手机安装 app ,设置代理,然后开始抓包. 发现数据没法解密,查看请求的 url 是 http://lbs.jt.sh.cn:8082/app/rls/monitor,使用 jadx 反编译 app ...
最新文章
- ActiveX组件及其注册 (轉)
- 基于Java语言构建区块链(六)—— 交易(Merkle Tree)
- 【收藏】蘑菇博客mogu_blog项目文档
- [Swift]LeetCode732. 我的日程安排表 III | My Calendar III
- 在WebLogic 12c上运行RichFaces 4.1.0.Final
- linux 中国-新手村,从新手村开始,手把手带你入门梳理内核代码
- datagridview使用mysql_使用DataGridView进行增删改查,并同步到数据库
- 180908每日一句
- 多路IO转接服务器——epoll模型
- VUE后台管理中使用富文本编辑器导入word 文档进行编辑
- 图解 JVM 内存结构
- centos7 安装pg_repack
- 计算机二级公共基础知识
- 3D角色模型的雕刻技巧:电影般的艺术工作流程,靠的是时间的叠加
- 看完李宏毅的视频我决定学好英语了
- (一)计算机网络的一些概念
- 南京信息工程大学 2021年 考研 软件工程 复试经验分享
- android自定义滚动日期,Android基于wheelView实现自定义日期选择器
- jsDOM编程-小球在盒子里来回撞击
- YOLOv5训练自己的数据集详解
热门文章
- python将两个excel匹配_Python3实现两个Excel文件内容比对
- 借助PLC-Recorder,西门子PLC S7-1200实现4ms准确周期采集的方法(带时间戳采集)
- CSS介绍及视频分享
- Cvae-gan: fine-grained image generation through asymmetric training论文阅读笔记
- 迅捷CAD编辑器高效修改文字的方式
- 基于springboot+layui快速开发框架源码
- 用QT5做一个视频播放器
- 关于函数或者数列极限保号性的直觉理解(图解)
- SpringBoot:整合Redis(概述,数据类型,持久化,RedisTemplate)
- 《那些年啊,那些事——一个程序员的奋斗史》——20