过apk模拟器检测,关于特定模拟器检测蓝叠模拟器
在学习android逆向过程中,包括在实际接单过程中,都会有遇到关于模拟器检测的,今天搞到一个关于特定模拟器,比如蓝叠模拟器,关键文件检测,small代码分析,初次详细解释java代码,转换为small代码,详细解释过程,如有错误,忘各位大神点播,感激不尽。
{:301_971:}
首先我们来看java源代码!
//关键路径检测特定模拟器检测
private static String[] known_bluestacks = { "/data/app/com.bluestacks.appmart-1.apk",
"/data/app/com.bluestacks.BstCommandProcessor-1.apk",
"/data/app/com.bluestacks.help-1.apk",
"/data/app/com.bluestacks.home-1.apk",
"/data/app/com.bluestacks.s2p-1.apk",
"/data/app/com.bluestacks.searchapp-1.apk",
"/data/bluestacks.prop",
"/data/data/com.androVM.vmconfig",
"/data/data/com.bluestacks.accelerometerui",
"/data/data/com.bluestacks.appfinder",
"/data/data/com.bluestacks.appmart",
"/data/data/com.bluestacks.appsettings",
"/data/data/com.bluestacks.BstCommandProcessor",
"/data/data/com.bluestacks.bstfolder",
"/data/data/com.bluestacks.help",
"/data/data/com.bluestacks.home",
"/data/data/com.bluestacks.s2p",
"/data/data/com.bluestacks.searchapp",
"/data/data/com.bluestacks.settings",
"/data/data/com.bluestacks.setup",
"/data/data/com.bluestacks.spotlight",
"/mnt/prebundledapps/bluestacks.prop.orig"
};
public static boolean checkBlueStacksFiles() {
for (int i = 0; i < known_bluestacks.length; i++) {
String file_name = known_bluestacks;
File qemu_file = new File(file_name);
if (qemu_file.exists()) {
Log.e("Result:", "Find BlueStacks Files!");
return true;
}
}
Log.e("Result:", "Not Find BlueStacks Files!");
return false;
}
下面,我们打开killer 神器,直接定位到 checkBlueStacksFiles方法出,直接看small代码
贴上,所分析的small代码 ,希望给大家,在过模拟器检测的时候提供一个思路
.method public static checkBlueStacksFiles()Z #根据特定模拟器检测
.locals 5
.prologue
.line 239
const/4 v1, 0x0
.local v1, "i":I#i=0初始化
#java代码 i=0
:goto_0
sget-object v3, Lcom/qianyu/antiemulator/AntiEmulator;->known_bluestacks:[Ljava/lang/String;
#sget读取known_bluestacks 出来,设定的模拟器文件名称 保存在数组v3
array-length v3, v3 #在数组里面读取预设的文件信息 保存在v3
#
if-lt v1, v3, :cond_0 small代码 注释 lt小于 le 小于等于 ,跳转到cond_0
# 判断获取到的指定文件数量是否大于0 ,文件在上面有定义需要检测德文件
.line 247
const-string v3, "Result:" #定义一个数据 result 保存在v3
const-string v4, "Not Find BlueStacks Files!" #//定义一个数据Not Find BlueStacks Files!保存在v4
#对应java代码 Log.e("Result:", "Find BlueStacks Files!");
invoke-static {v3, v4}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I #调用一个 调用实例的静态方法 打印log日志信息
#对应java代码Log.e("Result:", "Not Find BlueStacks Files!");
.line 248
const/4 v3, 0x0#给v3 赋值0
#
:goto_1
return v3 # 返回0 表示没有检测到模拟器
.line 240
:cond_0
sget-object v3, Lcom/qianyu/antiemulator/AntiEmulator;->known_bluestacks:[Ljava/lang/String;
#sget读取指定的文件信息, v3是需要读取文件的名称,返回值是string类型
#small指令普及 sget 是读sput 写
#从引用数组到v0数组引用位置位于v3元素索引位于v1
aget-object v0, v3, v1#从对象引用数组获取一个对象引用到v0,对象数组的引用位于v3,需获取的元素的索引位于v1。
#类似于 a=b 读取出来数组里面的数据
.line 241
.local v0, "file_name":Ljava/lang/String;
new-instance v2, Ljava/io/File; #new 创建一个对象,
invoke-direct {v2, v0}, Ljava/io/File;-><init>(Ljava/lang/String;)V
#调用实例的直接方法 。传入v2v0v2等于的数组元素缩影的文件名称,v0 是"file_name"
#用"file_name" 函数查找 指定的文件返回值 是V
.line 242
.local v2, "qemu_file":Ljava/io/File;
invoke-virtual {v2}, Ljava/io/File;->exists()Z
#判断相关关键文件是否存在,存在就返回true不存在返回false 。
move-result v3#接受返回结果
if-eqz v3, :cond_1#判断返回值v3 是否为true如果是就表示程序在模拟器中运行
.line 243
const-string v3, "Result:"
const-string v4, "Find BlueStacks Files!"
invoke-static {v3, v4}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
.line 244
const/4 v3, 0x1#赋值为1 程序在模拟器中运行
#const/4 v3, 0x0
#这里可以直接把0x1 改成0 const/4 v3, 0x0 ,这样就算是检测到在模拟器运行,也返回0
goto :goto_1
.line 239
:cond_1
add-int/lit8 v1, v1, 0x1
goto :goto_0
.end method
不知所云,装X 直接发过检测教程吧 感谢楼主分享 关于样本下载链接!链接:https://share.weiyun.com/5WcjSYY 密码:acy3ib 如果此贴反馈效果好,评分多,下面我会在详细讲解基于 基于模拟器cpu信息的检测 检测手机上的一些硬件信息等相关文章,希望多多鼓励 我先来一贴,这个可以,现在很多都检测模拟器,不过我看不懂代码呀~~~尴尬 我不太懂 这个能直接使用在需要过检的游戏上面吗 比如刺激战场什么的 wto1322 发表于 2019-10-18 13:57
我先来一贴,这个可以,现在很多都检测模拟器,不过我看不懂代码呀~~~尴尬
看java代码,在看small代码 smail代码看不懂,但是如果把文件路径的数组(known_bluestacks )里的路径替换成一个空路径是不是就可以了呢? 强大,多谢楼主分享,不能看懂 向高手演习!