cydia java_Cydia Substrate 使用

article/2025/8/26 8:14:35

前言

我们以前介绍过Xposed,这个只可以Hook java层,如果要hook native层就要使用InlineHook了,以前的文章都有提到。今天介绍一个既可以Hook java层又可以Hook native层的框架,就是Cydia Substrate。

环境

安装Cydia Substrate apk

使用adb install安装后,进入到app

1、点击Link Substrate Files

2、获取root权限

3、重启设备

如下图说明安装成功了

d4359acbe37c

image.png

java层Hook

创建项目后把so文件和jar文件拷贝到指定目录,jar添加进来

d4359acbe37c

image.png

新建一个Hook的入口类HookTest.java

HookTest.java

package com.example.cydiasubstratehook;

import java.lang.reflect.Method;

import android.util.Log;

import com.saurik.substrate.MS;

public class HookTest {

public static final String SHARK = "Shark";

/**

* substrate 初始化后的入口

*/

static void initialize() {

// Hook System Color

//先hook 类加载时

//参数一是类名 参数二是实现MS.ClassLoadHook的类

//在classLoaded中完成业务逻辑

MS.hookClassLoad("android.content.res.Resources",

new MS.ClassLoadHook() {

@SuppressWarnings({ "unchecked", "rawtypes" })

public void classLoaded(Class> resources) {

Method getColor;

try {

//从这个类获取getColor方法对象

getColor = resources.getMethod("getColor",

Integer.TYPE);

} catch (NoSuchMethodException e) {

getColor = null;

}

if (getColor != null) {

//保存原来的方法

final MS.MethodPointer old = new MS.MethodPointer();

//hook方法

MS.hookMethod(resources, getColor,

new MS.MethodHook() {

//hook方法的业务逻辑

public Object invoked(Object resources,

Object... args) {

try {

//调用原来的方法

int color = (Integer) old

.invoke(resources, args);

//修改返回值

return color & ~0x0000ff00

| 0x00ff0000;

} catch (Throwable e) {

Log.i(SHARK,

"hook color err:"

+ Log.getStackTraceString(e));

}

return 0xFFFFFFFF;

}

}, old);

} else {

Log.i(SHARK, "getColor == null");

}

}

});

}

}

这里我们拿Hook系统的字体颜色做例子

initialize方法是substrate 初始化后的入口,注释都很明白了。Hook也无非是哪几样东西,这里先hook加载类在hook方法。最后修改返回值就可以了。

配置AndroidManifest.xml

AndroidManifest.xml

package="com.example.cydiasubstratehook"

android:versionCode="1"

android:versionName="1.0" >

android:minSdkVersion="19"

android:targetSdkVersion="19" />

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

android:name=".MainActivity"

android:label="@string/app_name" >

android:name="com.saurik.substrate.main"

android:value="com.example.cydiasubstratehook.HookTest" />

一个是要加入substrate权限

一个是在meta-data中声明substrate的入口类

编译安装后手机会有信息提示

d4359acbe37c

image.png

点击进入,重启设备

d4359acbe37c

image.png

重启后可以看到效果

d4359acbe37c

image.png

Hook Native层

重点在这里

hook Native选择以前我们做过的一个案例,Android源码分析 之 分析Dalvik下Dex加载流程寻找脱壳点,以前我们是通过修改源码进行内存dump的,现在我们使用Hook DexFileParse函数这个脱壳点进行内存dump

添加文件

d4359acbe37c

image.png

这里我们在jni目录中加了三个文件

DexFile.h: 因为可能会用到一些函数的定义和结构所以我们从源码处拷贝过来并引用进代码中

Android.mk:ndk的Makefile文件

hookdvm.cpp:hook的代码

Android.mk

LOCAL_PATH := $(call my-dir)

#加入substrate的so

include $(CLEAR_VARS)

LOCAL_MODULE := substrate

LOCAL_SRC_FILES := libsubstrate.so

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := substrate-dvm

LOCAL_SRC_FILES := libsubstrate-dvm.so

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

#这里一定要注意编译的文件名必须是cy结尾的

LOCAL_MODULE := hookdvm.cy

