这段时间在做ROM的预制应用,在预制应用之前,应用需要过Google的cts检测,过检测之前,还需要对apk进行病毒扫描,结果扫出了病毒,于是我就进行了长久的排毒工作。
具体如何进行排毒,我在给apk清理病毒!详细的阐述了。先将apk进行解压,删除认为有病毒的文件,然后再打包去检测,面对如此庞大的文件,可能是1000,甚至更多,我该如何快速的找到病毒所在呢?
答案就是二分查找
忘记二分查找的同学,我们一起来复习下。
二分查找的框架:
int binarySearch(int[] nums, int target) {
int left = 0, right = ...;
while(...) {
int mid = (right + left) / 2;
if (nums[mid] == target) { //找到了!!!!
...
} else if (nums[mid] < target) {//往左边搜索
left = ...
} else if (nums[mid] > target) { //往右边搜索
right = ...
}
}
return ...;
}
前提:查找对象是有序的
为了更加清晰帮助你理解二分查找,我画个图,下图是从[1,2,3,4,5,6,7,8,9,10]中找到3的全过程。
下面是Python 版的二分查找实现:
def binary_search(data_list, target):
left = 0;
right = len(data_list)
while left < right:
mid = int((left + right) / 2) # 每次left,和right变化是,都要重新计算mid,否则会陷入死循环。
if data_list[mid] == target:
return mid
elif data_list[mid] < target: # 若目标值大于中间值,需要往右查找。
left = mid + 1
print("right")
elif data_list[mid] > target: # 若目标值小于中间值,需要往左查找。
right = mid - 1
print("left")
print(left, right, target)
d_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(binary_search(d_list, 3))
给定一个数组,找到指定数,我们最多需要几次呢?
l o g 2 ( n ) log_2(n) log2(n)
其中n为数组的大小
数组大小为100,则需要 l o g 2 ( 100 ) = 6.64 log_2(100)=6.64 log2(100)=6.64,最多7次就能够找到,相比较100次,效率是不是提升很多。
这个数字怎么算出来的呢?
第1次: n / 2 n/2 n/2
第2次: n / 4 n/4 n/4
第3次: n / 8 n/8 n/8
第4次: n / 16 n/16 n/16
第i次: n / ( 2 i ) n/(2^i) n/(2i)
n / ( 2 i ) = 1 n/(2^i)=1 n/(2i)=1
求 得 i = l o g 2 ( n ) 求得 i=log_2(n) 求得i=log2(n)
言归正传
了解了二分查找,工作量就少了很多。
通过apk_tool工具对APP进行解压,你会发现有很多文件夹,但是病毒一般会藏在smali文件内,给我减少了不少的工作。但是在smali中又有很多文件,怎么办?采用二分查找思想进行快速定位病毒。
1.先将smali的文件一分为二,为A和B,删除A,打包,上传virustotal网站进行病毒检测,若发现,说明在病毒在A,然后对A进行二分查找,否则在B里面进行二分查找 。
2.假如病毒B在的文件夹中,那么就把B再一份为二,上传到网站上,检测病毒。
3.以此类推,知道找到病毒所在。