Xposed快速hook關鍵點

0x01 導讀java

  工做中,經常須要針對各類app進行快速代碼定位,找到代碼修改和調試各類功能,就不得不面對xposed來進行一系列快速定位關鍵代碼的問題了。那麼問題來了,如何快速找到代碼呢?shell

這裏值這針對代碼在java層的進行分析,在so中的,目前做者是無能爲力的。app

0x02 衆所周知ide

  咱們的通常作法就是經過界面定位到具體的Activity ,執行adb 命令 「adb shell dumpsys activity | findstr "mFocusedActivity"」工具

就能夠快速找到咱們當前須要hook頁面的Activity功能塊,而後經過,XposedHelpers的測試

  findAndHookMethod方法來,監控方法。少許的工做沒什麼,可是若是代碼量不少,很難看,就比較麻煩了。 因此這裏介紹一種做者目前使用的,自仍未快速的方式。url

0x03 推薦使用spa

  一、安裝apk後,能夠獲得app使用的dex文件。插件

  二、而後解包dex文件獲得jar文件。調試

  三、經過xposed讀取jar中的全部類,

  四、而後hook,而後讀取全部方法hook.

  五、而後經過關鍵字,匹配參數,匹配返回值,快速獲得操做日誌。

  注意:若是是多個dex,同樣是能夠的,多個jar。解壓而後覆蓋保存到一個裏面,而後打包成jar就能夠,jar就使用zip打包工具就能夠,修改後綴就ok.,

dex文件通常均可以經過apk解壓獲得,而後用apktool工具獲得jar文件,針對某些apk沒法apktool解包的能夠添加-r等操做,不處理資源文件就OK.

  懶加載plugin如何操做呢? 找到不類呢?有一種狀況,某些dex是專門存放插件,插件是進入到某些頁面纔會進行加載的,經過懶hook,進入某某頁面,而後再進行hook操做,或者hook文件操做便可。

部分參考代碼:

public static void hook_byJar(final XC_LoadPackage.LoadPackageParam loadPackageParam, String jarFile) throws Exception {
        try {
            //經過將給定路徑名字符串轉換爲抽象路徑名來建立一個新File實例
            File f = new File(jarFile);
            URL url1 = f.toURI().toURL();
            URLClassLoader myClassLoader = new URLClassLoader(new URL[]{url1}, Thread.currentThread().getContextClassLoader());

            //經過jarFile和JarEntry獲得全部的類
            JarFile jar = new JarFile(jarFile);
            //返回zip文件條目的枚舉
            Enumeration<JarEntry> enumFiles = jar.entries();
            JarEntry entry;

            //測試此枚舉是否包含更多的元素
            while (enumFiles.hasMoreElements()) {
                entry = (JarEntry) enumFiles.nextElement();
                if (entry.getName().indexOf("META-INF") < 0) {
                    String classFullName = entry.getName();
                    if (classFullName.indexOf(".class") < 0) {
                                classFullName = classFullName.substring(0, classFullName.length() - 1);
                            } else {
                                Map<String, Object> hashMap = new HashMap<String, Object>();
                                
                                // 這裏經過包名對部分類進行過濾,方式因爲類不存在引發的錯誤。
                                hashMap.put("com/test/test/test/", new ArrayList<String>());
                                boolean isOkClass = false;
                                for (Map.Entry<String, Object> m : hashMap.entrySet()) {
                                    String name = m.getKey();
                                    ArrayList<String> list = (ArrayList<String>) m.getValue();
                                    if (classFullName.startsWith(name)) {
                                        isOkClass = true;
                                        for (String str : list) {
                                            if (classFullName.startsWith(str)) {
                                                isOkClass = false;
                                            }
                                        }

                                        break;
                                    }
                                }

                                if (isOkClass) {
                                    //去掉後綴.class
                                    String className = classFullName.substring(0, classFullName.length() - 6).replace("/", ".");
                                    // log(classFullName);
                                    try {
                                        final Class<?> myclass = myClassLoader.loadClass(className);
                                        for (final Method method : myclass.getDeclaredMethods()) {
                                            if (!Modifier.isAbstract(method.getModifiers())) {
                                                XposedBridge.hookMethod(method, new XC_MethodHook() {
                                                    @Override
                                                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                                                        String before_className = myclass.getName();
                                                        String methodName = param.method.getName();

                                                        super.beforeHookedMethod(param);
                                                    }

                                                    @Override
                                                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                                                        String before_className = myclass.getName();
                                                        String methodName = param.method.getName();
                                                        
                                                        super.afterHookedMethod(param);
                                                    }
                                                });
                                            }
                                        }
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                    }
                                }
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
View Code 讀取jarhook方法和類

0x04 其餘方式

  一、針對app使用的開源庫進行了解而後方便hook注關鍵代碼,由於開源代碼都是開源的,不須要看app解包的混淆,羞澀的代碼。

  二、針對app做者,寫入Log的內容進行hook,由於發佈的app通常都是把其中的一個true或者false進行註釋掉了,方法調用日誌自己沒有註釋掉,因此能夠針對寫入的日誌的地方進行處理。

相關文章
相關標籤/搜索