LOCAL_SRC_FILES := hookdvm.cpp

LOCAL_LDLIBS := -llog

LOCAL_ARM_MODE := arm

LOCAL_LDLIBS += -L$(LOCAL_PATH) -lsubstrate-dvm -lsubstrate

include $(BUILD_SHARED_LIBRARY)

这个应该不用说写过makefile的都应该看得懂。主要注意hookdvm的LOCAL_MODULE必须是cy结尾的

#include

#include "substrate.h"

#include

#include

#include

#include

#include

#include

#include

#include

#include "DexFile.h"

#define TAG "Shark"

#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)

#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)

const char* ex0 = "re-initialized>";

const char* ex1 = "zygote";

const char* ex2 = "app_process";

const char* ex3 = "/system/bin/dexopt";

const char* ex4 = "com.google.android.gms";

const char* ex5 = "com.google.android.gms.persistent";

const char* ex6 = "com.google.process.gapps";

const char* ex7 = "com.google.android.gms.wearable";

const char* ex8 = "com.android.phone";

const char* ex9 = "com.android.systemui";

const char* ex10 = "com.google.android.gms.unstable";

const char* ex11 = "android.process.acore";

const char* ex12 = "android.process.media";

const char* ex13 = "dexopt";

#define BUF_SIZE 1024

MSConfig(MSFilterLibrary, "/system/lib/libdvm.so");

const char* workDir = "/sdcard/hookdex/";

//得到进程的名称

void getNameByPid(pid_t pid, char *task_name) {

char proc_pid_path[BUF_SIZE];

char buf[BUF_SIZE];

sprintf(proc_pid_path, "/proc/%d/status", pid);

FILE* fp = fopen(proc_pid_path, "r");

if(NULL != fp){

if(fgets(buf, BUF_SIZE-1, fp) == NULL){

fclose(fp);

}

fclose(fp);

sscanf(buf, "%*s %s", task_name);

}

}

//是否需要过滤系统进程

int exclude(char* s){

int i = !strcmp(s,ex0)||!strcmp(s,ex1)||!strcmp(s,ex2)||!strcmp(s,ex3)||

!strcmp(s,ex4)||!strcmp(s,ex5)||!strcmp(s,ex6)||!strcmp(s,ex7)||

!strcmp(s,ex8)||!strcmp(s,ex9)||!strcmp(s,ex10)||!strcmp(s,ex11)||

!strcmp(s,ex12)||!strcmp(s,ex13);

return i;

}

//检测目录是否存在

int checkDir()

{

mode_t myMode = 777 ;

if(0 == access(workDir,0)) {//目录存在

return 0;

} else{

if(0 == mkdir(workDir,myMode)) {

return 0;

}

else {

return 1;

}

}

}

//老DexFileParse的保存

DexFile* (*oldDexFileParse)(const u1* data, size_t length, int flags);

DexFile* newDexFileParse(const u1* addr, size_t len, int dvmdex)

{

char buf[200];

char pname[50];

pid_t pid = getpid();

//得到进程名称

getNameByPid(pid, pname);

//判断是否需要Hook

if(exclude(pname)){

LOGI("exclude process:%s", pname);

return oldDexFileParse(addr, len, dvmdex);

}

LOGD("call dvm dex pid:%d,pname:%s", pid, pname);

sprintf(buf,"/sdcard/hookdex/%s_%d.dex", pname, pid);

FILE* file = fopen(buf, "wb");

if(!file){

LOGD("error open sdcard file to write");

}else{

//内存dump

fwrite(addr, 1, len, file);

fclose(file);

LOGD("write dex:%s len=%d succ!", buf, (int)len);

}

//进行原来的调用,不影响程序运行

return oldDexFileParse(addr,len,dvmdex);

}

