特征码修改技术总结
如今杀软的升级,他们的性能越来越强大,查杀力度和广度都大幅度提高,启发式杀毒的日益完善,使免杀工作越来越困难。杀软在进步我们小黑也不能落其后啊,我们必须努力掌握最新的免杀技巧和动向,同时也不能一步登天的忘了我们的基础。而传统的特征码差杀,杀软依然在使用。因此要想使我们的木马文件不被查杀,修改文件特征码也是一种常用的方法,今天就以特征码修改技术给大家做一个总结,献给支持和关心暗组的朋友,也献给免杀初学者和即将要学习免杀的朋友,本人能力有限,错误之处请大家指出,我们共同学习进步…
一. 什么是“特征码”
我们从字面意思上看,就是具有一定特点或特征的一串字符…而这串字符就是被杀软定义一文件是否是病毒的依据..
然而稍微专业点就是程序运行时,在内存中为完成特定的动作,要有特殊的指令,一个程序在运行时,同一内存地址的指令是相同的同一个程序中,一段连续的地址(它的指令相同),那么我截取这段地址,就可以判断它是不是这个程序。为了防止出现病毒的误查杀,可以提取出多段特征码。这也就是我们所说的复合特征码.
A. 特征码主要又分为:文件特征码,内存特征码,行为特征码,(主动特征码,如瑞星)
B. 同时,又分为:单一特征码和复合特征码;
单一特征码就是说,一个程序中的几句代码被杀毒软件做为识别标志。修改掉一处就可以免杀。
复合特征码:一个程序中的多句代码被杀毒软件作为识别标志。有一处不修改都不能免杀。
二. 修改特征码免杀技术
修改特征码技术,是以杀软查杀特点得来的。杀软会用它们的特征库(也就是我们说的病毒库)和我们的文件某些字符作对比,如果彼此吻和,就定义为我们的文件为木马病毒。同时,我们只要修改了它定义出的文件特征码,这样会出现什么情况呢,不用说那就是我们所说的免杀,也就是用修改特征码技术来达到我们文件的免杀.
三. 分析文件特征码
我们要使一个木马文件免杀就要修改它的特征码,但这些特征码我们如何得来。这就
说到了我们特征码分析,也就是我们所说的特征码定位。而定位的工具有很多,常见也是大家都觉得好用的有(CCL MYCCL multiCCL等).这就不具体说明,我们重点是特征码修改.
四. 修改特征码常用工具
OD(Ollydbg.exe) C32(C32Asm.exe) 辅助:RestoratRestorator.exe LordPE.exe
PEID 0.95.exe 汇编指令查询器(可以很好的帮助我们在修改特征码过程中遇到不认识的汇编指令时,我们可以用它来查询,了解相关功能)(如下图)
五. 修改特征码基础汇编指令
到了这里眼看就要修改了做免杀了。大家别急,有句话说的好:“巧妇难为无米之炊”。
也就是说,我们现在有了好的工具但是你会用吗?如果回答是否定的,那一切还是等于零。工具的使用我这里就不说了,暗组论坛自己搜,NEW4写的OD使用说明就很不错,大家可以看看。好了,我们言归正传。修改特征码需要具备基本的汇编知识,不懂没关系,只要你肯学肯记,不需要你对汇编了解太深,只要记住常见的指令和它们的作用。大家请注意,这步是学习免杀即修改特征码最关键的一步,这步学习的好坏,决定你以后修改特征码技术的高低…这里我给大家列出我们必须去掌握的一些指令,希望大家下来好好背记…
1.算术运算符
ADC:带进位加法
ADD:二进制数加法
DEC:减一
DIV:无符号数除法
IDIV:带符号数(整数)除法
IMUL:带符号数(整数)乘法
INC:加一
MUL:无符号书乘法
NEG:求补
SBB:带借位减法
SUB:二进制减法
XADD:交换并相加
2.ASCII-BCD转换
AAA:加后ASCII调整
AAD:除前ASCII调整
AAM:乘后ASCII调整
AAC:减后ASCII调整
DAA:加后十进制调整
DAS:减后十进制调整
3.移位
RCL:带进位循环左移
RCR:带进位循环右移
ROL:循环左移
ROR:循环右移
SAL:算术左移
SAR:算术右移
SHL:逻辑左移
SHR:逻辑右移
SHLD:双精度左移
SHRD:双精度右移
4.比较
BSF/BSR:位扫描
BT/BTC/BR/BB:位测试
CMP:比较
CMPSN:串比较
CMPXCHG:比较交换
CMPXCHG8B:比较并换?lt;br>TEST:测试位
5.数据传送
LDS:装如数据段寄存器
LEA:装入有效地址
LES:装入附加段寄存器
LODS:从串取
LSS:装入堆栈段寄存器
MOV:传送数据
MOVS:串传送
MOVSX:带符号扩展传送
MOVZX:带零扩展传送
STOS:存入串
XCHG:交换
XLAT:换码
6.标志操作
CLC:清除位标志
CLD:清除方向标志
CLI:清除中断标志
CMC:进位标志求反
LAHF:标志送AH
POPF:标志出栈
PUSHF:标志进栈
SAHF:AH送标志寄存器
STC:进位标志置1
CTD:方向标志置1
STI:中断标志置1
7.输入/输出
IN:输入字节或字
INSN:串输入
OUT:输出字节或字
OUTSN:穿输出
8.逻辑操作
AND:逻辑与
NOT:逻辑非
OR:逻辑或
XOR:异或
9.循环
LOOP:循环直到完成
LOOPE:相等时循环
LOOPZ:为零是循环
LOOPNE:不相等时循环
LOOPPNZ:不为零是循环
LOOPPNEW:不相等时循环
LOOPNZW:不为零时循环
10.处理器控制
HLT:进入暂停状态
LOCK:封锁总线
NOP:无操作
WAIT:置处理器于等待状态
11.堆栈操作
ENTER:建立堆栈帧
LEAVE:结束堆栈帧
POP:字出栈
POPF:标志出栈
POPA:所有通用寄存器出栈
PUSH:字进栈
PUSHA:所有通用积存器进栈
PUSHF:标志进栈
12.串操作
CMPS:串比较
LODS:从串取
MOVS:串传送
REP:串重复
REPE:相等时重复
REPZ:为零时重复
REPNE:不相等时重复
REPNZ:不为零时重复
SCAS:串扫描
STDS:存入串
13.转移(条件)
INT溢出中断
JA:高于则转移
JAE:高于或等于则转移
JB:低于则转移
JBE:低于或等于则转移
JC:进位为1则转移
JCXZ:CX为零则转移
JE:相等则转移
JG:大于则转移
JGE:大于或等于则转移
JL:小于则转移
JLE:小于或等于
JNC:进位为零则转移
JNE:不相等则转移
JNG:不大于则转移
JNGE:不大于或等于则转移
JNL:不小于则转移
JNLE:不小于或等于则转移
JNA:不高于则转移
JNB:不低于则转移
JNBE:不低于或等于则转移
JNAE:不高于或等于则转移
JN不溢出则转移
JNP:奇偶位为0则转移
JNZ:结果不为零则转移
JNS:结果为正则转移
J若溢出则转移
JP:奇偶位为1则转移
JPE:奇偶性为偶则转移
JP奇偶性为奇则转移
JS:结果为负则转移
JZ:结果为零则转移
14.转移(无条件)
CALL:调用过程
INT:中断
IRET:中断返回
JMP:无条件转移
RET:返回
RETN/RETF:近返回/远返回
15.类型转换
CBW:字节转换为字
CDQ:双字转换为四字
CWD:字转换为双字
CWDE:字转换为扩展的双字
大家不要怕辛苦,在你要动摇的时候,你就想想自己做出自己的免杀那种成就是多么开心。。免杀需要我们的坚持和不断创新,它的乐趣在于挑战…希望大家努力而不放弃…
六. 修改文件特征码
终于我们开始修改了,也恭喜你经过了无聊和乏味的时期,现在是我们创造奇迹的时候了。特征码定位出来之后,就是我们修改的过程。只有这样才能达到躲过杀软查杀的目的。修改文件特征码的方法有很多。如:替换法,填充法,大小写转换法,通用跳转法等。今天就给大家一一道来….
1. 排序法(就是我们说的上下互换法)
在我做免杀的过程中,上下互换我发现很重要也是很有效的办法,但是没有一个方法是完美的,上下互换也不能保证100%的成功率,不过它的通用率在90%..好了,我们具体说明一下。
例如:1 2 3 4 5 都分别代表一汇编指令,而其中 3 就是被杀软定义为病毒特征。我们要做的就是打乱它的顺序,让杀软无法辨别。修改后成:1 3 2 4 5 或 1 2 4 3 5 在不影响程序运行前提下,找到相应的互换法.我们实例说明…
如图选定的MOV XXXXXX 我们可以和PUSH XXXXX 上下互换 或者MOV XXXX 和下面的MOV XXX互换,从而达到免杀…一般情况下双MOV都可以互换,如图 CALL XXXX 也可以和下面PUSH XXXXX互换…但有时候的CALL是不能乱换的,这里就需要大家给汇编知识的了解,和自己的经验了…这个方法没什么技术含量,需要的是你下来多多练习,做多了自然掌握…
2. 替换法
替换法就是同等指令或者使用功能相同的代码之间的替换.就像5-5=0 而1-1也=0他们最终的结果和功能上都是一样的,在程序里这种我们可以相互替换,不会影响程序的运行。替换法就是程序灵活性的体现,一种功能,程序可以有N种方法表达出来。所以大家必须掌握我们常用的汇编指令,从而替换法将会简单如一。下来我们实例说明。
我们选定的区域,是这么一个汇编指令:SUB EAX,37 SUB 看了上面常用汇编指令的人应该了解这种算术运算符中的减法运算。这句意思是 EAX减37 .从而我们就有了思路。在有理数中,有了正负数,它们的加减我想大家都会吧。口诀是正正得正,负负得正,正负得负.由此我们可以把这句指令修改成这样•••
我们修改成ADD EAX,-37 ADD是汇编中的加法,加负37,结果还是减37.功能上和结果上到和原来的一致。程序也不会影响,杀软也将不会查杀…在我免杀中,还有如AND=TEST
Je可以换成JNL或jnz等 LEA 也可以换成 TEST或AND SAR 算术右移.(=SHR) SAL 算术左移.(=SHL) 有时候CALL也可以换成 MOV或JMP JMP=JB+JNB ADC=ADD+INC 等不过替换法也不是百分百成功的。我们要灵活运用,不能死板硬套,这样的想法是不可取的,我们多多尝试,多多创新,免杀技术才会进步。。上面都是相关指令的替换,还有一种就是几句代码,我们可以用其他的代码替换掉,功能和结果都是同等,也不会影响程序正常运行。如:XOR AL ,0 XOR在汇编中是异或运算符。而异或运算的二进制方法是这样的:1^1=0 0^0=0 1^0=1 0^1=1 看了这个我想大家可能就有所明了。我们可以把原来的这句写成 MOV BL,0 XOR AL,BL 这两句的结果和原来的还是一样的…修改后杀软也不会查杀…从这里我们看出了汇编指令的重要性,所以大家开始还是要努力吃掉那些基本的语句,这样以后就会好多点…
3. 填充法
填充法,我想大家是最先学会的。因为这个不需要进行什么修改或者替换,只需要轻轻一点16进制填充“输入00”就OK。不过说起来很简单,做起来不是我们说的那样简单。你填充一段或一句汇编代码时,你要了解,它是否影响程序的正常运行,有的代码或者指令是不能随便填充掉的,填充掉的后果就是程序坏掉。所以我们在填充之前要了解它是否是垃圾代码或者是无用代码,之后我们在填充它。填充法需要我们经常累计的经验和对汇编指令的了解程度来衡量,所以大家还需要多练习,等你悟道那一刻其实一切都是很简单的..
4. 跳转法
跳转法,是免杀人必须学会的一种技巧。因为它的通用性很好,免杀效果也不错。好了,我们先了解下什么是跳转法。所谓的跳转法就是把有特征码的代码在原有的位置上跳转到其他位置,从而达到免杀的过程。这里用的最重要的汇编指令就是无条件跳转 “JMP”.
下来介绍下跳转的要领:
a. 我建议在做跳转的时候在OD里面进行,OD比较直观,同时防止出错;
b. 要找一块可以写入的0区域(也就是没有添加代码的空白区域)如图
C32里面0区域表现..
下图是OD里面0区域的表现
有人会问,我找的零区域都无法写入。怎么办?问的好,一般教程中说,在找到零区域的时候先试着保存一下(OD坏境),不能保存就说明我们不能写入,这种说法是错误的。因为我们的文件在被PE装载器映射到内存的时候,PE装载器会读取相应节表结成的VOFFSET , VSIZE和属性,这些值决定了我们映射到内存中的起始偏移,大小还有相应的内存区域的属性,一般我们的程序在被连接器连接的时候都会将数据段设置为DATA属性,将CODE代码段设置为可执行属性。其实这些属性无关紧要,我们完全可以自己手动进行更改,比如将所有的属性设置为可读可写执行等,这样在跳转或者加花的时候可写的区域就会非常大,也就不用去加区段而使文件体积变大。
这里就教大家怎么开启这些不能写入的零区域..
用到的工具:LORDPE.EXE
首先,用LPE载入我们的木马文件(如图 1)
图一
然后点击区段..(如图 2)
图二
再右键点击CODE区段,选择编辑区段。。(如图 3)
图三
最后点击,标志右边的小框框..(如图4)
图四
大家是不是看见有个“可写入”没有勾选,我们把它勾选上,然后确定,保存即可。
这样我们CODE区段中的零区域就变成可写的了。
c. 在跳转的时候,我们必须记住,跳转回来的地址;
d. 还是那句话,方法不是万能的,跳转也不是100%成功的..(切忌)
病毒木马在变异,我们的方法也可以变异,跳转一般都在用JMP 杀毒软也会知晓,所以我们不用JMP,可以用CALL ,MOV等也构造跳转,这样是代码更加复杂,提高杀软查杀难度。这也是一般基本的跳转方法,还有如,跨区跳转,3级跳转等一些高级跳转方法。万变不离其宗,只要我们了解原理,各种好方法也就以用而生。1生2,2生4,慢慢的扩展下去。。。
5. 就近法(也就是我们说的加一减一)
就近法就是把我们特征码的16进制代码,修改成它相近的16进制代码的过程。。从而达到免杀。这种情况一般出现在字符串上,如,木马版本信息,一些对程序运行不起到绝对作用的代码.(如下图)
图中红色的30 我们可以改成31 (如下图)
这样就可以达到免杀目的。不过还有种情况(如下图)
MOV BL,14 这句汇编代码,我们又是可以在14上面加一或者减一或者跨度大点修改,总之在不损坏程序运行的前提下修改,要多观察代码周围的其他代码,看看这句代码的表达效果。
再就是,CALL地址上的加一减一•••免杀CALL上特征时,都知道只要地址变了,杀软也就不会查杀了(这只是其中一种情况,有时候不会成功)
如上图选定的CALL 10003214 我们可以尝试修改成 CALL 10003215或CALL 10003213也达到免杀的目的.
6. 大小写转换法
大小转换法就是把一些特定字符串,通过它相反的属性转换过来,从而达到免杀的目的。这种方法是利用杀软的大小敏感而WINS对大小写不敏感这一特性而得出的一种方法.(如下图)
比如我们选定的这部分是杀软定位的特征,我们修改。会点免杀的朋友一看,就知道这是一处木马相关文件释放的路径,这其中的字母也就是我们所说的字符串,只要我们进行大小写转换法,就能欺骗了杀软的眼睛。(如下图)
上图就是我们在C32利用修改数据中大小写翻转修改后的表现。我们也可以手工找一些字母进行大小写转换,直到免杀为止。
(此方法有相对的局限性)
说到着儿,我们也基本把特征码修改讲完了。我们现在总结一下。
1. 特征码是什么:就是被杀软定义一文件是否是病毒的依据..
2. 特征码修改工具:OD C32 辅助有:LPE PEID Restorator 等
3. 修改特征码之前必须,熟练掌握常用汇编指令..
4. 修改方法:
A..排序法; B.替换法;C.填充法; D.跳转法;E,就近法;F.大小写转换法;
上述就是我们今天的主要内容,希望下来大家多多练习,熟能生巧,坚持最重要啊,你喜欢它就应该义无反顾的去研究,去发挥到极致,不要轻易的说放弃,免杀道路布满荆棘,需要我们坚定的信念和对自己的信心,只有你付出了,一定会有所收获的。
最后,说一下,方法是死的,人是活的,免杀需要的是灵活的头脑和敢于举一反三的头脑,希望大家努力去磨练自己,让自己真正强大起来。本贴出自DST.免杀交流的好地方。