Xposed-----Hook神器

 

 

最近在搞Android app逆向,需要对函数进行Hook以便了解到函数的输入与输出,由于自己刚刚接触xposed所以记录一下学习经验,有错误或者不妥之处请告诉我,大家共同进步。

  1. 使用Android Studio创建一个Android项目。项目目录

    在AndroidManifest.xml中写入
    <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
    <!--        告诉xposed这是一个xposed模块-->
            <meta-data
                android:name="xposedmodule"
                android:value="true" />
    <!--        关于这个模块的描述-->
            <meta-data
                android:name="xposeddescription"
                android:value="hook测试"/>
    <!--        该模块支持的最低版本-->
            <meta-data
                android:name="xposedminversion"
                android:value="53" />

     

  2. 在app/src/main下创建assets目录并且右键选择Assets Folder

    在改目录下新建文件xposed_init文件,作为整个xposed的入口

     
  3. 关于app/build.gradle的修改,抱歉时间太长我也给忘记改的哪个地方了,我把图贴出来自行对比一下.
  4. 编写hook代码

    代码如下
    package com.example.xposed_hook_test_11;
    import android.app.DownloadManager;
    import android.util.Log;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    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 {
        @Override
        public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
    
            if (!lpparam.packageName.equals("app进程名")) {
                return;
            }
            XposedBridge.log("Loaded app: " + lpparam.packageName);
            XposedHelpers.findAndHookMethod("需要hook的包+类名", lpparam.classLoader, "函数名", String.class, new XC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    super.afterHookedMethod(param);
                }
            });
    此外还有一个beforeHookedMethod由于我没有用到所以先不列出以后用到再补充。
  5. 传参问题:在编写的时候我出现了一种情况包名+类名+方法名我都写对了但是就是hook不到,插了好久是因为我所hook的方法里面有传参,但是我在hook代码里面编写的时候并没有写参数,所以参数一定要跟源码中对应。
  6. 利用反射hook,native层面的方法。
    final Class <?> testndk = XposedHelpers.findClass("包名1+类名1", lpparam.classLoader);
    //目前对于包名1与包名2两者需不需要一样或者有什么关系没有深入考虑,我的是不一样,也能用。
    XposedHelpers.findAndHookMethod("包名2+类名2" ,lpparam.classLoader, "方法名",String.class,new XC_MethodHook() {
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    Object testndkobject = testndk.newInstance();
                    Method mytest =  XposedHelpers.findMethodBestMatch(testndkobject.getClass(), "native方法名",参数1,参数2);
    //             执行方法
                    byte [] str6 = (byte[]) mytest.invoke(testndkobject,参数1,参数2);
    
                }
            });
        }
  7. 获取返回结果,获取传入参数
    XposedHelpers.findAndHookMethod("包+类", lpparam.classLoader, "方法", String.class, new XC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    super.afterHookedMethod(param);
    //              获取返回结果
                    Object result = param.getResult();
                    XposedBridge.log("获取第一个参数"+(String) param.args[0]);
                }
            });
  8. 链接逍遥模拟器  cmd输入
    adb connect 127.0.0.1:21503
  9. 运行项目即可进行hook,通过日志xposed日志可看打印结果

注意修改Xposed代码后需要重新启动Android才可以继续hook,也可以更改代码设置不用重启。
​​​​​初次接触xposed,hook,Android逆向,如有任何问题欢迎加本人QQ:1005229608进行讨论。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值