Fireyer 是为了校验我们的虚拟化环境构建是否存在缺陷,可以保障我们的每次更新的产品质量,提升开发效率。
项目已开源:
☞ Github:https://www.github.com/iofomo/fireyer ☜
如果您也喜欢 Fireyer,别忘了给我们点个星。
1. 说明
fire
+ eyer
= Fireyer
(火眼),Fireyer
项目是我们在做虚拟化沙箱产品过程中的内部副产品。目的是为了校验我们的虚拟化环境构建是否存在漏洞,在内部作为我们产品的黑白检测工具应用,可以保障我们的每次更新的产品质量,提升开发效率。对于开发沙箱,虚拟化等相关场景产品的伙伴也可以提升开发效率,快速验证功能稳定性。Fireyer
的检测项还在不断完善中,后续会持续同步更新。
由于我们的虚拟化产品是普通主流机型,因此Fireyer
主要用于在正常系统环境下,检测应用被重打包(或重签名),容器环境(免安装加载运行),虚拟机(将Android
系统变成普通应用)的通用个人手机场景。Fireyer
当前并不适用于定制ROM
,或刷入Magisk
,或ROOT
的环境检测(当然由于技术的相关性,其中某些检测项可能生效,但并非针对性用例),但也在我们后续的迭代计划中。
2. 如何使用
Fireyer
项目的主要目的是为了提升我们产品的稳定性,并非为了应用的强对抗,只是为了保证正常的应用行为运行稳定。
我们自测的方法:
- 在正常的 应用环境中,点击
单元测试【原始环境】
,Fireyer
会将运行完成的用例数据格式化保存在系统的剪切板中备用。 - 在虚拟的测试环境中,点击
单元测试【虚拟环境】
,Fireyer
会从系统的剪切板中获取测试数据,然后与当前运行用例结果进行对比,最终得到测试验证的目的。
3. 系统调用实现
为了可以实现对inline
和got
表的拦截检测,我们需要实现一些基本函数的系统调用,如:
int open(const char *pathname, int flags, ...);
int close(int fd);
int stat(const char* path, struct stat* buf);
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
ssize_t readlink(const char *path, char *buf, size_t bufsiz);
系统调用的方式如何实现呢,有个简单的办法就是将手机里面的libc.so
库导出来(这里导出的64位的库),然后用ida
打开,查看对应函数的实现,如open
的实现如下:
这样我们得到openat
在64位系统上的系统调用的实现方式:
__attribute__((__naked__)) int svc_openat() {
__asm__ volatile("mov x15, x8\n"
"ldr x8, =0x38\n"
"svc #0\n"
"mov x8, x15\n"
"bx lr"
);
}