安卓逆向_23 --- Hook 框架 Cydia Substrate( Hook Java层 和 so层)

From:Android Hook 框架 Cydia_substrate 详解:https://www.cnblogs.com/lkislam/p/4859957.html

通过 cydia substrate 对 framework API进行注入:https://www.jianshu.com/p/cc49b30c5b5b

Android 逆向之旅 --- Native层的Hook神器Cydia Substrate使用详解:http://www.520monkey.com/archives/1028

CydiaSubstrate hook

1. Cydia_Substrate 框架简介

Cydia Substrate 和 Xposed:

  • Cydia Substrate 可以修改任何主进程的代码,不管是 Java / C / C++ (native代码)编写的。(hook Java层和C++层)
  • Xposed 只支持 HOOK app_process 中的 java 函数。( 只能 hook java 层 )

其实 cydia substrate 与 xposed 的 hook 原理是一样的,二者都可以作为 Java Hook 的框架,看使用习惯了。

官网地址:Cydia Substrate

注意:从官网可以看到,Cydia Substrate 支持安卓 2.3 到 4.3 版本。。。手机需要 root

Demo地址:https://github.com/zencodex/cydia-android-hook

官方教程:http://www.cydiasubstrate.com/id/20cf4700-6379-4a14-9bc2-853fde8cc9d1

SDK下载地址:http://asdk.cydiasubstrate.com/zips/cydia_substrate-r2.zip

使用方法

安装 Cydiastrate 框架 Android 本地服务

首先就是在 Android 设备中安装 Cydia substrate 框架的本地服务应用 substrate.apk。

官方下载地址为:http://www.cydiasubstrate.com/download/com.saurik.substrate.apk

安装完 substrate 后,需要 "Link Substrate Files"(连接本地的 Substrate 服务文件),这一步是需要 Root权限,连接后还需要 重启设备 才能够生效。

下载使用 Cydiasubstrate 库

Cydiasubstrate 官方建议在 Android SDK Manager 中添加它们插件地址的方式进行更新下载。

如:在用户自定义网址中添加http://asdk.cydiasubstrate.com/addon.xml。

通过使用 Android SDK Manager 工具下载完 Cydiasubstrate 框架后,

其存储于目录 ${ANDROID_HOME}\sdk\extras\saurikit\cydia_substrate下。

但是,由于 Android SDK Manager 在国内使用起来存在很多的限制,下载的时候也不是非常稳定,所以还是建议大家直接去官网下载开发库。官方下载地址为:http://asdk.cydiasubstrate.com/zips/cydia_substrate-r2.zip

下载完成后,将得到的所有文件(很多的 jar包 与 so库 ),都拷贝都 Android 项目下的 libs 文件夹中,就可以直接使用了。

其中的 substrate.h 头文件与 lib 文件夹下的 so文件是提供在使用 NDK 进行原生 Hook 程序开发中的函数支持库。

注意:CydiaSubstrate 框架对于 inline Hook 的操作目前还是存在一些 bug,使用的时候可能会出现崩溃的现象,部分使用了国内定制的 ROM 的设备在使用 CydiaSubstrate 框架时会造成设备无法重新启动或无法 Hook 的现象。

CydiaSubstrate怎么用 ?

CydiaSubstrate怎么用,其实很简单,CydiaSubstrate 提供了三个静态的方法工具类,我们只需要学会使用它就好 。

MS.hookClassLoad           拿到指定Class载入时的通知
MS.hookMethod              使用一个Java方法去替换另一个Java方法
MS.moveUnderClassLoader    使用不同的ClassLoder重载对象

具体说明如下:

