上一篇《Android Hook框架Xposed入门》,我们对xposed进行简单的介绍并hook自己写的登录app。这次我们对xposed进行深入的了解并hook系统应用和第三方应用。

一.API说明

  • IXposedHookLoadPackage.java

    • 方法: handleLoadPackage,这个方法用于在加载应用程序的包的时候执行用户的操作
    • 参数说明: final LoadPackageParam lpparam 这个参数包含了加载的应用程序的一些基本信息
  • XposedHelpers.java

    • 方法: findAndHookMethod,这是一个辅助方法,可以通过静态导入使用
    • 参数说明: findAndHookMethod(Class<?> clazz, //需要 Hook 的类名ClassLoader,//类加载器,可以设置为 nullString methodName, //需要 Hook 的方法名 Object… parameterTypesAndCallback)该函数的最后一个参数集,包含了: (1)Hook 的目标方法的参数,譬如:"com.android.internal.policy.impl.PhoneWindow.DecorView"是方法的参数的类。 (2)回调方法:a.XC_MethodHook b.XC_MethodReplacement
  • XposedBridge.java

    • 无参方法: log,该方法可以将 log 信息以及 Throwable 抛出的异常信息输出到标准的logcat 以及/data/xposed/debug.log 这个文件中
    • 无参方法: hookAllMethods/hookAllConstructors,该方法可以用来 hook 某个类中的所有方法或者构造函数,但是不同的Rom(非Android原生 Rom)会有不同的变种。

二.Hook/Replace

Xposed 框架中真正起作用的是对方法的hook,那么寻找正确的目标方法名和所在的类名就很关键了。一般寻找目标方法有两种方法:

  • 直接在 AOSP 中查看

这种是针对系统应用,要hook修改系统层面的东西,就可以通过查看google官方开放的源码来查看相应的接口。

  • 反编译目标程序,查看Smali代码。

这种是针对第三方应用,常见的反编译工具有apktool,反编译后可以得到jar或者得到smali文件。Android采用的是java语言 进行开发,但是Android系统有自己的虚拟机Dalvik,代码编译最终不是采用的java的class,而是使用的smali。对于jar文件,我们可以使用jd-gui来查看源码,但是jar的话可能很多地方无法正确的解释出来,如果我们反编译的是smali则可以正确的理解程序的意思。smali类似汇编的形式,不熟悉smali语法,我们可以用smail2java工具进行转化,就可以通过java查找相应要hook的方法名信息。

三.Hook系统应用

这节简单讲讲hook系统应用来修改IMEI(设备信息)。APP获取IMEI是通过代码

1
2
TelephonyManager tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE); String IMEI= tm.getDeviceId();

通过上述接口获取的,我们首先hook住TelephonyManager类的方法getDeviceId(),修改返回结果为"00000000000000" 这样无效的IMEI。

主入口HookUtil代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class HookUtil implements IXposedHookLoadPackage{ public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable{ HookMethod(TelephonyManager.class, "getDeviceId", "00000000000000"); } private void HookMethod(final Class clazz, final String method, final String result){try{ XposedHelpers.findAndHookMethod(clazz, method, new Object[] { new XC_MethodHook() { protected void afterHookedMethod(MethodHookParam param) throws Throwable { param.setResult(result);} } }); } catch (Throwable e){ e.printStackTrace(); } } }

写个简单获取IMEI例子测试是否hook成功。未激活插件时获取IMEI的值:

激活插件再获取IMEI的值,发现已经修改成功

既然能够修改IMEI,那么其他手机信息也可以依瓢画葫芦进行修改,只要知道返回这些信息的相应接口。

四.Hook第三方应用

接下来我们尝试hook第三方应用微信。微信是这几年很火的聊天软件,聊天的内容不局限文字、语音、图片……微信中还可以掷骰子和猜拳互动是比较娱乐性的功能。

如果能够hook微信里面的骰子和猜拳接口,那么我们就尝试基于Xspoed的微信猜拳、骰子点数作弊插件。保证每次掷出来的骰子或者猜拳出的是我们想要的结果。

由于微信版本众多,每个版本发布前都经过proguard混淆打包,导致相同接口每个版本的接口名不一致,但是相同版本在不同机器的接口保证唯一,我们这次用6.3.9 for Android也就是weixin_700版本进行hook,其它版本同理也可以hook。

根据网上大神反编译微信源码分析,掷骰子和猜拳的接口在com.tencent.mm.sdk.platformtools.bb类的 pu方法中

