Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> XPosed暴力列舉Package下所有的方法調用

XPosed暴力列舉Package下所有的方法調用

編輯:關於Android編程

使用Xposed去Hook Android,最讓人頭痛的是怎麼樣才能找到合適的函數入口。

Xposed的作者rovo89在開發教程https://github.com/rovo89/XposedBridge/wiki/Development-tutorial裡說,有兩個方法:

Possibility one: Decompile it。rovo89說反編譯得到smali代碼很難閱讀。在沒有JEB之前確實是這樣。有了JEB和JD-GUI,反編譯apk不再是夢。當然,這裡涉及到另一個問題:很多程序是以odex打包的,而JEB只支持dex格式。所以需要將odex轉換成dex或jar。

smali可以將odex反編譯成.smali文件;dex2jar可以將dex變成jar文件。現在我們以CardManager.odex為例,對CardManager.odex進行反編譯。
1. 運行 java -jar baksmali-1.3.2.jar -a 12 -x CardManager.odex // 會生成一個out文件夾,裡面的文件以.smali結尾
2. 運行 java -jar smali-1.3.2.jar out/ -o classes.dex // 生成dex文件
3. 運行 dex2jar-0.0.9.8$ ./dex2jar.sh ../Test_HW_ODEX/classes.dex // 生成classes_dex2jar.jar文件

注:
1. 反編譯framework.odex等這樣依賴其它odex的文件,需要用-d選項指定被依賴的odex存放位置,如下命令

java -Xmx512m -jar baksmali-1.3.2.jar --api-level 12 -c:core.jar:bouncycastle.jar:ext.jar:framework.jar:android.policy.jar:services.jar:core-junit.jar -d framework/ -x framework.odex

即指定Java內存的大小,又指定了依賴項

2. 用JEB打開較大的dex文件時會報OutOfMemory的異常,可以刪去第1步生成的out文件中不相關的文件,以減小dex大小。
Possibility two: Get the AOSP sources。誠然,熟悉Android的代碼對Hook肯定有極大的幫助。將對應版本的Android代碼下載下來讀就是了。不過,假如你和我一樣,任務緊急,崇尚暴力美學,那麼可以打印出某Package內所有method的做法,快速找到切入點。
package com.example.test;
import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import android.util.Log;
import dalvik.system.DexFile;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage;


/**
 * Created by mbpeele on 2/24/16.
 */
public class PackageHooker {


    private final XC_LoadPackage.LoadPackageParam loadPackageParam;


    public PackageHooker(XC_LoadPackage.LoadPackageParam param) {
        loadPackageParam = param;
        try {
            try {
				hook();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
        } catch (IOException e) {


        }
    }


    public void hook() throws IOException, ClassNotFoundException {
        DexFile dexFile = new DexFile(loadPackageParam.appInfo.sourceDir);
        Enumeration classNames = dexFile.entries();
        while (classNames.hasMoreElements()) {
            String className = classNames.nextElement();


            if (isClassNameValid(className)) {
                final Class clazz = Class.forName(className, false, loadPackageParam.classLoader);


                for (Method method: clazz.getDeclaredMethods()) {
                    if (!Modifier.isAbstract(method.getModifiers())) {
                        XposedBridge.hookMethod(method, new XC_MethodHook() {
                            @Override
                            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                            	log("HOOKED: " + clazz.getName() + "\\" + param.method.getName());
                            }
                        });
                    }
                }
            }
        }
    }


    public void log(Object str) {
		SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
		XposedBridge.log("[" + df.format(new Date()) + "]:  "
				+ str.toString());
	}
	
    public boolean isClassNameValid(String className) {
        return className.startsWith(loadPackageParam.packageName)
                && !className.contains("$")
                && !className.contains("BuildConfig")
                && !className.equals(loadPackageParam.packageName + ".R");
    }
}

以上代碼Copy自PackageHooker,鏈接在https://github.com/UMLGenerator/Android-UML-Generator/blob/f26521e9420d4be032c2e4a1a872ac0c945c7c2e/xposed/src/main/java/software/umlgenerator/PackageHooker.java

注:對於帶界面的APK,可以使用DDMS的Dump View快速找到對應的Package名稱。


						
		
	
				
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved