XPosed暴力列举Package下所有的方法调用

原创 2016年08月31日 15:19:25

使用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的做法,快速找到切入点。


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());
        }
}



                    

使用Xposed框架HOOK任意函数及API

感谢作者 http://0nly3nd.sinaapp.com/?p=613  0×1 建立一个空的工程 0×2 AndroidManifest.xml   ...

Xposed 包名类名加密要如何hook?多dex如何查找对应的方法?

Xposed Hook ,逆向常用之一;findAndHookMethod 语法;实现Hook模块的注意点;多dex如何查找对应的方法?包名类名加密要如何hook?如果用xposed去hook非默认d...
  • DJY1992
  • DJY1992
  • 2017年06月13日 12:10
  • 11869

Android逆向分析之Xposed的hook技术

Android逆向工程里常用到的工具除了的dex2jar,jd-gui,  Apktool之外还有一个Xposed。zhe...

Xposed框架之函数Hook学习

作者:Fly2015 Xposed是Android下Java层的开源Hook框架类似的有cydiasubstrate框架并且据说cydiasubstrate框架能实现Android的Java层和Nat...

Xposed如何实现类中函数的调用

0x01前言 之前学习了Xposed如何实现不重新打包APP的条件下,实现函数的Hook,在使用过程中,除了方法的hook,比如我要实现某些函数额调用,不同类中的函数和Native方法的调用...

Android安全专项-Xposed劫持用户名密码实践

Xposed是个强大的工具,可以hook所有的java方法,下面用Xposed来截获App的用户名密码,默认你已经安装好Xposed环境了 参考文章:http://blog.csdn.net/b...

android函数调用堆栈打印方法

//打印调用堆栈 RuntimeException e = new RuntimeException("run is here"); e...

Xposed的使用

背景阐述 Android是一种基于Linux的自由及开放源代码的操作系统,由Google公司和开放手机联盟领导及开发。由于其开放的特质,吸引了一大批硬件厂商和软件开发者。第三方的统计数据显示,201...

Android 热更新 tinker 在Android 简单的使用 (替换class)

Hello! 大家好. 前段时间比较忙,今天终于闲下来了.于是研究研究比较高大上的东西. 热更新! 网上一搜热更新,好家伙一点堆,各种框架让人应接不暇.最后综合来看选择了 微信的Tinker 热修复框...

某加固使用xposed脱壳

转:http://www.cnblogs.com/xiaobaiyey/p/5919921.html 这壳免费版本的好久没更新了。前两天用个demo加固测试,发现还是老的加固,免费版...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:XPosed暴力列举Package下所有的方法调用
举报原因:
原因补充:

(最多只允许输入30个字)