转自: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/。
好了马上手术了,上传一篇以前写的烂文,有啥好的想法不妨跟贴……