android逆向笔记 -- 记一次解决飞天助手未知模拟器方法
文章目录
- 0x0 前言
- 0x1 逻辑分析
- 0x2 检查逻辑
- 0x3 解除限制
0x0 前言
原来一直使用的飞天助手突然限制了模拟器, 美其名曰: "第三方模拟器盗用数据"云云, 谁不知道其实是想引流. 虽然无可厚非, 但是推荐的模拟器实在是太难用了, 于是修改下成为所有模拟器通用
0x1 逻辑分析
首先, 此界面并不是开始就直接显示, 而是点击运行脚本后再显示, 如果从程序入口来分析将很麻烦, 于是我打算追查是什么启动了此activity
首先检查此activity的包名, 使用adb链接模拟器adb connect 127.0.0.1:5555
, 注意, 每个模拟器的端口都不一样, 用之前检查下
然后使用命令adb shell dumpsys activity | findstr "mResumed"
查看最上层包名, 结果为****/ui.activity.AdActivity
0x2 检查逻辑
这里我是用Android Killer
进行分析, 加载此脚本, 查看activity, 发现所有的Activity和Service都是灰色的, 这主要是因为新版Android在打包时会分开储存dex, 而android killer的确有点老了, 只会识别第一个dex我用的ak已经魔改过了, 其实其他dex已经反编译, 自己找找即可
首先寻找AdActivity
, 发现位于smali_classes3/ui/activity
下, 查看其Java代码
发现一个公共静态方法public static void startAdActivity
, 很明显这个函数就是启动广告的关键, 使用搜索检测是哪里调用了这个方法
在Android Killer里搜索startAdActivity
, 发现一共有两处
首先看下面一个, 阅读smail源码, 可以看见startAdActivity(context, this.mAdTitle, this.mWebPath) 随后finish(), 最后 return-void
上面一个可以看见startAdActivity(context, "", ScriptCommandBean.getDLPlatformPrompt())
, 从英文上可以明显怀疑为在此检测模拟器, 查看Java代码
可以看见对比paramBaseBeanNew.getData()).getDLPlatformPrompt()
为0的时候, 代表检测模拟器通过
首先是发现关键词RetrofitApiManager
, 可以知道用的是Retrofit
, 寻找对应的apiNormalSwitch(DLPlatformPrompt)
, 发现请求网址API
可以拿到检测网站http://api.aistool.com/ftzs/system/getAll?paramKey=DLPlatformPrompt
使用Postman进行访问, 发现结果
其中http://lander.gc.com.cn/~preview/cn/campaign/ftldy.htm
就是看到的那个未知模拟器的网站
现在怀疑, 是否通过Header进行检测模拟器? 但是检查okhttp后并没有发现header, 于是我选择抓包进行验证
首先使用"未知模拟器", 抓包结果如图, 并没有Header
然后使用遁地模拟器, 发现根本没有这个请求, 说明这步并不是检测模拟器的核心, 而是获取模拟器广告的地方, 这里应该为一个开关如果返回的广告不为地址而为0, 说明不限制其他模拟器, 这里可以作为一个破解点, 即使其返回0, 但是我想看看其检测模拟器的原理, 于是继续追踪checkDeviceApi
由于JD没法正确解析, 只能读smali源码里, 下面是翻译的伪代码
private boolean mIsRfOrDD
this.mIsRfOrDD = TfloatHelp.isPass()
if (this.mIsRfOrDD) {startRunScript()
} else {if (android.os.Build.VERSION.SDK_INT != 0x13) {checkDeviceApi()}
}
追踪isPass()
, 发现ui.util.DundiUtils.isDunDi()
, 发现是通过shell getprop ro.hardware
里是否有遁地进行判断的, 进行测试
雷电模拟器:
遁地模拟器:
如何检测遁地模拟器到此明白了
0x3 解除限制
现在解除限制的方法很多
- 修改
checkDeviceApi()
, 将返回的广告改为0, 如果为0说明不做限制, 脚本照样能启动 - 修改
isPass()
, 让其检测自己为遁地模拟器
这里我选择第二种
在Lapp/ais/dev/TFloatWinService.smali
的7106
行
在这里, 将if-nez v0, :cond_2
改为goto :cond_2
, 于是代码变成
private boolean mIsRfOrDD
this.mIsRfOrDD = TfloatHelp.isPass()
if (true) {startRunScript()
} else {if (android.os.Build.VERSION.SDK_INT != 0x13) {checkDeviceApi()}
}
保存后回编译, 安装到模拟器内, 限制已被解除
android逆向笔记 -- 记一次解决飞天助手未知模拟器方法相关推荐
- Android 逆向笔记 —— 一个简单 CrackMe 的逆向总结
温馨提示 请拖动到文章末尾,长按识别「抽奖」小程序. 在我的印象中,懂逆向的,都是大牛,让我们一起来看看下面这位大牛的学习心得. 无意中在看雪看到一个简单的 CrackMe 应用,正好就着这个例子总结 ...
- Android逆向笔记-大部分内购游戏破解思路
最近出了几个Android逆向的笔记,CSDN审核不通过,在此不再做详细的笔记,仅是记录下思路,免得CSDN审核不通过. 这里以单机游戏为例,大部分是单机内购游戏. 2020-07-05 10:35: ...
- Android开发笔记(十三)视图绘制的几个方法
三个可进行绘制的方法 在自定义视图中,有三个函数可以重写用于界面绘制,在视图创建过程中,三个函数的执行顺序依次是:onLayout.onDraw.dispatchDraw. 1.onLayout(bo ...
- Android逆向笔记-Proguard混淆Android代码以及去打印日志信息
本笔记只记录其现象和功能,不记录具体怎么去用他. 这个Proguard全称应该是project guard,用来混淆Android代码的.如下未使用Proguard的类: 使用Proguard后: 这 ...
- Android逆向笔记-使用Android Studio调试Smali代码(方式二)
这里我使用Android Studio写了这样的一个程序: 这里我使用Android Studio写了这样的一个程序: 然后点下BUTTON后: 下面写下如何调试这种程序. 开发环境: win 10: ...
- Android逆向笔记-使用Android Studio调试Smali代码(方式一)
这里我使用Android Studio写了这样的一个程序: 然后点下BUTTON后: 下面写下如何调试这种程序. 开发环境: win 10: 使用的模拟器是雷神模拟器: Android Studio版 ...
- Android逆向笔记-通过配置文件设置全屏(逆向开发与正向开发)
这里就是最简单的项目: 源码打包下载: https://github.com/fengfanchen/AndroidReverse/tree/master/CrakDemo3 这里首先用逆向改配置文件 ...
- android逆向笔记,Android逆向分析笔记(1)
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 最近在读<Android软件安全与逆向分析>,虽然不从事逆向研究的工作,但作为一名Android开发者,觉得 ...
- 【android逆向笔记】(二)滚动的天空逆向
对滚动的天空游戏APP进行逆向 效果:可以无限购买. ps:参考教程 https://www.52pojie.cn/thread-632178-1-2.html 因为是初学,所以对一些代码方面就会笔记 ...
- Android逆向笔记(二) -- 破解AutoR的注册码验证
文章目录 0x0 前言 0x1 界面分析 0x2 反编译 0x3 破解 0x0 前言 此软件为练习用Crackme.apk 仅有验证逻辑 此软件不同于普通的Android软件, 是由Mono for ...
最新文章
- 使用rest_framework写api接口的一些注意事项(axios发送ajax请求)
- Spring @Transactional踩坑记
- guava和commons_使用Guava CharMatcher和Apache Commons Lang StringUtils确定字符串中字符或整数的存在...
- webpaper网页出题语言
- python全系列之爬虫scrapy_python爬虫scrapy之登录知乎
- CNNIC公告称半个月已处理不良网站域名万例
- Python不再为字符集编码发愁,使用chardet轻松解决你的困扰。
- SpringBoot核心注解@SpringBootApplication一二
- mysql查询表中名字包含某个字符_查询当前数据库中所有用户表中哪些字段包含某个字符串...
- iscsi:IO操作流程(五)——IO完成处理
- java webtable_java winform开发:JTable详解
- 目前用到的两个分页存储过程:
- HTML 空格转义符的用法
- Python基础 day2
- 蓝桥杯试题java_java蓝桥杯试题
- pngimg 可以商用吗_全球6大免费商用素材网!设计师必备!
- CodeForces 1009 D. Relatively Prime Graph(思维)
- SSB基准测试-ClickHouse
- 听说QQ扫码登录很难,办了它
- Python中一些少数人知晓且有趣的特性
热门文章
- Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks论文翻译
- php日志在哪,php日志在哪
- Chrome和360浏览器“无法翻译此网页”解决方法
- Pycharm 用鼠标滚轮控制字体大小
- Google搜索引擎算法研究
- 搜索引擎算法研究(一)
- android手机做电脑的显示器,怎样用手机当电脑显示器
- 3Dmax与BIM模型的区别
- windows 无法对计算机进行启动到,windows无法启动无法启动怎么办,windows无法启动的9种解决方法...
- windows系统更新失败无法启动的解决方法