基于Xposed的hook实战
程序员文章站
2022-05-12 14:01:53
...
一、Hook原理
将需要修改的函数“钩住”,然后使用自定义的函数替换原来的函数,让程序执行自定义的函数,达到修改的目的。
二、环境搭建
经过root的模拟器:
(1)在https://www.yeshen.com/ 中下载夜神模拟器(该模拟器在系统设置中默认开启root)
(2)启动夜神模拟器,在终端执行adb connect 127.0.0.1:62001
,将模拟器与AS关联,其中,62001是夜神模拟器的端口号
Xposed框架的搭建:
(1)在https://forum.xda-developers.com/showthread.php?t=3034811 中下载Xposed的apk并且安装到root的模拟器(可以选择更新,该apk用于管理所有基于Xposed开发的hook模块)
三、编写hook代码
这里是基于带签名的demo 的hook实战
(1)新建as工程项目,配置AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mi.crackmehook">
<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">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--hook配置:start-->
<!--是否是xposed模块-->
<meta-data
android:name="xposedmodule"
android:value="true" />
<!--描述,hookDemo,随便写-->
<meta-data
android:name="xposeddescription"
android:value="hookDemo" />
<!--最低的api版本支持-->
<meta-data
android:name="xposedminversion"
android:value="54" />
<!--hook配置:end-->
</application>
</manifest>
(2)配置依赖
(3)hook相关代码(钩住"com.example.mi.crackme"APP
中的checkSN
函数,无论用户名和***怎样,都返回true)
//HookTest .java
package com.example.mi.crackmehook;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
public class HookTest implements IXposedHookLoadPackage {
final String packgeName = "com.example.mi.crackme";
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if(!lpparam.packageName.equals(packgeName)) {
return;
}
new CheckSNHook(lpparam.classLoader);
}
}
//CheckSNHook.java
package com.example.mi.crackmehook;
import android.util.Log;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
public class CheckSNHook {
static final String TAG = "crackmehook";
public CheckSNHook(ClassLoader cl) {
super();
XposedBridge.log("hooking checkSN.");
try {
Class clz = XposedHelpers.findClass("com.example.mi.crackme.MainActivity",cl);
XposedHelpers.findAndHookMethod(clz, "checkSN", String.class, String.class,
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("CheckSN afterHookedMethod call.");
String s1 = (String)param.args[0];
String s2 = (String)param.args[1];
Log.d(TAG,"s1:"+s1);
Log.d(TAG,"s2:"+s2);
// 无论用户名和***怎样,都返回true
param.setResult(true);
super.afterHookedMethod(param);
}
});
}catch (Exception e) {
e.printStackTrace();
}
XposedBridge.log("hook checkSN done.");
}
}
(4)配置资源文件xposed_init
(5)对项目签名打包(为了兼容性,V1,V2都勾上)
四、安装测试
(1)安装
安装命令:adb install xxx.apk
卸载命令:adn uninstall xxx.xxx.xxx.xxx
// 使用完整包名
重启虚拟机命令:adb reboot
安装好hook模块(CrackMeHook
)后,需要在hook管理apk(Xposed Installer
)中勾上对应模块,然后重启虚拟机
(2)测试(无论输入什么,都提示注册成功,代表hook成功。)
代码下载
推荐阅读
-
基于C#实现的HOOK键盘钩子实例代码
-
详解MySQL主从复制实战 - 基于GTID的复制
-
详解MySQL主从复制实战 - 基于日志点的复制
-
详解MySQL主从复制实战 - 基于日志点的复制
-
详解MySQL主从复制实战 - 基于GTID的复制
-
ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法
-
使用ASP.NET Web Api构建基于REST风格的服务实战系列教程——使用Repository模式构建数据库访问层
-
基于桥的全量方法Hook方案 - 探究苹果主线程检查实现
-
ASP.NET Core 实战:基于 Jwt Token 的权限控制全揭露
-
Python实战——基于股票的金融数据量化分析