android逆向奇技淫巧四:模拟器检测和反检测
对于逆向人员而言,很多时候分析app是需要抓包和调试的,一般都会选中模拟器,而不是真机,主要是因为模拟器成本低,而且不用担心app损坏真机(部分app通过色情、赌博等内容诱导用户安装,然后把手机做成肉鸡、挖矿机等,这就是所谓的“看片一时爽,手机火葬场”);但很多黑灰产app也不是吃素的,内置了大量检测模拟器的功能,一旦发现app被安装在了模拟器,直接退出。所以用模拟器分析和调试的第一步就是干掉模拟器检测,让app在模拟器中正常运行;本文介绍几种常见的模拟器检测逻辑和过模拟机检测的方法;
先在模拟器安装app,然后选择登陆游戏,弹出如下界面:
用jadx-gui打开,然后用模拟器作为关键词搜索,啥都没有,所以这里的提示有可能是图片,也有可能是服务器返回的,也有可能在so层;
换其他关键字试试,结果如下:第二个刚好出现在了屏幕上,感觉靠谱,进去看看了:
发现这是一个if的条件选择,中间那个提示刚好是我们在屏幕上看到的;但由于混淆很严重,存粹分析这些代码很难读懂背后的业务意义(java语法大家肯定都懂,但更重要是理解这些代码的业务意义,也就是这些代码实现了什么功能),只能另辟蹊径!
既然是模拟器,肯定有自己个性化的特征,不可能和真机一摸一样,比如cpu:模拟器一般都是x86架构的,真机是arm的;还有蓝牙、通信录、短信等模拟器都不具备,这些都是比较明显的特征;具体的模拟器检测代码和思路,请见文章末尾的参考连接;这里用几个检测代码继续搜索试试,比如:
- 这里检测cpu的信息:
右键方法名称,选择查找用例,发现一个引用都没有,显然是不正常的,估计是jadx-gui的bug,这里选择android-killer继续尝试:找到方法定义的地方,右键方法名,选择“查看方法引用”,还真找到了:
直接进入这个activity,发现在onCreate方法内部调用了上述cpu的检测办法,
进入android-killer,把if这段代码选中,删除,然后回编译成apk:
如果对smali语法不熟,担心改错,也可以直接把intel和amd这两个原始的字符串改成其他的,让if的逻辑和以前相反也行:
再次安装就不会看到使用模拟器的提示了!最后末尾的参考链接是模拟器检测方法和思路,建议感兴趣的小伙伴多看看!
另外:附上常见的android反调试方法总结:
参考:
1、https://titanwolf.org/Network/Articles/Article?AID=4def465f-a492-49e4-a10e-04ca53a6d107#gsc.tab=0
2、https://github.com/strazzere/anti-emulator/issues/7
3、http://www.shirlman.com/tec/20160605/419
4、https://juejin.cn/post/6844903637840297998
5、http://zeng9t.com/tech/2019/04/30/Android%E6%A8%A1%E6%8B%9F%E5%99%A8%E6%A3%80%E6%B5%8B%E5%8F%8A%E5%AF%B9%E6%8A%97%E6%96%B9%E6%B3%95.html