免杀基础三步走

作者: admin 分类: 学习文档 发布时间: 2011-11-01 18:06

 随着黑客圈子逐渐向商业化靠拢,以及杀毒厂商间的互相竞争愈演愈烈,导致新出现的免费且好用的木马越来越少,除此之外,木马的生存期也在逐渐缩短!而另一方面,新出现的攻击手法越来越少,使得学习黑客技术的我们不得不考虑怎样摆脱或改善现有环境。

因此,免杀技术逐渐火热起来,而作为一个黑客技术初学者,掌握免杀技术更是迫在眉睫!

这篇文章就带领你由杀毒软件原理开始,逐步砸实基础,从而晋升为免杀高手,为以后的黑客生涯铺平道路。

对于免杀,也许大家或多或少都有些了解,但是大家对杀毒软件又有多少了解呢?也许正因为是你对杀毒软件了解不足,所以才造成一些看似比较奇怪的问题,例如无法精确的定位出特征码,或者每次定位的特征码都不一样等等。

如果我们对杀毒软件若能有一个大体的了解,就会使一些问题迎刃而解,从而做到更加有效率的进行免杀。

一、杀毒软件原理基础

一个杀毒软件的构造的复杂程度要远远高于木马或病毒,所以其原理也比较复杂。而且鉴于现在木马病毒越来越向系统底层发展,杀毒软件的编译技术也在不断向系统底层靠近。例如现在的“主动防御”技术,就是应用RING0层的编译技巧。这里我简单为大家介绍一下基本构成。

一个杀毒软件一般由扫描器、病毒库与虚拟机组成,并由主程序将他们结为一体,如图1

001.jpg (70.81 KB)
001

2009-2-17 13:22

 
扫描器是杀毒软件的核心,用于发现病毒,一个杀毒软件的杀毒效果好坏就直接取决于它的扫描器编译技术与算法是否先进,而且杀毒软件不同的功能往往对应着不同的扫描器,也就是说,大多数杀毒软件都是由多个扫描器组成的。而病毒库存储的特征码形式则取决于扫描器采用哪种扫描技术。它里面存储着很多病毒所具有的独一无二的特征字符,我们称之为“特征码”。特征码总的分来只有两个,文件特征码与内存特征码。文件特征码存在于一些未执行的文件里,例如EXE文件、RMVB文件、jpg文件甚至是txt文件中都有可能存在文件特征码,也都有可能被查杀。而内存特征码仅仅存在于内存中已运行的应用程序。而虚拟机则是最近引进的概念,它可以使病毒在一个由杀毒软件构建的虚拟环境中执行,与现实的CPU、硬盘等完全隔离,从而可以更加深入的检测文件的安全性。

简单的说,杀毒软件的原理就是匹配特征码。当扫描得到一个文件时,杀毒软件会检测这个文件里是否包含病毒库里所包含的特征码,如果有,则报毒病查杀,如果没有,纵然这个文件确实是一个病毒,它也会把它当作正常文件来看待。

二、基于文件扫描的杀毒技术

基于文件的杀毒技术可以分为“第一代扫描技术”、“第二代扫描技术”与“算法扫描”这三种方法,对于免杀爱好者来说,要对每一种方法烂熟于心,才能成为高手!但做为一个初学者来说了解一下即可。这里我们就简单介绍一下其中两种种方法,详细的技术原理如果各位得这有兴趣的话可以自己研究。

1、通配符扫描技术

  通配符扫描技术属于是第一代扫描技术的一个分支,对于“通配符”,可以理解为具有一定意义的符号,例如DOS命令里的*号就是任意长度的任意字符的意思,而且通配符在不同的领域也里可以代表不同的意思。
现在杀毒软件中简单的扫描器常常支持通配符,因为鉴于字符串扫描技术的执行速度与特征码长度限制等问题,使得其逐渐退出历史舞台,取而代之的是通配符扫描技术,通配符扫描技术以同样简单的原理与技术却实现了更为强大的功能。

扫描器中的通配符一般用于跳过某些字节或字节范围,以至于现在有些扫描器还支持正则表达式!

下面我们通过一个例子来讲解通配符扫描技术的原理。

例如我们的病毒库中有这样一段特征码:
0400 B801 020E 07BB ??02 %3 33C9 8BD1 419C

