[Asm] 纯文本查看 复制代码.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[1] 读取出来数组里面的数据
.line 241
.local v0, "file_name":Ljava/lang/String;
new-instance v2, Ljava/io/File; #new 创建一个对象,
invoke-direct {v2, v0}, Ljava/io/File;->(Ljava/lang/String;)V
#调用实例的直接方法 。传入v2 v0 v2等于的数组元素缩影的文件名称,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