正己 发表于 2023-2-2 08:38

《安卓逆向这档事》七、Sorry,会Hook真的可以为所欲为-Xposed快速上手(上)模块编..

本帖最后由 正己 于 2023-10-10 18:50 编辑

https://www.bilibili.com/video/BV1VT411C7Sr/?spm_id_from=333.788&vd_source=6dde16dc6479f00694baaf73a2225452
# 一、课程目标
---
1.了解Xposed原理及发展
2.从0到1编写xposed模块
3.配置ubuntu的逆向环境
4.了解xposed的常用Api

# 二、工具
---
1.教程Demo(更新)
2.jadx-gui
3.雷电模拟器
4.vmware
5.Android Studio

# 三、课程内容
---
## 1.什么是Xposed?

Xposed是一款可以在不修改APK的情况下影响程序运行的框架,基于它可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。在这个框架下,我们可以编写并加载自己编写的插件APP,实现对目标apk的注入拦截等。

## 2.Xposed原理

用自己实现的**app_process**替换掉了系统原本提供的**app_process**,加载一个额外的jar包,入口从原来的:**com.android.internal.osZygoteInit.main()被替换成了:de.robv.android.xposed.XposedBridge.main()**,
创建的Zygote进程就变成Hook的Zygote进程了,从而完成对zygote进程及其创建的Dalvik/ART虚拟机的劫持(zytoge注入)


## 3.Xposed的发展及免root框架


| 名称          | 地址                                          | 支持版本 | 是否免root |
| ------------- | ----------------------------------------------- | -------- | ---------- |
| xposed      | https://github.com/rovo89/Xposed                | 2.3-8.1| 否         |
| EDXposed      | https://github.com/ElderDrivers/EdXposed      | 8.0-10   | 否         |
| LSPosed       | https://github.com/LSPosed/LSPosed            | 8.1-13   | 否         |
| VirtualXposed | https://github.com/android-hacker/VirtualXposed | 5.0-10.0 | 是         |
| 太极          | https://www.coolapk.com/apk/me.weishu.exp       | 5.0-13 | 是         |
| 两仪          | https://www.coolapk.com/apk/io.twoyi            | 8.1-13   | 是         |
| 天鉴            | https://github.com/Katana-Official/SPatch-Update                                                | 6-10         |是          |



## 4.Xposed可以做什么?