/*** Hook一个指定的Class* * @param name Class的包名+类名,如android.content.res.Resources* @param hook 成功Hook一个Class后的回调*/
void hookClassLoad(String name, MS.ClassLoadHook hook);/*** Hook一个指定的方法,并替换方法中的代码* * @param _class Hook的calss* @param member Hook class的方法参数* @param hook 成功Hook方法后的回调* @param old Hook前方法,类似C中的方法指针*/
void hookMethod(Class _class, Member member, MS.MethodHook hook, MS.MethodPointer old);/*** Hook一个指定的方法,并替换方法中的代码* * @param _class Hook的calss* @param member Hook class的方法参数* @param alteration*/
void hookMethod(Class _class, Member member, MS.MethodAlteration alteration);/*** 使用一个ClassLoader重载一个对象* * @param loader 使用的ClassLoader* @param object 带重载的对象* @return 重载后的对象*/
<T> T moveUnderClassLoader(ClassLoader loader, T object);

Substrate 几个重要 API 介绍

MS.hookClassLoad 

  • 函数原型:void hookClassLoad(String name, MS.ClassLoadHook hook);
  • 说明:该方法实现在指定的类被加载的时候发出通知。因为一个类可以在任何时候被加载,所以Substrate提供了一个方法用来检测用户感兴趣的类何时被加载。参数
参数描述

name

包名+类名,使用 java 的.符号

hook

MS.ClassLoadHook 的一个实例,当这个类被加载的时候,它的 classLoaded 方法会被执行。

MS.hookMethod 

该 API 允许开发者提供一个回调函数替换原来的方法,这个回调函数是一个实现了MS.MethodHook接口的对象,是一个典型的匿名内部类。它包含一个 invoked 函数。

函数原型:

void hookMethod(Class _class, Member member, MS.MethodHook hook, MS.MethodPointer old);
void hookMethod(Class _class, Member member, MS.MethodAlteration alteration);

参数描述(一)

参数

描述

_class

加载的目标类,为classLoaded传下来的类参数

member

通过反射得到的需要hook的方法(或构造函数). 注意:不能HOOK字段 (在编译的时候会进行检测).

hook

MS.MethodHook的一个实例,其包含的invoked方法会被调用,用以代替member中的代码

参数描述(二)

参数  描述

_class

加载的目标类,为classLoaded传下来的类参数

member

通过反射得到的需要hook的方法(或构造函数). 注意:不能HOOK字段 (在编译的时候会进行检测).

alteration

An instance of MS.MethodAlteration whose boxedinvoked method will be called instead of member. This instance will also be filled in using information from   the original implementation, allowing you to use invoke to call the original method implementation。

建议开发者使用第二种方式,这种方式使用起来简单并且很少出错,不需要一个单独的MS.MethodPointer类实例。

示例 1:接口组件颜色修改为紫罗兰色hook Java层

下面以官网的一个实例来说明 cydia substrate 的使用方法。

该实例是实现将多个接口组件颜色修改为紫罗兰色。

步骤 一:

创建一个空的 Android 工程。由于创建的工程将以插件的形式被加载,所以不需要 activity。将 SDK 中的 substrate-api.jar 复制到 project/libs 文件夹中。

步骤 二:

配置 androidmanifest.xml 文件

  • (1)需要指定权限:cydia.permission.SUBSTRATE
  • (2)添加 meta 标签,name 为 cydia.permission.SUBSTRATE,value 为下一步中创建的类名 .Main

图示:

配置代码:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">   <application>   <meta-data android:name="com.saurik.substrate.main" android:value=".Main"/>   </application>   <uses-permission android:name="cydia.permission.SUBSTRATE"/>   
</manifest>   

步骤 三:

创建一个类,类名为 Main。类中包含一个 static 方法 initialize,当插件被加载的时候,该方法中的代码就会运行,完成一些必要的初始化工作。

