此篇博客仅实现的思路分享,不提供最终成品
目录
学完你能收获什么
1.增长安全意识,你会发现root后只要软件想获取什么就获取什么;
(运行在VA里的任何软件其实都等价于root风险)
2.学会自定义完善App的途径。
(打个比方,如果你觉得微信定位不准,就可以在微信获取定位的地方换成或用别的定位api优化)
Hook这项技术在2上面的应用场景真的非常的广,可以在不同的应用之前搭建起一个桥梁。
另外,友情提示,千万不要root或者root后下不明来源软件,VA自用玩玩就行。
要求
前置条件
1.手机Root并且会使用Xposed等Hook框架或使用VA;
2.有一定安卓代码编写能力与安卓逆向能力;
3.Java基础扎实,因为VA、Android及我使用的Hook代码都是基于Java的;
4.有耐心。
运行环境
Android:9
手机型号:华为荣耀Magic2 /或其他
成果
最终效果
因为能拦截消息发送,所以没做图形化的工具而是直接采用了了个命令控制,这里就显示一下效果参考。
1.万能骰子/石头剪刀布
2.计步器任意倍率
3.反撤回
4.自动回复->聊天机器人
5.前后台锁屏任意抢红包
6.模拟别人给自己发消息
学习阔以,请勿滥用技术。
开发耗时
因为网上资料还是比较多的,从零开始到做完上面那些功能大概花了一星期,知识分享思路,代码不考虑开源
最终Hook的类
因为安卓的代码混淆会根据实际代码所处的位置分配不同的字母,微信版本更新如果类的代码顺序变了就会导致Hook的类名变化,所以Hook微信会有适配版本号。
实现
需知
1.选择root或VA
root非常不安全,我是使用了VirtualApp+YAHFA(参考了VirtualHook)实现的。
如果要使用VA并且是Android9的手机,你需要耗费一定的时间去让git上的开源代码适配你的Android9。
2.反编译代码工具
apkKill、dex2jar 等软件我都试过,或多或少都有问题
使用apktool+jadx+安卓sdk自带monitor即可应对大部分场景
3.YAHFA使用简介
插件的基本模板如下,以Hook步数为例
注意点
1.methodSig是javap转化的汇编语言
基本数据类型如int对应I、Float对应F、boolean对应Z、Long对应J
实体类则使用java/lang/Sting;(注意这里有分号)
数组则在前面加一个’['如[java/lang/Sting;、[I
可使用如javap -s java.lang.Sting进行查看
public static String methodSig = “(I[FIJ)V”;
代表该方法为(int,float[],int,long)的输入参数,V即返回void
2.backup()是YAHFA的原方法备份,里面无论写什么都不会被执行到,仅代表原方法。
3.hook()相当于AOP的环绕代理,其中backup()相当于原方法执行。
4.hook()方法的第一个参数如果该类为非静态类则为自身,静态类则不填,可以使用Object,全局保存该对象后通过反射调用该类的其他方法(这个做法在hook中会非常频繁,hook有时候只是为了获取到某个类的对象再通过反射调用该类的其他方法)。
public class Hook_SystemSensorManager_dispatchSensorEvent {
private static final String TAG = HookInfo.TAG + "_Sensor";
public static String className = "android.hardware.SystemSensorManager$SensorEventQueue";
public static String methodName = "dispatchSensorEvent";
public static String methodSig = "(I[FIJ)V";
public static int step = 1;
public static void hook(Object object, int handle, float[] values, int inAccuracy,
long timestamp) {
values[0] = values[0] + step * WalkCommand.walkMultiple;
step++;
backup(object, handle, values, inAccuracy, timestamp);
}
private static void backup(Object object, int handle, float[] values, int inAccuracy, long timestamp) {
}
}
Hook
代码只是一个大概,具体的需要用Jadx反编译出源码,再通过monitor自行分析
可以Hook几个类辅助进行观察(ClassLoader、Activity、各种Log)
1.计步器
计步器比较通用没什么好说的,调用SensorEventQueue.dispatchSensorEvent方法前修改其倍数即可,上面举的例子就是计步器的。
需要Hook的方法:
SensorEventQueue.dispatchSensorEvent
2.反撤回
1.撤回的时候会受到一条通知:XXX撤回了一条消息,该通知会带有撤回的消息内容体。
2.Hook该方法获取到被撤回的消息体重新插入本地消息数据库。
3.撤回文件/视频的同时会删除本地资源文件,所以要Hook对应的删除方法,禁止资源文件删除。
需要Hook的方法:
SQLiteDatabase.insertWithOnConflict()
SQLiteDatabase.delete()
File.delete()
细思极恐的是
你发的所有消息,只要某个软件想要,就可以直接获取。
比如微信聊天,发图片发视频,全都是可以拦截到的,然后本地储存,在某个时间点悄悄的发给后台服务。
甚至可以在支付的时候修改一下收款人?(虽说实际操作会有非常多的校验难度很大,不排除有这种可能)
3.万能骰子
骰子是随机数,所以定位的思路也很简单。
1.打开monitor记录下一次骰子的过程
2.搜索方法为random()的函数
3.在jadx中找到该类hook其返回值即为任意点数
网上的分析文章其实都有提到了这句,所以定位下面这句代码即可找到对应类
new Random(System.currentTimeMillis()).nextInt((i - i2) + 1) + i2
需要Hook的方法自行定位。
4.抢红包
流程分析
1.抢红包会在本地数据库插入一条红包消息,这里Hook并获取解析出红包的nativeurl,因为红包页其实是webview。
2.通过monitor分析得到加载webview的函数方法,Hook得到该加载的对象,并记录加载红包页所需的参数。
3.Hook初始Activity用于webview加载所需参数。
4.后台/锁屏抢红包可借助moveTaskToBack(true);函数实现。
5.自动回复
自动回复挺bug的,因为可以模拟出别人给自己发消息的假象,不作分析
给个提示,消息体内field_talker、field_isSend、field_content的属性比较关键
和谁聊天,谁是发送人,发送了什么