下载地址:https://www.pan38.com/share.php?code=a5agk 提取码:8888
声明:仅用于学习参考使用!
用于拦截和修改系统IMEI相关API:
MainHook.java
package com.example.imeichanger;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
public class MainHook implements IXposedHookLoadPackage {
private static final String TARGET_PACKAGE = "android";
private static final String FAKE_IMEI = "123456789012345";
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) {
if (!lpparam.packageName.equals(TARGET_PACKAGE)) {
return;
}
hookTelephonyManager(lpparam.classLoader);
hookSystemProperties(lpparam.classLoader);
}
private void hookTelephonyManager(ClassLoader classLoader) {
// 拦截TelephonyManager的getDeviceId方法
XposedHelpers.findAndHookMethod(
"android.telephony.TelephonyManager",
classLoader,
"getDeviceId",
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) {
param.setResult(FAKE_IMEI);
}
});
}
private void hookSystemProperties(ClassLoader classLoader) {
// 拦截SystemProperties的get方法
XposedHelpers.findAndHookMethod(
"android.os.SystemProperties",
classLoader,
"get",
String.class,
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) {
String key = (String) param.args[0];
if ("ro.serialno".equals(key) || "ril.serialnumber".equals(key)) {
param.setResult(FAKE_IMEI);
}
}
});
}
}
此代码实现了Xposed模块的基本结构,拦截了系统获取IMEI和序列号的关键方法。
二、多参数适配与持久化存储
PrefUtils.java
package com.example.imeichanger;
import android.content.Context;
import android.content.SharedPreferences;
public class PrefUtils {
private static final String PREFS_NAME = "imei_prefs";
public static void saveImei(Context context, String imei) {
SharedPreferences prefs = context.getSharedPreferences(
PREFS_NAME, Context.MODE_WORLD_READABLE);
prefs.edit().putString("custom_imei", imei).apply();
}
public static String getImei(Context context) {
SharedPreferences prefs = context.getSharedPreferences(
PREFS_NAME, Context.MODE_WORLD_READABLE);
return prefs.getString("custom_imei", "123456789012345");
}
}
这个工具类用于存储用户自定义的IMEI值,确保重启后仍然生效。
三、MAC地址修改实现
com.example.imeichanger;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
public class NetworkHook {
private static final String FAKE_MAC = "02:00:00:00:00:00";
public static void hookWifiManager(ClassLoader classLoader) {
// 拦截WifiInfo的getMacAddress方法
XposedHelpers.findAndHookMethod(
"android.net.wifi.WifiInfo",
classLoader,
"getMacAddress",
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) {
param.setResult(FAKE_MAC);
}
});
// 拦截NetworkInterface的getHardwareAddress方法
XposedHelpers.findAndHookMethod(
"java.net.NetworkInterface",
classLoader,
"getHardwareAddress",
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) {
byte[] macBytes = new byte[6];
String[] parts = FAKE_MAC.split(":");
for (int i = 0; i < 6; i++) {
macBytes[i] = (byte) Integer.parseInt(parts[i], 16);
}
param.setResult(macBytes);
}
});
}
}
此代码实现了MAC地址的拦截和修改,使设备网络标识也被伪装。
SettingsActivity.java
package com.example.imeichanger;
import android.os.Bundle;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;
public class SettingsActivity extends AppCompatActivity {
private EditText etImei;
private EditText etMac;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
etImei = findViewById(R.id.et_imei);
etMac = findViewById(R.id.et_mac);
// 加载保存的值
etImei.setText(PrefUtils.getImei(this));
etMac.setText("02:00:00:00:00:00");
findViewById(R.id.btn_save).setOnClickListener(v -> {
String imei = etImei.getText().toString();
PrefUtils.saveImei(this, imei);
finish();
});
}
}
xposed_init入口文件
xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.imeichanger">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="IMEI Changer"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".SettingsActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="xposedmodule"
android:value="true" />
<meta-data
android:name="xposeddescription"
android:value="IMEI修改工具(学习用途)" />
<meta-data
android:name="xposedminversion"
android:value="82" />
</application>
</manifest>
- Xposed框架:通过动态方法替换技术,在运行时修改目标方法的返回值
- IMEI获取流程:Android系统通过TelephonyManager获取设备标识信息
- MAC地址获取:系统通过WifiManager和NetworkInterface获取网络硬件地址
- 持久化存储:使用SharedPreferences保存用户自定义的设备信息