实战 逆向最新黄鸟抓包软件

2023-10-30

前言

观众器者为良匠,观众病者为良医。这篇文章分析了知名抓包软件HttpCanary高级功能的使用限制,使用了许多实用的工具,过程写的尽可能的详细,希望对大家有所帮助。

笔者实践环境:

  1. pixel 6
  2. Android 12
  3. frida 15.1.27
  4. HttpCanary v3.3.5

脱壳

在jadx中查看原包,检查软件是否加固

在这里插入图片描述

由于包下的类比较少且看见了stub,因此可以确定是360加固了,直接用工具脱壳,我用的是hluwa巨佬的frida-dexdump,具体用法可以看官网,这里直接进行尝试脱壳

在这里插入图片描述

在众多dex文件中通过入口类进行筛选

在这里插入图片描述

脱壳完毕~~

核心代码定位与分析

两种思路:

  1. 从激活功能下手,修改成功逻辑

在这里插入图片描述

  1. 从vip功能下手,定位身份判断关键点

在这里插入图片描述

对比两种思路,第二种思路感觉更加的简单和直接,当然第一种也是可以做的,只不过会比想想中的更加复杂,我这里直接给出第一种思路的frida版本,但它是不完善的,重启软件会失效,有兴趣的可以研究一下

function pojie() {
    // remove app detect expression
    Java.choose("com.guoshi.httpcanary.ui.premium.PremiumActivateActivity", {
        onMatch: function (instance) {
            console.log("f7834 before value is " + instance.\uFC82.value)
            instance.\uFC82.value = 1
        },
        onComplete: function () {

        }
    })

    // break vip step1
    let C2217 = Java.use("com.guoshi.\uFC70.\uFC71.\uFC72");
    C2217["\uFC70"].implementation = function () {
        let ret = this.\uFC70.apply(this, arguments);
        var CodeActivateResBody = Java.use("com.guoshi.httpcanary.model.CodeActivateResBody")
        var obj = CodeActivateResBody.$new()
        obj.status.value = 1;
        obj.encryptToken.value = "mdcg";
        obj.token.value = "mdcg";
        console.log("Create obj --> " + obj)
        console.log("status --> " + obj.status.value)
        console.log("encryptToken --> " + obj.encryptToken.value)
        console.log("token --> " + obj.token.value)

        return obj;
    };

    // break vip step2
    let PremiumActivateActivity = Java.use("com.guoshi.httpcanary.ui.premium.PremiumActivateActivity");
    PremiumActivateActivity["\uFC71"].overload('java.lang.String', 'java.lang.String').implementation = function (arg1, arg2) {
        let ret = this.\uFC71(arg1, arg2);
        console.log('\uFC71 ret before value is ' + ret);
        ret = true
        console.log('\uFC71 ret after value is ' + ret);
        return ret;
    };
}

function main() {
    Java.perform(function () {
        pojie()
    })
}

setImmediate(main)

在这里插入图片描述

下面主要对第二种思路进行分析,极速模式属于高级功能,由一个按钮进行控制,最迅速的定位方式为hook点击事件,并反推出核心判断。我使用r0ysue巨佬的hookEvent.js快速定位点击事件,代码不复杂,建议研究一下

var jclazz = null;
var jobj = null;
function getObjClassName(obj) {
	if (!jclazz) {
		var jclazz = Java.use("java.lang.Class");
	}
	if (!jobj) {
		var jobj = Java.use("java.lang.Object");
	}
	return jclazz.getName.call(jobj.getClass.call(obj));
}

function watch(obj, mtdName) {
	var listener_name = getObjClassName(obj);
	var target = Java.use(listener_name);
	if (!target || !mtdName in target) {
		return;
	}
	target[mtdName].overloads.forEach(function (overload) {
		overload.implementation = function () {
			console.log("[WatchEvent] " + mtdName + ": " + getObjClassName(this))
			return this[mtdName].apply(this, arguments);
		};
	})
}

function OnClickListener() {
	Java.perform(function () {
		Java.use("android.view.View").setOnClickListener.implementation = function (listener) {
			if (listener != null) {
				watch(listener, 'onClick');
			}
			return this.setOnClickListener(listener);
		};
		
		Java.choose("android.view.View$ListenerInfo", {
			onMatch: function (instance) {
				instance = instance.mOnClickListener.value;
				if (instance) {
					console.log("mOnClickListener name is :" + getObjClassName(instance));
					watch(instance, 'onClick');
				}
			},
			onComplete: function () {
			}
		})
	})
}
setImmediate(OnClickListener);

