
如果我现在问大家一个问题,入侵成功后我们该干什么?相信大家都会异口同声地回答:“装后门!”不错,为了保住胜利果实,我们总会四处寻找适合的后门。我们的要求并不过分——体积小、功能强大、隐蔽性强。然而前两个要求还是比较容易实现的,最让后门作者头疼也让使用者无奈的就是隐蔽性了。这次我给大家带来的就是另类的方法打造自己的隐蔽后门。
前置小知识
在继续本前我们需要先了解点必要的知识.在WIN32下使用的文件格式都是PE文件格式。PE文件是一个平面地址空间,所有代码和数据都被合并在一起,组成一个很大的结构。文件内容被分割成不同的区块(section,又称区段、节等),块中包含代码或数据,各个块按页边界来对齐,块没有大小限制,是一个连续的结构。
每一个区块都有不同的名字,这个名字用来表示区块的功能。磁盘文件中每个区块的大小必定等于磁盘对齐值的整数倍,而区块的实际代码或数据的大小不一定刚好这么多,所以在不足的地方一般以0x00来填充,这就是区块的间隙。而对我们这篇文章来说,这就是关键。我们就是在这块间隙上做文章,这块间隙我们称做“dead space”。
另外一个我们需要注意的问题就是在汇编中我们可以直接这样来调用一个函数:
push 0
push 'hello'
push 'hello'
push 0
call user32.MessageBoxA
但是在机器码中我们不能直接push一个字符串,我们只能push这个字符串所在的地址。比如:
01007D80 . 68 65 6C 6C 6F>ASCII 'hello',001007D86 00 DB 00
01007D87 00 DB 00
01007D88 00 DB 00
01007D89 00 DB 00
01007D8A 00 DB 00
01007D8B 00 DB 00
01007D8C 00 DB 00
01007D8D 00 DB 00
01007D8E 00 DB 00
01007D8F 00 DB 00
01007D90 6A 00 PUSH 0
01007D92 68 807D0001 PUSH notepad.01007D80 ;注意这里,我们push的是hello字符串所在的地址
01007D97 68 807D0001 PUSH notepad.01007D80
01007D9C 6A 00 PUSH 0
01007D9E E8 D3E6D276 CALL USER32.MessageBoxA
好了,需要提前了解的地方就这些,下面我们该进入正题了。
打造实战
先简单说一下我们的思路,寻找一个系统自带的文件,然后使用反汇编调试工具在其“dead space”中添加我们的后门代码,然后对目标文件进行必要的修改,使之运行的同时也运行我们的后门代码。下面我们以一个简单的实例为大家演示。目标文件我们定为系统自带的记事本上,为什么选择它呢?因为很多情况下大家会打开txt文档,而txt文档默认的关联程序正是记事本。
OK!下面准备好我们的主角 OllyDebug 1.10b 汉化版。选择“文件”→“打开”找到c:\windows\system32\notepad.exe(我使用的是xp系统,其它系统大同小异,下面所有过程均以xp为平台讲述),打开后如图一。
运行一下看看,屏幕闪了两次cmd窗口后记事本弹了出来(5555555,不能动态抓图,所以无法给大家展示这瞬间的美丽了~~~)。用net user看后,确实添加了一个管理员帐户mfm。实验成功!
总结
如果你仔细点,会发现修改后的notepad和先前的那个大小依然一样。这是因为我们所添加的那些代码本身就是在notepad自身空间内的。将上面修改后的notepad.exe覆盖肉鸡上的notepad.exe,只要他打开文本文件或者直接运行记事本都会先添加一个mfm帐户了。当然了,我添加的那些代码并不实用,弹出的cmd窗口会非常显眼而引起怀疑。我们可以进一步优化这些代码,甚至添加一个开端口或者反向连接的后门都可以(只要宿主程序 “dead space”足够大就可以)。
可想而知,谁会去注意一个看上去是那么正常的程序呢?而实际上这个程序确实已经被我们修改过了。这篇文章作为一个思路给大家,剩下的就靠大家去发挥了。有问题的读者可以去X论坛讨论。
这个文章发出后,又很多读者都向我提出了很多问题。在此我感谢支持我的朋友们,本篇文章是在xp下实践成功的。在其他系统都大同小异,留给大家一个想象的空间。欢迎大家继续关注我将在x档案第三期发表的《逆向工程打造免杀后门》。