Xposed全方位入门教程
- 0x00 前言
- 0x01 创建一个靶子App:ButtonApp
- 0x02 创建Xposed Hook Demo
- 0x03 hook参数类型是自定义类型的函数
- 0x04 [待完成]多dex hook
- 0x05 [待完成]Xposed热更新
- 0x06 [待完成]Xposed项目创建工具
0x00 前言
主要怕忘记了怎么配置,记录一下折腾过程。每一次逆向Android,想用Xposed hook的时候,总是要查一遍资料重新整理一次,网上的教程也参差不齐,所以写一篇教程方便自己也方便他人。

0x01 创建一个靶子App:ButtonApp
在开始hook之前,我们先创建一个靶子App,就叫他ButtonApp吧(因为只有一个按钮),在界面上画一个Button,并且在MainActivity里写相关Button点击事件,点击Button弹出“我是一个正常的按钮”,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
package com.demo.buttonapp; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, getMessage(), Toast.LENGTH_SHORT).show(); } }); } private String getMessage(){ return "我是一个正常的按钮"; } } |



0x02 创建Xposed Hook Demo
1、创建一个EmptyAcvity

2、修改AndroidManifest.xml,在Application标签下添加以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<meta-data android:name="xposedmodule" android:value="true" /> <meta-data android:name="xposeddescription" android:value="Xposed Hook Demo描述" /> <meta-data android:name="xposedminversion" android:value="53" /> |

连上手机调试,编译运行一下,运行成功后,手机端Xposed框架会显示刚刚我们编写的这个模块:

3、编辑build.gradle文件:配置jcenter作为代码仓库,再从这个仓库里安装Xposed API,代码如下:
1 2 3 4 5 |
repositories { jcenter() } |
1 2 3 4 |
compileOnly 'de.robv.android.xposed:api:82' compileOnly 'de.robv.android.xposed:api:82:sources' |
添加完毕后, build.gradle会提示文件已经修改,是否同步。点击 “sync now”,进行同步即可。

4、创建HookTest.java文件,编写hook逻辑:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
package com.demo.xposeddemo; import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_LoadPackage; public class HookTest implements IXposedHookLoadPackage { // hook ButtonApp public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable { if (loadPackageParam.packageName.equals("com.demo.buttonapp")) { XposedBridge.log("Hooked"); Class clazz = loadPackageParam.classLoader.loadClass( "com.demo.buttonapp.MainActivity"); XposedHelpers.findAndHookMethod(clazz, "getMessage", new XC_MethodHook() { protected void beforeHookedMethod(MethodHookParam param) throws Throwable { super.beforeHookedMethod(param); // done. } protected void afterHookedMethod(MethodHookParam param) throws Throwable { // 修改getMessage函数的返回值: param.setResult("我是一个被劫持的按钮~"); } }); } } } |

5、创建入口文件:在/app/src/main下创建名为assets的Assets Folder,然后再创建一个名为xposed_init文件,文件内容写上:com.demo.xposeddemo.HookTest

6、禁用 Instant Run:

7、点击运行,确认自己的Xposed打勾之后,重启手机,等待重启完成再打开ButtonApp,点击则会看到提示已经变成“我是一个被劫持的按钮~”,就成功了。

基本的hook教程已经完成了,下面会陆续补充一些其他和Xposed相关的内容。
0x03 hook参数类型是自定义类型的函数
我们先来看一个目标函数,一般经过混淆的apk,经常能看hd这样的变量类型:
public void a(String paramString, Map<String, String> paramMap, hd paramhd)
可以先用classLoader查找hd这个类,查出来之后当参数用,因为这个hd类是没有包名的,所以只写hd,不然要写全限定名才能找到,比如:com.demo.xposeddemo.hd(hd上面的na类也是一样)

后续内容待补充…
去打赏