高强度花指令–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感染形)用跳转法移动头部某些代 码,在头部空出广大区域加花。或者加完花(感染以后)在加一个空文件节。(这个适用与病毒编程) 写着写着就有点跑题……………………
|