上面的特征码可以解释为:
1、尝试匹配04,如果找到则继续,否则跳出。
2、尝试上一匹配目标后匹配00,如果找到则继续,否则跳出。
3、尝试上一匹配目标后匹配B8,如果找到则继续,否则跳出。
4、尝试上一匹配目标后匹配01,如果找到则继续,否则跳出。
5、尝试上一匹配目标后匹配02,如果找到则继续,否则跳出。
6、尝试上一匹配目标后匹配0E,如果找到则继续,否则跳出。
7、尝试上一匹配目标后匹配07,如果找到则继续,否则跳出。
8、尝试上一匹配目标后匹配BB,如果找到则继续,否则跳出。
9、忽略此字节。
10、尝试上一匹配目标后匹配02,如果找到则继续,否则跳出。
11、在接下来的3个位置(字节)中尝试匹配33,如果找到则继续,否则跳出。
12、尝试上一匹配目标后匹配C9,如果找到则继续,否则跳出。
13、尝试上一匹配目标后匹配8B,如果找到则继续,否则跳出。
14、尝试上一匹配目标后匹配D1,如果找到则继续,否则跳出。
15、尝试上一匹配目标后匹配41,如果找到则继续,否则跳出。
16、尝试上一匹配目标后匹配9C,如果找到则继续,否则跳出。

这种扫描技术通常支持半字节匹配,这样可以更精确地匹配特征码,一些早期的加密病毒用这种方法都比较容易检测出来。

其实现在的一些特征码仍然在使用类似此种方法的特征码表达技术,因此掌握这些知识会对我们以后的免杀有所帮助,同样可以使我们在定位特征码时更加了解自己正在做什么,以及做的是否正确等等,这对于我们来说非常重要。

2、智能扫描

智能扫描属于第二代扫描技术的一个分支,这种方法是在一种病毒变异工具包出现之后提出的。智能扫描法会忽略检测文件中象NOP这样的无意义指令。而对于文本格式的脚本病毒或宏病毒,则可以替换掉多余的例如空格、换行符或制表符等空白字符,这一切替换动作在扫描缓冲区就会执行,从而大大提高了扫描器的检测能力。

3、近似精确识别法

近似精确识别法同样是属于第二代扫描技术的一个分支,但是相比起来应用的更为广泛,这种扫描技术包含了两种方式与若干种方法,在这里不可能一一介绍,下面将主要介绍两种方法的代表。

方法一:多套特征码
该方法采用两个或更多个字符串集来检测每个病毒,如果扫描器检测到其中一个特征符合,那么就会警告发现变种,但并不会执行下一步操作(例如清除病毒体或删除文件)。如果多个特征码全部符合,则报警发现病毒,并执行下一步操作。

方法二:效验和
对于校验和,也许有些朋友会想到文件校验和比对的方法,这个方法的思路是将每一个无毒的文件生成一个校验和,等待下次扫描时在进行简单的校验和比对即可,如果校验和有所变化,在进行进一步的扫描,这样有利于提升扫描器的效率,但是严格地说,这并不算是扫描技术。
效验和扫描技术利用的最为到位的就是比较出名的KAV(卡巴斯基)了,它的第二代扫描器就采用了密码效验和技术,并且没有使用任何搜索字符串技术。关于效验和是一个复杂的概念,简单的说就是通过对病毒中的某一段代码的计算,从而得出一个值(例如123XY4),与MD5加密有些相似,当然这样说不完全正确。

但KAV采用的是一种由卡巴斯基发明的一种叫做密码效验和的特殊算法,这种算法通常会产生两个值。而且病毒库的查询采用了特征码分类思想,例如扫描EXE文件时只调用与EXE文件有关的病毒库,而根据EXE文件的位置不同(例如文件头、入口点)又分为不同的子库,这样有利于提高扫描速度。

三、由此得出的一些经验

首先我们应该明白第一个例子介绍的通配符“0400 B801 020E 07BB ??02 %3 33C9 8BD1 419C”代表的肯定不是一个字节。也就是说,杀毒软件厂商定位的特征一般都是数十字节,所以我们定位特征码时就要避免定位过于精确,一般保证在10字节以内就足够了!因为如果特征码定位的过于精确,会为我们以后的修改操作带来很大不必要的麻烦。我们可以简单的想一下,是修改一个字节的方法多,还是修改10字节的方法多?

而由智能扫描我们也可以得出一个结论,就是不要将杀毒软件想的太傻,例如属于智能扫描的一个分支——启发式扫描,它会将一些异常改动计算到可能性的“权值”里,如果一个文件的可疑改动过多,就会导致报毒,这样我们所做的一些工作就起到了相反的作用,是典型的画蛇添足。所以,修改木马文件时也要掌握一个度的问题,不要修改的过多,但还要保证自己的木马免杀时间够长,这就要明白那些更改会被归为可疑修改,而那些则不会。但是掌握这些是需要一定的PE文件结构基础知识的,对于PE文件,我会在下篇文章详细介绍。

而最后的就是卡巴斯基的密码校验和扫描技术了,恐怕这在业内也是第一次提出来,各位看官有福了!

对于密码校验和的更深层次的知识,这里我们不再细谈,我们只谈他对免杀带来什么样的影响。首先,特殊的扫描方法必然会导致特殊的特征码,所以密码校验和的真正特征码通常体积都比较大,通过脚本木马的一些实验,卡巴斯基7.0对字母的大小写不是很敏感,此外对文件代码的变动也不是很敏感。也就是说,只要包含特征码的这行代码在卡巴斯基的校验和取样范围之内,那么它就会报毒,而如果你将其移出这个范围,那么肯定会导致文件不能正常运行,唯一的办法就是更改代码结构。

如果大家注意总结与思考,会发现一些免杀方面的模糊概念完全可以用本文介绍的知识解释通,例如什么“隐含特征码”等等。

这篇文章不知道大家看着怎么样,我想无论你是刚要入门的新手,还是有一些经验的老手,本文都会提供给你许多你不曾知道的知识。由此也可以看出基础的重要性,正是因为基础的不同,才造成技术的高低。

我想授人予鱼不如授人予渔,所以这篇文章偏重于理论,没有什么实例,但是相信会给你带来一些帮助。

 不知道通过上一节的学习与大家自己的努力,许多以前曾困惑不解的问题现在是否已经有了满意的答案。如果自己认为理解的还不够,就多实践一下,多思考一会,多搜索一次,相信你会因此而变得不再平凡。

这一节就让我带领大家走进文件系统的底层——PE文件结构的学习与探究。

其实PE文件就是指Windows里的DLLEXE文件,PE的意思就是 Portable Executable,即可移植的执行体。大家也可以将其与JPG文件或MP3文件等对应理解,也许这样就会揭开它的神秘面纱,显得更为亲近一些。当然,PE文件要远比MP3等文件复杂得多,但是作为Windows操作系统里特有的一种可执行文件格式,只要我们能对其有一个大体的了解,就会使我们了解更多的免杀技术的本质,从而更加有效与正确的利用这些技术。

一、PE文件入门

PE文件总的来说是由DOS文件头、DOS加载模块、PE文件头、区段表与区段5部分构成。其实,如果在纯Windows环境下运行,DOS文件头、DOS加载模块根本是用不上的,加上两个DOS相关的结构完全是为了兼容性问题。

为了方便观察与理解,我们可以通过观察1大体了解PE文件的结构。

 

 

 
如图可知,整个程序就是以DOS文件头“MZ”开始的,接下来就是DOS加载模块“This program cannot be run in DOS mode”,几乎每个Windows程序的前面都是这样一些信息!

下面有一个以字母“PE”为开头的文件块,这就是大名鼎鼎的PE文件头了,PE文件头的标准大小为224个字节,由图可见,里面有一个画了横线标记的问号与左面的十六进制信息“E0”相对应,这便是PE文件头体积的描述标记,十六进制的“E0”等于十进制的“224”由此也不难看出PE文件头的大小为224个字节。

再往下就是以“.text”、“ .data”与“.rsrc”组成的区段表了。区段表也称节表,它的作用就相当于一本书中的目录,你想看哪一章哪一节,只要按着目录标注的页数去找就可以,PE文件的区段表也是起同样的作用,但是区段表除此之外还包含有各个区段的读写权限信息。而图中的“.text”、“ .data”与“.rsrc”则是这个程序里的区段名称,也称为“节”。由此可见这个程序是由“.text”、“ .data”与“.rsrc”这3个区段组成的,如2

 

 

 
其实通过区段名称就可以大体猜出来这个区段里包含什么信息,在整个程序中能起到什么作用等等。

由此可见,PE文件是一种结构组成十分科学的文件格式,因此也对我们快速的认识它起到了助推器的作用,只要你记住PE文件的这5个构成的结构,你就可以向别人说,我了解PE文件!