import com.saurik.substrate.MS;   public class Main {   static void initialize() {    // ... code to run when extension is loaded   }   
}   

步骤 四:

为了实现 HOOK,达到修改目标类中的代码的目的,我们需要得到目标类的一个实例,如示例中的 resources。

public class Main {   static void initialize() {   MS.hookClassLoad("android.content.res.Resources", new MS.ClassLoadHook() {   public void classLoaded(Class<?> resources) {   // ... code to modify the class when loaded   }   });   }   
}  

步骤 五:

通过 MS.MethodHook 实例实现原代码的修改。

为了调用原来代码中的方法,我们需要创建一个 MS.MethodPointer 类的实例,它可以在任何时候运行原来的代码。

在这里我们通过对原代码中 resources 对象原始代码的调用和修改,将所有绿色修改成了紫罗兰色。

代码:

public void classLoaded(Class<?> resources) {   Method getColor;    try {   getColor = resources.getMethod("getColor", Integer.TYPE);   } catch (NoSuchMethodException e) {   getColor = null;   }   if (getColor != null) {   final MS.MethodPointer old = new MS.MethodPointer();   MS.hookMethod(resources, getColor, new MS.MethodHook() {   public Object invoked(Object resources, Object... args)   throws Throwable   {   int color = (Integer) old.invoke(resources, args);   return color & ~0x0000ff00 | 0x00ff0000;   }   }, old);   }   }   

安装运行,重启系统后发现很多字体颜色都变了。如下图所示:

安装运行,重启系统后发现很多字体颜色都变了。示例中 MS.hookMethod 的代码可以改成:

MS.hookMethod(resources, getColor, new MS.MethodAlteration<Resources, Integer>() {   public Integer invoked(Resources resources, Object... args)   throws Throwable   {   int color = invoke(resources, args);   return color & ~0x0000ff00 | 0x00ffee00;   }   
}); 

示例 2:duanxinjiankong实例(hook Java层

在下面的例子中我们实现了短信监听功能,将短信发送人、接收人以及短信内容打印出来:

import java.lang.reflect.Method;   
import android.app.PendingIntent;   
import android.util.Log;   
import com.saurik.substrate.MS;   
public class Main {  static void initialize() {     MS.hookClassLoad("android.telephony.SmsManager", new MS.ClassLoadHook() {   @Override   public void classLoaded(Class<?> SmsManager) {   //code to modify the class when loaded   Method sendTextMessage;   try {   sendTextMessage = SmsManager.getMethod("sendTextMessage",   new Class[]{String.class,String.class,String.class,PendingIntent.class,PendingIntent.class});   } catch (NoSuchMethodException e) {   sendTextMessage = null;   }   MS.hookMethod(SmsManager, sendTextMessage, new MS.MethodAlteration() {   public Object invoked(Object _this,Object... _args) throws Throwable{   Log.i("SMSHOOK","SEND_SMS");   Log.i("SMSHOOK","destination:"+_args[0]);   Log.i("SMSHOOK","source:"+_args[1]);   Log.i("SMSHOOK","text:"+_args[2]);   return invoke(_this, _args);   }   });   }   });   }   
}

运行步骤

  • ROOT 的手机一部,没有 ROOT 的,请自行搜索方法。
  • 手机端安装 Cydia Substrate。下载地址: http://www.cydiasubstrate.com/download/com.saurik.substrate.apk
  • 按照上面的例程,编译代码后安装到手机
  • 手机上运行 Substrate,界面上点击"Link Substrate Files",再点击 "Restart System(Soft)"(这些都是Hook 步骤)
  • 最后再编写一个 Test.apk,调用 hook 后的 class,检验 hook 结果。

运行后的结果为:

示例 3:广告注入 (hook Java层

From:https://blog.csdn.net/yzzst/article/details/47318751

使用Cydiasubstrate框架我们能够任意的Hook系统中的Java API,当然其中也用到了很多的反射机制,那么除了系统中给开发者提供的API以外,我们能否也Hook应用程序中的一些方法呢?答案是肯定的。下面我们就以一个实际的例子讲解一下如何Hook一个应用程序。

下面我们针对Android操作系统的浏览器应用,Hook其首页Activity的onCreate方法(其他方法不一定存在,但是onCreate方法一定会有),并在其中注入我们的广告。根据上面对Cydiasubstrate的介绍,我们有了一个简单的思路。

首先,我们根据某广告平台的规定,在我们的AndroidManifest.xml文件中填入一些广告相关的ID。并且在AndroidManifest.xml文件中填写一些使用Cydiasubstrate相关的配置与权限。当然,我们还会声明一个广告的Activity,并设置此Activity为背景透明的Activity,为什么设置透明背景的Activity,如下图:

好了,下面我们就来实操一下。其 AndroidManifest.xml 文件的部分内容如下所示:

<!-- 广告相关的权限  -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<!-- 加入substrate权限  -->
<uses-permission android:name="cydia.permission.SUBSTRATE" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><!-- 广告相关参数 --><meta-dataandroid:name="APP_ID"android:value="c62bd976138fa4f2ec853bb408bb38af" /><meta-dataandroid:name="APP_PID"android:value="DEFAULT" /><!-- 声明substrate的注入口味Main类 --><meta-dataandroid:name="com.saurik.substrate.main"android:value="com.example.hookad.Main" /><!-- 透明无动画的广告Activity --><activityandroid:name="com.example.hookad.MainActivity"android:theme="@android:style/Theme.Translucent.NoTitleBar" ><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><!-- 广告的action  --><action android:name="com.example.hook.AD" /></intent-filter></activity>
</application>

对于 Cydiasubstrate的主入口 Main 类,依照之前的步骤新建一个包含有 initialize 方法的 Main 类。

这个时候我们希望使用 MS.hookClassLoad 方式找到浏览器主页的 Activity 名称。

这里我们使用 adb shell 下使用 dumpsys activity 命令找到浏览器主页的 Activity 名称为 com.android.browser.BrowserActivity。

使用 MS.hookClassLoad 方法获取了 BrowserActivity 之后再 hook 其 onCreate 方法,在其中启动一个含有广告的 Activity。Main 类的代码如下所示:

public class Main {/*** substrate 初始化后的入口*/static void initialize() {//Hook 浏览器的主Activity,BrowserActivityMS.hookClassLoad("com.android.browser.BrowserActivity", new MS.ClassLoadHook() {public void classLoaded(Class<?> resources) {Log.e("test", "com.android.browser.BrowserActivity");// 获取BrowserActivity的onCreate方法Method onCreate;try {onCreate = resources.getMethod("onCreate", Bundle.class);} catch (NoSuchMethodException e) {onCreate = null;}if (onCreate != null) {final MS.MethodPointer old = new MS.MethodPointer();// hook onCreate方法MS.hookMethod(resources, onCreate, new MS.MethodHook() {public Object invoked(Object object, Object...args) throws Throwable {Log.e("test", "show ad");// 执行Hook前的onCreate方法,保证浏览器正常启动Object result =  old.invoke(object, args);// 没有Context// 执行一个shell 启动我们的广告ActivityCMD.run("am start -a com.example.hook.AD");return result;}}, old);}}});}
}

对于启动的广告MainActivity,在其中就是弹出一个插屏广告。当然可也可是其他形式的广告或者浮层,内容比较简单这里不做演示了。对整个项目进行编译,运行。这个时候我们重新启动 Android 自带的浏览器的时候发现,浏览器会弹出一个广告弹框。

从上面的图片我们可以看出来了,之前我们设置插屏广告 MainActivity 为无标题透明(Theme.Translucent.NoTitleBar)就是为了使得弹出来的广告与浏览器融为一体,让用户感觉是浏览器弹出的广告。也是恶意广告程序为了防止自身被卸载掉的一些通用隐藏手段。

这里演示的注入广告是通过 Hook 指定的 Activity 中的 onCreate 方法来启动一个广告 Activity。当然,这里我们演示的 Activity 只是简单的弹出来了一个广告。如果启动的 Activity 带有恶意性,如将 Activity 做得与原 Activity一模一样的钓鱼 Activity,那么对于移动设备用户来说是极具欺骗性的。

示例 4:修改 主题颜色和游戏金币值(hook java层 so 层

From:视频去哪了呢?_哔哩哔哩_bilibili

hook java 层

Main.class 代码:

hook so 层

需要的 jar 包 和 lib

Androidmainfest.xml 添加权限:

添加 libs 文件

添加 .h 文件 和 so 库文件

test.cpp 代码:

IDA 打开 so 库,定位 函数名:

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

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

相关文章

高校人工智能热的“冷”思考

来源&#xff1a;中国科学报高校在开设相关专业时&#xff0c;应该组织教授委员会、学术委员会&#xff0c;结合国家的人才政策、产业发展对人才的需求、国内外其他高校同类专业人才培养的情况&#xff0c;就本校开设这方面的专业有无现实条件&#xff0c;怎样进行师资建设、课…

转载:实用 FRIDA 进阶 --- objection :内存漫游、hook anywhere、抓包

转载&#xff1a;实用FRIDA进阶&#xff1a;内存漫游、hook anywhere、抓包&#xff1a;https://www.anquanke.com/post/id/197657 Frida Hook Android 常用方法&#xff1a;https://blog.csdn.net/zhy025907/article/details/89512096 实用FRIDA进阶&#xff1a;脱壳、自动化…

谷歌李飞飞:我们依旧站在人工智能研究的起点

来源&#xff1a;机器人大讲堂摘要&#xff1a;8 年来&#xff0c;在 ImageNet 数据集的训练下&#xff0c;人工智能对于图像识别的准确度整整提高了 10 倍&#xff0c;甚至超越了人类视觉本身。但李飞飞认为&#xff0c;我们对于人工智能的研究仍在起点上。说起人工智能&#…

Android Intent 用法总结

From&#xff1a;https://www.jianshu.com/p/67d99a82509b Android 中提供了 Intent 机制来协助应用间的交互与通讯&#xff0c;Intent 负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述&#xff0c;Android 则根据此 Intent 的描述&#xff0c;负责找到对应的组件…

FRIDA - API使用篇:rpc、Process、Module、Memory 使用方法及示例

官方 API (JavaScript API)&#xff1a;https://frida.re/docs/javascript-api/ From&#xff1a; ( FRIDA-API使用篇 )&#xff1a;https://www.anquanke.com/post/id/195215 前言 在这篇文章中来对其官方的一些非常常用的 API 进行学习。所谓工欲善其事&#xff0c;必先利其…

Entity Framework 实体关系总结(转)

通过 Entiy Framework实践系列文章&#xff0c;理了理 Entity Framework 的实体关系。 为什么要写文章来理清这些关系&#xff1f;“血”的教训啊&#xff0c;刚开始使用 Entity Framework 的时候&#xff0c;由于没有静下心来认真理清关系&#xff0c;走了一些"痛不欲生&…

技术架构分析:攻克Dota2的OpenAI-Five

来源&#xff1a;CreateAMind摘要&#xff1a;OpenAI昨日发布研究成果&#xff0c;宣布Dota2 5v5在限定条件下&#xff08;英雄阵容固定&#xff0c;部分道具和功能禁用&#xff09;战胜人类半职业选手。本文主要对其模型技术架构做一些分析总结。一、 模型输入与输出模型的输入…

Redis基础-Redis概念及常见命令

1.nosql数据库 NoSQL数据库是一种提供了非关系型数据存储的数据库系统&#xff0c;与传统的关系型数据库&#xff08;如SQL数据库&#xff09;不同。NoSQL数据库的特点是灵活性高&#xff0c;能够处理结构化、半结构化或非结构化数据。它们通常用于大数据和实时Web应用。NoSQL数…

Java 高级特性 --- 反射

From&#xff1a;Java 高级特性 --- 反射&#xff1a;https://www.jianshu.com/p/9be58ee20dee From&#xff1a;Java 基础之 --- 反射&#xff08;非常重要&#xff09;&#xff1a;https://blog.csdn.net/sinat_38259539/article/details/71799078 From&#xff1a;Java 高级…

G20国家科技竞争力大盘点,中国科研创新表现突出,人工智能变道超车

来源&#xff1a;科睿唯安中国科学院文献情报中心和科睿唯安6月25日在北京联合发布了《G20国家科技竞争格局之辩》系列报告&#xff0c;报告分为总体篇及人工智能专题篇&#xff08;下文有重点介绍&#xff09;&#xff0c;聚焦G20国家的科研产出规模、学术影响力、领域分布、国…

Java中泛型 Class<T>、T与Class<?>、 Object类和Class类、 object.getClass() 和 Object.class

From&#xff1a;Java中泛型 Class<T>、T 与 Class<?>、 Object类 和 Class类、 object.getClass() 和 Object.class &#xff1a;https://www.cnblogs.com/zhaoyanhaoBlog/p/9362267.html Class<T>和 Class<?>类型 有什么区别&#xff1a;https://…

智能驾驶是否会“运动式”发展

来源&#xff1a;中国科学网最近&#xff0c;无人驾驶车发生撞人致死事故再度引发公众恐慌。在近日举行的全球人工智能技术大会上&#xff0c;中国工程院院士李德毅表示&#xff0c;不管是无人驾驶还是有人驾驶&#xff0c;事故总是有的。实际上人类才是第一马路杀手&#xff0…

Java学习之java高级特性

From&#xff1a;https://blog.csdn.net/w252064/article/details/79923999 [Java高级特性详解]&#xff1a;https://blog.csdn.net/qq_37977176/article/details/78941649 菜鸟教程 之 Java 教程&#xff1a;https://www.runoob.com/java/java-tutorial.html 本部分内容主要…

任正非亲自指导下拍的视频,事关中国的未来

来源&#xff1a;华为中美贸易战开打之后&#xff0c;中国产业未来的出路在哪里&#xff1f;华为的答案是基础研究与基础教育。这则由华为创始人兼CEO任正非亲自指导下拍摄的视频&#xff0c;呼吁社会重视基础教育&#xff0c;让教师成为最伟大的职业&#xff0c;成为优秀青年的…

《科学》杂志做了一个清单,告诉你今年 10 个最重要的科技突破

来源&#xff1a;网络大数据摘要&#xff1a;著名杂志《科学》最近列出了一份清单&#xff0c;来告诉你哪些科技突破在 2015 年是最重要的。《科学》是美国科技促进会出版的一份学术期刊杂志&#xff0c;主要发布的内容是各种学术研究&#xff0c;以及相关的科学新闻和观点&…

[进阶] --- Python3 异步编程详解(史上最全篇)

[进阶] - Python3 异步编程详解&#xff1a;https://blog.csdn.net/lu8000/article/details/45025987 参考&#xff1a;http://aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html 木风卜雨&#xff1a;https://blog.csdn.net/lu8000 1 什么是异步编程 1.1 阻…

AI+医疗:基于模型的医疗应用大规模分析 | 腾讯AI Lab学术论坛演讲

来源&#xff1a;腾讯AI实验室摘要&#xff1a;3月15日&#xff0c;腾讯AI Lab第二届学术论坛在深圳举行&#xff0c;聚焦人工智能在医疗、游戏、多媒体内容、人机交互等四大领域的跨界研究与应用。3月15日&#xff0c;腾讯AI Lab第二届学术论坛在深圳举行&#xff0c;聚焦人工…

Python 并行编程

参考&#xff1a;python-parallel-programming-cookbook-cn&#xff1a;https://python-parallel-programmning-cookbook.readthedocs.io/zh_CN/latest/ 第一章 认识并行计算和Python 1. 介绍2. 并行计算的内存架构3. 内存管理4. 并行编程模型5. 如何设计一个并行程序6. 如何评…

自动驾驶技术之——虚拟场景数据库研究

来源&#xff1a;智车科技摘要&#xff1a;驾驶场景数据是智能网联汽车研发与测试的基础数据资源&#xff0c;是评价智能网联汽车功能安全的重要“案例库”与“习题集”&#xff0c;是重新定义智能汽车等级的关键数据依据。驾驶场景测试用例主要通过虚拟仿真环境及工具链进行复…

C++ 数据指针(-)

C指针探讨 &#xff08;一&#xff09;数据指针 指针&#xff0c;在C/C语言中一直是很受宠的&#xff1b;几乎找不到一个不使用指针的C/C应用。用于存储数据和程序的地址&#xff0c;这是指针的基本功能。用于指向整型数&#xff0c; 用整数指针(int*)&#xff1b;指向浮点数用…