android gps 案例_【Android改机系列】一键新机原理剖析

一个改机案例:

6月份拿到一个口碑不错的商业改机案例,该案例只能运行在指定的手机,指定的rom,号称各大App无法检测,免root的改机框架。

我手上只有nexus6p,安装到手机上跑了一下,瞬间闪退,没有任何崩溃日志。但是这条日志出卖了它:

a1b785ade1aba2b89f0accf27bdb4e6c.png 这明显是调用System.exit(0)主动退出。

静态分析

05703bea99eb1c73e90d20fda7cccb01.png 通过图片可以看到dex被混淆,字符串也被加密。

解密字符串重打包

字符串解密往往是固定的smali格式:
const-string vX, "加密后的字符串"
invoke-static {vX}, Lcom/test/decString(Ljava/lang/String;)Ljava/lang/String;
move-result-object vX
这个案例也不例外,所以编写一个脚本去匹配以上代码,然后调用解密代码(自己去源码里扣)解密字符串。 然后把解密之后的字符串替换加密的字符串,然后再删除const-string vX, "解密之后字符串"以下两条指令,然后重打包即可(各位大佬若有更好的方案请告知)。 当然我这里还加上了hook系统签名校验:
private void hook(Context context) {try {
DataInputStream is = new DataInputStream(new ByteArrayInputStream(Base64.decode(oriSign, 0)));byte[][] sign2 = new byte[(is.read() & 255)][];for (int i = 0; i < sign2.length; i++) {
sign2[i] = new byte[is.readInt()];is.readFully(sign2[i]);
}
Class> activityThreadClass = Class.forName("android.app.ActivityThread");
Object currentActivityThread = activityThreadClass.getDeclaredMethod("currentActivityThread", new Class[0]).invoke(null, new Object[0]);
Field sPackageManagerField = activityThreadClass.getDeclaredField("sPackageManager");
sPackageManagerField.setAccessible(true);
Object sPackageManager = sPackageManagerField.get(currentActivityThread);
Class> iPackageManagerInterface = Class.forName("android.content.pm.IPackageManager");this.base = sPackageManager;this.sign = sign2;this.appPkgName = context.getPackageName();
Object proxy = Proxy.newProxyInstance(iPackageManagerInterface.getClassLoader(), new Class[]{iPackageManagerInterface}, this);
sPackageManagerField.set(currentActivityThread, proxy);
PackageManager pm = context.getPackageManager();
Field mPmField = pm.getClass().getDeclaredField("mPM");
mPmField.setAccessible(true);
mPmField.set(pm, proxy);
Log.i(TAG,"PmsHook success.");
} catch (Exception e) {
Log.e(TAG,"PmsHook failed.");
e.printStackTrace();
}
}
这是jadx反混淆和解密字符串之后的效果,这下代码阅读性高了很多: 0a2b50bd46c89b60759751f7e12f58a4.png

过授权、签名校验、系统认证、登录

这是一个厮杀的过程,本案例检验之处有非常多,so中也存在字符串加密和检验。 当然这不是本篇文章重点,具体厮杀过程就不过多赘述。 最后庐山真面目出现了: 31c9207e4626f3c33c51cf686f32aa6b.png

新机原理

绝杀技一:免root Hook

此案例通过编译xposed源码并且修改特征码,把Xposed相关名称改为系统名称,例如camera、email、phone。 然后hook堆栈信息,把hook框架的堆栈过滤掉。 然后把改名字的xposed集成至LineageOs源码中。 然后通过魔改后的XposedBridge.jar编写Hook模块,这样就实现了免root集成hook框架。 这样子真的可以为所欲为。

绝杀技二:全面Hook Android设备信息接口

这个不用多说,全面的Hook了java层所有获取设备信息的有关函数,包括文件读取的io重定向,附件中是我整理的Hook相关接口。

绝杀技三:伪造真实用户活动

各大厂商都在做风控,IP画像、设备画像、用户画像、手机号画像...,没用用户行为的设备,必然是非正常用户,肯定是过不了风控的。 通过hook相关接口,每次新机填充不同的短信,通话记录,联系人,照片,启动时间,周边蓝牙、wifi,sensor的值随机化。

绝杀技四:基站、gps、ip位置一致

目前获取位置信息主要有基站、gps、ip位置,三个维度。 改机必然是通过链接代理(vpn)来生成不同ip,这里就要保证每次基站和gps的位置要和IP的位置信息相差不大,这样每次新机都是一个新的地理位置。

绝杀技五:SysPropertyHook

Xposed只是java层的Hook,现在大多数设备指纹sdk都是native获取或者native和java层都获取,然后进行对比。 这里通过Hook SystemProperties.set、Settings.System.put、Settings.Secure.put、Settings.Global.put。 保证改机后/system/build.porp、System.xml、Secure.xml、Global.xml文件真实改变,保证native层通过getProp时候和java层获取的是一致的。

新机流程

准备新机设备信息PhoneInfo

通过读取/assets目录下的设备信息集,随机生成一个设备信息,然后通过当前ip获取基带和gps的位置,并且生成用户信息。 把这些信息全部写入到sdcard中的phoneInfo.json中。

完成Hook

通过读取sdcard中的phoneInfo.json的设备信息完成Hook,自此新机已经完成。 由于版权原因,案例就不放出来了

a06ccd517847170eb1be98e14831ff91.png

- End -

0c2f10c26b1873b9efb80f67c7b6fd9b.png

看雪ID:seandong  

https://bbs.pediy.com/user-766159.htm  

本文由看雪论坛 seandong 原创

转载请注明来自看雪社区

往期热门回顾

1、Windows Kernel Exploit 内核漏洞学习(3)-任意内存覆盖漏洞

2、Windows Kernel Exploit 内核漏洞学习(2)-内核栈溢出

3、编写Windows Kernel Shellcode

4、初学者的静态分析挑战writeup

a228b663da5f993bf3a490fa855edbaa.png

公众号ID:ikanxue

官方微博:看雪安全

商务合作:wsc@kanxue.com

      ↙

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值