MSInitialize{

LOGD("Substrate initialized.");

//创建目录

if(checkDir()){

LOGD("create dir err...");

return;

}else{

LOGD("create dir succ...");

}

//打开libdvm.so得到MSImageRef

MSImageRef image = MSGetImageByName("/system/lib/libdvm.so");

if (image != NULL){

//得到dexFileParse函数的地址,_Z12dexFileParsePKhji为导出名称,使用ida查看得到

void * dexload = MSFindSymbol(image, "_Z12dexFileParsePKhji");

if(dexload == NULL){

LOGD("error find _Z12dexFileParsePKhji");

}else{

//进行hook

MSHookFunction(dexload, (void*)&newDexFileParse, (void **)&oldDexFileParse);

}

}else{

LOGD("ERROR FIND LIBDVM");

}

}

Cydia Substrate已经封装了MSGetImageByName和MSFindSymbol供我们得到函数的内存地址。最后调用MSHookFunction进行hook,原来的函数地址保存在oldDexFileParse中。

我们要Hook系统的dexFileParse函数,这个函数在/system/lib/libdvm.so中。导出它使用ida打开搜索得到他的导出名称。

d4359acbe37c

image.png

_Z12dexFileParsePKhji这个就是我们要Hook的名称。

在Hook时我使用int exclude(char* s)进行了过滤,并不是所有的进程都是我们想要hook的,而且这些进程未必有dex文件,比如鼻祖进程zygote,而这些进程过滤规则,需要我们自己打印看结果。然后构造。

运行

按照上面的方法编译安装重启手机

运行软件后,查看/sdcard/hooktest目录

d4359acbe37c

image.png

引用


http://chatgpt.dhexx.cn/article/3ZJBMV3Z.shtml

相关文章

10E polkadot substrate : 配置合约托盘

• 介绍 • 添加托盘依赖项 • 实现 Contracts 配置特征 • 公开合约 API • 更新外部节点 • 启动本地 Substrate 节点 • Substrate Tutorials , Substrate 教程 • Contact 联系方式 • 介绍 如果您完成了构建本地区块链教程,那么您已经知道 Substrate节点模板…

Substrate之旅2:Substrate开发环境搭建

我们将基于Ubuntu 18.04来安装Substrate的开发环境。 我这边Ubuntu是安装在VMWorkstation虚拟机上的。 安装依赖 安装参考:https://docs.substrate.io/tutorials/v3/create-your-first-substrate-chain/#install-rust-and-the-rust-toolchain 但具体的操作步骤&…

认识substrate

了解substrate 前言从互联网发展看区块链未来--跨链跨链是未来 公链和联盟链可交互的联盟链polkadot组件substrate介绍区块链的构造组件substrate开发的特性 polkadot :substrate 之上建立如何通过substrate构造自己的链一键链上升级--永不分叉为什么需要链上升级 substrate与企…

CydiaSubstrate框架

往期推荐 Frida Native层HOOK Frida hook Java层 frida环境安装 Xposed框架安装、使用及插件开发 需要相关资料的朋友,可以【[加入此处即可打包获取]】 Cydia Substrate是一个基于Hook的代码修改框架,可以在Android、iOS平台使用,并实现…

创建Substrate 私有网络

创建Substrate 私有网络 所有区块链都要求网络中的节点就消息集及其顺序达成一致,以成功创建区块并从一个区块推进到下一个区块。每个块代表特定时间点的数据状态,节点对状态的一致称为共识。有几种不同的算法用于达成共识,包括:…

Build the Substrate Kitties Chain(中文翻译)

欢迎来到Substrate Kitties课程。 本课程将向您介绍如何构建一个可以创建并持有非同质化代币(NFT,这个NFT名称为Substrate Kitties)的区块链。课程分为部2部分: Part I 描述如何构建Kitties pallet,以及这个pallet怎样…

oracle substrate,Substrate 2.0 带来了哪些改变?

Substrate 已到了 2.0 版本的主要里程碑处。该区块链框架现在包含链下工作机(off-chain workers)和 70 多个可组合模块,并为构建优化的、与 Polkadot 兼容的、可投入生产的区块链奠定了坚实的基础。数十个实时区块链已经在运行 Substrate 2.0,包括Polkad…

Substrate 基础教程(Tutorials) -- 授权特定节点