二、深入了解PE文件与文件头

下面让我们抽象的了解一下PE文件的构成:
DOS MZ header
<<DOS

DOS stub

<<DOS加载模块
PE header

<<PE文件头
Section table

<<区段表
Section 1

<<区段1
Section 2

<<区段2
Section …
Section n
<<
区段n

如果要详细介绍PE文件,恐怕就是这一期X档案也介绍不完,所以我就为大家简单的说明一下,如果你喜欢,可以当作一种知识储备给背下来。

DOS MZ header也称之DOS文件头,亦或DOS MZ文件头,它是一段以关键字MZ为开头的数据,偏移量3C处包含着PE文件头的起始位置信息。

DOS stub这个区块是以一段“This program cannot be run in DOS mode”为标志,当运行环境不匹配时则弹出这句话,对于WIN32位的操作系统来讲,存在的意义不大,完全可以删除。

PE header这就是需要我们着重研究的PE文件头了,他是一段以关键字“PE”为开头的数据,默认大小224字节,里面包含着许多信息,不过对我们有用的就是描述自身大小的一个字段,他家可以仔细观察图1PE文件头里的画横线部分。

Section table区段表,也称为节表,这是一段记录着整个文件中区段的大小与位置信息表

Section 1区段,也称之为节,大家可以将其理解为一个个存放数据的抽屉,每个抽屉都有自己不同的名字,往往通过名字就可判断里面包含着真么样的数据。由于这些区段的数量并没有限制,所以用了“Section 2”“Section …”“Section n”表示剩余部分。

希望通过以上的介绍,大家能对PE文件有一个比较宽泛的了解,但是除此之外,对于免杀技术来说,还有输入表也是我们必须了解的,而对于输入表,就不这么简单了。

输入表也称“导入表”,要想了解导入表,我们还要从导入函数讲起,一看到类似的术语,也许有一些初学的朋友又要嘀咕着埋怨俺了。其实大家不用担心,电脑中的术语与你的名字没有什么区别,你不需要理解它究竟是什么意思,只要知道他代表什么就可以了。

我们知道,如果一个程序需要运行的话,它执行的就是文件内部代码,而导入函数恰恰不属于这个定义,也就是说,导入函数就是代表被程序调用执行,但其执行的代码却不再程序中的一小部分函数。这些函数的真正代码位于某些DLL文件中,这调用者的程序中只保留一些调用这些函数的信息,包括需调用的函数名与DLL文件的名称等等。

但是对于这些硬盘上静态的PE文件来说,在自己被映射到内存之前,无法得知这些导入函数会在哪个地方出现。只有当文件被装入内存后,Windows才会将相应的DLL文件装入,并将导入函数与DLL中的实际函数地址联系起来,这便是“动态链接”的概念,也就是为什么DLL文件会被称为“动态链接库文件”的原因。

说了这么一大堆,归根结底就是要大家明白,动态链接就是由“导入表”来完成的。

三、由这些知识想到的

看完这些,不知道大家有什么想法没有,我想现在肯定仍然有些朋友还被一种叫做“修改PE段”的免杀技巧所困惑,为什么自己总是不成功呢?

记得我曾经在X档案07年第7期中发表一篇名为《木马免杀全攻略》的文章,其中就涉及到了“修改PE段”的免杀技巧,写完之后有一些朋友反映操作不成功,其实就是因为我当时对PE文件结构不了解造成的。

这里我就针对PE文件头的修改在这里详细的介绍一遍。

我们就针对WebHacking[A1Pass干净版]为例,做一次PE文件头的免杀。首先,为了能有一个比较“干净”的修改场所,我们需要将其PE头部的垃圾信息清理一下,这里使用的工具是PeClean,我们只需将WebHacking拖放到PeClean的界面即可完成清理,如图3所示,然后通过反汇编工具WinHex打开。

 

 

打开后如4所示,通过与图1的典型PE文件对比,我们发现许多没用的信息现在已经能够清理干净了,这样更有利于我们的修改操作。

 

 
接下来就是计算PE文件头的大小了,我们沿着PE文件头开始标志“PE”往下找,第一个问号处所对应的16进制信息就是PE文件头的大小了,如5所示。其实这种查找方法是有一定的局限性的,我们也可以这样找,在关键字“PE”后的第17个字节处的数据就是代表PE文件头大小的信息。

 

 

 
我们由图5得知,与之相对应的16进制信息为“E0”,转换为10进制也就是“224”,如6所示。

 

 

 
由此我们得知了PE文件头的大小为224字节。也许看到这里有的朋友会有疑问,前面介绍PE文件的时候不是说过PE文件头的大小为224字节了吗?为什么这里有讲一遍呢?其实这样做只是考虑到怕大家遇到特殊情况,例如PE文件有已经被做了手脚,如果再详细的介绍一遍,这样可保证大家可以轻松应对任何情况。

下面我们就有关键字“PE”开始向下复制224个字节,其实还有更方便一些的方法我们可以边复制,边注意WinHex右下角的“大小”信息,当其显示为16进制的E0时,即说明我们已经选择了224个字节的信息了,如7所示。

 

 

下面我们按快捷键【Ctrl+C】复制这段数据,然后在刚刚选取PE文件中部,由下向上选取224字节的区域,同理,我们看“大小”信息后显示16进制信息E0后即可停止,如8

 

 

 
通过图8可知,我们的光标停留在所选区域最前方。也就是偏移量80上,下面我们按快捷键【Ctrl+B】,会弹出一个对话框,提示“剪切板数据将写入在偏移量80”,我们点击确定即可,结果如9所示。这里一定要注意,在按快捷键之前,一定要确定光标在所选择区域最前方,否则会导致程序不能运行,甚至执行后会导致系统崩溃。

 

 

现在我们要将原PE文件头的剩余部分如10所示用00填充。

 

 

 
然后我们在区段表的第一个节表“.nsp0”前开始选择,一直到PE文件头的头部,如11所示。与图可知,我们选择区域的大小为16进制的140,也就是10进制的320字节。我们只需将这个数值减去24,等于296,这就是现在位移后的PE文件头的真正大小。

 

 

 
也就是说,实际上我们PE文件头大小此时已经由原来的224变为现在的296,转换为16进制就是128,现在通过以上的PE文件知识推理可知,我们应该将上面的E0改为现在的128,但是实际应用时我们却不能这么改,因为涉及到高低位的问题,关于高低位的问题这里大家不必了解,只要记住它的规律即可。

就拿我们精要更改的128为例,真正应用时要输入为28 01,如12所示。

 

 

 
而如果大小是567的话,那么就应输入为67 05,而ABC自然就是BC 0A

明白了修改PE文件头大小的方法后,我们还应该修改记录PE文件头位置的信息,这个就比较容易了,通过PE文件的基础知识我们知道,记录PE文件头的字段位于DOS文件头的偏移量3C处,如13所示。

 

 

我们可以知道原来的PE文件头位于偏移量C8处,但是现在我们PE文件头位于偏移量80处,所以我们只要将C8改为80即可,如14所示。

 

 

 

 

最后保存即可,运行一下试试功能也完全正常。

也许这节讲的难度略微提高了一些,对于新手可能有些阻碍,如果你想快速入门,推荐你先读一读我写的《木马免杀全攻略》,也许会让你快速入门。

 转眼间免杀基础三步走系列文章已经接近结尾了,不知道这个系列文章是否对大家的免杀技术提高起到了什么样的作用。但是不得不客观地说,免杀技术是一门涉猎面非常广的技术,你可以由此轻松转型为反汇编、逆向工程甚至系统漏洞的发掘等其他顶级黑客技术。

纵然区区三篇文章还不足以向大家道出免杀技术的精髓,但我会努力使它发挥出应有的作用,让大家能切实的感觉到自己的提高……

我们言归正传,这篇文章介绍的就是初学朋友们认为很遥远的汇编语言,其实之所以说遥远,只是因为大家对汇编以及自己潜力的不了解所造成的一种假象,记得一句名言说过“从数学角度上看,人们本无法理解事物,而只能去习惯他们”。

其实单从语言上来说,我认为汇编要比C++简单一些,而且对于我们目前的层次来讲,也是只需与汇编“混个脸熟”即可,没有必要深入理解,这也是为什么文章的子标题定位“了解汇编语言”的原因。

首先,在大家了解汇编语言之前,一定要先明白我们的目标是什么。对于现阶段的我们大多数初学读者,如果想利用一些外行人看似很牛的免杀技术的话,就要对汇编的基本指令及其作用要有一定的了解。当然,在这之前,先要摆脱对汇编的陌生感,不要一看到汇编指令就迷糊,而是要学会在其中发现一些对我们有用甚至是没有用的信息。