在这里插入图片描述

注册点击事件的类是com.guoshi.httpcanary.ui.-$ L a m b d a Lambda LambdaHomeActivity$L0WEKAV1lAcNYjl4nGyTdnm61r8,在jadx中查看

在这里插入图片描述

在这里插入图片描述

后面的注释是我加上去的,下面从第一处判断开始分析

m6185函数传入了一串加密字符串,我们需要知道它代表了什么意思,可以看一下这个函数

在这里插入图片描述

在这里插入图片描述

可以确定是一个解密函数,但我们不需要逆向出解密的逻辑,因为可以直接hook获取返回值

function hook_1(){
    let C2146 = Java.use("com.guoshi.httpcanary.\uFC72");
    C2146["\uFC70"].implementation = function (str) {
        console.log('input str: ' + str);
        let ret = this.\uFC70(str);
        console.log('ret value is ' + ret);
        return ret;
    };
}

function main(){
    Java.perform(function(){
        hook_1()
    })
}
setImmediate(main)

在这里插入图片描述

解密的字符串是settings_turbo_mode,翻译成汉语就是设置极速模式,那m6317函数是什么呢?点进去看看

在这里插入图片描述

懂了,m6317是从sharedPreferences中取出相应key的value,而settings_turbo_mode保存的是当前极速模式是打开还是关闭,如果返回值为true,那么表明当前属于开启的状态,这样就要进入判断成功的逻辑,把开启状态变成关闭状态。

下面分析第二处判断,该处判断取决于a函数和z函数的返回值,点开看一下

在这里插入图片描述

有native关键字就意味着我们要分析so层了,那么第一步就是要确定这些函数在哪个so文件中,首先我们假设这些函数都是动态注册的,那么就可以使用yang神的hook_RegistNatives.js脚本迅速判断,注意要以spawn模式启动,脚本如下:

function find_RegisterNatives(params) {
    var symbols = Module.enumerateSymbolsSync("libart.so");
    var addrRegisterNatives = null;
    for (var i = 0; i < symbols.length; i++) {
        var symbol = symbols[i];
        
        //_ZN3art3JNI15RegisterNativesEP7_JNIEnvP7_jclassPK15JNINativeMethodi
        if (symbol.name.indexOf("art") >= 0 &&
                symbol.name.indexOf("JNI") >= 0 && 
                symbol.name.indexOf("RegisterNatives") >= 0 && 
                symbol.name.indexOf("CheckJNI") < 0) {
            addrRegisterNatives = symbol.address;
            console.log("RegisterNatives is at ", symbol.address, symbol.name);
            hook_RegisterNatives(addrRegisterNatives)
        }
    }

}

function hook_RegisterNatives(addrRegisterNatives) {

    if (addrRegisterNatives != null) {
        Interceptor.attach(addrRegisterNatives, {
            onEnter: function (args) {
                console.log("[RegisterNatives] method_count:", args[3]);
                var env = args[0];
                var java_class = args[1];
                var class_name = Java.vm.tryGetEnv().getClassName(java_class);
			   var methods_ptr = ptr(args[2]);
                var method_count = parseInt(args[3]);
                for (var i = 0; i < method_count; i++) {
                    var name_ptr = Memory.readPointer(methods_ptr.add(i * Process.pointerSize * 3));
                    var sig_ptr = Memory.readPointer(methods_ptr.add(i * Process.pointerSize * 3 + Process.pointerSize));
                    var fnPtr_ptr = Memory.readPointer(methods_ptr.add(i * Process.pointerSize * 3 + Process.pointerSize * 2));

                    var name = Memory.readCString(name_ptr);
                    var sig = Memory.readCString(sig_ptr);
                    var find_module = Process.findModuleByAddress(fnPtr_ptr);
                    console.log("[RegisterNatives] java_class:", class_name, "name:", name, "sig:", sig, "fnPtr:", fnPtr_ptr,  " fnOffset:", ptr(fnPtr_ptr).sub(find_module.base), " callee:", DebugSymbol.fromAddress(this.returnAddress));
                }
            }
        });
    }
}

setImmediate(find_RegisterNatives);

在这里插入图片描述

确定了我们要分析的是libHttpCanary.so文件,并且函数的偏移地址也拿到了,把文件拖进ida中看一下,重新命名的过程就不展示了

在这里插入图片描述

a方法调用了z方法和l方法,点进z方法看一下

在这里插入图片描述

由上面的伪代码可以推出,z方法就是判断当前是否是高级模式,如果是高级模式则返回true,下面看看l方法是什么

在这里插入图片描述

由伪代码可以看出l方法返回用户试用的剩余天数,如果为正数则表明用户的试用还没有到期,如果为负数则表明用户的试用到期了,现在重新看a方法应该清晰了很多

在这里插入图片描述

这个逻辑表达式表示的是如果用户不是vip且试用还没有到期,那么结果为true。

那么两个核心函数就找到了,一个是a方法,一个是z方法,a方法判断是否是试用模式,z方法判断是否是vip模式,那么这两个方法只要有一个为真就能使用软件的高级功能了,下面使用frida简单测试一下

function hook_2(){
    let Cont = Java.use("com.guoshi.httpcanary.jni.Cont");
    Cont["a"].implementation = function (context) {
        let ret = this.a(context);
        ret = true
        console.log('a ret value is ' + ret);
        return ret;
    };

    Cont["z"].implementation = function (context) {
        let ret = this.z(context);
        ret = false
        console.log('z ret value is ' + ret);
        return ret;
    };
}

function main(){
    Java.perform(function(){
        // hook_1()
        hook_2()
    })
}
setImmediate(main)

使用脚本之前

在这里插入图片描述

使用脚本之后

在这里插入图片描述

结尾

