安卓逆向经典案例-XX谷

H5app逆向——XX谷

在这里插入图片描述

这里显示为真,说明app没有禁用WebView调试。

所以调试考虑

  • 反编译出错
  • 利用字符串加密或者反射的方式去禁用调试
通过什么方式可以查找自己想frida hook的类?

在使用 Frida 进行逆向工程时,查找你想要 hook 的类和方法是一个关键步骤。以下是一些常见的方法和工具,可以帮助你找到目标类和方法:

1. 使用 Frida 自带的脚本

Frida 提供了一些内置的脚本,可以帮助你枚举和查找类和方法。

枚举所有加载的类

你可以使用以下脚本来枚举所有加载的类:

Java.perform(function() {Java.enumerateLoadedClasses({onMatch: function(className) {console.log(className);},onComplete: function() {console.log("Enumeration complete");}});
});
枚举类中的所有方法

找到目标类后,你可以使用以下脚本来枚举该类中的所有方法:

Java.perform(function() {var targetClass = Java.use('com.example.TargetClass');var methods = targetClass.class.getDeclaredMethods();methods.forEach(function(method) {console.log(method.toString());});
});

2. 使用 jadx 反编译 APK

你可以使用 jadx 反编译 APK 文件,以查看应用程序的源代码。这可以帮助你找到感兴趣的类和方法。

安装和使用 jadx
  1. 安装 jadx:你可以从 jadx GitHub 页面 下载并安装 jadx。

  2. 反编译 APK:使用以下命令反编译 APK 文件:

    jadx -d output_dir your_app.apk
    
  3. 浏览源代码:在输出目录中浏览反编译后的源代码,查找你感兴趣的类和方法。

3. 使用 Android Studio 进行动态调试

你可以使用 Android Studio 的调试工具来动态调试应用程序,设置断点并检查运行时的类和方法。

4. 使用 Frida 的 findClass 方法

你可以使用 Frida 的 findClass 方法来查找特定的类:

Java.perform(function() {var className = 'com.example.TargetClass';if (Java.available) {try {var targetClass = Java.use(className);console.log('Class found: ' + className);} catch (e) {console.log('Class not found: ' + className);}}
});

5. 使用 Frida 的 enumerateClassLoaders 方法

有时候类可能还没有加载,你可以使用 enumerateClassLoaders 方法来查找类加载器并手动加载类:

