C2分析设计一开始气量不宜太高,先以几个开源的框架作为基础,取其精华,组织成一个新的C2出来。其实这个C2的设计并不简单,需要从整个C2的框架开始进行设计,然后是协议等等,挺复杂的。我们先通过大概的去构思一个C2,然后将其中的每一个环节进行分解,把每一个细节将清楚,这样大家的接受程度可能会高一点。
我们第一个取材的是SILENTTRINITY,需要从中提炼两个好东西,更准确的其实只有一个东西,另外一个东西是它延申出来的,当然我们取材的还有第二个、第三个、第四个、第五个,把这些C2好的东西都给它提炼出来,然后进行组装,那个时候再从协议设计上去细讲,大家接受起来就比较容易了。
今天先来讲下C端大概的规划,咱们的主要开发语言是C#,C#主要的框架就是.net framework,用来做这些东西方便且效率高,而且加上.net framework在windows操作系统上的普及以及编译后程序集(Assembly)的灵活性,C#+.net成为了最合适的一个搭配。但是他们有一个不太好的地方就是C#语言发展太快了,分了很多版本,从1.0到7.0语法发生着各种变化,对应的.net框架也从1.0开始到现在的4.8,大家在写的时候就会过多的考虑兼容性,会考虑目标机器上.net框架版本,win10可能是默认4.0,2008可能是默认装3.5等等版本的兼容性,这个对于C2设计来讲是一个坎,这个坎不是说有多难,而是说会造成很多开发上的困扰,那么怎么去解决呢?其实换一种设计理念,我不管你目标系统上.net的版本是多少,除非你达到我想要的那个版本,否则的话我就给你装,发现你的版本不是我的开发版本(4.8),就将你的版本升级到我的开发版本(4.8)。这种方式第一个好处就是在写代码的时候不用去考虑兼容性,第二个好处就是更高版本的.net做更多的事情。那怎么去做呢?不可能大摇大摆的在人家的桌面上弹个安装框对吧,或者你去用人家的鼠标瞎点。这里边其实微软都已经帮咱们选好了,拿4.8来说,4.8版本的安装一般都分离线的和在线安装,在线安装版本可能体量比较小,1-3MB。离线的可能就是上百MB了,我们传一个上百MB的安装包是不现实的,所以我们只能使用在线安装。.net在线安装支持很多命令行参数,有些参数可以完全做到静默安装,而且也不用重启,再加上.net framework本来就是微软的东西,所以自带通行证,没有杀软会去管这个事情。那么另外一种安装方式就是采用键盘消息之类的去安装,不过操作比较复杂,可以参考三好学生的文章。到底怎么安装上看个人的情况。
第二点就是还要考虑一种情况,用.net写是默认承认目标机器的.net符合自己要求,万一安装升级不成功怎么办?那么我们的C端核心(core)就不能用.net去写,咱们的core就要用C或者C++去写,当然汇编也行。由core去判断.net版本,如果不满足就负责安装.net,安装成功之后后续的工作交由.net来做。这就是一个大概C端的设计,今天主要讲讲C端涉及到的技术点。首先第一点你肯定要用C或者C++去写东西,其中有一个非常重要的功能就是通过支持SSL的HTTP协议使用Web Downloader去下载.net framework的在线安装包,下载完成后通过创建进程去执行安装包实现.net framework的安装。这个功能其实也不难,用Google随便搜索http wrapper c++ 这种方式就能搜到很多,看自己喜好了,这块选择上要提醒一下,虽然是C++的东西,但是尽量不要找带有MFC的包装类(wrapper),因为MFC牵扯到了太多乱七八糟的东西。我选择的是HttpInterface(https://github.com/JelinYao/HttpInterface),这个实现挺完美的,今天就以它为例子,看看下载执行这一块儿的东西。
HttpInterface先用visual studio打开项目
打开之后有两个工程,IHttp是咱们要用到的工程,UserHttp是测试工程,这个可以直接编译,编译出来是一个dll,这个肯定不行,因为是需要集成到core里面的所以需要改为静态库
将代码生成处的运行库改为MT,然后进行右键项目点击生成进行编译,在编译完成后就会在新生成的目录中出现IHttp.lib文件