一、认识汇编

汇编语言如同其他语言一样,也指的是一个大类,例如VB相对应的VBSscript,C对应的VC或C++等等,这里我们主要学习对我们来说汇编语言的常见格式,即反汇编出来的格式。

首先大家要知道我们最常用的计算机都是应用的Inter 8086指令系统,而我们要了解的汇编语言,也是基于Inter 8086的。Inter 8086指令系统大致可以分为6个功能组,他们是:

1、数据传送类指令 2、算输运算类指令
3、位操作类指令 4、控制转移类指令
5、串操作类指令 6、处理机控制类指令

其中1、2、4类对我们免杀比较有用的,当然,这也是相对而言,并不绝对。下面我们在看看汇编语言的通用格式:

例如:
标号:指令 目的操作数,源操作数 ;注释
00001A2B : add esp,1 ;将指针寄存器加1

由上可知,汇编语言的格式由4部分组成,其中标号表示该指令在主机中的逻辑地址,这个大家不用了解。而指令也称为指令助记符,就是我们汇编语言中的“代码”了。而目的操作符与原操作符则代表操作的对象。最后的注释是对这一段指令的说明,可有可无,他在程序编译与执行时不产生任何影响。

下面我们一起看看程序被反汇编之后是什么样子的,如图1所示,可见在OllyDbg中主要分为“地址”、“HEX数据”、“反汇编”与“注释”这4部分组成,其中的“反汇编”区域便是我们以后的主要“战场”。

 

 

 
其中的“地址”代表程序加载到内存之后的相对地址,与我们平时定位特征码时的偏移量并不是一个概念,紧随其后的“HEX数据”表明这段指令在用16进制查看后的状态,而后面的“反汇编”就是指这段程序的反汇编代码了,另外这里的“注释”大多都是指程序中的字符,或调用的命令。

二、比较常用的汇编指令

这里所指的比较常用的指令是针对我们的免杀工作而言的,大家也可以将其作为一个参考的形式来对待这一小节的内容,遇到不懂的指令就先到这里来查看它的用法,久而久之也就记熟了。

1.传送指令mov
传送指令的格式为:
Mov ebp,esp ;将esp传送至ebp

2.进栈指令push
进栈指令的格式为:
Push ebp ;将基址指针寄存器(ebp)压入堆栈

3.出栈指令pop
出栈指令的格式为:
Pop ebp ; 将基址指针寄存器(ebp)弹出堆栈

4.加法指令add
加法指令的格式为:
Add esp,1 ;将指针寄存器(esp)加1

5.减法指令sub
减法指令的格式为:
Sub esp,1 ;将指针寄存器(esp)加1

6.增量指令inc
增量指令的格式为:
Inc ecx ;计数器(ecx)加1

7.减量指令dec
减量指令的格式为:
Dec ecx ;计数器(ecx)减1

8.无条件转移指令jmp
无条件转移指令的格式为:
Jmp 00000001 ;跳转到00000001

9.子程序调用指令call
子程序调用指令的格式为:
Call XX.00001234 ;调用位于00001234处的子程序

一口气总结了这么多,都是精挑细选出来的,也许有的朋友看完后会感觉一头雾水“那些‘指针寄存器’与‘计数器’都是干什么的啊?迷迷糊糊的……”,其实没必要这么想,上面我只是举了一个例子,你要明白的是这些语句怎么用,而不用搞明白那些例子语句究竟是干什么的。

三、由汇编语言想到的

学了这么多枯燥乏味的东西,它们究竟有什么作用呢?下面我就教大家利用现有的知识将一个应用程序加上我们想要的功能。只要各位朋友炼成此功必然所向披靡!(玩笑了)

首先,下面的内容会涉及到“2.进栈指令push”、“8.无条件转移指令jmp”和“9.子程序调用指令call”我会依次为大家便做演示边做讲解。
我们的目标就是将“木马辅助查找器 2005”(以下简称‘木马查找器’)加一个功能,当它运行时会向C盘下写入一个内容为C盘里文件目录结构的文本文档。

第一步先祭出我们OllyDbg,并打开“木马查找器”,如图2所示。

 

 

 
看见这些生疏的汇编指令我们先不用担心,我们只需要先找到一处“HEX数据”为0的区域,并记住开头的地址,如图3所示。

 

 

 
然后选中一片区域,并单击右键,选择“二进制”→“编辑”,如图4所示。

 

 

 
在弹出的编辑对话框中输入我们一会要调用的命令“cmd /c dir c: > c:lookme.txt”如图5所示,熟悉DOS的朋友们应该知道,这是一段将C盘里的文件及目录信息写入位于c:lookme.txt的文件中的一段DOS命令。

 

 

