文章目录

  • 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.smali7106


在这里, 将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逆向笔记 -- 记一次解决飞天助手未知模拟器方法相关推荐

  1. Android 逆向笔记 —— 一个简单 CrackMe 的逆向总结

    温馨提示 请拖动到文章末尾,长按识别「抽奖」小程序. 在我的印象中,懂逆向的,都是大牛,让我们一起来看看下面这位大牛的学习心得. 无意中在看雪看到一个简单的 CrackMe 应用,正好就着这个例子总结 ...

  2. Android逆向笔记-大部分内购游戏破解思路

    最近出了几个Android逆向的笔记,CSDN审核不通过,在此不再做详细的笔记,仅是记录下思路,免得CSDN审核不通过. 这里以单机游戏为例,大部分是单机内购游戏. 2020-07-05 10:35: ...

  3. Android开发笔记(十三)视图绘制的几个方法

    三个可进行绘制的方法 在自定义视图中,有三个函数可以重写用于界面绘制,在视图创建过程中,三个函数的执行顺序依次是:onLayout.onDraw.dispatchDraw. 1.onLayout(bo ...

  4. Android逆向笔记-Proguard混淆Android代码以及去打印日志信息

    本笔记只记录其现象和功能,不记录具体怎么去用他. 这个Proguard全称应该是project guard,用来混淆Android代码的.如下未使用Proguard的类: 使用Proguard后: 这 ...

  5. Android逆向笔记-使用Android Studio调试Smali代码(方式二)

    这里我使用Android Studio写了这样的一个程序: 这里我使用Android Studio写了这样的一个程序: 然后点下BUTTON后: 下面写下如何调试这种程序. 开发环境: win 10: ...

  6. Android逆向笔记-使用Android Studio调试Smali代码(方式一)

    这里我使用Android Studio写了这样的一个程序: 然后点下BUTTON后: 下面写下如何调试这种程序. 开发环境: win 10: 使用的模拟器是雷神模拟器: Android Studio版 ...

  7. Android逆向笔记-通过配置文件设置全屏(逆向开发与正向开发)

    这里就是最简单的项目: 源码打包下载: https://github.com/fengfanchen/AndroidReverse/tree/master/CrakDemo3 这里首先用逆向改配置文件 ...

  8. android逆向笔记,Android逆向分析笔记(1)

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 最近在读<Android软件安全与逆向分析>,虽然不从事逆向研究的工作,但作为一名Android开发者,觉得 ...

  9. 【android逆向笔记】(二)滚动的天空逆向

    对滚动的天空游戏APP进行逆向 效果:可以无限购买. ps:参考教程 https://www.52pojie.cn/thread-632178-1-2.html 因为是初学,所以对一些代码方面就会笔记 ...

  10. Android逆向笔记(二) -- 破解AutoR的注册码验证

    文章目录 0x0 前言 0x1 界面分析 0x2 反编译 0x3 破解 0x0 前言 此软件为练习用Crackme.apk 仅有验证逻辑 此软件不同于普通的Android软件, 是由Mono for ...

最新文章

  1. 使用rest_framework写api接口的一些注意事项(axios发送ajax请求)
  2. Spring @Transactional踩坑记
  3. guava和commons_使用Guava CharMatcher和Apache Commons Lang StringUtils确定字符串中字符或整数的存在...
  4. webpaper网页出题语言
  5. python全系列之爬虫scrapy_python爬虫scrapy之登录知乎
  6. CNNIC公告称半个月已处理不良网站域名万例
  7. Python不再为字符集编码发愁,使用chardet轻松解决你的困扰。
  8. SpringBoot核心注解@SpringBootApplication一二
  9. mysql查询表中名字包含某个字符_查询当前数据库中所有用户表中哪些字段包含某个字符串...
  10. iscsi:IO操作流程(五)——IO完成处理
  11. java webtable_java winform开发:JTable详解
  12. 目前用到的两个分页存储过程:
  13. HTML 空格转义符的用法
  14. Python基础 day2
  15. 蓝桥杯试题java_java蓝桥杯试题
  16. pngimg 可以商用吗_全球6大免费商用素材网!设计师必备!
  17. CodeForces 1009 D. Relatively Prime Graph(思维)
  18. SSB基准测试-ClickHouse
  19. 听说QQ扫码登录很难,办了它
  20. Python中一些少数人知晓且有趣的特性

热门文章

  1. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks论文翻译
  2. php日志在哪,php日志在哪
  3. Chrome和360浏览器“无法翻译此网页”解决方法
  4. Pycharm 用鼠标滚轮控制字体大小
  5. Google搜索引擎算法研究
  6. 搜索引擎算法研究(一)
  7. android手机做电脑的显示器,怎样用手机当电脑显示器
  8. 3Dmax与BIM模型的区别
  9. windows 无法对计算机进行启动到,windows无法启动无法启动怎么办,windows无法启动的9种解决方法...
  10. windows系统更新失败无法启动的解决方法