利用二分查找精准的找到病毒所在的文件

这段时间在做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.以此类推,知道找到病毒所在。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术人Howzit

钱不钱的无所谓,这是一种鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值