由代码我们可以分析出,掷骰子和猜拳的结果是本地取随机数来控制,当传入int paramInt = 2时,代表猜拳的接口,随机返回0,1,2三个随机数分别代表"剪刀", “石头”, “布"。当传入int paramInt = 5时,代表掷骰子的接口,随机返回0~5六个随机数分别代表1~6的点数。

那么我们就可以编写HookUtil的代码

1
findAndHookMethod("com.tencent.mm.sdk.platformtools.bb", lpparam, "pu");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
private void findAndHookMethod(String className, final LoadPackageParam lpparam, String methodName) { XposedHelpers.findAndHookMethod(className, lpparam.classLoader, methodName, int.class, newXC_MethodReplacement() { @Override protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { int gameType = (Integer) param.args[0]; switch (gameType) { case 5: // 摇骰子 Uri diceUri = Uri.parse("content://com.example.hookdemo.provider/wx_plugs_setting"); Cursor diceCursor = mContext.getContentResolver().query(diceUri, null, null, null, null); if (diceCursor!= null) { while (diceCursor.moveToNext()) { diceCount = diceCursor.getInt(diceCursor.getColumnIndex("dice_num")); XposedBridge.log("查询获取骰子数为:" + diceCount); } } break; case 2: // 猜拳 Uri morraUri = Uri.parse("content://com.example.hookdemo.provider/wx_plugs_setting"); Cursor morraCursor = mContext.getContentResolver().query(morraUri, null, null, null, null); if (morraCursor != null) { while (morraCursor.moveToNext()) { diceCount = morraCursor.getInt(morraCursor.getColumnIndex("morra_num")); XposedBridge.log("查询猜拳数为:" + morraNum); } } break; } XposedBridge.log("replaceHookedMethod--函数返回值:" + diceCount); return diceCount; } }); }

接下来我们编写保存设置想要点数和猜拳的并保存sqlite并通过ContentProvider提供统一的接口。当然也可以通过xposed提供的XSharedPreferences来做可能会更简单点。这样每次hook到请求返回骰子和猜拳结果就会根据我们每次保存的结果动态更改。

运行插件,点击【模块】,找到我们的插件勾选,并点击进行配置

设置摇出来的骰子点数为6点。

设置猜拳出的是剪刀。

重启激活插件,进入微信查看效果:

重新进入模块配置界面,设置点数为1,猜拳为石头

再进来微信查看是否生效

有些人试验会不成功,可能是因为微信版本不是6.3.9导致接口名不一致,比如微信6.3.16的接口就为 com.tencent.mm.sdk.platformtools.ba的pT()方法。

我们可以根据当前微信的不同版本(微信历史版本可以在安智市场下载),hook相应的接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
case "6.3.5": ClassName = "com.tencent.mm.sdk.platformtools.ba"; MethodName = "or"; break;case "6.3.7": ClassName = "com.tencent.mm.sdk.platformtools.bc"; MethodName = "oK"; break;case "6.3.8": ClassName = "com.tencent.mm.sdk.platformtools.bc"; MethodName = "oZ"; break;case "6.3.9": ClassName = "com.tencent.mm.sdk.platformtools.bb"; MethodName = "pu"; break;case "6.3.11": ClassName = "com.tencent.mm.sdk.platformtools.ay"; MethodName = "pu"; break; case "6.3.13": ClassName = "com.tencent.mm.sdk.platformtools.ay"; MethodName = "pu"; break; case "6.3.15": ClassName = "com.tencent.mm.sdk.platformtools.ba"; MethodName = "pu";break; case "6.3.16": ClassName = "com.tencent.mm.sdk.platformtools.ba"; MethodName = "pT"; break;

看到这,有些骚年会动歪心思,是不是可以hook微信抢红包的接口来获利,你们真是too young,too simple。你们以为微信抢红包金额接口会从客户端随机取个数吗,明显是要服务端分配下发的,服务端要严格控制任何漏洞,不向骰子和猜拳是客户端产生各随机结果再发送到服务端同步给其它客户端。再者万一你们找到漏洞,这种涉及金钱的被发现是要被腾讯告抓去坐牢滴~

五.总结

通过介绍Xposed常用API接口,寻找hook的目标方法,以及演示分别hook系统应用和第三方应用的例子来进一步阐述Xposed的使用。可以看出Xposed的功能非常强大,可能有人会担心自己手机上的帐号密码或者钱财丢失,其实Xposed使用还是有些限制的,比如需要手机root权限,不好hook jni写的C语言接口。所有一般我们使用的手机尽量不要root,我们App关键接口尽量用jni的so库来实现。

附:

HookIMEI源码: https://github.com/chendd/Hook_IMEI.git

Hook微信源码: https://github.com/chendd/WeChatHook.git

Android Hook框架Xposed进阶相关推荐

  1. Android应用防xposed注入,android hook 框架 xposed 如何实现注入

    转:http://www.cnblogs.com/jiayy/p/4305018.html 前面分析的adbi框架和libinject都是使用so注入的方式,实现将指定代码装入目标进程,这种方式有几个 ...

  2. Android.Hook框架xposed篇(Http流量监控)

    瘦蛟舞 · 2015/08/03 10:30 官方教程:github.com/rovo89/Xpos- 官网:repo.xposed.info/module/de.r- apk:dl-xda.xpos ...

  3. 面试:Hook框架Xposed、Dexposed、Epic原理

    Xposed.Dexposed.Epic对比总结: 1.Xposed框架是需要root的,他的功能很全,能够hook掉系统方法,同时也可以hook掉其他应用的一些方法. 2.Dexposed框架是不需 ...

  4. android hook 程序,Android hook框架之Xposed插件开发

    上一篇讲了Android hook框架Cydia,这一篇是Android hook的另一个框架Xposed,Xposed是一款广泛应用于安卓领域的开源框架. 其原理是Xposed框架主要通过替换/sy ...

  5. 全能Android HOOK框架 JNI NATIVE JAVA ART DALVIK

    OneHook 目前比较流行的几个安卓HOOK方案,都有功能上的欠缺,有的不支持art模式,有的不支持jni层,有的不支持侵入HOOK. 所以OneHook诞生了! 这是一个同时支持ART和Dalvi ...

  6. android hook之 xposed检测

    注意:原文中第3个方法"检测并不应该native的native方法"没有实现. 检测代码如下: import java.io.BufferedReader; import java ...

  7. Android.Hook框架Cydia篇(脱壳机制作)

    瘦蛟舞 · 2015/08/17 14:53 注:框架有风险,使用要谨慎. Cydia Substrate是一个代码修改平台.它可以修改任何主进程的代码,不管是用Java还是C/C++(native代 ...

  8. android hook技术-Xposed框架 帮你轻松应对支付宝2016晒账单

    一.支付宝2016年账单. 最近几天微信朋友圈充斥着各式的支付宝2016账单,对于程序员屌丝来说打开发现年度消费9W+,和他们动辄十几万的消费没得比,细看更有80%的消费还都是还信用卡,顿时万念俱灰啊 ...

  9. Xposed Android hook框架入门 -开发步骤

    原理 Xposed替换了/system/bin/app_process可执行文件,在启动Zygote时加载额外的jar文件(/data/data/de.robv.android.xposed.inst ...

最新文章

  1. 全方位,多角度理解ThreadLocal
  2. Oracle to_char格式化函数
  3. java提高篇(十六)-----异常(一)
  4. (Mybatis)Mybatis简介和初步使用
  5. SAP Customer Data Cloud的Audit log设置
  6. mysql基础查询语法
  7. servlet下载文件(注意文件名字必须是英文)
  8. linux 在文件中增加空行,linux – 在不同组的行之间添加空行
  9. 前端性能毫秒必争综合方案
  10. 阿里云服务器如何升级配置和降低配置?
  11. EXICOM/STAHL触摸屏维修MT-577-SX-TFT-T-AC-AL故障概述
  12. The Fun Of Algorithm - Day4 - 百钱百鸡问题
  13. 小程序该怎么去做引流和变现呢
  14. 【外卖cps源码分享】支持美团饿了么
  15. CAN 常见错误排查
  16. python中set如何添加元素_python中如何在set中添加元素?语句是什么
  17. 基于微博评论的文本情感分析与关键词提取的实战案例~
  18. 【读书笔记】金字塔原理-学习总结
  19. 中级响应代表什么事件_15万预算,能买到合格的中级轿车吗?
  20. sdnu oj 1319 Russian Roulette

热门文章

  1. 独行月球现在成本多少?分红周期长吗?沈腾主演?
  2. 我有300万存支付宝的余额宝,可以实现财富自由吗?
  3. 如何自学通过PMP考试
  4. apache ii评分和死亡率_APACHE评分系统在危重病救治中的重要意义
  5. 【计算机毕业设计】001基于SpringBoot的在线拍卖系统
  6. (羊皮卷三) 坚持不懈,直到成功
  7. linux互信,Linux 下实现SSH互信
  8. 计算机速录专业论文,试论现代汉语拼音在计算机速录技术中的应用
  9. CONTAINING_RECORD
  10. 一杯奶茶的数字化之路