首先介绍的是Xposed只是一个安卓手机的框架,并不具有任何功能,为了实现个人的需求,我们需要自己编写模块加入到这个框架中去。现如今比较主流的Xposed框架包括微信运动步数的作弊模块、微信的虚拟位置定位模块等、Xposed的框架十分地强大,可以实现截取信息和修改信息的功能。要想实现你心中所想要实现的功能,你首先要去知道这个功能的方法在哪个应用包中的哪个类中的哪个方法中的某个参数,那么你的模块就要指明哪个包,哪个类,哪个方法,当系统重启加载目标应用包时,加载了你的模块的Xposed框架会识别到这个进程,接下来,如果你指明的应用中的某一方法被系统执行了,那么Xposed也会识别到,然后你的模块会进行Hook这个方法(Hook就是钩子陷阱的意思,也可以说是拦截)这个方法,并可以利用模块的接口让方法的参数和返回值结果暴露出来甚至是进行修改。
现在的网络教程中有很多是模拟写一个用户登录的界面,之后在利用Xposed框架进行截取信息以及修改用户信息的教程我在这里就不再过多的罗嗦了,大致的流程我给大家简单的介绍一下:
1. private boolean isOK(String account, String password){
2. return account.equals(ACCOUNT) && password.equals(PASSWORD);
3. }
这个是模拟写一个登录界面的APP,上方的代码是判断用户ID和PassWord的一个方法,假如ID和PassWord相符,返回turn反之false;那么假如我们想要hook到这个App中的登录界面的用户账号和密码,并且我们通过反编译知道了这个判断账号密码的类和方法了,那我们就可以利用Xposed框架来进行截取工作了,截取的方法如下所示:
1. new XC_MethodHook() {
2. @Override
3. protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
4. XposedBridge.log("账号:"+(String)param.args[0]+" 密码:"+(String)param.args[1]);
5. Log.d("zz","账号:"+(String)param.args[0]+" 密码:"+(String)param.args[1]);
6. }
7.
8. @Override
9. protected void afterHookedMethod(MethodHookParam param) throws Throwable {
10. Log.d("zz", param.getResult().toString());
11. }
12. });
通过param.arg就可以获取目标方法中的参数,通过log的方式打印出来,而param.getResult()方法就是获取返回结果的打印结果必然是true或是false;当然了如果你比较坏想替换他的账号密码也是可以的,在beforeHookMethod方法内对param.arg直接进行赋值,这样他在登录的App中无论如何填写账号密码,都会被替换到如下的账号密码。
1. //修改参数
2. param.args[0]="ssssss";
3. param.args[1]="111111";
以上是对别人的博客进行一个总结,也是为读者说明这个安卓Xposed框架的功能说明进行简单的介绍讲解,在下面我会详细进行说明和对某一款使用量很大的App的数据库进行hook操作,当然我是只是一个小新手Android开发经验只有短短的不到一年时间,只能够hook到加密过的乱码也没有仔细研究,只为大家提供一个思路和Xposed的简单使用教程。话不多说进入正题:
一、手机环境的要求:
Root过的手机一部,并且安装了Xposed框架。(Root教程和Xposed插件请百度搜索也可以qq加一些Xposed群,针对不
同机型版本,里面有很多详细的介绍)
二、导入jar包
XposedBridgeApi.jar包导入到lib中,在Add as Library,这里必须注意两点细节,一是,放jar包的文件夹名字一定是“lib”或“jar”(自己创建lib文件与libs同级)亲测放到“libs”里没用;二是,需要在build.gradle里的dependencies将compile改为provided,不然可能会报错。
三、新建一个类(Xposed模块类),命名为Module,代码如下:
public class Module implements IXposedHookLoadPackage{ @Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable { hookQuery(loadPackageParam); } private void hookQuery(XC_LoadPackage.LoadPackageParam loadPackageParam) { try{ Class hookClass = loadPackageParam.classLoader.loadClass("com.tencent.mmdb.database.SQLiteDatabase"); XposedBridge.hookAllMethods(hookClass, "query", new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { super.beforeHookedMethod(param); StringBuilder sb = new StringBuilder(); for (Object arg : param.args) { if (arg instanceof String) { sb.append("<==string==>"); sb.append(arg.toString()); } else if (arg instanceof String[]) { String []subArgs = (String []) arg; for (String str : subArgs) { sb.append("<==[ ]==>"); sb.append(str); } } } XposedBridge.log("hookQuery的数据为:" + sb.toString()); } @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { super.afterHookedMethod(param); } }); }catch (Exception e){ } } }
使用hookAllMethod是因为我将该APP下载反编译APK后,查看目标包下的同类中有多个重载的方法(方法名相同而参数列表不同的同名方法)而通常情况下可以直接使用XposedHelpers.findAndHookMethod()方法进行hook操作,在beforeHookedMethod方法中对param.args进行判断,因为在目标方法中的参数列表有数组存在,我们要打印结果就要进行判断在添加到一个字符串中。
四、配置清单文件,其中内容复制粘贴就可以,不存在Activity展示界面,此项目只作为一个Xposed模块插件而存在,代码如下所示:
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <meta-data android:name="xposedmodule" android:value="true"/> <meta-data android:name="xposeddescription" android:value="Hook WeiXin Query"/> <meta-data android:name="xposedminversion" android:value="54"/> </application>
五、在main文件夹下创建一个assets文件,并在里面创建一个普通的文件,,命名为“xposed_init”,在里面添加一段字符串,内容为包名 + 模块类名(注意在最后没有分号!!不然会不识别!!!)
com.sq.xp_rawquery_test.Module
六、使用说明
如果代码被混淆过,即使你明知道代码中要hook的类名和方法名,但都不一定能用,必须以smali中的名字为准,比如:queryMethod()混淆之后再smali中的函数名为a,那么hook的时候就必须写a,而不是queryMethod,第一个参数类名同理。
七、安装模块及使用
最后模块已经完成,接下来就是对其进行打包 Build -> Generate Signed APK,并安装在手机上。因为没有MainActivity,所以安装后不会弹出任何界面,安装了Xposed的手机会弹出消息,提示模块已经更新,此时可以选择Xposed菜单中的“框架” -> “软重启”(软重启手机不会断电,相当于电脑重启,比硬重启要快),之后正常启动APP,登录账号密码就会被拦截,在Xposed的日志中可以查看到账号密码,在Android Studio中也可以查看到log日志。最后窃取到的信息多为一些乱码数据,但是确实实现了数据的截取,只是怪自己代码经验不足,和人家TX的WX团队太厉害在加上反编译后的源码真的好难看懂,所以就不再进一步的深究了。最下方是自己的项目GitHub的下载地址,XposedBridgeApi.jar包可以到项目中的lib包中直接复制拿来用。(微信版本不一致是无法hook到数据的,因为反编译后的包名类名以及方法名都有可能发生改变)
结语:
Xposed的框架对于安卓手机来说就是一个神器,可以使用到的地方只要你能力够强,你的手机就可以变得有多高大上,对于一个程序员界的新手来说,希望通过这篇文章可以让更多人知道Xposed框架,可以设计出更多的强大模块来改变你的手机,如果以上文章有何错误希望可以被指出,请原谅我这个萌新写的博客的一些不足之处,如果写的不好还请谅解,可以在评论区给我一些改进的意见。
https://github.com/shiqiangdva/xposed.git