五、授权特定节点 在添加可信节点中,您看到了如何使用一组已知的验证器节点构建一个简单的网络。该教程演示了一个简化版的许可网络(permissioned network)。在一个被许可的网络中,只有被授权的节点(authorized nodes…

Substrate常见问题

目录标题 1. Rust nightly not installed, please install it!2. Rust WASM toolchain not installed, please install it!3. use pallet::*出错4. failed to load manifest for workspace member5. error: failed to run custom build command for node-template-runtime v4.0…

什么是 Substrate

如果你关注了 Polkadot 项目,可能会多次看到「Substrate」这个词。 它是 Polkadot 项目的重要组成部分,但有关它的信息非常少。 白皮书或黄皮书里找不到, 至少没有专门的介绍「Substrate」。 从较高的层面来看,Substrate 是一个可…

Substrate之旅3:Substrate是什么

Substrate 是从Polkadot 孵化出来的项目。它是一个用来搭建区块链的通用框架,具有以下特点: 可扩展。模块化。开源。 Substrate的框架与组件 框架 其中: P2P: libp2p网络协议,Substrate基于该协议实现了一个不带任何假设的&…

Substrate 基础 -- 教程(Tutorials)

官网 github DOC 面向未来的区块链框架 Substrate 使开发人员能够快速、轻松地构建适合任何用例的未来 证明区块链(future proof blockchains)。 Substrate 文档包括区块链构建器(blockchain builders)和parachain 项目团队的概念、过程和参考信息。…

【Android 逆向】substrate 框架 ( substrate 简介 | substrate 相关文档资料 )

文章目录 一、substrate 简介二、substrate 相关文档资料 一、substrate 简介 substrate 官网 : http://www.cydiasubstrate.com substrate 框架 是 Cydia 下的逆向工具 , 该框架是开源的 ; substrate 配合对应的 so 动态库 和 头文件 , 可以在 Android / iOS 平台中独立运行 …

ios tableView那些事(三)给tableView添加些图片

感觉光有数据的tableView很丑&#xff0c;那么我们就来美化下吧&#xff0c;加一些图片 #import <UIKit/UIKit.h> /*tableview 一定要用到这两个delegate UITableViewDataSource,UITableViewDelegate */ interface ViewController :UIViewController <UITableViewDa…

QT的TableView实现多级表头

QT的TableView实现多级表头 最近项目需要支持多级表头&#xff0c;QT本身不支持。可重写QHeaderView表头实现。 demo如下&#xff1a; FSItemDelegate.h #pragma once/* 自定义委托类 */ #include <QItemDelegate> #include <QSpinBox> #include <QDoubleSpin…

QML类型:TableView

一、描述 TableView 显示从内置 QML 类型&#xff08;如 ListModel 和 XmlListModel&#xff09;创建的模型中的数据&#xff0c;这些模型仅填充 TableView 中的第一列。要创建具有多列的模型&#xff0c;请使用 TableModel 或继承 QAbstractItemModel 的 C 模型。 TableView…

QML TableView表格使用示例

前言 QML中实现表格可以使用多种方式&#xff0c;比如直接使用ListView&#xff0c;定义每一行delegate&#xff0c;或者自定义Rectangle&#xff0c;放到Flipable中组合使用。Qt Quick Control1中 从5.1版本开始就提供了表格控件&#xff0c;但是感觉不怎么好用&#xff0c;在…

Qt TableView的简单使用

软件环境&#xff1a; ubuntu -------------------------------------------------------------------------------------------------------- 最终效果图&#xff1a; --------------------------------------------------------------------------------------------------…

PyQt5 TableView组件

一、话不多说&#xff0c;先看图 本次要实现的是主窗口内添加widget组件&#xff0c;widget内设置成垂直盒布局&#xff0c;然后在布局中添加tableView、PushButton组件 二、看main函数 if __name__ __main__:app QApplication(sys.argv)# 现在这创建 主窗口 &#xff08;不然…

优雅的开发TableView

前言 UITableView&#xff08;UITableViewController&#xff09;是iOS开发使用频率最高的一个组件。 不管是使用UITableView还是还是UITableViewController&#xff0c;在开发的时候&#xff0c;我们都需要实现两个协议&#xff1a; UITableViewControllerDataSourceUITabl…