过模拟器检测之新手简单逆向

文章来源:补丁网 时间:2019-07-15 18:41

将文件拖到AndroidKill中


首要查找BLUETOOTH,由于蓝牙是特别简单做到的过检测技能。(我在刺进代码时没找到刺进smali的.....)



1279    invoke-static {}, Landroid/bluetooth/BluetoothAdapter;->getDefaultAdapter()Landroid/bluetooth/BluetoothAdapter;
1281    move-result-object v0
1283    if-nez v0, :cond_10
1285    move v0, v1


查找蓝牙,在进口activity文件中得到如上代码。剖析:::获取蓝牙实例,成果给v0,假如v0不等于0跳转cond_10。猜想需求跳转验证,假如不跳转则凉凉,将v1给v0必定判别为模拟器了。


来到cond_10处(运用查找功用可抵达)
2173    invoke-virtual {v0}, Landroid/bluetooth/BluetoothAdapter;->getName()Ljava/lang/String;
2175    move-result-object v0
2177    invoke-static {v0}, Landroid/text/TextUtils;->isEmpty(Ljava/lang/CharSequence;)Z
2179    move-result v0
2181    if-eqz v0, :cond_11

剖析:::从v0中获取蓝牙称号的字符串,成果给v0。从v0中获取字符串是否为空。成果给v0。这儿办法应该回来一个boolen值。假如是真机就应该为假。 假如v0为假,跳转到cond_11。
查找cond_11发现其内容为
2188    move v0, v2
2190    goto/16 :goto_2 
剖析:::v2,给v0。所以这个v2是什么呢。接着向上跳转到goto_2。
前面有个v1给v0则判别为模拟器的猜想。这儿又有一个v2给v0判别为真机的猜想。以及
2183    move v0, v1    
2185    goto/16 :goto_2
假如未建立v1仍是要给v0。所以v1应该代表模拟器。v2代表真机。
回到goto_2以及和上面的连在一起看
1285    move v0, v1
1287    :goto_2
1288    if-eqz v0, :cond_12
此处是两种状况运转的集合点,全体的状况是模拟器会一向向下运转,直到1288行;而真机会经屡次跳转,运转到1288行跳转到cond_12去。(在此之前,我在蓝牙处向上找,在1142 和 1146处看到了 const/4 v2, 0x0    ;  const/4 v1, 0x1)所以在这儿判别出会跳转到cond_12。之后又进入其他的分支,不过都不重要了,由于咱们现已知道,在1287处v0=v1代表模拟器,v0=v2代表真机。


蓝牙状况算是剖析完了,从蓝牙往上看,看到几个字符串,分别是intel,amd,sensor。这些在andkill里边都是赤色的,很好看出来,意思也十分显着,假如看了上面csdn的文章敏感度也比较高。再往上面走便是安卓惯例的create了。所以模拟器检测有很大的可能性只要三种。即蓝牙,传感器,和cpu信息。
1330    const-string v4, "intel"
1232    invoke-virtual {v0, v4}, Ljava/lang/String;->contains(Ljava/lang/CharSequence;)Z
1234    move-result v4
1236    if-nez v4, :cond_0
1238    const-string v4, "amd"
1240    invoke-virtual {v0, v4}, Ljava/lang/String;->contains(Ljava/lang/CharSequence;)Z
1242    move-result v0
1244    if-eqz v0, :cond_e
CPU处是这样的,剖析:::1236处 判别v0中是否有intel 有则赋值给v4;v4不等于0跳转。猜想v4为真即模拟器。1244处判别v0中是否有amd 有则赋值给v0;v0等于0跳转。。。。猜想v0为真持续履行,就和intel相同,即模拟器。 跳转后cond_e即为真机。
cond_e处    2159    :cond_e              2160    move v0, v2(之后又跳转回来)    与之前cond_0处1246    :cond_0      1247    move v0, v1  很显着了仍是v1应该代表模拟器。v2代表真机。
跳转回来时1249    :goto_0      1250     if-nez v0, :cond_1      假如是模拟器则跳转到cond_1去履行其他分支。(这个分支好像是在写入字符串,可能是在为发送信息做准备,不过现在不需求了解) 在查找cond_1时发现了1277处也跳转到了cond_1。1277离1250好久,能够留心一下。


CPU也剖析完了,找到传感器,依据方才的经历。。。。。经历没有用了这儿我不怎么看得懂了,大约意思是获取了传感器,然后进行了跳转等等。不过有个好消息是我看到了1277处的cond_1,所以同理,模拟器才跳转,真机应该向下履行。向下便是判别蓝牙,感觉思路挺正确的。所以这儿,假如你用模拟器,就不能让它跳转。


检测整个进程便是1.CPU信息,2.传感器信息,3.蓝牙信息。有一项不满足都判定为模拟器。


因此在smali上修正。1285 v1->v2 ; 2183 v1->v2 ;  1247 v1->v2;  1277   ifnqz->if-eqz;最终编译即可。


过模拟器成功标志,在模拟器上能进入战役。
仅以此篇留念我第一次逆向到达方针。未来加油!

更多

猜你喜欢