看我若何逆向卡巴斯基引擎实现对秘密文件的检测
在本文中,我们将详细介绍若何逆向一个流行的反病毒引擎,并对其停止“扩展”。在创建新的反病毒特征值(Anti-virus Signature)之后,就能够通过杀毒软件来对我们指定的秘密文件实现主动检测。布景
在抵御歹意代码的耐久战中,反病毒产物占据了主力地位。然而有趣的是,那些反病毒产物的特点往往与高级收集谍报监控东西的特点有许多配合之处。例如,耐久性、可扩展性、高级扫描才能、自我防御机造等,详细如下:
1、耐久性:反病毒产物需要确保其可以始末运行,凡是会将一些根底组件隐藏在比常规用户更高级此外位置。
2、扫描:反病毒产物设想的目标,就在于监测并扫描全数文件,包罗文档那类不成施行的文件。
3、主动更新:反病毒产物经常需要主动更新各类组件,例如最新的特征库,那些组件会以不通明的体例停止功用上的扩展,即凡是所说的“更新病毒库”。
4、上传文件:反病毒产物可能会上传可疑文件,以停止进一步阐发。
5、自我防御和反阐发机造:反病毒产物凡是会接纳先辈的自我防御机造,来防备逆向工程阐发。
在那里,我们重点存眷反病毒特征值。我们所研究的特征值应该具有如下特点:
1、每天更新;
2、以加密体例传输,而且以加密体例保留在磁盘上;
3、面向特定地域或特定客户端,停止有针对性的更新;
4、独立存在,不包罗在反病毒产物的源代码之中。
换而言之,若是要阐发具有上述特征的特征值,能够说是一个相当复杂的使命。那么,能否存在一种可能,让我们将反病毒产物当做完美的收集谍报监控东西来利用?
在比来的新闻中,我们看到:有人责备出名收集平安公司卡巴斯基旗下的反病毒软件,会检测NSA的秘密文档,并将其泄露给俄罗斯。那个新闻使我面前一亮。当然,我不想对那一事务颁发评论,但是我十分猎奇,能否能够从手艺上实现那一点。
详细而言,我想测验考试一下能否在不修改可施行代码的前提下,能否可以将文档的特征值添加到卡巴斯基反病毒产物之中,从而让反病毒引擎帮忙我们主动检测秘密文档,并对其停止标识表记标帜,从而帮忙我们获得那些文档。
我的目的十分简单:对卡巴斯基产物停止逆向阐发,从而掌握其原理。而且创建一个新特征值,用于标识表记标帜秘密文件。
对卡巴斯基的阐发过程我们将针对macOS系统上最新版本的卡巴斯基收集平安软件停止阐发。鄙人载之后,我们停止安拆,它会安拆多种组建,此中包罗内核扩展组件、守护历程组件以及各类用户组件。
$ ps aux | grep -i kaspersky root 975 /Library/Application Support/Kaspersky Lab/KAV/Binaries/kav -r -bl user 1599 /Applications/Kaspersky Anti-Virus For Mac.app/Contents/MacOS/kav_app user 1116 /Library/Application Support/Kaspersky Lab/KAV/Applications/Kaspersky Anti-Virus Agent.app/Contents/MacOS/kav_agent我们能够停止大致对守护历程停止分类(/Library/Application Support/Kaspersky Lab/KAV/Binaries/kav),找到负责病毒扫描及检测逻辑核心的代码,并将其做为我们要逆向的目的。
当前的反病毒产物十分复杂,而卡巴斯基可能是此中最为复杂的一个。因而,要胜利掌握其对特征值的检测体例和扫描逻辑,是一个十分具有挑战性的使命。但幸运的是,在那个世界上还有像29A、VXer、z0mbie如许的大神们和《Antivirus Hacker’s Handbook》(做者:Joxean Koret)如许的教程存在,我们要出格感激他们所供给的帮忙!
虽然安拆法式附带了内置的特征值,但与其他反病毒软件不异,卡巴斯基反病毒引擎会按期查抄新的特征值并停止更新。
让我们认真研究一下那个过程。
当新的特征值可用时,会由kav守护历程从卡巴斯基更新办事器(例如http://dnl-03.geo.kaspersky.com)停止下载:
关于上述信息,不要觉得奇异,因为那些特征值已经以特定的体例停止了压缩和加密。
当客户端收到更新的内容后,起首会将特征值存储在/private/tmp/temporaryFolder/updates/kdb/i386/文件夹中,然后安拆
# fs_usage -w -f filesystem 05:51:32.804433 stat64 /private/tmp/temporaryFolder/updates/kdb/i386/base010c.kdc 0.000003 kav.11742 05:51:32.804440 open F=80 (R_____) /private/tmp/temporaryFolder/updates/kdb/i386/base010c.kdc # tail -f /Library/Logs/Kaspersky\ Lab/kav_daemon_2017-11-01-091336_pid_02464.log 05:53:01.704 13365 INF updater [updater_facade_ai.cpp:345] Publishing journal event with code: 1408419436, core code: 107, defaultLocalization: File updated, param1: /Library/Application Support/Kaspersky Lab/KAV/Bases/KLAVA/base011b.kdc, param2: 05:53:02.277 11764 INF bl [ReportsWriter] sqlite query processed: insert into "UpdaterFileUpdatedEvent" values (6159,0,/Library/Application Support/Kaspersky Lab/KAV/Bases/KLAVA/base011b.kdc,13); 05:53:02.277 11764 INF bl [ReportsWriter] sqlite query processed: insert into "UpdaterFileUpdatedEvent" values (6160,0,/Library/Application Support/Kaspersky Lab/KAV/Bases/KLAVA/base011c.kdc,13); # hexdump -C /private/tmp/temporaryFolder/updates/kdb/i386/base010c.kdc 00000000 55 50 44 53 cc 65 02 00 00 00 02 00 1f 8b 08 00 |UPDS.e..........| 00000010 00 00 00 00 00 0b 74 9d 07 d8 db d4 f9 f6 83 1d |......t.........| 00000020 c8 09 a3 ec b4 10 66 28 ab ac 24 8c b0 21 83 0c |......f(..$..!..| 00000030 32 08 49 08 10 a6 24 cb b6 3c 24 db f2 26 6c 08 |2.I...$..<$..&l.| 00000040 7b af b0 cb 86 b2 09 1b ca 0a a3 94 51 f6 0a a5 |{...........Q...| 00000050 ec b2 f7 28 04 c8 f7 bb e5 a4 7f 4e bf 8b 5c 97 |...(.......N..\.| 00000060 6e 59 ef 6d eb 3c 92 ce 39 cf 3c ca f8 51 23 87 |nY.m.<..9.<..Q#.| 00000070 f4 e9 b3 64 9f 5f ff db 80 83 cb fd 54 b2 1d b7 |...d._......T...|在守护历程运行时,似乎那些特征值会存储在kavbase_00000000缓存文件中。举例来说,在那里我们就能够找到EICAR特征值(欧洲反计算机病毒协会用于测试的特征值)“X5O!P%@AP[4PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*h”:
# grep -r EICAR-STANDARD-ANTIVIRUS-TEST /Library/Application\ Support/Kaspersky\ Lab/ Binary file /Library/Application Support/Kaspersky Lab//KAV/Bases/Cache/kavbase_00000000 matches # strings -a /Library/Application Support/Kaspersky Lab//KAV/Bases/Cache/kavbase_00000000 .. X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*h通过lsof号令,我们能够确认卡巴斯基守护历程已经翻开了那个文件:
# lsof -p 508 | grep kavbase_00000000 kav 975 root /Library/Application Support/Kaspersky Lab/KAV/Bases/Cache/kavbase_00000000 kav 975 root /Library/Application Support/Kaspersky Lab/KAV/Bases/Cache/kavbase_00000000.lck_00000002此前,研究人员们(好比z0mbie)针对卡巴斯基特征值所专有的文件格局,已经编写过一个能够对其停止解密息争压缩操做的解析器。但是那些东西只要Windows版本,而且可能已经有一些过时。虽然我们有才能将那些东西移植到macOS系统上,同时也能够对其停止更新,但是我仍是决定采纳更简单的体例来实现,即在内存中对特征值停止修改操做。虽然那种办法其实不具有耐久性,但它却能完全绕过破解卡巴斯基特有文件格局的那一过程,最末殊途同归——能够让我们胜利创建一个能检测秘密文档的特征值。
为了实现我们的目的,目前为行我们已经晓得加密后的特征值是从卡巴斯基办事器上下载的,并在安拆之后由其守护历程kav来利用。我们能够创建一个文本文件,在此中写入EICAR特征值,封闭文件并保留(例如能够存为test.txt),以此来证明kav的感化。
# fs_usage -w -f filesystem 07:07:13.240475 open F=83 (R_____) /Users/user/Documents/test.txt kav.4343 07:07:13.242416 read F=83 B=0x44 kav.4343 07:07:17.597921 unlink /Users/user/Documents/test.txt kav.4343我们很容易发现,kav会翻开该文件,并读取整个文件(共有0x44字节),逐字节对其停止扫描,一旦检测到婚配某条特征值后,就会立即将其删除。
在处置另一个文档(dontScanMe.rtf)的过程中,我们发现,当文档被修改时,卡巴斯基也会翻开该文档并读取其内容,我们揣测可能是为了扫描此中能否被添加了新的歹意内容:
# fs_usage -w -f filesystem 09:21:42.208362 open F=82 (R_____) /Users/user/Desktop/dontScanMe.rtf kav.4343 09:25:00.937012 lseek F=82 O=0x00000000 kav.4343 09:25:00.937032 read F=82 B=0x15d kav.4343除了确认kav确实是施行扫描的组件以外,我们在此次尝试中,还确认了卡巴斯基会主动扫描全数文档,以查找存在风险的形式。
当然,扫描具有歹意形式的文件也是反病毒产物的职责之一。所以从逻辑上来看,反病毒产物应该对可能被歹意操纵或包罗歹意代码的文档停止检测。所以,它扫描文档的那一行为不该该被量疑。与此同时,因为反病毒引擎对所有文档城市停止扫描,那也就意味着我们应该能够操纵那一特征,生成并利用一个能够用来检测文档密级的特征值。
早期的反病毒引擎只可以扫描简单的形式,现代的反病毒产物与之比拟愈加智能化。正如Joxean在其《Antivirus Hacker’s Handbook》一书中所说的那样,卡巴斯基的扫描逻辑相当复杂。详细而言,卡巴斯基对一个特征值的检测,不只会检测其简单的形式,同时还会对可施行代码停止检测(即检测例程)。如许一来,反病毒产物就包罗了强大且复杂的检测逻辑,并打破了“特征值”在传统上的定义。那些将被更新到客户端的“可施行”特征值,需要动态链接到防病毒软件的内核。Koret在文章中提出:“在解密息争压缩之后,那些文件会彼此链接,重生成的二进造文件构成新的内核,同时所有的插件将会静态链接到内核上。”那也就意味着,卡巴斯基已经实现了完好意义上的加载器和链接器(Loader/Linker)。
你也许会认为,以特定国度为目的的歹意软件(Nation-state malware)代码是独一有才能从长途办事器下载加密载荷并在内存中施行的代码。然而,像卡巴斯基如许的高级反病毒产物,就有充实的理由来利用如许的功用。除了庇护其特征值不被歹意软件毁坏之外,如许的功用还能够降低内存消耗,并带来更快的启动速度。
为了进一步阐发,我们接下来测验考试在kav的内存中寻找那些动态加载的可施行特征值。因为那个代码是动态加载和链接的,因而假设我们利用“image dump sections”之类的号令来遍历调试器中的内存区域时,它可能不会显示出来:
(lldb) image dump sections Dumping sections for 301 modules. Sections for /Library/Application Support/Kaspersky Lab/KAV/Binaries/kav (i386): Load Address Perm Section Name --------------------------------------- ---- ---------------------------- [0x0000000000000000-0x0000000000001000)* --- kav.__PAGEZERO [0x000000000008e000-0x000000000039a000) r-x kav.__TEXT [0x0000000000092500-0x000000000031c620) r-x kav.__TEXT.__text ...但是,假设我们利用vmmap如许的东西,应该就能够将调试器模块Section列表中未能列出的内存可施行Section显示出来。现实上确实如斯,我们发如今0x12824000处有一个11MB大小的内存块:
# vmmap kav Process: kav [975] Path: /Library/Application Support/Kaspersky Lab/KAV/Binaries/kav Load Address: 0x8e000 Identifier: kav Version: ??? Code Type: X86 OS Version: Mac OS X 10.13 (17A365) ---- Virtual Memory Map of process 975 (kav) Output report format: 2.4 -- 32-bit process VM page size: 4096 bytes ==== Non-writable regions for process 975 ... VM_ALLOCATE 0x12824000-0x13379000 [11.3M 7300K 7300K 4304K] r-x/rwx SM=PRV在调试器中,我们能够通过“memory read”号令来转储那个内存,但在那里需要留意“-binary”标记:
(lldb) memory read --force --binary --outfile /tmp/signatures.bin 0x12824000 0x13379000 11882496 bytes written to /tmp/signatures.bin在反汇编器中,翻开转储后的二进造数据,并将其基址设置为0x12824000,就能够显示出与特征值相关的字符串和二进造代码:
至此,我们已经对卡巴斯基的特征值以及它们与反病毒引擎的交互有了一个十分好的理解。至少来说,我们已经掌握了生成用于检测秘密文档签名所需的全数常识。
检测秘密文档反病毒引擎用于主动扫描歹意形式的文件(此中包罗文档)。既然我们目前已经确定了卡巴斯基未加密签名和检测例程在内存中的位置,那么我们创建一个用于检测秘密文档的特征值就不再那么困难。当然,若是一个反病毒软件公司想要那么做(或者被迫那么做),它们完全能够针对特定的客户端(目的用户)摆设一个新的特征值,并用来持续检测那些文件。在本文,我们的目标仅仅是从手艺角度展示那一点是完全可行的。那个新的“特征值”,会让反病毒引擎主动将包罗特征值的加密文档标识表记标帜出来。
在《Antivirus Hacker’s Handbook》中,Joxean讨论了若何绕过卡巴斯基特征值检测机造,并测验考试检测操纵CVE-2010-3333破绽参加歹意代码的文档。因为那一破绽仅针对微软产物,所以我们能够将其做为一个十分适宜的目的。
阐发特征值检测例程
通过我们从内存直达储出来的特征值检测例程,我们在地址为0x13071230的位置找到了实现那个特征值逻辑的函数:
正如Joxean所指出的那样,该检测法式起首查抄被扫描的文档是以富文本格局(RTF)头部“{rt”起头的,而且大小至少为0x5d00字节。以下伪代码详细展现了初始查抄的过程:
//esi is an item object // +0 points to the start of the document being scanned // +0xdc14 contains the length of the document if ((*esi != {\rt) || (*(esi + 0xdc14) <= 0x5d00)) { //bail }随后,检测代码将从文档中读取数据块,并在那些数据块内扫描各类字符串,例如“dplineco”、“{sp2{sn1 pF”和“ments}”。若是上述字符串都能够在该文档中找到,则函数会返回0x1,那代表着特征值检测例程认为该文档属于歹意文件。
为了展现那一行为,我们需要现实扫描一个操纵了CVE-2010-3333破绽的歹意文件(该文件Hash值为deac10f97dd061780b186160c0be863a1ae00579)。但起首,我们在检测例程起头的处所设置一个断点,其详细地址为0x13071230:
(lldb) b 0x13071230 Breakpoint 1: address = 0x13071230 * thread #131, stop reason = breakpoint 1.1 frame #0: 0x13071230 -> 0x13071230: pushl %ebp 0x13071231: movl %esp, %ebp 0x13071233: subl $0x20, %esp 0x13071236: movl 0x12828164, %eax Target 0: (kav) stopped.在扫描文档的过程中,特征值检测法式的断点会被触发。在那里,我们能够转储它所需的参数(在$esp+4中),其参数是一个指向包罗正在扫描文档信息的“项目对象”(Item Object)指针。详细来说,我们能够在该对象的起头处看到文档对应的字节“{rtxa{…”,而在偏移量0xdc14的位置是文档的大小(0x00006e1e):
(lldb) x/x $esp+4 0xb11c5f44: 0x79f6041c (lldb) x/s 0x79f6041c 0x79f6041c: "{\rtxa{\ansi{\shp{ (lldb) x/x 0x79f6041c+0xdc14 0x79f6e030: 0x00006e1e我们能够步进特征值检测函数,来确认所有需要寻找的字符串都胜利被找到,那就意味着该文档将会被标识表记标帜为CVE-2010-3333的歹意文件。
起首,查抄该文档能否以“{\rt”(或者0x74725c7b)开头:
-> 0x13071244: cmpl $0x74725c7b, (%esi) 0x1307124a: pushl %edi 0x1307124b: jne notMalicious (lldb) x/x $esi 0x79f6041c: 0x74725c7b随后,查抄文档的大小能否不小于0x5d00:
-> 0x13071251: cmpl $0x5d00, 0xdc14(%esi) 0x1307125b: jb notMalicious (lldb) x/x $esi+0xdc14 0x79f6e030: 0x00006e1e因为我们所扫描的文件是不小于0x5d00字节的RTF文档,因而将会继续查抄文档页脚附近能否存在字符串“dplineco”。那一步是通过挪用0x129fcc70的函数来完成的,该函数会扫描字符串中的一个字节块:
我们在0x1307128b的处所,即挪用0x129fcc70的位置设置断点,并转储参数,让其显示出我们要查找的字符串(即“dplineco”)和要停止搜刮的全数字节(即“necor0dplinecog0dplinecob0))))”):
(lldb) x/4x $esp 0xb11c5f00: 0x79f6041c 0xb11c5f2c 0x00000008 0x79f617fc (lldb) x/s 0xb11c5f2c 0xb11c5f2c: "dplineco" (lldb) x/s 0x79f617fc 0x79f617fc: "necor0\dplinecog0\dplinecob0}}}}"若是找到婚配项,则会继续查抄“{sp2{sn1 pF”和“ments}”能否存在,查抄过程会再次挪用位于0x129fcc70的函数:
* thread #111, stop reason = breakpoint 3.1 -> 0x129fcc70: push ebp 0x129fcc71: mov ebp, esp 0x129fcc73: sub esp, 0x10c 0x129fcc79: mov eax, dword ptr [0x12828164] Target 0: (kav) stopped. (lldb) x/5x $esp 0xb11c5efc: 0x13071314 0x79f6041c 0xb11c5f1c 0x0000000d 0xb11c5f0c: 0x79f6181c (lldb) x/s 0xb11c5f1c 0xb11c5f1c: "{\sp2{\sn1 pF" (lldb) x/s 0x79f6181c 0x79f6181c: "ture1\levelold0\levelprev1\levelprevspace1\...{\sp2{\sn1 pF}... * thread #111, stop reason = breakpoint 3.1 -> 0x129fcc70: push ebp 0x129fcc71: mov ebp, esp 0x129fcc73: sub esp, 0x10c 0x129fcc79: mov eax, dword ptr [0x12828164] (lldb) x/5x $esp 0xb11c5efc: 0x1307132d 0x79f6041c 0xb11c5f2c 0x00000006 0xb11c5f0c: 0x79f6181c (lldb) x/s 0xb11c5f2c 0xb11c5f2c: "ments}" (lldb) x/s 0x79f6181c 0x79f6181c: "ture1\levelold0\levelprev1\levelprevspace1\...ments}...因为我们此次扫描的文档,通过了上述所有的查抄,全数特征均与特征库中内容相婚配,因而特征值检测例程将返回0x1,那就表白该文档疑似是歹意文件。
isMalicious: 1307134c mov eax, 0x1 ... 13071357 mov esp, ebp 13071359 pop ebp 1307135a ret在卡巴斯基的UI界面中,我们能够看到该文件确实被标识表记标帜并隔离:
在全面领会那个特征值检测例程之后,我们就能够操纵它来主动检测秘密文件。
修改特征值实现检测秘密文档由美国政府分类的文件,凡是包罗分类标识表记标帜。例如,包罗敏感隔离信息的绝密文件会被标识表记标帜为TS/SCI。我们将通过修改上文所述的CVE-2010-3333特征值,来让卡巴斯基有才能检测到那些文档。但是,若是反病毒软件公司想要检测那些文件,他们必定会创建一个新的签名,在本文中,我们采纳的是最简单的体例,也就是修改已有的特征值。详细而言,我们要将需要搜刮的字符串(例如“ments”)改为文档中的分类标识表记标帜(例如“TS/SCI”)。
需要强调的一点是,我们希望通过修改特征值来实现对秘密文档的检测,而不是通过修改反病毒产物可施行代码的体例,无论是在磁盘上仍是在内存中。其原因在于:
1、若是修改任何法式的可施行代码,那就是改动了产物的根本逻辑,而如许的做法并没有意义。而且,若是可以制止修改产物的可施行代码,我们就能够证明代码审计其实不能减小我们将反病毒产物用在歹意用处的可能性。
2、在那个特定情况下,我们利用特征值来检测分类特征能否存在的那一过程将会被加上必然的约束前提,详细要看我们所选择原始特征值的可施行代码中包罗的约束前提,原因在于卡巴斯基同时撑持可施行代码和形式婚配。例如,我们示例中就限造了RTF文档的大小不小于0x5d00字节。在那里,还需要再次强调,一个希望(或者被迫)摆设新特征值来检测秘密文件的反病毒软件公司不会遭到那些因素的限造。
3、在最初,我们胜利创建了一个不成施行的检测特征值之后,为了文章的完好性,我们还额外举例讲解了若何创建一个更强大的特征值,该特征值需要对特征值检测的可施行代码停止修改(但不会触及反病毒引擎的核心代码,与1不抵触)。
将卡巴斯基中CVE-2010-3333的特征值修改为检测并隔离已分类文档的特征值,就像修改内存中的婚配形式一样简单。举例来说,我们能够将“ments”修改为“TS/SCI”。响应的修改,能够通过调试器(内存写入0x130a4d80 0x54 0x53 0x2f 0x53 0x43 0x49)来完成,也能够通过负责修改kav守护历程内存的外部历程来完成。在那里,我们接纳后者,因为它不需要调试会话(Debugging Session),所以能够以法式的体例来施行,同时还能证明特征值检测例程的地址是动态的。
要修改长途历程的内存,能够挪用mach_vm_write() API。正如其名称所表示的那样,那个函数能够在指定的偏移量处写入特定的字节。
苹果公司供给了一个函数定义的示例,但没有进一步供给更多细节:
kern_return_t mach_vm_write(vm_map_t target_task, mach_vm_address_t address, vm_offset_t data, mach_msg_type_number_t dataCnt);为了挪用那个API,我们必需利用root账户,而且必需具有能够拜候目的(长途)历程的使命。通过挪用the task_for_pid()办法能够获得上述拜候权限。
下面的代码(基于@osxreverser的readmem项目编写)演示了若何操纵那些API,将肆意字节写入到长途历程的内存之中:
//write some bytes into a remote process write_memory(pid_t pid, mach_vm_address_t address, vm_offset_t bytes, mach_msg_type_number_t size) { //task port vm_map_t port = 0; //get task for remote process task_for_pid(mach_task_self(), pid, &port)); //suspend task_suspend(port); //write write write! // assumes that memory is writable! mach_vm_write(port, address, bytes, size); //resume task_resume(port); }通过此代码,我们如今能够修改kav守护历程中的特征婚配形式,例如在内存0x130a4d80处的“ments}”。 要检测包罗敏感隔离信息的绝密文档,我们将特征值婚配形式对应的内存值更改为“TS/SCI”。通过调试器或mach_vm_read() API从头读取长途内存,我们可以确认它已经胜利被修改:
(lldb) x/s 0x130a4d80 0x130a4d80: "TS/SCI"如今,卡巴斯基应该就能够主动标识表记标帜和隔离任何包罗此分类标识表记标帜的文档。
用小熊维尼停止测试在将特征值添加到卡巴斯基之后,我们停止一下测试。
小熊维尼是我们童年时代的一本典范漫画书,其实不属于秘密文档。但是,若是我们在此中添加“TS/SCI”分类标识表记标帜,并将此改动通过保留的体例写入到文件系统(包罗主动保留、手动保留或者文档封闭)时,文档将会被扫描,随后卡巴斯基发现该文档契合特征值,触发告警,该文件也随之被标识表记标帜。
尝试视频:
目前,我们已经停止了一次胜利的测验考试,由此就能够证明,反病毒产物能够垂手可得地被用于检测秘密文档。
固然那个特征值是有效的,但是我们留意到它遭到了特征值检测函数可施行代码的轻细“限造”。 好比说,代码起首会查抄文档能否大于等于0x5d00字节,较小的秘密文档将无法被检测到。
后续改良和优化我们发现,通过修改特征值检测函数的可施行代码,就能够继续对那个特征值停止改良。 正如我们上文所说的那样,我们能够在不修改任何可施行代码的前提下创建特征值,接下来让我们看看若何修改可施行指令。
因为卡巴斯基会分发包罗可施行代码(即自包罗特征值检测例程)的特征信息,那些特征在运行时会动态链接到防病毒引擎内核中,因而还能够仅通过修改那些代码来实现。
也就是说,那一过程不会触及到反病毒引擎。
通过修改现有特征值检测例程的可施行代码,来实现对其的扩展,那种办法长短常间接的。针对本文中的例子,我们能够通过那种办法检测到任何大小的文档,不再遭到0x5d00字节的限造。起首,在0x13071251(cmp dword [esi + 0xdc14],0x5d00)的位置,修改“查抄文件”过程中负责比力的代码。 详细改动如下,修改后即可对全数文件(大小超越0字节)停止检测:
;scan any file over 0 bytes ;cmp file size, now with 0 cmp dword [esi+0xdc14], 0x0 ;unlikely to have a negative sized file ;so this jump wont be taken ? jb notMalicious我们只修改了该特征值检测例程的1-2个字节,就能够使防病毒引擎在文件中的任何处所(或在文件起头的位置)搜刮分类标识表记标帜。
当我们拥有那个新的特征值之后,即便是包罗分类标记的根本文件,也会被主动标识表记标帜并隔离。也就是说,该文件会从原始位置“删除”,并移入“隔离”的位置:
秘密文档的搜集如今,我们需要考虑如何去搜集那些秘密文档。如前文中所述,反病毒软件经常会搜集可疑文件和被标识表记标帜/被隔离的文件,并将它们上传到云端,以便停止更深切的阐发。如许的功用,能够让反病毒产物的厂商对某个可疑文件停止更全面、更彻底的阐发(与用户计算机比拟),同时能够搜集威胁谍报,而且在整体上进步其产物的检测才能。
卡巴斯基将他们产物的公开搜集功用称为“卡巴斯基平安收集(KSN)”他们认为:如许能够让卡巴斯基尝试室快速搜集新威胁的相关数据,从而开发出针对新威胁的有效防备计划。在KSN文档中,有如许一段内容:“卡巴斯基平安收集办事可能会处置并提交整个文件,若是文件中嵌入的对象包罗歹意链接,可能会被攻击者操纵,进而对系统或应用的功用产生毁坏。因而,卡巴斯基尝试室会对其停止额外的查抄。”然而我们目前其实不清晰,标识表记标帜的文件能否会主动提交,以供进一步阐发。此外,卡巴斯基在博客文章中出格指出,可能会上传检测为歹意的文件,并指出:“若是文件本身被检测出歹意软件,将会提交给卡巴斯基尝试室停止阐发,该阐发由我们的一名阐发人员手动停止。”
受研究时间所限,我并没有对卡巴斯基的文件搜集功用停止逆向工程和进一步阐发。而且,出于一些原因,我不希望与后端系统停止交互,所以我在阐发用的虚拟机中禁用了收集毗连,以确保新特征值标识表记标帜的“小熊维尼”文档绝对不会被上传到俄罗斯。
最初,我有充实理由认为,任何具有搜集功用的反病毒产物都可以自在地搜集(上传)其产物所标识表记标帜的文件。不外我们要再次强调,那个功用设想的初志,是为了让产物拥有更强大的才能,而并非为了窥探用户的隐私。
总结在那篇文章中,我们展现了若何借助反病毒产物来检测秘密文档的特征值。我想重申的是,虽然手艺上确实能够,但其实不代表着反病毒公司实的会如许做。而关于我们来说,能够将它当做一个有趣的逆向阐发测验考试。
但是,希望通过本文各人可以理解,任何防病毒产物都能够做为一个完美的收集间谍搜集东西。并且因为它们的特征值是加密的,可能会被战略性地摆设,会主动安拆,包罗可施行代码,而且凡是与反病毒产物的源代码别离,那就使得用户难以鉴别出哪些特征值是可疑的,以至用户底子都无法查看到那些特征值。
十分有趣的是,在那篇文章发布之前,卡巴斯基刚好颁发了一篇博客文章并提到了那种情况。卡巴斯基指出,他们的特征值创建过程很难通过“外部测验考试”被窜改(例如被用来检测/搜集秘密文档):
然而,任何一位反病毒产物所属公司的内部人员,都可能有权限去摆设如许的特征值,而且很可能不会被发现。当然,若是该公司被某些组织强迫,或者与一个庞大的集团停止了合做,此时完万能够操纵他们的产物,来黑暗检测并操纵任何感兴趣的文件。
有时候,善恶的分界,不是对立面,而是每个杀软中的一个特征值。
登录平安客 - 有思惟的平安新媒体www.anquanke.com/,或下载平安客APP来获取更多最新资讯吧~
Tags: