Xposed (一) Android hook框架入门
博客专区 > pseudo 的博客 > 博客详情
Xposed (一) Android hook框架入门
pseudo 发表于2年前
Xposed (一) Android hook框架入门
  • 发表于 2年前
  • 阅读 13274
  • 收藏 21
  • 点赞 1
  • 评论 3

腾讯云 十分钟定制你的第一个小程序>>>   

原理

Xposed替换了/system/bin/app_process可执行文件,在启动Zygote时加载额外的jar文件(/data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar),并执行一些初始化操作(执行XposedBridge的main方法)。然后我们就可以在这个Zygote上下文中进行某些hook操作。

安装XposedInstaller

  1. 下载XposedInstaller
  2. 安装。安装完会提示重启手机。如果是虚拟机要选择软重启,真实手机要选择硬重启,千万不要搞反。 注:手机启动会比较慢,但如果手机重启时卡在欢迎界面,可以通过连续按电源键来跳过Xposed加载。

开发Xposed项目

###1. Xposed module基础

Xposed程序称为module,它是包含一些特殊元数据和文件的android项目。建议使用android SDK 4.0.3 (API 15)进行开发。 一个Xposed module项目结构如下:

XposedModule项目结构

其中/assets/xposed_init文件指定了module的入口类,开发者要在这个类中实现需要的hook代码。这个类要实现特定的XposedBridge接口。 /assets/xposed_init内容:

com.example.xmodule.car.XModule

AndroidMannifest.xml内容:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.Xmodule" android:versionName="1.0" android:versionCode="1">
    <uses-sdk android:minSdkVersion="15"/>
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <meta-data
                android:name="xposedmodule"
                android:value="true"/>
        <meta-data
                android:name="xposeddescription"
                android:value="Xposed模块示例"/>
        <meta-data
                android:name="xposedminversion"
                android:value="54"/><!-- 对应的XposedBridge版本号 -->
    </application>
</manifest>

注意: Xposed module项目在开发时导入了XposedBridge jar文件,但编译时要去掉,否则因为在Zygote中已经导入该jar文件而导致类冲突。

###2. 一个简单的示例

开发一个xposed module来修改手机imei,imsi。

  1. 新建一个普通的android项目,添加依赖XposedBridge.jar(源码下载),scope为Provided。
  2. 在AndroidManifest.xml中添加Xposed元数据
  3. 编写 /assets/xposed_init文件
  4. 编写hook代码
public class XModule implements IXposedHookLoadPackage {
    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
        //只hook测试app
        if (lpparam.packageName.equals("com.example.test")) {
            XposedHelpers.findAndHookMethod(TelephonyManager.class, "getDeviceId", new XC_MethodReplacement() {
                @Override
                protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
                    return "this is imei";
                }
            });
            XposedHelpers.findAndHookMethod(TelephonyManager.class, "getSubscriberId", new XC_MethodReplacement() {
                @Override
                protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
                    return "this is imsi";
                }
            });
        }
    }
}

###3. 运行module module的安装与普通app一样,如果没有编写Activity,模块不会显示在launcher中。但可以在XposedInstaller应用中看到安装的module;另外module的启用与停止都需要在XposedInstaller中进行配置,配置完还需要重启才能生效。

###4. 运行结果 test app的Activity代码

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final TextView tv1 = (TextView) findViewById(R.id.tv1);
        final TextView tv2 = (TextView) findViewById(R.id.tv2);
        TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        tv1.setText("imei: "+tm.getDeviceId());
        tv2.setText("imsi: "+tm.getSubscriberId());
    }

运行结果如下:

hook结果

参考链接

共有 人打赏支持
pseudo
粉丝 71
博文 37
码字总数 35469
作品 3
评论 (3)
pseudo
如果不添加 android:versionName="1.0" android:versionCode="1" 安装模块时logcat报错
2450-2466/? E/AndroidRuntime﹕ FATAL EXCEPTION: RepositoryReload
android.database.sqlite.SQLiteConstraintException: installed_modules.version_name may not be NULL (code 19)
at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:775)
at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)
at android.database.sqlite.SQLiteDatabase.insertOrThrow(SQLiteDatabase.java:1365)
at de.robv.android.xposed.installer.repo.RepoDb.insertInstalledModule(RepoDb.java:374)
at de.robv.android.xposed.install
pseudo
Only methods and constructors can be hooked,Cannot hook interfaces,Cannot hook abstract methods
只能 hook 方法和构造方法,不能 hook 接口和抽象方法
陈先生123456
招聘一名xp框架会写模块的大大,工作在深圳宝安 ,工资面议 ,电话:13544252494 陈先生
×
pseudo
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: