XPosed暴力列举Package下所有的方法调用
2016-08-31 15:19
435 查看
使用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大小。
上面的解压教程均来自wanqi的android apk反编译和odex转dex, 网址是http://www.cnblogs.com/wanqieddy/archive/2012/03/01/2375424.html
Possibility two: Get the AOSP sources。诚然,熟悉Android的代码对Hook肯定有极大的帮助。将对应版本的Android代码下载下来读就是了。不过,假如你和我一样,任务紧急,崇尚暴力美学,那么可以打印出某Package内所有method的做法,快速找到切入点。
以上代码Copy自PackageHooker,链接在https://github.com/UMLGenerator/Android-UML-Generator/blob/f26521e9420d4be032c2e4a1a872ac0c945c7c2e/xposed/src/main/java/software/umlgenerator/PackageHooker.java
注:对于带界面的APK,可以使用DDMS的Dump View快速找到对应的Package名称。
最后,附上dump某个class的代码,调试的时候可以输出所有的细节:
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大小。
上面的解压教程均来自wanqi的android apk反编译和odex转dex, 网址是http://www.cnblogs.com/wanqieddy/archive/2012/03/01/2375424.html
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<String> 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名称。
最后,附上dump某个class的代码,调试的时候可以输出所有的细节:
private void dumpClass(Class actions) { <span style="white-space:pre"> </span>XposedBridge.log("Dump class " + actions.getName()); XposedBridge.log("Methods"); Method[] m = actions.getDeclaredMethods(); for (int i = 0; i < m.length; i++) { XposedBridge.log(m[i].toString()); } XposedBridge.log("Fields"); Field[] f = actions.getDeclaredFields(); for (int j = 0; j < f.length; j++) { XposedBridge.log(f[j].toString()); } XposedBridge.log("Classes"); Class[] c = actions.getDeclaredClasses(); for (int k = 0; k < c.length; k++) { XposedBridge.log(c[k].toString()); } }
相关文章推荐
- Web所有父窗体与子窗体的交互方法列举(子调用父窗体函数)
- Web所有父窗体与子窗体的交互方法列举(子调用父窗体函数)
- 编写一个文件,读取 src 下面day12包 下面的my.properties 文件,文件内容如下, className=day12.User 结合 IO、反射知识,完成 配置文件中对象的创建和方法调用。并编写方法,列举出 Student 类中所有的属性、
- Web所有父窗体与子窗体的交互方法列举(子调用父窗体函数)
- arclist标签在文章页列表页调用所有(全站)栏目最新文章热门文章的方法
- C#中调用ORACLE的PACKAGE里方法和存储过程的应用
- 所有的页面都继承自定义的BasePage,而有一个特殊页面要继承BasePage,但不想执行父类构造函数调用的某些方法,怎么办?
- 写一个方法进行各种属性的更新,而不要每个界面设置改变都改变一个属性。就是点击应用或确定按钮时调用这个更新属性的方法,遍历所有(控制对象属性的)界面控件的状态(值),进行属性修改和刷新。
- oracle调用java方法的例子(下面所有代码都是在sql/plus
- 非常实用的织梦dede所有标签调用方法大全
- 存储过程调用package 、package body中的方法
- (转)C#中调用ORACLE的PACKAGE里方法和存储过程的应用
- 非常实用的织梦dede所有标签调用方法大全 .
- 采用AOP 的观点来 Log 所有方法的调用
- 非常实用的织梦dede所有标签调用方法大全
- 织梦dede所有实用标签调用方法搜集整理
- Java反射代码--07.根据字段调用所有set方法
- oracle调用java方法的例子(下面所有代码都是在sql/plus中写)
- 【转】Eclipse中如何查找所有调用方法a()的类
- vc中调用Com组件的所有方法详解