网上和饭客的其他帖子已经说了很多了,我就不多说什么废话了。
在此说一点,我个人倾向于无损免杀,像那种直接NOP、00填充或者加一减一的大部分都是有损免杀,也许当时管用,换一个操作系统可能就不行了。
1.最常用的就是通用条转法了,不多说。
2.其次就是交换上下句,也不多说。
3.仔细琢磨特征码的附近语句,看看有什么是多余的,NOP掉,然后移动特征指令几个字节。
4.加花,配合跳转法,跳走之后来几个花指令再跳回来,对于高启发是有一定效果的。
5.特征是字符的可以修改大小写,或者移动到其他位置,然后修改调用原来字符的指令为新的字符的地址。还是杀的花就异或加密,异或加密的代码最后贴出。
6.最后就是自己发挥了,玩过编程的人做这些都很容易,一看就懂,数据的传递、堆栈、函数的调用等等随便修改,保持功能不变就可以了。
7.有一个免杀的误区大家要注意,在EXE中JMP=PUSH + RETN这样是对的,但是在DLL中就不可以了,否则还要重定位干什么,在DLL中变相的JMP就是【自定位】然后跳到【相对偏移】的xxx地址就可以了
代码段的免杀就是这些,至少是我常用的。下面来说说其他的数据免杀。
输入表免杀:
1.移动名称字符,修改指针。
2.与相邻的函数调换指针,然后在C32中调换名称字符。
3.动态填充函数地址,需要汇编基础了,代码我会在最后贴出来,处理之后用LOADPE删除该函数在输入表里的指针信息就可以了。
输出表:
1.移动函数名称字符并修改指针。
2.移动下输出函数的入口代码,别忘了加几个小花,然后异或加密输出表函数的名称字符,代码我会在最后贴出来。
附加数据:【配置信息】
还是异或加密,可以在文件入口解密,也可以用OD跟踪,在使用配置信息之前解密,这样最好。
其他的还没想起来,不知不觉都天亮了,呵呵,总之免杀中是指令代码的就跳转,加花,变异。是数据的就加密,要注意输入表字符是不能加密的。
下面就说说针对杀软的免杀:
卡巴:免杀到最后病毒名开头是HEUR的就应该是高启发了,加个签名就应该过了,不过的话带着签名继续定位。
卡巴主动:不要带SYS驱动,尽量不要自删除,不要注入进程等危险操作,应该就可以过了。
瑞星:特征或特征附近最多的就是TEST了,改AND就可以,字符修改大小写,注意不是所有字符都可以改大小写的。
瑞星内存:没啥说的,MYCCL内存定位,大部分是字符。
瑞星主动:废物一个,还是基于特征码的,用OD定位,是字符。
金山:主要杀鸽子的配置信息,在PE头的128字节处写90即可。遇到追杀的就是你添加新的区段的问题了,还有就是花指令不够强。
NOD32:说2种方法,加壳改壳,破坏输入表指针。
就说这几个,江民除了主动没啥特点,过江民的主动改一下释放路径即可,就不多说了,其他的杀软也没啥好说的,用我上面说的方法就可以。下面贴出来2个上面提到的代码。
1.异或加密代码
D01 pushad 寄存器入栈,在LordPE设置为新入口点
D02 call D03 调用下一行代码的VA,在OD中也可采用二进制编辑,输入E8 00000000
D03 pop ebx 出栈,ebx的值就是这一行代码的VA,也就是D03
D04 sub ebx,A1 A1是这样计算的,加密点起始的VA减去上面的D03,ebx的值就是加密点起始的VA
D05 xor ecx,ecx 清空ecx为下面循环解密xor的字节做准备
D06 mov ax,5D62 传5D62给ax做初始密匙用,可以修改的
D07 xor word ptr ds:[ebx+ecx*2],ax 对ebx+ecx*2处进行双字节解密
D08 inc ecx ecx加1,加密了多少次
D10 cmp ecx,A2 此处的A2就是加密的代码的总长度除二,计算公式是:(最终VA-起始VA+1)/2 (十六进制)
D11 jl short D07 没有解密完就跳,继续解密
D12 popad 寄存器出栈,如果还要加密下一段,此处从D04开始继续。
D13 jmp到原入口点
加密的二进制代码如下:
60 E8 00 00 00 00 5B 81 EB 00 20 00 00 33 C9 66 B8 7D 4A 66 31 04 4B 41 81 F9 11 11 00 00 7C F3 61
2.隐藏输入表代码
004B702F 60 PUSHAD
004B7030 E8 00000000 CALL 08.004B7035
004B7035 5B POP EBX //程序自定位
004B7036 8BEB MOV EBP,EBX
004B7038 81C3 9F110000 ADD EBX,119F
004B703E 8BF3 MOV ESI,EBX //计算出LoadLibraryA的地址放到ESI中
004B7040 8BDD MOV EBX,EBP
004B7042 81C3 1F100000 ADD EBX,101F
004B7048 8BFB MOV EDI,EBX //计算出GetProAddress的地址放到EDI中
004B704A 8BDD MOV EBX,EBP
004B704C 81C3 232B0000 ADD EBX,2B23
004B7052 53 PUSH EBX
004B7053 FF16 CALL ESI //调用LoadLibraryA
004B7055 50 PUSH EAX //保存DLL句柄,多个相同库里的函数就不必再调用LoadLibraryA了
004B7056 8BDD MOV EBX,EBP
004B7058 81C3 09330000 ADD EBX,3309
004B705E 53 PUSH EBX
004B705F 50 PUSH EAX
004B7060 FF17 CALL EDI //调用GetProAddress
004B7062 A3 04864B00 MOV DWORD PTR DS:[4B8604],EAX //填充函数地址
004B7067 58 POP EAX //取出DLL句柄到EAX
004B7068 61 POPAD
来自:http://hi.baidu.com/daiqingfeng1/blog/item/57c8be58ca44da202934f03c.html