然后我们在选中下面的隔一行处,并按空格键,弹出一个汇编对话框,写入汇编指令“push 0”,如图6所示。

 

 

 
然后我们记住这个地址。下面写入“push 开头地址”,由图3可知,我们选的开头地址为“004B1DB2”,所以这条指令就应为“push 004B1DB2”。在其后面写入“call WinExec”,最后在如图7所示处找到整个程序的入口点,并写上最后一条汇编语言“jmp 004B1D38”即可完工。

 

 

 
我们先在OllyDbg的界面中单击右键弹出如图8所示的菜单。

 

 

 
并选择其中的“复制到可执行文件” →“所有更改”→“全部复制”,然后在弹出的窗口中再次单击右键,并选择“保存到文件”即可,如图9所示。

 

 
最后我们就是要修改一下入口点了,打开LordPE后,将我们已经更改之后的“木马查找器【改】”拖放到LordPE的界面中,如图10所示。

 

然后我们将程序的入口点改为“000B1DD7”,也就是图6所示的那个地址减去400000所得到的数,并点击“保存”即可,如图11所示。

 

 

 

到这里,一个经过我们亲手改造过的程序就诞生了,通过上面的操作,我们赋予了程序原本没有的功能!其实不难发现,这次改造的中心思想就是令程序执行“dir c: > c:lookme.txt”这段DOS命令,如果我们将其换为其他命令呢?当然同样可以执行!这无形间就给与了我们无限的发挥空间,具体更加精彩的利用,就等读者朋友们实现了。

但是现在有一个问题已经突显出来,我们利用的原理究竟是什么?现在就让我一一为大家讲解。
首先,我们是利用一个名为“WinExec”的API函数执行的DOS命令,它的格式为:
UINT WinExec(
LPCSTR lpCmdLine,
UINT uCmdShow );

如果我们要利用,其实就是“WinExec( DOS命令,0);”,但是汇编调用API函数遵循sdtcall格式,也就是从右到左的格式,所以在用汇编实现时,要先将“0”压入栈,然后再将DOS命令压入栈,再调用我们的函数WinExec,最后来一个JMP跳转,跳到程序入口点,从而保证程序运行的顺序。大体格式如下:
00001234 PUSH EBP ;程序入口点
0000XXXX ……
……
……
00002001 YYYYY ;DOS命令的第一行
00002002 YYYYY
……
00002100 push 0 ;将参数设为0并压入键,0在WinExec函数里就是隐藏运行的意思
00002101 push 00002001 ;将DOS命令压入栈
00002102 call WinExec ;一定要注意大小写
00002103 jmp 00001234 ;程序入口点

在保存完文件后,我们还要将这个文件的入口点改为“push 0”所在的地址,也就是0002100,使文件运行时首先执行我们加入的这个功能,然后再由jmp 00001234跳到程序真正的入口点,使程序正常运行。

讲了这些,相信大家对汇编语言应该熟悉一些了,现在我就带大家了解一下花指令,其实花指令的原理就是一种保证堆栈平衡的思想,
我们就以“防杀精灵终极防杀代码”为例,讲解一个话指令代码。
push ebp ;将基址指针寄存器(ebp)压入堆栈
mov ebp,esp ;将esp传送至ebp,
add esp,-0C ;将esp加“-0C”,不平衡
add esp,0C ;又将esp加“0C”,等于这两条指令就是废话(例如先加-1,再加1)
push eax ;将数据寄存器(eax)压入栈
jmp入口 ;跳到程序入口
由上面这段指令不难看出来,所谓的花指令就是完全没有用的垃圾指令,它的存在只为起到干扰的作用,其实我们上一小节讲的为应用程序增加功能的做法也是一种花指令,如图12可知,显然我们修改之后的程序已经将PEID骗过了。

 

 

 
由于涉及内容较多,所以讲的有些散,但是相信大家理解起来还是不会有什么困难的,虽然本文的重点是要大家了解汇编,并由此了解花指令的原理,但是还是建议大家先将本文所讲的例子做成功以后,在通篇阅读一遍,相信你的感觉是不会一样的!

 

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Protected by WP Anti Spam