转自:http://huaidan.org/archives/1722.html,该网站的文章也是转载的,转载时间为:2008/02/26 5:47,文章真正的写作时间要早于这个时间,由于原作者网站早已无法访问,已无从考证。

由于原文极度潦草,标点符号乱用,无语了,十分难以阅读,本站于 2011-11-22 9:13:17 重新进行了排版,有修改少量语句。

------------------------------------------- ↓ 原文 ↓ -------------------------------------------

转载保留版权,Anskya@Gmail.com,http://www.famdiy.com/。

    想了解更深层的RAT架构的不妨进来看看。高手飘过……

    稍微详细的讲述一下 Bifrost,Flux,PoisonIvy 的结构

    只说RAT结构演变,其他技术不讨论……

自从Bo出世后。大量的RAT相继出现……

国内熟悉的,冰河,黑洞,PcShare,灰鸽子等……

国外熟悉的 Bifrost,Flux,Assasin,Beast,Bandook,Institution,PoisonIvy 等……

相继有自己的特色,包括程序结构,出现了许多令人惊叹的东西……

[1] 结构简介:

第一代:-EXE独立结构

相对应的,C/S架构:EXE --> EXE

都是EXE的,比如说冰河,黑洞,几乎第一,二代RAT都是。

第二代:DLL分体结构

这代的DLL纯粹是为了穿墙而设计……

利用 Inject Code --> LoadLibrarA 完成DLL载入。

或者注册表,消息钩子等等……

第2.5代:Plugin 型架构

插件结构的RAT大部分功能……

说到插件型RAT,国内只有灰鸽子之流做出这样的东西。

而且纯粹是摆设……

当然还有FWB++

DLL映射注入,相信大家知道 FilePacker,Alloy,MoleBox,PEBundle,将DLL映射到EXE空间里,然后修改导入表跳转地址……

这样做到了无需加载DLL(其实DLL是映射到EXE空间了)

FWB++ 就是这么玩~,乎乎~

Tequila Bandita 就是采用 DLL Stream Inject 的,国内使用的比较少……

关于插件的RAT,做的最绝的要属 Spirit 系列。

那几乎完美的体积,强悍的代码注入方式,包括代码优化整合,PE结构的使用。

早就了 Spirit4b1 那 1.37k的体积,(API Hash搜索(写的太Cool了),LZO压缩引擎,RT32注入引擎.)

他主要是采用代码注入方式,然后再传输 DLL 插件。

第三代:代码注入类型

这个技术类似病毒技术,将病毒体代码写入host文件……

再进程注入方面,既然可以写 LoadLibraryA 函数。

为什么就不能写入所有代码呢……

技术难点:代码,数据重定位问题……

还有数据的地址获取等等,一些这样那样的问题……

当然在乎编程者,其实这些都很容易解决……

第3.5代:

NT核心下可以让你使用ProcessHack技术了……

替换代码,傀儡进程等等都是类似技术

综上所述,现在的RAT无外乎这几种形态……

那我说了半天究竟要说什么?我说的是木马的框架结构……

下面小议一下木马存在形态……

[2] 形态介绍:

//--------------------------------------------------

冰河:

单纯的EXE,WIn9x下将自己注册成系统服务隐藏进程……

黑洞,Nuclear Rat,灰鸽子,Spook,风雨江湖,小熊那东东……

都是采用第二代形式……

EXE+DLL……

这代体积都比较庞大……

不管是什么消息钩子

下面主要说说,Bifrost,Flux,Poison Ivy 吧,国内的没啥意思,请原谅我的无理……

本文说的是框架,聊的是自己敢兴趣的东西……

相信也有的朋友对 Bifrost,Flux,Poison Ivy 能这么小的体积感兴趣。

Flux,Bifrost,Poison Ivy 其实都是采用FWB+技术……

但是他们都有一个共通点……

这里算上,C-One V1.0(Caecigenus)

Caecigenus 好牛的,别的不知道,至少他,法文,English,中文都会说……

x140d4n 说他是中国人?还是华人???

C-One 和 Flux 类似,但是编码技术不如 Gargamel 来的 Cool……

Flux,Bifrost,Poison Ivy,C-One 都是前 EES,现在的 ChaseNET 的作品。

[1] C-One 比较简单,先说一下吧:

1.安装自己

2.注入到默认浏览器

浏览器路径由 HKEY_CLASSES_ROOT\HTTP\shell\open\command 获取

由于他没有使用RT32或者EliRT组件库

所以这个RAT不支持Win9x

注入方式也很简单.

VirtualAllocEx
VirtualProtectEx
WriteProcessMemory
CreateRemoteThread
WaitForSingleObject

协议包也很简单(简单的令人发狂,速度慢得要死,还弄了一个既算加密又不算加密的加密算法)

[2] Flux,Bifrost

采用的是原始结构,佩服 Gargamel,ksv 的毅力

居然可以把这么多代码直接用VC写出来,完全代码注入……

和上面的C-One一样,注入方式不过二者都使用了 EliRT 1.01。

不过为了防止被跟踪他们都是先将代码注入 explorer.exe 或者 msgsrv32.exe,然后再次跳转……