1.修改app布局:[上帝模式](https://github.com/kaisar945/Xposed-GodMode)
2.劫持数据,修改参数值、返回值、主动调用等。例:微信防撤回、步数修改、一键新机
[应用变量](https://github.com/kingsollyu/AppEnv)

3.自动化操作,例:微信抢红包


学习项目:

(https://www.xda-developers.com/best-xposed-modules/)
[基于Xposed的抖音爬虫,抖音风控后自动一键新机,模拟一个全新的运行环境](https://github.com/Lstaynight/xposed-dy)
[基于xposed的frida持久化方案](https://github.com/svengong/xcubebase)
(https://github.com/monkeylord/XServer)
(https://github.com/GravityBox/GravityBox)
(https://github.com/Xposed-Modules-Repo)]
[一个旨在使QQ变得更好用的开源Xposed模块](https://github.com/ferredoxin/QNotified)
[杜比大喇叭](https://github.com/nining377/dolby_beta)
[知乎去广告Xposed模块](https://github.com/shatyuka/Zhiliao)
[哔哩漫游](https://github.com/yujincheng08/BiliRoaming)
[曲境](https://github.com/Mocha-L/QuJing)
[自动化创建Xposed模块及钩子,让Xposed模块编写时只需关注钩子实现](https://github.com/monkeylord/XposedTemplateForAS)

## 5.Xposed环境配置

### 前置
ubuntu虚拟机镜像,感谢沐阳哥提供的镜像!!!
内置:
-   `Frida`开发环境
-   动态分析及开发工具:android-studio
-   动态分析工具:ddms
-   静态分析工具:jadx1.4.4
-   动静态分析工具:jeb
-   动态分析工具:集成HyperPwn
-   静态分析工具:010 editor
-   抓包工具:Charles
-   抓包工具:WireShark
-   动态分析工具:unidbg

vm虚拟机:https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html
(或下载我打包好的)
激活码自行百度哦

第一步,安装虚拟机调整路径,输入激活码

第二步,导入镜像,文件->打开->选择解压好的镜像

第三步,点击运行,待初始化,输入密码:toor





---


1.Android Studio创建新项目
2.将下载的xposedBridgeApi.jar包拖进libs文件夹
3.右击jar包,选择add as library
4.修改xml文件配置
```xml
<!-- 是否是xposed模块,xposed根据这个来判断是否是模块 -->
<meta-data
    android:name="xposedmodule"
    android:value="true" />
<!-- 模块描述,显示在xposed模块列表那里第二行 -->
<meta-data
    android:name="xposeddescription"
    android:value="这是一个Xposed模块" />
<!-- 最低xposed版本号(lib文件名可知) -->
<meta-data
    android:name="xposedminversion"
    android:value="89" />
```
5.修改build.gradle,将此处修改为compileOnly 默认的是implementation
```
implementation 使用该方式依赖的库将会参与编译和打包
compileOnly 只在编译时有效,不会参与打包
```
6.新建-->Folder-->Assets Folder,创建xposed_init(不要后缀名):只有一行代码,就是说明入口类
7.新建Hook类,实现IXposedHookLoadPackage接口,然后在handleLoadPackage函数内编写Hook逻辑
```java
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.callbacks.XC_LoadPackage;

public class Hook implements IXposedHookLoadPackage {
    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
      
    }
}
```
继承了IXposedHookLoadPackag便拥有了hook的能力
## 6.Xpoosed常用API

(https://github.com/fankes/YukiHookAPI)

### 1.Hook普通方法
修改返回值
```java
XposedHelpers.findAndHookMethod("com.zj.wuaipojie.Demo", loadPackageParam.classLoader, "a", String.class, new XC_MethodHook() {
    @Override
    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
      super.afterHookedMethod(param);
      param.setResult(999);
    }
});

```
修改参数
```java
XposedHelpers.findAndHookMethod("com.zj.wuaipojie.Demo", loadPackageParam.classLoader, "a", String.class, new XC_MethodHook() {
    @Override
    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
      super.beforeHookedMethod(param);
      String a = "pt";
      param.args = a;    }
});

```

### 2.Hook复杂&自定义参数

```java
Class a = loadPackageParam.classLoader.loadClass("类名");
XposedBridge.hookAllMethods(a, "方法名", new XC_MethodHook() {
    @Override
    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
      super.beforeHookedMethod(param);
      
      }
});

```


### 3.Hook替换函数
```java
Class a = classLoader.loadClass("类名")
XposedBridge.hookAllMethods(a,"方法名",new XC_MethodReplacement() {
    @Override
    protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
      return "";
    }
});

```


### 4.Hook加固通杀
```java
XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() {
    @Override
    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
      Context context = (Context) param.args;
      ClassLoader classLoader = context.getClassLoader();
      //hook逻辑在这里面写
    }
});

```


#四、课后小作业
---
写一个xposed模块去修改上节课smali相关学习里的方法,并修改参数以及返回值

# 五、答疑
---
待更新

# 六、视频及课件地址
---

[百度云](https://pan.baidu.com/s/1cFWTLn14jeWfpXxlx3syYw?pwd=nqu9)
[阿里云](https://www.aliyundrive.com/s/TJoKMK6du6x)
[哔哩哔哩](https://www.bilibili.com/video/BV1wT411N7sV/?spm_id_from=333.788&vd_source=6dde16dc6479f00694baaf73a2225452)
PS:解压密码都是52pj,阿里云由于不能分享压缩包,所以下载exe文件,双击自解压

# 七、其他章节
---
[《安卓逆向这档事》一、模拟器环境搭建](https://www.52pojie.cn/thread-1695141-1-1.html)
[《安卓逆向这档事》二、初识APK文件结构、双开、汉化、基础修改](https://www.52pojie.cn/thread-1695796-1-1.html)
[《安卓逆向这档事》三、初识smail,vip终结者](https://www.52pojie.cn/thread-1701353-1-1.html)
[《安卓逆向这档事》四、恭喜你获得广告&弹窗静默卡](https://www.52pojie.cn/thread-1706691-1-1.html)
[《安卓逆向这档事》五、1000-7=?&动态调试&Log插桩](https://www.52pojie.cn/thread-1714727-1-1.html)
[《安卓逆向这档事》六、校验的N次方-签名校验对抗、PM代{过}{滤}理、IO重定向](https://www.52pojie.cn/thread-1731181-1-1.html)
# 八、参考文档
---
[[原创]源码编译(2)——Xopsed源码编译详解](https://bbs.kanxue.com/thread-269616.htm#msg_header_h2_0)
[[原创]Xposed Hook技巧,代{过}{滤}理abstract](https://bbs.kanxue.com/thread-260484.htm)
[[原创]Xposed callMethod 如何传入接口参数](https://bbs.kanxue.com/thread-257100.htm)

正己 发表于 2024-1-12 22:02

lwt198888 发表于 2024-1-11 19:24
@正己   大神,课程里面大神用了真机,但是这里虚拟机ubuntu怎么连主机里面的雷电模拟器啊,这里没说,还是 ...

可以通过桥接,百度一下,网上有教程

不知道改成啥 发表于 2023-2-2 08:56

图上缺了一个宇宙第一IDE

正己 发表于 2023-2-2 08:39

先出门一下{:301_998:}

ssson 发表于 2024-3-1 23:33

正己 发表于 2024-3-1 22:15
不会啊,重启看看

这是我写的hook硬币的函数,但是没有效果,还是显示0。
// hook coin count
      XposedHelpers.findAndHookMethod("com.zj.wuaipojie.ui.SmaliLearn", loadPackageParam.classLoader,"getVip_coin", new XC_MethodHook() {
            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                super.afterHookedMethod(param);
                param.setResult(99);
            }
      });

于是静态分析看到这段代码并没有调用函数,直接访问的类的变量
int i = smaliLearn.vip_coin;
      if (i != 0) {
            textView3.setText(String.valueOf(i));
      }


问了chatgpt教我这么hook
Class<?> clazz = XposedHelpers.findClass("com.zj.wuaipojie.ui.SmaliLearn", loadPackageParam.classLoader);
      Field field = XposedHelpers.findField(clazz, "vip_coin");

      // 获取字段值
      int currentValue = (int) XposedHelpers.getIntField(field, yourInstance);

      // 设置字段值
      XposedHelpers.setIntField(field, yourInstance, 999);

这个yourInstance不知道要怎么填,chatgpt的回答是这样的

Xposed框架确实可以hook类的字段。虽然Xposed框架最常见的是用来hook方法以改变其行为,但它同样支持通过反射机制来读取和修改类的字段(包括私有字段)。对于你提到的私有字段`vip_coin`,可以通过Xposed的`XposedHelpers`类提供的`findField`方法找到这个字段,并使用`getField`和`setField`方法来获取或修改它的值。

例如:

```java
Class<?> clazz = XposedHelpers.findClass("YourTargetClassName", lpparam.classLoader);
Field field = XposedHelpers.findField(clazz, "vip_coin");

// 获取字段值
int currentValue = (int) XposedHelpers.getField(field, yourInstance);

// 设置字段值
XposedHelpers.setField(field, yourInstance, newValue);
```

这里`yourInstance`应当是指向包含`vip_coin`字段的实际对象实例的引用。在Xposed模块中,你需要在适当的位置(如`handleLoadPackage`方法内)插入这样的代码来实现对目标字段的hook。

请注意,由于Xposed框架的强大能力,这种操作应当谨慎使用,避免破坏原有应用的正常逻辑或引起不可预见的后果。而且,为了安全性和稳定性,通常建议仅在必要的情况下才对非公开API进行hook操作。

偶尔.c 发表于 2023-2-2 08:51

下一集有没有预告{:301_976:}

正己 发表于 2024-2-14 14:56

HandSonic 发表于 2024-2-14 14:52
大佬,有加固hook直接闪退怎么破呀

拦截闪退的代码

a976606645 发表于 2023-2-2 08:47

前排支持{:1_893:}

GYB6 发表于 2023-2-2 09:00

支持支持{:301_993:}

klxn0-0 发表于 2023-2-2 09:04

正好在学,跟着深入了:lol

201811094222 发表于 2023-2-2 09:18

太好了 真的太好了

debug_cat 发表于 2023-2-2 09:18

快进到魔改Xposed移除特征内置到系统{:1_918:}{:1_918:}

not2die 发表于 2023-2-2 09:22

谢谢正己大佬
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 《安卓逆向这档事》七、Sorry,会Hook真的可以为所欲为-Xposed快速上手(上)模块编..