鄙人结合最近从论坛学到的知识,并结合流星学长的过主动防御教程 ,有点感想,在此抒发。
首先帖一篇文章:
什么是特征码:
程序运行时,在内存中为完成特定的动作,要有特殊的指令,一个程序在运行时,同一内存地址的指令是相同的
同一个程序中,一段连续的地址(它的指令相同),那么我截取这段地址,
就可以判断它是不是这个程序。
为了防止出现病毒的误查杀,可以提取出多段特征码。
在WINNT下面的NOTEPAD.EXE的反汇编程序
01006420 > $ 55 PUSH EBP
01006421 . 8BEC MOV EBP,ESP
01006423 . 6A FF PUSH -1
01006425 . 68 88180001 PUSH NOTEPAD.01001888
0100642A . 68 D0650001 PUSH <JMP.&MSVCRT._except_handler3> ; SE handler installation
0100642F . 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
01006435 . 50 PUSH EAX
01006436 . 64:8925 000000>MOV DWORD PTR FS:[0],ESP
0100643D . 83C4 98 ADD ESP,-68
01006440 . 53 PUSH EBX
01006441 . 56 PUSH ESI
01006442 . 57 PUSH EDI
01006443 . 8965 E8 MOV DWORD PTR SS:[EBP-18],ESP
01006446 . C745 FC 000000>MOV DWORD PTR SS:[EBP-4],0
0100644D . 6A 02 PUSH 2
0100644F . FF15 60110001 CALL DWORD PTR DS:[<&MSVCRT.__set_app_ty>; msvcrt.__set_app_type
01006455 . 83C4 04 ADD ESP,4
01006458 . C705 38990001 >MOV DWORD PTR DS:[1009938],-1
01006462 . C705 3C990001 >MOV DWORD PTR DS:[100993C],-1
0100646C . FF15 5C110001 CALL DWORD PTR DS:[<&MSVCRT.__p__fmode>] ; msvcrt.__p__fmode
01006472 . 8B0D 44880001 MOV ECX,DWORD PTR DS:[1008844]
01006478 . 8908 MOV DWORD PTR DS:[EAX],ECX
0100647A . FF15 4C110001 CALL DWORD PTR DS:[<&MSVCRT.__p__commode>; msvcrt.__p__commode
01006480 . 8B15 40880001 MOV EDX,DWORD PTR DS:[1008840]
01006486 . 8910 MOV DWORD PTR DS:[EAX],EDX
01006488 . A1 54110001 MOV EAX,DWORD PTR DS:[<&MSVCRT._adjust_f>
0100648D . 8B08 MOV ECX,DWORD PTR DS:[EAX]
0100648F . 890D 40990001 MOV DWORD PTR DS:[1009940],ECX
01006495 . E8 86010000 CALL NOTEPAD.01006620
0100649A . A1 C0850001 MOV EAX,DWORD PTR DS:[10085C0]
0100649F . 85C0 TEST EAX,EAX
010064A1 . 75 0E JNZ SHORT NOTEPAD.010064B1
010064A3 . 68 10660001 PUSH NOTEPAD.01006610
010064A8 . FF15 50110001 CALL DWORD PTR DS:[<&MSVCRT.__setusermat>; msvcrt.__setusermatherr
010064AE . 83C4 04 ADD ESP,4
010064B1 > E8 3A010000 CALL NOTEPAD.010065F0
010064B6 . 68 0C800001 PUSH NOTEPAD.0100800C
010064BB . 68 08800001 PUSH NOTEPAD.01008008
010064C0 . E8 17010000 CALL <JMP.&MSVCRT._initterm>
010064C5 . 83C4 08 ADD ESP,8
010064C8 . 8B15 3C880001 MOV EDX,DWORD PTR DS:[100883C]
010064CE . 8955 94 MOV DWORD PTR SS:[EBP-6C],EDX
010064D1 . 8D45 94 LEA EAX,DWORD PTR SS:[EBP-6C]
010064D4 . 50 PUSH EAX
010064D5 . 8B0D 38880001 MOV ECX,DWORD PTR DS:[1008838]
010064DB . 51 PUSH ECX
010064DC . 8D55 9C LEA EDX,DWORD PTR SS:[EBP-64]
010064DF . 52 PUSH EDX
010064E0 . 8D45 90 LEA EAX,DWORD PTR SS:[EBP-70]
010064E3 . 50 PUSH EAX
010064E4 . 8D4D A0 LEA ECX,DWORD PTR SS:[EBP-60]
010064E7 . 51 PUSH ECX
010064E8 . FF15 48110001 CALL DWORD PTR DS:[<&MSVCRT.__getmainarg>; msvcrt.__getmainargs
010064EE . 83C4 14 ADD ESP,14
010064F1 . 68 04800001 PUSH NOTEPAD.01008004
010064F6 . 68 00800001 PUSH NOTEPAD.01008000
010064FB . E8 DC000000 CALL <JMP.&MSVCRT._initterm>
我们取 地址 01006420 到 0100642A 的指令(杀毒软件都是取核心部分的地址代码),如果别的程序的指令和他不一样,那这个程序就是病毒。通常杀毒软件会提取3处以上的关键代码(程序没有这段代码就无法感染文件或无法启动),如果在同一个EXE都存在则这个文件就是病毒。
现在的杀软一般都是以提取病毒特征码为主流进行查杀
如果是灰鸽子等便会有多处(不是一般的多)的特征码
而普通病毒只有很小一段(为了速度)
如果有变种 则重新添加特征码
而病毒的免杀一般都以修改特征码和添加花指令来实现
修改特征码是最为常用的
硬盘中修改 内存中修改 过主动防御
而一般的变种 会在一段时间后被杀软继续查杀
而特殊的变种(例如很古老的远控做的免杀)则一般都是很久以后,甚至至今也没有被杀软干掉
鄙人就想:
是否能用一种自动变化的机制来实现特征码查杀呢?
例如:
首先提取多个特征码
并融入升级包
当杀软查杀时只应用其中的一段特征码
并取系统时间为种子 进行某种随机算法的动态变化
即隔一段时间则查杀的特征码进行变化
这样貌似能抵御很多针对个人或小团体的病毒以及木马
纯属个人想法
欢迎批评
绝对原创
08.08.16
用户系统信息:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 1.1.4322; InfoPath.2)