当然你熟练操作你的 Debuger Tools 的话很容易就可以注入你想注入的进程,然后去分析他的结构,OD足矣……

特殊的地方,发送指令,执行指令,都是采用同一个Socket,可以多线程操作……

相互之间不会冲突,你可以一边查看桌面,WebCam,还有传输文件,同时还可以干点别的。

可见作者功力之高,国内没有任何一款RAT可以做到如此功能(站长评论:一点都不复杂,区分各种数据包头就行了,完全只用一个sock就行了)……

PcShare 也是使用了HTTP隧道双工,一个功能一个线程,两个Socket。

八大功能的意思就是说,有2*8=16个Socket连接隧道(应该不会这么恐怖吧)。

代码注入没啥好说的,就是经验了,自己跟踪一下就明白了。

Bifrost 的功能比 Flux 多一点,他是如何做到的?

插件!Plugin!当然他使用的不是LoadLibraryA来载入DLL的不然你就可以发现了……

用Bo2k的Plugin引入代码,将DLL映射到EXE进程中然后再加载调用……

很有意思吧(新版本的Poison Ivy据说也采用这个功能……)

Flux的Socket生存能力比Bifrost强一点,体积小一点,但是估计上线的数量不是很多

居然一个I/O输入输出模型都没有使用,汗!

[3]Poison Ivy 恐怖的家伙

以前就对Poison Ivy的结构感觉很神奇,体积这么小巧。

功能还可以这么完善,有点违反"能量守恒定律"难道shapeless技术高到如此境界?

IDA+OD拆了他……

由于几乎所有的API都是自己内存搜索的,不是使用GetProcAddress函数……

自己写的一个Hash函数,Crc32b Hash算法……

OD简单的跟踪了一下,发现Poison Ivy代码有些地方写的并不高明。

代码优化做的完全没有Spirit那么精致。(太精致了~)

代码一点都不优美,但是很容易OD跟踪分析,没有使用代码的编码优化技巧。

为什么说他恐怖,一开始认为和Bifrost一样,传输Plugin插件过去然后再控制……

经过OD三级跳分析后(先注入 Explorer.exe,小心使用OD跟踪下,程序很容易死循环,主要原因在于获取Explorer.exe进程始终返回0!但是他会一直再那里等,直到有Explorer.exe的存在,你可以自己手工跳转+填写Explorer.exe进程PID,设置为自己的记事本或者计算器,这样容易跟踪一些。)

抓包分析+冰刃观察,发现Poison Ivy居然不是传输Plugin做到的,自己观察下发现……

他第一次是直接传输功能代码过去。(数据包是压缩的,没有加密,NTDLL.RtlGetCompressionWorkSpaceSize,RtlCompressBuffer,RtlDecompressBuffer)

压缩数据了,你可以自己Dump出数据包,然后自己解压缩,然后试试看是不是。

都是明文了,效果不错,学习数据包结构了……

呼呼~,我喜欢他们的风格。

由于直接传输功能代码(第二次就不传输了)。

实在是太恐怖了,由于可记录,而且第二次就不需要再传输,所有功能都是本地实现。

想想会如何?哈哈~,是不是感觉很有意思……

和小弟以前做的一个主动功能型RAT一样(反向连接,加文件管理,进程管理功能后只有945字节,nasm写的)

主动功能型?再TT里面第一次看到drocon弄出来的,感觉这小胖子(x140d4n那里的来的消息他胖!)很厉害呀~

drocon现在主要做一些asm代码优化的工作,很不错的一些工作,比较喜欢他的编码风格。

特别是代码优化方面做的真的很不错……

PS:x140d4n啥时带我去见他呀……

接着说:Poison Ivy和Flux,Bifrost有一些不同。

支持文件多线程多文件同时传输,为了保证Socket的稳定性,他在文件传输时使用了多个Socket进行传输,其他的还是保留独立Socket。

同样采用多线程操作,但是似乎主控段的上线率不是很高,而且没有使用Thread Pool,所以线程切换浪费了太多的时间……

你可以观察一下,用冰刃打开注入进程,你每次刷新一下目录或者操作一次,是不是程序就多出一个线程?

哈哈~,而且Poison Ivy还有许多地方不太完善,但是现在变成VIP版本了,没有多少机会分析了。

唉~,谁让人家老外福利好呢,在家没事写东西卖钱,谁给我钱我也天天在家写……,乎乎~~

综上的结构看来,是不是感觉Poison Ivy代码是如何实现的还是一头雾水?

1.被控端连接主控段。

2.主控段发送主动功能代码给被控端。

3.被控端新建一块内存保存主动功能代码。这里有个BUG,当主控段重复发送功能代码的时候,他会不去释放直接申请内存保留主动功能代码……,居然都不释放,呼呼~

4.然后当主控段再次发送控制指令的时候,被控端,开始调用一开始接受的主动功能性代码。新建线程执行的,所以造成了大量的空余线程,似乎都没有使用CloseHandle关闭??

5.还有什么好说的?自己Dump,然后看数据包吧……

转载保留版权,Anskya@Gmail.com,http://www.famdiy.com/。

好了马上手术了,上传一篇以前写的烂文,有啥好的想法不妨跟贴……