本帖最后由 Sean1994 于 2019-7-23 11:44 编辑

[ 本帖最后由 Sean1994 于 2019-7-23 11:33 编辑 ]\n\n

声明:本帖只作为技术分享,切勿用于非法用途,如果用于其他用途,本贴概不负责,如果有侵权,请管理员删除。

一个改机案例

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

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

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

静态分析

通过图片可以看到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反混淆和解密字符串之后的效果,这下代码阅读性高了很多:

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

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

新机原理

绝杀技一:免root Hook

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

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

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

Gaiji.txt

(7.75 KB, 下载次数: 19)

2019-7-23 11:23 上传

点击文件名下载附件

下载积分: 吾爱币 -1 CB

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

各大厂商都在做风控,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,自此新机已经完成。

由于版权原因,案例就不放出来了

下篇预告

Android改机系列:二.全息备份原理刨析

jadx重新打包_Android改机系列:一.Android一键新机原理刨析相关推荐

  1. 爱伪装(AWZ)/爱立思(ALS)改机改串一键新机原理分析

    安装过苹果插件的都知道,点开Cydia ,点软件源,再点编辑,再点添加,添加阿里源, 大家都知道,源地址::http://apt.aliooz.com 店铺地址:快发卡自动发卡平台 - 最好用的自动发 ...

  2. 抹机王怎么一键新机_抹机王怎么进行一键新机???

    抹机王是一款设备清理工具,通俗点讲的话就是改机软件,可以实现一键新机的功能,那么我们下面来讲一下如何利用抹机王这款软件实现一键新机.1.基础功能配置主要用于设置清理设备的详细的个性化设置,这里我们介绍 ...

  3. jadx重新打包_Android反编译看看手Q口令红包的实现原理

    首篇作为开始,先讲讲简单的反编译.反编译通常有几种目的:互相学习.借来用用.嘿嘿(干你,又分为小干干类似微信红包,和大干干改别人的apk帮他上架). 因为没带kvm回来,mbpr屏幕太小,所以下文环境 ...

  4. 热修复系列之一----Android 热修复原理篇及几大方案比较

    热修复说白了就是"即时无感打补丁",比如你们公司上线一个app,用户反应有重大bug,需要紧急修复.2015年以来,Android开发领域里对热修复技术的讨论和分享越来越多,同时也 ...

  5. java中的saturn_Saturn分布式调度平台系列:高屋建瓴之设计原理简析

    由于业务系统中使用了Saturn作为分布式调度平台并且计划对其作二次开发,因此看了官方文档及源码,简单做了梳理与总结.Saturn是唯品会开源的一款定时任务调度平台,相对于传统的Spring Batc ...

  6. 【NEO官方】一键新机 改串 安装教程 ios一键新机 ios9 ios8 ios7均可用

    NEO 支持IOS9一键新机了 IOS8设备安装NEO IOS8 ; IOS9设备安装NEO9, 确定自己的设备版本后对应安装 设备进cydia下,点,(最下面)软件源,编辑,添加,源输入apt.so ...

  7. 机架搭建_【新阁教育】穷学上位机系列——搭建STEP7仿真环境

    经常有学员问我,学习上位机要不要买PLC硬件? 我一般的回答是:富则自行购买,穷则搭建仿真. PLC硬件,对于学习上位机来说,是锦上添花的事,经济条件允许,有则更好,条件不允许,新阁教育告诉您也可以通 ...

  8. Atitit 发帖机系列(7) 词法分析的方法attilax大总结)

    Atitit 发帖机系列(7) 词法分析的方法attilax大总结) 1.1. 词法分析貌似俩大方法,一个直接根据状态图转换,一个根据dfa1 1.2. switchcase或者ifelse 最原始方 ...

  9. 美术改画系列-张聪-专题视频课程

    美术改画系列-9212人已学习 课程介绍         这次的课程分为6章,将为大家呈现完全不一样的游戏设计,通过6个不同方向的美术设计的指导,让大家在老师的改画的过程中学习到更多的关于游戏美术设计 ...

  10. LS-WXL/E改机应用流程全攻略(改机+下载工具安装)

    申明:本攻略中用到的方法并非都是本人原创,本人只是将其它帖子中的方法进行整理,并将其中部分不适合的地方进行修改补充,引用方法的版权归原作者,如果需要转载,请注明出处,谢谢! 装机前必看:如果NAS开启 ...

最新文章

  1. vscode 结束_8 个给前端的顶级 VS Code 扩展插件
  2. HTML CSS JS(一)
  3. Redis总结集群方式之主从复制
  4. LeetCode(1030)——距离顺序排列矩阵单元格(JavaScript)
  5. WMI-Win32_BIOS 参数说明
  6. Objective-C基础笔记(7)Foundation中的常用结构体
  7. SQL:postgresql查询结果加一个自定义的列
  8. 从delphi 10.3到delphi 10.4的改变实务
  9. f1c100A运行linux,荔枝派 Nano 全志 F1C100s 编译运行 Linux 笔记
  10. GCD中dispatch_semaphore(信号量)的使用方法
  11. matlab和robotstudio,一种从Robotstudio环境中导出机器人模型并在MATLAB下使其可视化的研究记录...
  12. C# vb .net实现淡色效果滤镜
  13. ECharts 中的事件和行为
  14. 用php编写多项选择题_php 多选框问题(类似一道多选题)多选题的答案 以及正确答案都记录到数据库里了,读取修改问题...
  15. 编程语言中的反射机制
  16. 声源定位matlab模拟,matlab声源定位程序的一点小问题
  17. android抓包 dns,利用 dns 实现 app简易抓包
  18. 60个让程序员崩溃的瞬间,我已崩溃,哈哈哈哈哈
  19. 基于FPGA的自动小车控制设计Verilog开发
  20. android+驾考软件开发,「驾考app开发」驾考app开发解决方案

热门文章

  1. SWFTOOLS PDF2SWF 参数详解(转)
  2. PHP将swf转为gif,swf转gif 在线转换
  3. Visual Studio 2019 Community 版离线注册
  4. 计算机键盘正确指法操作方法,键盘指法,图文详解键盘指法练习方法
  5. 2021 OpenCV人工智能竞赛优秀项目团队介绍集锦(五)
  6. ie11不兼容 html编辑器,修复kindeditor编辑器不兼容IE11问题
  7. 使用python来完成对QQ邮箱文件中转站的文件下载链接的获取
  8. 经济应用文写作【8】
  9. 网吧服务器系统安装,网吧服务器和客户端安装教程
  10. html写手机登录界面,使用HTML做手机端的登录界面