好友
阅读权限20
听众
最后登录1970-1-1
|
在学习android逆向过程中,包括在实际接单过程中,都会有遇到关于模拟器检测的,今天搞到一个关于特定模拟器,比如蓝叠模拟器,关键文件检测,small代码分析,
初次详细解释java代码,转换为small代码,详细解释过程,如有错误,忘各位大神点播,感激不尽。
首先我们来看java源代码!
//关键路径检测特定模拟器检测
[Asm] 纯文本查看 复制代码 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[i];
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代码 ,希望给大家,在过模拟器检测的时候提供一个思路
[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;-><init>(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
|
免费评分
-
查看全部评分
|