014 Android之Cydia与Xposed框架入门
文章目錄
- Android Hook框架介紹
- Cydia Substrate
- 插件編寫步驟
- 實例:編寫Cydia修改系統字體顏色
- Xposed
- 插件編寫步驟
- 實例:Hook獲取手機序列號
- 準備工作
- 獲取hook所需要的數據
- 編寫hook代碼
- 效果測試
Android Hook框架介紹
Android中比較經典的Hook框架有兩個
Cydia Substrate
插件編寫步驟
Cydia Substrate插件編寫的一般步驟:
實例:編寫Cydia修改系統字體顏色
首先新建一個空的項目
將substrate-api.jar復制到libs目錄下,jar下載地址如下:
http://asdk.cydiasubstrate.com/zips/cydia_substrate-r2.zip接著右鍵打開模塊設置
將jar包導入到模塊依賴庫
接著在清單文件中添加一個自定義的權限
<uses-permission android:name="cydia.permission.SUBSTRATE"></uses-permission>添加一個meta-data標簽,并指定入口類
<meta-data name="com.saurik.substrate.main" android:value=".Main"></meta-data>然后新建一個入口類,命名為Main
package com.example.cydiademo;import android.content.res.Resources; import android.util.Log;import com.saurik.substrate.MS;import java.lang.reflect.Method;public class Main {static void initialize() {//1.hook指定的類-->android.content.res.ResourcesMS.hookClassLoad("android.content.res.Resources", new MS.ClassLoadHook() {@Overridepublic void classLoaded(Class<?> aClass) {//2.1 獲取老的方法對象Method method=null;try {method=aClass.getMethod("getColor",int.class);} catch (NoSuchMethodException e) {e.printStackTrace();}if (method==null){Log.d("GuiShou","method==null");return;}//2.hook指定的方法-->getColor//老的方法的指針final MS.MethodPointer methodPointer=new MS.MethodPointer();MS.hookMethod(aClass, method, new MS.MethodHook() {@Overridepublic Object invoked(Object o, Object... objects) throws Throwable {//hook代碼//調用老的方法,獲取colorint color= (int) methodPointer.invoke(o,objects);//修改color并返回return color&~0x0000ff00|0x00ff0000;}},methodPointer);}});} }接著實現initialize方法,修改系統字體顏色。到此插件編寫完成,這個hook框架需要運行在真機環境下,所以暫時看不到效果。
Xposed
插件編寫步驟
Xposed是一個開源的Hook框架,可定制性強;其提供了SDK可以寫插件,輕松完成hook。基本步驟如下:
實例:Hook獲取手機序列號
需要HOOK的目標程序如下:
app運行之后,會顯示當前的設備ID
準備工作
新建一個工程,將XposedBridge-82.jar復制到新建的lib目錄下
打開模塊設置,將jar包導入到模塊,并設置Configuration為compileOnly
<meta-data android:name="xposedmodule" android:value="true"></meta-data> <meta-data android:name="xposeddescription" android:value="XX神器"></meta-data> <meta-data android:name="xposedminversion" android:value="54"></meta-data>在清單文件中添加上面的字段
接著新建一個類,命名為Main
public class Main implements IXposedHookLoadPackage {@Overridepublic void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {} }并實現IXposedHookLoadPackage接口,然后在handleLoadPackage函數內編寫Hook代碼
接著指定入口類,新建assets/xposed_init文件,然后將入口類寫到該文件內。準備工作就已經完成,接著開始編寫hook代碼。
獲取hook所需要的數據
需要對app進行hook需要知道下面幾個數據
首先來查看一下需要HOOK的目標app代碼
顯示設備ID的代碼在onCreate方法中
public void onCreate(Bundle savedInstanceState) {IncrementalChange incrementalChange = $change;if (incrementalChange != null) {incrementalChange.access$dispatch("onCreate.(Landroid/os/Bundle;)V", this, savedInstanceState);return;}super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);((TextView) findViewById(R.id.textinfo)).setText("設備ID: " + ((TelephonyManager) getSystemService("phone")).getDeviceId());}需要Hook的類名是TelephonyManager,方法名是getDeviceId
接著Android Studio的自動導入功能可以看到完整的類名是
android.telephony.TelephonyManager然后進入類內搜索方法名,即可獲取到完整的方法原型
public String getDeviceId()然后查看清單文件
在清單文件中可以查看到包名為com.bluelesson.testphoneinfo
編寫hook代碼
接著編寫hook代碼如下:
public class Main implements IXposedHookLoadPackage {@Overridepublic void handleLoadPackage(XC_LoadPackage.LoadPackageParam Param) throws Throwable {//包名 com.bluelesson.testphoneinfo//類名 android.telephony.TelephonyManager//方法名 public String getDeviceId()String packageName=Param.packageName;if (!packageName.equals("com.bluelesson.testphoneinfo"))return;XposedHelpers.findAndHookMethod(TelephonyManager.class,//類類型"getDeviceId",//方法名new XC_MethodReplacement() { //回調@Overrideprotected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {return "我就是序列號";}});} }替換getDeviceId函數,直接返回序列號
效果測試
在模擬器中安卓xposed框架
第一次進入需要安裝更新以激活框架
然后直接安卓app到模擬器,提示Xposed模塊未激活
勾選當前模塊
返回到Xposed插件主頁,點擊軟重啟
打開目標app,可以看到當前的設備ID已經被修改了
總結
以上是生活随笔為你收集整理的014 Android之Cydia与Xposed框架入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 013 Android锁机病毒分析
- 下一篇: 015 Android之可执行文件dex