Java.perform(function() {Java.enumerateClassLoaders({onMatch: function(loader) {try {if (loader.findClass('com.example.TargetClass')) {console.log('Class loader found: ' + loader);}} catch (e) {// Ignore}},onComplete: function() {console.log('Enumeration complete');}});
});

6. 使用 Frida 的 InterceptorStalker

你可以使用 Frida 的 InterceptorStalker 来动态跟踪和 hook 方法调用。

示例:拦截方法调用
Java.perform(function() {var targetClass = Java.use('com.example.TargetClass');targetClass.targetMethod.implementation = function(arg1, arg2) {console.log('targetMethod called with arguments: ' + arg1 + ', ' + arg2);var result = this.targetMethod(arg1, arg2);console.log('targetMethod returned: ' + result);return result;};
});

总结

通过上述方法,你可以有效地查找和 hook 你感兴趣的类和方法。根据具体情况选择合适的方法和工具,可以大大提高你的逆向工程效率。如果你有任何进一步的问题或需要更多的帮助,请随时告诉我!

解决方法:

直接hook类

andriod.webkit.WebView

hook实战

Java.perform(function (){var WebView = Java.use("android.webkit.WebView");//hook 类android.webkit.WebViewWebView.setWebContentsDebuggingEnabled.overload("boolean").implementation = function (s) {// send(s.toString());console.log("webview hook")//当出现webview hook时,说明有布尔值被hook了// this.loadUrl.overload("java.lang.String").call(this, s);// console.log(this.)this.setWebContentsDebuggingEnabled(true)//设置webview可调};} 作者:叫我龙哥就好re https://www.bilibili.com/read/cv7946527/ 出处:bilibili

hook WebView脚本

Java.perform(function () {var WebView = Java.use("android.webkit.WebView");WebView.$init.overload('android.content.Context').implementation = function (a) {console.log("WebView.$init is called");var retval = this.$init(a);this.setWebContentsDebuggingEnabled(true);return retval;}WebView.$init.overload('android.content.Context','android.util.AttributeSet').implementation = function (a,b) {console.log("WebView.$init is called");var retval = this.$init(a,b);this.setWebContentsDebuggingEnabled(true);return retval;}WebView.$init.overload('android.content.Context','android.util.AttributeSet','int').implementation = function (a,b,c) {console.log("WebView.$init is called");var retval = this.$init(a,b,c);this.setWebContentsDebuggingEnabled(true);return retval;}WebView.$init.overload('android.content.Context','android.util.AttributeSet','int','boolean').implementation = function (a,b,c,d) {console.log("WebView.$init is called");var retval = this.$init(a,b,c);this.setWebContentsDebuggingEnabled(true);return retval;}WebView.$init.overload('android.content.Context','android.util.AttributeSet','int','int').implementation = function (a,b,c,d) {console.log("WebView.$init is called");var retval = this.$init(a,b,c,d);this.setWebContentsDebuggingEnabled(true);return retval;}// WebView.$init.overload('android.content.Context','android.util.AttributeSet','int','int','java.util.Map','boolean').implementation = function (a,b,c,d) {//     console.log("WebView.$init is called");//     var retval = this.$init(a,b,c,d,e,f);//     this.setWebContentsDebuggingEnables(true);//     return retval;// }// WebView.setWebContentDebuggingEnabled.implementation = function () {//     this.setWebContentsDebuggingEnabled(true);//     console.log("setWebContentDebuggingEnabled is called")// }// 检查 WebView 类是否存在if (WebView) {// 重写 setWebContentsDebuggingEnabled 方法WebView.setWebContentsDebuggingEnabled.implementation = function (enabled) {this.setWebContentsDebuggingEnabled(true);console.log("setWebContentsDebuggingEnabled is called with argument: " + enabled);};//setWebContentsDebuggingEnabled} else {console.log("WebView class not found");
结果

在这里插入图片描述

现在可以调试了

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这里的到的http是发送的端口。httpcanary可以抓包,charles要设置非标准端口抓包。

       login: function() {var A = this, t = A.$refs.phone.value;/^1[3456789]\d{9}$/.test(t) ? A.$http.post(A.$store.state.marUrl + "/login/login", {phone: A.$refs.phone.value,password: A.$refs.password.value}, {emulateJSON: !0}).then((function(t) {if ("用户名或密码错误" == t.body.msg)this.presentAlert("手机号或密码错误");else {var e = t.body.user;A.$cookies.set("user", e, "15d"),A.$store.commit("changeToken", t.body.token),A.$store.commit("changeTokenState", t.body.token),this.$router.push({path: "/shop"})}}这里我获得了A.$store.state.marUrl"http://121.36.75.162:7878",算是逆向吗?可以通过这个url获取什么有价值的信息吗?

加密通常在JS文件中,

解决方法:远程调试、修改JS代码注入

H5app的发包方法:

  1. 纯JS发包,可以在远程调试工具抓包(chrom:inspect)
  2. 部分JS发包,部分java,这时调试工具抓不了,要分析
    • JS和java如何互相调用,找java层接口
  3. 纯java发包

webView远程调试的要求:

  1. 手机端的webview比电脑端的Chrome版本低
  2. 手机端的webview需要开启可调式
  3. 需要科学上网(VPN)才能在chrome浏览器调试

批处理脚本(.bat)

这里是博主写的用来一键启动frida server的批处理文件。

确保你的批处理脚本在启动 Frida Server 之前检查并释放端口:

@echo off
adb kill-server
adb start-serverREM 检查并杀掉占用端口的进程
adb shell "su -c 'lsof -i :27042 | grep LISTEN | awk '{print $2}' | xargs kill -9'"adb shell "su -c 'cd /data/local/tmp && chmod 777 frida-server-14.2.2-android-arm64 && ./frida-server-14.2.2-android-arm64 &'"
adb forward tcp:27042 tcp:27042REM 检查 Frida Server 是否成功启动
adb shell "ps | grep frida-server"
if %errorlevel% neq 0 (echo Frida Server failed to start.pauseexit /b 1
) else (echo Frida Server started successfully!
)REM 检查端口转发是否成功
adb forward --list | findstr "tcp:27042"
if %errorlevel% neq 0 (echo Port forwarding failed.pauseexit /b 1
) else (echo Port forwarding set up successfully!
)REM 测试连接到 Frida Server
frida-ps -H 127.0.0.1:27042
if %errorlevel% neq 0 (echo Failed to connect to Frida Server.pauseexit /b 1
) else (echo Successfully connected to Frida Server!
)pause
netstat -tunlp
  • 用于查看frida server的端口占用情况
kill -9 [PID]
  • 可以杀死fridaserver进程,重启frida server

总结

引用webview类的方法
找webview类时遇到的问题

在 Android Studio 中没有看到 WebView.setWebContentsDebuggingEnabled 方法,可能是因为你引用的 WebView 类是一个模拟(mock)版本,而不是实际的 Android 系统中的 WebView 类。模拟版本通常用于测试和开发环境中,并不包含所有实际类的方法。

解决方法

  1. 确保引用正确的库:确保你的项目引用了正确的 Android SDK 库,而不是模拟库。

  2. 检查依赖项:在 build.gradle 文件中,确保你引用了正确的 Android 库。

示例 build.gradle 文件

确保你的 build.gradle 文件中包含以下依赖项:

dependencies {implementation 'com.android.support:appcompat-v7:28.0.0'implementation 'com.android.support:design:28.0.0'implementation 'com.android.support:support-v4:28.0.0'implementation 'com.android.support:recyclerview-v7:28.0.0'implementation 'com.android.support:cardview-v7:28.0.0'implementation 'com.android.support.constraint:constraint-layout:1.1.3'implementation 'com.android.support:support-annotations:28.0.0'implementation 'com.android.support:support-core-utils:28.0.0'implementation 'com.android.support:support-core-ui:28.0.0'implementation 'com.android.support:support-fragment:28.0.0'
}

检查类路径

确保你引用的是实际的 android.webkit.WebView 类,而不是模拟类。你可以通过以下方式检查:

  1. 在代码中直接引用 android.webkit.WebView

    import android.webkit.WebView;public class MyActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);WebView webView = findViewById(R.id.webview);webView.setWebContentsDebuggingEnabled(true);}
    }
    
  2. 确保没有引用模拟类:检查你的项目中是否有类似 com.android.layoutlib.bridge.MockView 的引用,如果有,移除或替换为实际的 Android 类。

使用正确的方法

确保你使用的是正确的方法名 setWebContentsDebuggingEnabled,而不是其他类似的方法名。

示例代码

以下是一个完整的示例代码,确保正确引用 WebView 类并调用 setWebContentsDebuggingEnabled 方法:

import android.os.Bundle;
import android.webkit.WebView;
import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);WebView webView = findViewById(R.id.webview);WebView.setWebContentsDebuggingEnabled(true);}
}

进一步排查

  1. 检查 Android SDK 版本:确保你使用的 Android SDK 版本支持 setWebContentsDebuggingEnabled 方法。该方法在 API 级别 19(Android 4.4 KitKat)及以上版本中可用。

  2. 查看官方文档:查阅 Android 官方文档,确保方法名和用法正确。

如果你有任何进一步的问题或需要更多的帮助,请随时告诉我!

资料

安卓逆向第七篇-hook android WebView js注入 - 简书 (jianshu.com)

WebViewDebugHook: 深度调试Webview的利器-CSDN博客

我找到了几个关于使用 Frida hook WebView 重载方法的资源和示例。以下是一些有用的链接和信息:

  1. Stack Overflow - Frida Intercept all webview traffic

    • 讨论了如何使用 Frida 拦截所有 WebView 流量,包括异步 JavaScript 请求。
    • 链接
  2. Node Security - Android Hooking in Frida

    • 详细解释了如何使用 Frida hook Android 的 WebView 类,包括获取 loadUrl 方法的重载版本。
    • 链接
  3. OWASP - Testing for URL Loading in WebViews

    • 介绍了如何使用 Frida 或 frida-trace 动态测试 WebView 中的深度链接,包括 hook shouldOverrideUrlLoadingshouldInterceptRequest 方法。
    • 链接
  4. GitHub - iddoeldor/frida-snippets

    • 提供了多个 Frida 示例,包括如何 hook 所有方法重载。
    • 链接
  5. GitHub - How to hook WebSettings.getSettings() method

    • 讨论了如何 hook WebView 类中的 getSettings 方法,并获取与 WebView 关联的 WebSettings 对象。
    • 链接

这些资源应该能帮助你找到更多关于如何使用 Frida hook WebView 重载方法的示例和详细信息。如果你有任何进一步的问题或需要更多的帮助,请随时告诉我!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/357993.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python中使用PyQT5库时报错:没有Qt平台插件可以初始化

一、发现问题:无限易pythonGo打开执行的时候报:“没有Qt平台插件可以初始化,请重新安装应用程序。”的错误,点击确定后无限易崩溃闪退。 二、解决问题: 1、重新安装依赖,打开CMD输入pip list,查…

day3-xss漏洞(米斯特web渗透测试)

day3-xss漏洞(米斯特web渗透测试) XSSXss种类三种反射型1.反射型xss2.存储型xss3.DOM型xss XSS Xss有一部分是前端的有一部分不是前端的,我们来看一下,昨天的HTML注入修复方法应灵活使用。 HTML注入是注入一段HTML,那…

2.超声波测距模块

1.简介 2.超声波的时序图 3.基于51单片机实现的代码 #include "reg52.h" #include "intrins.h" sbit led1P3^7;//小于10,led1亮,led2灭 sbit led2P3^6;//否则,led1灭,led2亮 sbit trigP1^5; sbit echo…

Qt利用Coin3D(OpenInventor)进行3d绘图

文章目录 1.安装1.1.下载coin3d1.2.下载quarter1.3.解压并合并 2.在Qt中使用3.画个网格4.加载wrl模型5.画个锤子并旋转6.加载自定义视口文件 1.安装 1.1.下载coin3d 首先,到官网下载[coin3d/coin] 我是Qt5.15.2vs2019的,因此我选择这个coin-4.0.2-msvc…

视频监控平台:支持交通部行业标准JT/T905协议(即:出租汽车服务管理信息系统)的源代码的函数和功能介绍及分享

目录 一、视频监控平台介绍 (一)概述 (二)视频接入能力介绍 (三)功能介绍 二、JT/T905协议介绍 (一)概述 (二)主要内容 1、设备要求 2、业务功能要求…

Pikachu靶场--CRSF

借鉴参考 CSRF跨站请求伪造(CTF教程,Web安全渗透入门)_bilibili pikachu靶场CSRF之TOKEN绕过_csrf token绕过的原理-CSDN博客 CSRF(get) 发现需要登录 查看提示,获取username和password 选择一个用户进行登录 选择修改个人信息 …

Docker定位具体占用大量存储的容器

监控告警生产环境的服务器磁盘分区使用率大于90%,进入服务器查看Docker 的 overlay2 存储驱动目录中占用很大,很可能是某个容器一直在打印日志,所以需要定位到是哪个容器,然后进行进一步排查。 然后进入到overlay2中查看是哪个目录…

kotlin函数

1、函数定义 // 下边定义了main函数 fun main() {} 2、函数的类型 // foo函数定义 fun foo () {} // 对应无参类型 () -> Unit fun foo (a: Int):String {} // 对应有参类型 (Int) -> String 3、函数的引用 函数的引用类似C语言中的函数指针,可用于函数传…

基于JSP的“塞纳河畔左岸”的咖啡馆管理系统

开头语: 塞纳河畔左岸的咖啡,我手一杯品尝的你美~ 哎哟,不错哦!我们今天来介绍一下咖啡馆管理系统! 你好呀,我是计算机学长猫哥!如果你对咖啡馆管理系统感兴趣或有相关需求,欢迎联…

「iOS」UI——无限轮播图实现与UIPageControl运用

「OC」UI 文章目录 「OC」UI无限轮播图的实现以及UIPageControl的实际运用明确要求简单滚动视图的实现UIPageControl的实现设置NSTimer实现自动移动补充实现 进行无限滚动视图的修改思路实现 完整代码展示 无限轮播图的实现以及UIPageControl的实际运用 明确要求 我们要实现一…

发表在SIGMOD 2024上的高维向量检索/向量数据库/ANNS相关论文

前言 SIGMOD 2024会议最近刚在智利圣地亚哥结束,有关高维向量检索/向量数据库/ANNS的论文主要有5篇,涉及混合查询(带属性或范围过滤的向量检索)优化、severless向量数据库优化、量化编码优化、磁盘图索引优化。此外,也…

ES全文检索支持繁简和IK分词检索

ES全文检索支持繁简和IK分词检索 1. 前言2. 引入繁简转换插件analysis-stconvert2.1 下载已有作者编译后的包文件2.2 下载源码进行编译2.3 复制解压插件到es安装目录的plugins文件夹下 3. 引入ik分词器插件3.1 已有作者编译后的包文件3.2 只有源代码的版本3.3 安装ik分词插件 4…

示例:推荐一个基于第三方开源控件库DataGridFilter封装的FilterColumnDataGrid,可以像Excel拥有列头筛选器

一、目的:基于第三方开源控件库DataGridFilter封装的FilterColumnDataGrid,可以像Excel拥有列头筛选器,感兴趣的可以去下方链接地址查看开源控件库地址。本控件封装的目的在于将第三方库的皮肤和样式封装到皮肤库中可统一设置样式&#xff0c…

某md5魔改-js还原

我们先把js 扣下来看一下 整体扣一下 ,运行后发现结果一致。 到这里就结束了吗,不不,这次我们要看到它里面具体的变动 <-_-> 先看一下md5的初步加密流程 void MD5Init(MD5_CTX *context) {context->count[0] = 0;context->count[1] = 0;context->state[0]…

linux 简单使用 sftp 和 lftp命令

目录 一. 环境准备二. sftp命令连接到SFTP服务器三. lftp命令3.1 连接FTP和SFTP服务器3.2 将文件从sftp服务器下载到本地指定目录 四. 通过WinSCP命令行从SFTP服务器获取文件到Windows 一. 环境准备 ⏹在安卓手机上下载个MiXplorer&#xff0c;用作SFTP和FTP服务器 官网: htt…

Typora + Hexo 图片路径问题(Typedown)

文章目录 1. 冲突来源2. 解决思路3. 实现1. typora图片路径2. hexo脚本 1. 冲突来源 Hexo上对于图片在md中的引用&#xff0c;使用了post_asset_folder: true配置&#xff0c;来更好的管理图片。 当一篇名为xxx.md的文章引用1.png图片时&#xff0c;默认让1.png保持在xxx文件夹…

cpolar:通过脚本自动更新主机名称和端口号进行内网穿透【免费版】

cpolar 的免费版经常会重新分配 HostName 和 Port&#xff0c;总是手动修改太过麻烦&#xff0c;分享一下自动更新配置文件并进行内网穿透的方法。 文章目录 配置 ssh config编写脚本获取 csrf_token打开登陆界面SafariChrome 设置别名 假设你已经配置好了服务器端的 cpolar。 …

路由

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 客户端&#xff08;例如浏览器&#xff09;把请求发送给 Web 服务器&#xff0c;Web 服务器再把请求发送给 Flask程序实例。程序实例需要知道对每个U…

oracle 外连接(+)和left join用法

案例1&#xff1a; select count(1) FROM TFUNDINFO A, TFUNDTYPE B WHERE A.VC_FUNDCODEB.VC_FUNDCODE() select count(1) FROM TFUNDINFO A, TFUNDTYPE B WHERE A.VC_FUNDCODEB.VC_FUNDCODE SELECT count(1): 这表示查询将返回一个计数&#xff0c;count(1)是一种常见的计数…

【database1】mysql:DDL/DML/DQL,外键约束/多表/子查询,事务/连接池

文章目录 1.mysql安装&#xff1a;存储&#xff1a;集合&#xff08;内存&#xff1a;临时&#xff09;&#xff0c;IO流&#xff08;硬盘&#xff1a;持久化&#xff09;1.1 服务端&#xff1a;双击mysql-installer-community-5.6.22.0.msi1.2 客户端&#xff1a;命令行输入my…