原标题:花指令的应用
对免杀的影响是非常大的,有效地利用花指令可以使免杀工作事半功倍,甚至单凭花指令就可以达到免杀的效果。
一、花指令在免杀领域的应用
1、花指令的应用技巧
在使用之前,首先我们应该明白什么时候比较适合使用,同时还要清楚什么时候不适合。总的来说,应该在无壳的木马中应用,如果木马已经被加壳,那么我们必须要先脱壳然后再添加。不管是加壳还是加都可以看作是一种加密行为,因此一般都是先加然后再加壳。
有一点需要说明的是,添加也会增加木马被启发式扫描器发现的概率,因为常见的可能本身就包含着特征码,所以究竟什么时候加,加多少是件仁者见仁、智者见智的事情。
下面将带大家进行一次典型的花指令添加操作。首先打开Ollydbg并载入我们要加花的程序,然后找到一段空白区域写入以下花指令:
首先选中空白区域并按空格键,在调出的反汇编窗口中依次写入上面的指令,然后写入jmp指令跳回到原程序入口点并将程序Dump(转储)保存,最后修改OEP。
其实除了手工添加花指令外,还有一些工具也可以实现自动加花。
2、花指令的修改技巧
既然能制作出来,那么必然也可以修改它,但是的修改是否能达到我们预期的目的,是否能修改成功呢?这就需要有一定的汇编语言基础了。
花指令首先要保证不破坏堆栈平衡,或者它只能在程序可以接受的范围内进行有目的的破坏,这样才能保证程序在加花后仍可正常运行。说到这里,或许会您对“堆栈”这个名词发悚,不用担心,带着问题看下去就会明白了。
所谓的堆栈平衡,目前可以简单地理解为不影响程序的运行结果,例如我们先执行一条push eax,也就是将eax的内容压入栈,然后再执行一条pop eax,也就是将栈顶的内容取出并传递给eax,这样一存一取,对于堆栈来说没有任何影响,也就是说这时的堆栈是平衡的。
保证堆栈平衡是的制作原则,如果要在现成的上进行修改,可以使用特征码的等值替换法来修改原有的语句,例如将add eax,-3修改为sub eax,3等,或者是添加一些自己的语句,例如添加add eax,3与sub eax,3。由此不难看出,的修改其实是很简单的。
3、空白区域寻找与加空白区段
不管是通过反汇编为程序添加功能还是使用跳转法修改特征码,又或者是添加花指令等操作,都有一个共同点,那就是需要有一块比较大的0x00区域以便于我们进行修改。
不管是OllyDbg还是WinHex,都可以非常轻松地找到一块可用的0x00区域,但是还有几点是需要大家注意的:
(1)使用WinHex等十六进制编辑软件找到0x00区域后,先要将其起始地址转换为内存地址,这样就可以在Ollydbg中找到它了,如图1所示。
图1 使用WinHex等十六进制编辑器查找0x00区域
(2)找到空白区域后不要忘记检测此区域是否可写,如果不可写的话则会导致最终保存时出现错误,从而前功尽弃。验证方法是选中将要使用的0x00区域,单击右键,在弹出的菜单中选择“复制到可执行文件”>“选择”,之后如果弹出了出错提示,则证明这段区域不可用,否则的话就是可以使用。
(3)在WinHex中也可以通过菜单栏“搜索”下的“查找十六进制数值”来搜索0x00字节,以便快速定位。
除了OllyDbg和WinHex之外,还可以利用一些工具查找空白区段,例如我们常用的PEID就有这个功能。在使用PEID打开一个程序后,单击“PE段”右侧的“>”按钮,如图2所示。
图2 打开PEID的节查看器
右击选择一个区段后,在弹出的对话框中选择“搜索全0处”,如图3所示。
图3 搜索全0处
这样就可以找到如图4所示的全0x00区域信息了。
图4 搜索结果
另外还有一款专门用于搜索0x00区域的软件CodeCaver,也叫做“PE空隙搜索器”,它可以搜索NOP与0空间,但是唯一不好的地方就是需要运行程序才能进行查找。假设我正运行着一个截图软件,打开CodeCaver后在“进程名”下拉菜单中选择“截图软件.exe”,然后单击“搜索”按钮,就会找到如图5所示的00区域信息。
图5 使用“PE空隙搜索器”搜索0x00
CodeCaver找到的0x00区域信息非常丰富,由于是直接在内存中搜索到的,所以不需要进行地址转换就可以直接在OllyDbg中应用,不过这个工具并不利于在进行木马修改时应用,因为它只能在已经运行的程序中进行寻找。
倘若利用以上的方法都无法找到合适的0x00区域又该怎么办呢?其实还可以通过加区段的方法人为地制造出一块可用的区段来。比如,可以使用ToPo这款小工具来增加所需要的区段。运行ToPo后单击“打开”按钮打开要添加区段的程序,在弹出的对话框中选择“创建一个新的区段[文件大小增加]”,然后再单击OK按钮。
接着在“增加字节”栏中填入“128”(一般情况下这里所填写的字节数最好为2的倍数),并勾选上“改变入口”,最后单击“生成”按钮,如图6所示。由图6可以看到,程序已经将128字节增加到0x0103E000这个地址的后面了。
图6 增加字节
在这里需要说明的是,如果此处选择了“改变入口”这个选项,那程序会自动将入口点更改为软件中所提示的"0x0103E000"这个地址处,而且还会在区段结尾添加一个跳转语句跳转到程序原来的入口地址处,所以我们直接将花指令
二、花指令的高级应用
1、花指令的提取与快速应用
当我们拿到一款免杀的木马或自动添加工具时,是否想过将对方的据为己有?要是能将提取出来,那么这个以后就是我们自己的了。
如果木马程序被加了,那么往往在程序开头处的信息便是了。如图7所示就是一个通过加花工具自动添加进去的。
图7 一个由工具自动添加的花指令
通过这个我们可以发现它是通过压栈(push)来跳到程序的原入口点的,因此应用时只需要更改push后面的内容即可。为了方便以后的调用,我们在OllyDbg中先选中这段,然后单击右键,选择“二进制复制”,并将其粘贴到记事本中,这样就完成了的提取操作。
如果以后想应用这段,只需要复制我们保存在记事本中的信息,然后选中一块空白区域,单击右键,选择“二进制粘贴”,并将push指令部分更改为“push程序原入口地址”,最后使用peditor将入口点修改为开始的地址就行了。
这里再给大家介绍一款工具—怒剑狂花,它能够很好地支持自定义的添加。打开“怒剑狂花”后,依次选择“设置”>“自定义”,然后在弹出的窗口中单击“添加”按钮,便进入了“添加”的窗口,如图8所示。
图8 打开花指令添加窗口
在“指令名称”处填写要给取的名字,这里我填写的是"X"。下一步就是将我们刚才保存下来的代码复制进去,然后勾选“自动调整格式”,如图9所示。
图9 添加自定义花指令
可以看到上面还有一个“跳转位置”没有填写,这是我们自定义的一个重要参数,它是用来控制应该向哪里跳转的。回到OllyDbg后,我们可以发现跳转处的的HEX数据为"68 61 63 01 01",而其上面则为"68 90 90 90 90",如图10所示。
图10 获取跳转特征信息
由此可知,在字符"68 61 63 01 01"里的"61 63 01 01"就是原程序入口地址的十六进制数据了,而其中的68代表的则是push。返回到“怒剑狂花”中,单击68后,可以看到窗口底部显示的信息为“选中的字符序号为:23”,如图11所示。
图11 查看显示序号
也就是说我们要在“跳转位置”处填写23,这样程序在添加时,当添加到23个字符后就会插入它获取的原程序入口,以保证程序可以前后连贯起来正常运行。掌握了这些,您以后就可以随意添加自己搜集到的了。
2、SEH异常的应用
SEH异常是一个比较复杂的概念,这里只介绍一下目前我们能用到的知识,以便于引领大家向更深层次迈进。
首先,静下心来读读MSDN对SHE异常给出的解释:“Windows 支持一种称为结构化异常处理的可靠的异常处理方法,此方法涉及与操作系统的协作,并且在编程语言中具有直接支持”。
“异常”是意外的或是使进程不能正常进行的事件,硬件和软件都可以检测出异常。硬件异常包括被零除和数值类型溢出。而软件异常指的是通过调用RaiseException函数检测到并发出信号通知系统的情况,以及由Windows检测到的特殊情况。
为了避免出现异常后程序崩溃,可以使用异常处理机制编写更可靠的代码,以确保资源(如内存块和文件)在发生意外终止事件时可正常关闭,还可以利用简洁的、不依靠goto语句或详细测试返回代码的结构化代码来处理具体问题(如内存不足)。
SEH异常也叫做“结构化异常处理(Structured Exception Handling)”,它其实是系统提供的一个服务,例如有时我们在执行程序时会出现一个错误提示框,请我们单击“发送报告”或“调试”或“关闭”按钮。在这之前的Windows版本也会弹出一个提示框,如果系统安装了微软的编译工具,那它就会引导你启用工具去调试程序的错误。
当系统检测到异常时,它马上会将发生异常的程序挂起,并交由系统特定的调试程序来处理,也就是说这时程序的执行流程已经转移到了系统上,而如果程序此时又运行起来的话,那么就会使程序的运行流程产生更大的迷惑性。
大家可以想象一下,假如杀毒软件正在跟踪程序的运行,而此时程序抛出了一个异常,其流程转移到了系统上,那么可想而知,杀毒软件肯定也会跟到系统里,而原程序此时就可以大摇大摆地继续完成自己的使命了。
当然,上面所举的例子并不十分准确,这里只是为了尽量使大家了解SEH异常。关于SEH异常在中的应用,暂且把它当成一个跳转使用就行了。假设我们现在有个已经加花的程序,那么只需要将的跳转替换为SEH异常代码就可以了。就以下面的SEH异常代码为例为大家演示一下。
我们先使用OllyDbg打开已经加花的程序,发现程序入口处就是一段花指令,而用鼠标选中的那一行便是跳向程序真正入口的地址了,如图12所示。
图12 找到花指令中的程序原入口地址
现在将其替换为上面的SEH异常代码,并将上面代码中的"********"改为原程序入口地址0x01016361。
最终的修改结果如图13所示,最后保存之。
图13 修改后的情况返回搜狐,查看更多
责任编辑: