1.用于侦测恶意软件的老把戏:分治算法
绕过基于静态特征码(如CRC或简单模式匹配算法) 的反病毒扫描器的最古老技巧是: 把文件分成细小的若干部分,然后对这些部分逐一分析。将样本文件分成若干部分以后,其中仍然会触发反病毒扫描器的检测告警的部分,就是接下来为了绕过反病毒软件需要修改的部分。虽然这听起来十分幼稚,而且大多数情况下可能都不管用,但是如果反病毒软件使用的是基于校验和的特征码算法或是简单特征匹配检测算法,就会十分有用了。但在研究和测试过程中,根据样本文件格式的不同,需要有针对性地作出调整。比如,如果要让一个PE文件绕过反病毒软件的检测.将PE文件分成若干部分可能会有效,因为反病毒引擎肯定会首先校验样本文件是否是PE文件。当PE文件分为不同的数据块后,可能会丢失有效的PE文件头;因此,反病毒软件就不会再查杀样本文件了。在这里可以使用类似的方法,但与前面将样本文件拆分为不同数据块的方式不同这里我们将文件拆分成大小递增的小部分: 第一个文件包含偏移量为0-256字节的字节码区块.接下来的文件包含偏移量为0-512字节的字节码区块,以此类推。
如果新创建的文件被反病毒软件侦测到,就能推测出样本文件是在哪一块以及在哪处偏移被反病毒软件查杀到的。打个比方,如果样本文件在带有偏移量为2048的数据块时被查杀,这时候可以继续一个字节一个字节地拆分文件,直到最终找出匹配特征对应的偏移量( 也可以使用十六进制编辑器打开文件,查看文件中是否有特殊的区域,比如特定的字节排列,然后手动进行相关修改),按照上述步骤进行测试后,你就能知道样本中的哪个偏移量触发了扫描器的告警。同时你需要去猜测样本在缓冲区中是如何被反病毒软件识别出来的。在90%的情况下,原因很简单.扫描器使用的是基于模糊散列(即CRC )算法或模式匹配技术,抑或是两者结合的特征码查杀技术。在一些情况下,反病毒软件通过加密散列(针对整个文件或者某,数据块) 来查杀侦测样本,很有可能是通过校验MD5值。在这种情况下,你自然而然地需要更改文件内容的一部分或者特定数据块,同时由于用于识别文件的加密散列的单一性,文件的散列值会因为改动而变更,最终导致反病毒软件无法查杀更改过的样本文件,从而绕过了反病毒软件。
例如:使用样本的MD5为8834639bd8664aca00b5599aaab833ea,该样本目前已经没有攻击性
$ clamscan -i 8834639bd8664aca00b5599aaab833ea
通过执行上面命令样本可以被查杀,现在为了绕过ClamAV的查杀使用一个Python脚本将文件拆分为递增的若干部分:每次以256字节递增地从文件中提取代码部分
#!/usr/bin/python
import os
import sys
import time
def log(msg):
print(“[%s] %s” % (time.asctime(), msg))
class csplitter:
def _init_(self,filename):
self.buf = open(filename,”rb”)).read()
self.block_size = 256
def aplit(self,directory):
blocks = len(sef.buf) / self.block_size
for i in xrange(1,blocks):
buf = self.buf[:i*self.block_size]
path = os.path.join(directory,”block_%d” % i)
log(“writing file %s for block %d (until offset 0x%s)” % \(path,i,self.bolk_size * i))
f = open(path,”wb”)
f.write(buf)
f.close()
def main(in_path,out_path):
splitter = csplitter(in_path)
splitter.split(out_path)
def usage():
print(“usage: “,sys.argv[0],”<in file> <directory>”)
if _name_ == “_main_”:
if len(sys.argv) !=3:
usage()
else:
main(sys.arbv[1],sys.argv[2])
执行python split.py file directory,按照上述思路生成若干稍小的文件,知道递增到原始样本文件最终的偏移量处:
$ python split.py 8834639bd8664aca00b5599aaab833ea blocks/
脚本生成完毕后,再启动clamscan反病毒扫描工具对样本文件所在目录进行扫描,使用十六进制编辑器打开刚刚生成的blocks/block_2文件,观察结果会注意到:从原始文件中取出的数据块中的<iframe>标签。我们可以据此得出一个合理的猜测:反病毒扫描器的特征码查杀过程,似乎是通用基于iframe的特征码进行的,其过程是匹配查找<iframe>标签,且可能是 一些标签属性。那要如何修改HTML标签或是其对应的属性,来使样本绕过反病毒软件的查杀呢? 首先试着将<iframe src= "..."修改为<iframe src= '...'。虽然这看起来很简单,只是将双引号改成了单引号,但在某些情况下是有效的。修改完成后,扫描一下试试,结果会发现没有什么效果 ̄□ ̄||
接下来,换另一个方式试试,删除uiframe标签的style="visibility:hidden"属性。通过对比,可以发现这也是一个很简单的修改,可以通过diff查看不同之处:
$ diff modified_block block/block_2
再次运行clamscan扫描的时候就会发现,扫描器已经无法识别检测刚刚修改过的样本文件.现在,只需要根据 上面的发现,修改原样本文件,删除文件中的空格,就可以绕过扫描器的侦测了 ( 很显然,我们同时发现了通用的绕过ClamAV针对iframe类恶意软件样本的通用侦测策略 )。
2.二进制指令和污点分析
进制指令分析是在指令层面监控某一程序的行为。污点分析是当数据被fread或recv等函数读取后,去跟踪探究数据流,并判断传入的数据是如何影响代码流程的。污点分析程序是程序分析中备受欢迎的一种方法,可以使用不同的二进制指令工具集来编写。一些二进制指令工具包可以免费下载,比如闭源的IntelPIN和开源的DynamoR10,并且可以用于调试测试程序,比如反病毒软件的命令行扫描器。你可能想针对你得心应手的二进制指令工具集采用更为复杂的污点分析模块,自动而优雅地追踪传入值的来源 (恶意软件样本的字节),并了解数据是如何传递的.以及最终样本是如何被侦测到的。但是建议你最好不要这么做,原因自行搜索这里不多说。