VS 2017上编译gh0st
0x00 前言
最近突发奇想想要找个RAT用用,于是就打算自己编译一个gh0st,结果被折腾了两天,过程那个叫一个酸爽,所以这里把踩的坑记录下来,以后也好有个参考。这次编译的源码来自https://github.com/sincoder/gh0st,编译环境是VS 2017 Community on Win7/Win10。本来呢,gh0st这个东西是在VC++6.0上写的,所以用VC编译会更简单一点,但是我还想准备以后对源码进行一些扩展,因此想把他移植到VS上,理论上这个操作流程对VS2010 - VS2017都适用。整个过程基本上参照了这位博主的博客http://ligangelectron.blog.163.com/blog/(VS 2010编译Gh0st 3.6)所写的内容,不过中间有些不详尽的地方和一些隐藏的坑,我在这里再补充一下。
0x01 编译Server(被控端)
这里简单介绍一下,gh0st中主要有五个项目:sys, svchost, install, CJ60Lib, gh0st,其中位于server
目录下的sys, svchost和install都是被控端的代码,其作用分别是:驱动程序、DLL(主要功能部分)和加载DLL的exe,位于CJ60Lib
目录下的CJ60Lib是gh0st主控端所依赖的一个界面库,而gh0st就是主控端的主要代码了。被控端的编译顺序是sys, svchost, install,咱们一个一个来说。
sys
编译驱动文件需要用到Windows Driver Ki,VS2017里没有,需要手动下载安装:https://developer.microsoft.com/en-us/windows/hardware/windows-driver-kit,安装完后打开Windows XP Free Build Environment
进入sys目录,用build
命令编译然后将编译好的ressdt.sys
拷进sys
目录就好了,这部分网上很多教程都说得比较详细,这里不再赘述。
svchost
打开gh0st.sln
,升级解决方案,为了让生成的程序能在XP上运行,还需要手动在每个项目上面右键选择属性->常规,把平台工具集那一栏设置为带XP的那个工具集。没有的话打开VS安装程序补上就好了,下文不再重复说明。接下来,接下来按照前言里面那位博主的文章进行编译,修改BUG(一些变量未声明和缺少类型说明符的错误在原文“编译CJ60Lib”一节提到,源代码中很多类似错误),直到能编译通过。注意,这里要修改编译配置为Release Win32,下面所有项目都要编译为Release Win32,下文不再重复说明。
此时虽然能编译通过,但是链接的时候还是会出现模块对于SAFESEH影像是不安全的
的错误,这里在项目上右键->属性->连接器->命令行,加入命令/SAFESEN:NO
就好了。
到这里应该是能成功得到一个svchost.dll
了(在server/install/res/
目录下),不过这个DLL在使用过程中还要依赖MSVCR*.dll的C运行库,一般人是不会装这些库的,所以我们需要把动态运行库改成静态库包含在生成的dll里面,方法如下:
- 修改所有
Server/svchost/svchost.cpp
和Server/svchost/common/until.cpp
中的#ifdef _DLL
为#ifdef GH_DLL
- 打开项目属性->C/C++->预处理器,修改预处理器定义中的
_DLL
为GH_DLL
- 打开项目属性->链接器->输入,删掉附加依赖项中的
MSVCRT.lib
进行这些操作的原因是_DLL
是VS内部使用的预处理选项,在项目中有这个选项会莫名其妙地依赖MSVCR.lib而VC6之后的MSVCR.lib又会在加载的时候引用MSVCR*.dll动态链接库。至此svchost才算编译成功,接下来编译install
install
install不需要修改代码,改一下配置就好了:
- 打开项目属性->链接器->输入,在忽略默认库中加入
msvcrt.dll
; - 打开项目属性->链接器->系统,修改子系统为
窗口(/SUBSYSTEM:WINDOWS)
。
成功编译之后会在gh0st/res/
目录下生成一个install.exe
,这就是以后的被控端程序了。
0x02 编译CJ60Lib
gh0st主控端依赖CJ60Lib,因此要先编译一下CJ60Lib,打开CJ60Lib/CJ60Lib/
目录下的dsw文件,按照前言里面那位博主的文章进行修改编译就能成功,不再赘述。这里有个小坑:不要用VS 2010 express版编译CJ60Lib库,因为express版不支持MFC…
0x03 编译gh0st(主控端)
gh0st有一个锁硬盘的函数,如果随意更改版权信息的话,这个函数就会重写MBR,导致硬盘无法访问。我们要先干掉这个函数,代码位于gh0st/gh0st.cpp
LINE:220,
直接将这个函数return掉就好了。
接下来同样按照博文进行修改,不过添加#define _WIN32_WINNT 0x0500
那一步需要修改为#define _WIN32_WINNT 0x0501
,然后再注释掉ThemeUtil.h
中的#include "TmSchema.h"
,因为VS 2017已经不支持编译运行在win 2000上的MFC程序了。
编译成功进行链接的时候会发现丢了一个daouuid.lib
的库,可能VS2017中已经没有这个库了,从网上搜一个,放到common目录,同时在项目属性->链接器->输入->附加依赖项中加入这个库就好了。再编译就能成功了,下面是运行截图。
0x04 结尾
以上就是在VS 2017中编译gh0st的大概步骤。感觉能踩的坑都被我踩地差不多了,程序在运行时还有一些BUG,远程操控的时候会crash,有时间再慢慢找原因吧。