yutao531315 发表于 2019-10-18 13:33

过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















Antigen 发表于 2019-10-18 16:27

不知所云,装X

8204118 发表于 2019-10-18 18:14

直接发过检测教程吧

赤〆夜 发表于 2019-10-18 15:58

感谢楼主分享

yutao531315 发表于 2019-10-18 13:34

关于样本下载链接!链接:https://share.weiyun.com/5WcjSYY 密码:acy3ib

yutao531315 发表于 2019-10-18 13:36

如果此贴反馈效果好,评分多,下面我会在详细讲解基于   基于模拟器cpu信息的检测      检测手机上的一些硬件信息等相关文章,希望多多鼓励

wto1322 发表于 2019-10-18 13:57

我先来一贴,这个可以,现在很多都检测模拟器,不过我看不懂代码呀~~~尴尬

wind941 发表于 2019-10-18 13:59

我不太懂 这个能直接使用在需要过检的游戏上面吗 比如刺激战场什么的

yutao531315 发表于 2019-10-18 14:08

wto1322 发表于 2019-10-18 13:57
我先来一贴,这个可以,现在很多都检测模拟器,不过我看不懂代码呀~~~尴尬

看java代码,在看small代码

FoundWay 发表于 2019-10-18 14:14

smail代码看不懂,但是如果把文件路径的数组(known_bluestacks )里的路径替换成一个空路径是不是就可以了呢?

gaoxiaoyan 发表于 2019-10-18 15:01

强大,多谢楼主分享,不能看懂

hu007 发表于 2019-10-18 15:56

向高手演习!
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 过apk模拟器检测,关于特定模拟器检测蓝叠模拟器