思绪燃星火 2009-02-17 13:11:47 阅读2582 评论23 字号:大中小
题记:三步走系列之最后一篇。
转载请注明版权:A1Pass http://a1pass.blog.163.com/
黑客反病毒论坛 http://bbs.hackav.com
转眼间免杀基础三步走系列文章已经接近结尾了,不知道这个系列文章是否对大家的免杀技术提高起到了什么样的作用。但是不得不客观地说,免杀技术是一门涉猎面非常广的技术,你可以由此轻松转型为反汇编、逆向工程甚至系统漏洞的发掘等其他顶级黑客技术。
纵然区区三篇文章还不足以向大家道出免杀技术的精髓,但我会努力使它发挥出应有的作用,让大家能切实的感觉到自己的提高……
我们言归正传,这篇文章介绍的就是初学朋友们认为很遥远的汇编语言,其实之所以说遥远,只是因为大家对汇编以及自己潜力的不了解所造成的一种假象,记得一句名言说过“从数学角度上看,人们本无法理解事物,而只能去习惯他们”。
其实单从语言上来说,我认为汇编要比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处的子程序
一口气总结了这么多,都是精挑细选出来的,也许有的朋友看完后会感觉一头雾水“那些‘指针寄存器’与‘计数器’都是干什么的啊?迷迷糊糊的……”,其实没必要这么想,上面我只是举了一个例子,你要明白的是这些语句怎么用,而不用搞明白那些例子语句究竟是干什么的。
三、由汇编语言想到的
学了这么多枯燥乏味的东西,它们究竟有什么作用呢?下面我就教大家利用现有的知识将一个应用程序加上我们想要的功能。只要各位朋友炼成此功必然所向披靡!(A1Pass注:玩笑了)
首先,下面的内容会涉及到“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骗过了。
由于涉及内容较多,所以讲的有些散,但是相信大家理解起来还是不会有什么困难的,虽然本文的重点是要大家了解汇编,并由此了解花指令的原理,但是还是建议大家先将本文所讲的例子做成功以后,在通篇阅读一遍,相信你的感觉是不会一样的!
评论