这个软件整体的防护还是很到位的,java层的混淆也是很给力,但如果加一些frida的反调试并且在so层多加一点防护那么就更安全了。上面只是使用了frida脚本进行了功能的分析,我也把它写成了xposed模块,方便大家的使用,原包与模块都放在了下面的链接中,当然有能力的还是要支持下正版。因为新人创作不易,希望大家点个赞鼓励一下((′▽`〃))

HttpCanary_v3.3.5.apk

httpCanaryBreaker.apk

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实战 逆向最新黄鸟抓包软件 的相关文章

  • Android Studio 3.0.0 不允许 DOCTYPE

    升级到Android Studio 3 0 0 同步并更新gradle插件 出现以下错误 Error DOCTYPE not allowed if function http apache org xml features disallow
  • 如何在 Android / Java 中获取图像的分辨率

    如何在 Android 中找到任何图像的分辨率 获取存储在磁盘中的图像大小的有效方法 例如获取用户选择上传的图像文件的大小 是使用BitmapFactory Options并设置inJustDecodeBounds为真 这样做你就会获取图像
  • Android 上有哪些字体可用? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我知道安卓有一个字体集合 http www ascenderfonts com store search
  • 安卓无法玩ogg

    有人知道这是什么意思吗 ogg使用phonegap is Media播放 它使用MediaPlayer 05 26 15 41 50 007 1160 3631 E AudioFlinger no more track names avai
  • 将正确的上下文传递给 greendao 的 OpenHelper 构造函数

    如果我理解正确的话 在使用数据库时 我必须执行以下操作 DaoMaster OpenHelper helper new DaoMaster OpenHelper this test db null Override public void
  • 在 Anko DSL 中创建自定义 View/ViewGroup 类

    我想创建一个自定义视图 它只是一些 Android 视图的包装 我考虑创建一个自定义 ViewGroup 来管理其子视图的布局 但我不需要这么复杂 我基本上想做的是 class MainActivity verticalLayout tex
  • android webview 函数 onPagefinished 被调用两次

    我的android webview功能onPageFinished被调用两次 我不知道为什么 但它在 android 2 2 上运行良好 但当我将其升级到 4 时 它就不起作用了 代码附在下面 Code Override public vo
  • Retrofit-2 内容类型问题

    我的 Api 接受 Content Type application json 作为标头 我按照改造文档中所述完美设置了标题 Headers Content Type application json POST user classes C
  • 如何从一个代码库创建多个 Android 应用

    我有一个 Android 代码库 它使用带有设置的 API 来获取多个应用程序的不同数据 所有应用程序都使用相同的代码库 但进行一两个设计调整 那么如何重用主代码库而不必每次都复制整个 Android 项目呢 iPhone 在同一个项目中使
  • 尝试在模拟器上安装第二个 flutter 应用程序时出错

    我创建了一个简单的 flutter 应用程序并在 android 模拟器上运行它 效果还不错 现在我创建了另一个 当我尝试在模拟器上运行它时 我得到 Error ADB exited with exit code 1 adb failed
  • 在 Jetpack Compose 中跨可组合函数重复使用一组预览注释

    在 Jetpack Compose 中迈出第一步 这非常令人惊奇 除了一个恼人的问题 我有一组固定的预览 正常 深色和 RTL Preview name Normal group Screen showBackground true Pre
  • Vimeo 视频在 Android 6 设备上停止播放

    我正在尝试在我的应用程序中播放 Vimeo 的视频 问题是在 Android 6 设备上 视频会在一定时间后停止播放 在 API 较低的设备上一切正常 时间取决于质量 对于下面提供的网址的视频 播放一定分钟 1 到 3 视频质量有多低 播放
  • Android Studio 将音乐文件读取为文本文件,如何恢复它?

    gameAlert mp3是我的声音文件 运行应用程序时 它询问我该文件不与任何文件类型关联 请定义关联 我选择TextFile错误地 现在我的音乐文件被读取为文本文件 我如何将其转换回music file protected void o
  • Espresso 和 Proguard 的 Java.lang.NoClassDefFoundError

    我对 Espresso 不太有经验 但我终于成功地运行了它 我有一个应用程序需要通过 Proguard 缩小才能处于 56K 方法之下 该应用程序以 3 秒的动画开始 因此我需要等到该动画结束才能继续 这就是我尝试用该方法做的事情waitF
  • onBackPressed 隐藏 不破坏 Activity

    我知道如何取消后退按键 以便活动 主窗口保持可见 public void onBackPressed return 我的目标是隐藏该活动 但是 在没有完成它的情况下 您如何在 onBackPressed 事件中做到这一点 即我想达到 onP
  • android httprequest java.net.UnknownHostException

    我想用android发出http请求 是使用这个 void testHTTP HttpClient httpClient new DefaultHttpClient HttpUriRequest request new HttpPost h
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • 安卓的限制

    我需要构建一个应用程序 该应用程序拍摄相机图像并将其上传到网络 在网络上进行一些处理并返回真 假 我在这方面遇到了一些问题 希望得到澄清 1 我的应用程序有什么方法可以知道 Android 相机捕获的图像吗 我从这里明白了什么 Androi
  • Android:解析 XML 数据的最佳解析器 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在开发一个应用程序 其中我第一次要解析来自远程服务器的 xml 文件中的数据 但我无法选择哪个解析器是有效的或最适合解析的 因为我知道主要有
  • 当ScrollView滚动到底部时加载更多数据

    我有一个带有动态加载内容的滚动视图 有时可能会有很多内容 所以我想在用户滚动到底部时加载更多内容 我搜索了合适的方法 发现了两种 onScrollChanged and getScrollY 但我不知道如何将它用于我的目的 请给我一些建议

随机推荐

  • oracle 多值更新,oracle 同时更新(update)多个字段多个值

    创建表A B create table A a1 varchar2 33 a2 varchar2 33 a3 varchar2 33 create table B b1 varchar2 33 b2 varchar2 33 b3 varch
  • pytest常用代码示例详细

    test case py usr bin env python3 coding utf 8 File test case py Author sunyajun Creation Time 2023 7 31 9 41 Description
  • C++ 标准库值操作迭代器的常见函数

    迭代器是C 标准库中的重要组件 特别是在容器内部 没有迭代器 容器也就无所谓存在了 例如 vector容器简而言之就是3个迭代器 start finish 以及end of storage vector的任何操作都离不开这3个迭代器 接下来
  • 关于COCO数据集评价参数设置

    在进行DETR like模型的实验过程中 考虑到原模型都是基于COCO数据集上进行的实验 因此博主在实验时也是将其全部都转换为COCO数据集的格式 但这就引发了一个问题 那就是不同的数据集中目标的数目是不同的 而最终结果却有一个不容忽视的指
  • 怎么升级Android Studio版本,Android Studio更新的四种版本介绍

    Android Studio在更新版本时 会有让选择升级源 如下 默认情况下选择的是Stable Channel 这几个Channel的版本是有一些差异的 在Android Studio下载官网上 有如下介绍 Android Studio
  • scrollIntoView() 方法的使用

    在 JavaScript 中 scrollIntoView 方法是用于将指定元素滚动到可见区域内的方法 该方法可以接收一个 options 对象参数 提供了滚动时的一些控制选项 如平滑滚动的行为 下面我们来介绍一个应用 scrollInto
  • tradingview

    文档地址 https b aitrade ga books tradingview index html 初始化 数据对接后的展示图 TV的数据格式 getbars time单位是S 10位数 ms的请除以1000 历史数据回来 塞给get
  • 我的世界进服务器显示C1.8-1.11,我的世界坐标显示(Batty's Coordinates PLUS)Mod

    Batty s Coordinates PLUS最好用的坐标显示Mod是为了你在游戏中方便的显示坐标或者帧数 这样你就不需要频繁的去按F3 并且还内置的定时器的功能 用法 在模式0坐标是隐藏的 模式1 显示了X Y Z坐标 也表明你面对的方
  • C# 添加Windows服务,定时任务。

    源码下载地址 http files cnblogs com files lanyubaicl 20160830Windows E6 9C 8D E5 8A A1 zip 步骤 一 创建服务项目 步骤二 添加安装程序 步骤三 服务属性设置 s
  • MATLAB中均值、方差、标准差、协方差、相关性的计算

    公式 1 均值 2 方差 3 标准差 均方差 4 协方差 5 相关性 6 加权均值 7 加权方差 8 加权标准差 MATLAB代码 样本定义 x 1 2 3 3 2 1 y 1 2 3 3 1 2 z 3 2 y 1 均值 均值 xmean
  • 搭建spring-cloud-alibaba微服务项目:springBoot服务+nacos注册中心+nacos配置中心+feign服务交互+gateway网关

    项目说明 从0 1 搭建cloud alibaba微服务项目 包括各个springBoot服务 nacos注册中心 nacos配置中心 feign服务交互 gateway网关 首先统一微服务种alibaba相关组件的依赖版本问题 官方参考文
  • Android中LocalSocket使用

    http www cnblogs com bastard archive 2012 10 09 2717052 html 一 Socket Socket最初用在基于TCP IP网络间进程通信中 以客户端 服务器模式进行通信 实现异步操作 共
  • vue项目实现微信扫码登录

    要在Vue项目中实现微信扫码登录功能 你可以按照以下步骤进行操作 注册微信开放平台账号并创建应用 首先 在微信开放平台上注册一个账号 并创建一个应用 获取到应用的AppID和AppSecret 安装 Axios 在Vue项目中使用Axios
  • python setup.py install报错“error: can‘t create or remove files in install directory”

    运行python setup py install 报错 running install error can t create or remove files in install directory The following error
  • 叶面积指数(LAI)介绍以及遥感估算方法

    前言 叶面积指数精度是正确预测产量的重要参数之一 同时 还有那么多疑问 如何才能正确 以及如何使用最有效的方法计算叶面积指数 LAI 什么是最佳 LAI 哪些估算叶面积指数精度的方法比较好 本文为初学者做了简要介绍 并在文章末尾附了两种估算
  • 史上最全的正则表达式-匹配中英文、字母和数字

    1 匹配中文 u4e00 u9fa5 2 英文字母 a zA Z 3 数字 0 9 4 匹配中文 英文字母和数字及下划线 u4e00 u9fa5 a zA Z0 9 同时判断输入长度 u4e00 u9fa5 a zA Z0 9 4 10 5
  • vue3中将数据导出为excel表格

    目标 将vue3接口中得到的数据转换为数组 然后利用Export2Excel导出为excel表 1 开始之前要准备 1 Export2Excel js文件 在后面标题4附上 我是放在until目录下 2 npm i xlsx 安装失败后面加
  • 6.4-为何要深度学习

    文章目录 一 模型对比 二 模块化 Modularization 三 语音辨识 3 1 类比 Analogy 3 2 端到端学习 End to end Learning 四 复杂任务 五 更多的原因 一 模型对比 在参数量相同的条件下 究竟
  • dede仿站时----实现简单图片滚动(轮流图)效果

    第一次发文章 说的不好 请见谅 刚处理了标题这个问题 也百度半天没好办法 自己混乱的整理出来 所以发出来 说说自己的解决办法 直接代码 图 代码 dede arclist typeid 20 orderby pubdate type ima
  • 实战 逆向最新黄鸟抓包软件

    前言 观众器者为良匠 观众病者为良医 这篇文章分析了知名抓包软件HttpCanary高级功能的使用限制 使用了许多实用的工具 过程写的尽可能的详细 希望对大家有所帮助 笔者实践环境 pixel 6 Android 12 frida 15 1