二 杀毒软件原理

  2011-09-23 16:26

    高强度花指令–SEH
        SEH是WINDOWS系统中处理计算机异常行为的一种方式,这种方式的特点就是用入栈的方式把断点保存起来,所以他的效率很高,往往能够处理很多的异常状态。在免杀中我们可以通过它给木马加花,让他“错误”地跳到入口点。
     奉上汇编代码如下:
push 原入口点   -OEP
mov eax,dword ptr fs:[0]
push eax
mov dword ptr fs:[0],esp
mov ebx,0
div ebx 
       复制代码
    这样混淆的强度就很大了,其实还有很多这样的方法,自己漫漫研究把。。
    小鱼和Medusa的免杀技巧 
1. 遇到特征码定位在jmp指令上面的 构造替换 push xxxxx ret。 
举例: jmp xxxxx 
构造替换 push xxxxx 
ret 
2. 遇到特征码定位在call指令上的。 
举例: 
call xxxxx 
构造替换: push @f 
jmp xxxxx 
@@: 
;@@的标 表示的是你jmp xxxx指令后面的内存地址。 @f也就是引用@@ 的标 ,所以此时@f这里填写的就是jmp xxxxx指令后面的内存地址。。 
3. 遇到特征码定位在ret上 
举例: ret 
构造替换: 
jmp dword ptr [esp] 
4. 遇到特征码定位在test eax, eax je xxxx or eax, eax, je xxxxx cmp eax, 0 jexxxxxx 
举例: test eax, eax 
je xxxxxx 
构造替换: xchg eax, ecx 
jecxz xxxxx 
5. 遇到特征码定位在 push [xxxxxx]上的。 
举例:push [xxxxx] 
构造: 
在其之前通过 xchg [xxxxxx], ebx 
然后用寄存器传参: push ebx 
最后在下面在通过xchg [xxxxxx], ebx 交换回来。 
6. 数据段动态恢复和巧用算法加密结合起来。 
前提是对汇编大家一定要有所了解,例如一些人说金山杀的是配置信息上,你完全可以将其这些配置信息所处的地址的数据进行一层加密。或者你可以将其这些偏移所处的数据 通过xchg 交换。 
dll注意下 要进行重定位 
call $+5 ;机器码是 E8 00000000 00000000是相对地址 
@@: pop ebx 
sub ebx, @b 
下面你就可以通过[ebx+你的偏移]来进行变址寻址了。。 
test eax,eax
je xxxxxx
将test eax,eax nop掉,改je为jb
或将两句nop掉
test eax,eax
jnz xxxxxx
将两句nop掉
mov ebx,xxxxxx
mov ebp,eax
双mov可以上下调换
add     edx, dword ptr [ebp+6E]
imul esi, dword ptr [edi+ebx*2+44], 614D6C6C
imul ebp, dword ptr [esi], 0
00              00
00              00
00              00
考虑下移
and eax,80000007
改为:
or eax,7FFFFFF9
用C32asm改,80000007为-80000007,C32asm会自动变为80000007的负数7FFFFFF9
je   等于则跳   改成   jle   也是等于则跳
这是瑞星的新把戏
00436008   09C0 xor EAX,EAX
改为
00436008   09C0 OR EAX,EAX
004A19BD   6A 00 PUSH 0
改为
004A19BD   6A 01 PUSH 1
0049D775   /77 07 JA SHORT 021.0049D77E
改为
0049D775   /7F 07 JG SHORT 021.0049D77E
特征码定位出来用OD载入却显示无此地址的解决方法
dll:
也许你经常遇到特征码定位出来用OD载入却显示无此地址.
我们用灰鸽子VIP2006的GETKEY.DLL做演示.
假若特征码为
[特征] 000009DA_00000002 004015DA   (OC导出的内存地址)
使用OC导出的地址到OD中却不能使用.这时用lordpe打开GETKEY.dll
00013000
00400000 上下相加得00413000
OD载入入口为00883000 > 55              PUSH EBP
把40换成87就是真正的特征码.008715DA
Dll实例(黑洞1.97 瑞星dll特征):
OK=1
CharactorTotal=3
Codz1=H_0000354C_0092414C
Codz2=H_0001A4B4_0093B0B4
Codz3=H_0003C958_0095D558
先用lord_PE打开,再用OD打开
文件入口:00042948       
               > ——-> 00442948
镜像:00400000                      
                                       >———–>相减   00520000
内存入口                   00962948

零区无法定位可执行文件数据的问题
1.c32asm来解决,静态反汇编改特征

2.加一0区段,跨区段jmp跳,然后再新区段保存”所有修改”,再回到原特征码处jmp,保存
免杀关键是技巧,关键你对这些汇编指令掌握的程度,以及你对汇编程序的熟练度。。 

接下来再说一下NOD32的高启 
《一个钉子和一个国家灭亡的故事》大家都知道
如果有那一个钉子,不丢那个马掌,不折那匹战马,不伤那位将军………… 
有太多不确定了,只要我们破坏了其中任何一个环节启发杀毒就会全线溃败。 
NOD32通过PE结构寻找特征代码 以导入表函数的修改为例 (这个简单,其实还有更复杂的上次那个木马就是12处关联,但是12处关联破坏一个就免杀了) 
首先他会从PE MZ那里开始计算PE HARD的位置 在从PE HARD处寻找数据段 计算数据段位置寻找指针的提示位置,然后通过指针的提示位置找到指针,通过指针找到导入表函数。 
启发杀毒理解比较困难但是修改还是很简单的,可以说比普通的特征码更容易。我们只要破坏他以上分析的任何一个环节他就会全线溃败。 
以前的pcshare有一个超简单过NOD32的方法,那就是将子系统设置为未知,就直接过NOD32的高启发,因为NOD32默认的对未知PE文件不予检测 毒,而恰巧,我们的pcshare通过这样更改之后仍然可以运行,达到了免杀目的,就是这么简单 
其实卡巴为我们提供了更多修改的机会 
因为他的特征是关联的,只要破坏他的关联就行了 
就好像 
1+2+3+4+5+6+7+8+9=45一样 
特征码是45.当然会有很多选择我们可以改”1″也可以改“2”还可以改“3”…… 
改掉一个他下面的关联就被破坏了,也就免杀了, 
解决NOD32最简单的两个方法
1.把文件子系统设未未知
2.修改OriginalFirstThunk 日期时间标志 ForwarderThunk 以前都是00000000 把它改成FFFFFFFF 或者别的,就这样就可以过了输入表查杀虽然之后lordpe提示“错误的指针”,但是功能,上线都是没有损坏的
至于原理,我上面说的很清楚了,呵呵
接下来说下基因启发 
因 启发是通过比对文件当中的关键代码,来查杀新病毒以及变种,这种方式在现阶段的优势比较明显,查杀率高,占用内存少,但从缺点来看,这种启发技术在现阶段 已经暴露出来了一个很严重的问题就是误 过于严重,在国外的误 测试当中,使用这项技术的杀软普遍误 十分厉害,像蜘蛛,红伞,飞塔等等。而从长远来看, 这种技术随着时间的增长,病毒的种类越来越多,必定造成基因库的臃肿,随之造成的结果就是杀软的运行效率降低,占用资源量的提升,甚至出现不同基因代码间 的冲突,所以这项技术虽然在现阶段被看好,而且在技术上也没什么难度。 
这个是基因启发启发的定义,但是NOD32这么多特征完全来自广谱查杀jack的文章曾说过: 引用:例如,如果一段程序以如下序列开始:MOV AH ,5/INT,13h,即调用格式化盘操作的BIOS指令功能, 
那么这段程序就高度可疑值得引起警觉,尤其是假如这段指令之前不存在取得命令行关于执行的参数选项,又没有要求 
用户交互性输入继续进行的操作指令时,就可以有把握地认为这是一个病毒或恶意破坏的程序。 
例子:一个免杀卡巴的木马加一个被杀的花卡巴会提示type win32病毒 和感染pe的病毒一样 
卡 巴会确定他的入口点,一般程序的入口点一般不会在程序的最后一个PE节里。如果OEP在最后一个PE节里就值得卡巴怀疑。所以有的“牛人”在2007年初 提出了OEP虚拟化…………但是我不懂编程但是我们可以修改PE结构让入口不在最后一个PE节里,比如在木马修改(非PE感染形)用跳转法移动头部某些代 码,在头部空出广大区域加花。或者加完花(感染以后)在加一个空文件节。(这个适用与病毒编程) 
写着写着就有点跑题…………………… 

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2015年2月10日
下一篇 2015年2月10日

相关推荐