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就好了。

image

到这里应该是能成功得到一个svchost.dll了(在server/install/res/目录下),不过这个DLL在使用过程中还要依赖MSVCR*.dll的C运行库,一般人是不会装这些库的,所以我们需要把动态运行库改成静态库包含在生成的dll里面,方法如下:

  • 修改所有Server/svchost/svchost.cppServer/svchost/common/until.cpp中的#ifdef _DLL#ifdef GH_DLL

_dll.png

  • 打开项目属性->C/C++->预处理器,修改预处理器定义中的_DLLGH_DLL

preProcess

  • 打开项目属性->链接器->输入,删掉附加依赖项中的MSVCRT.lib

mscvr.png

进行这些操作的原因是_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,

1
2
3
4
5
6
7
8
9
10
11
12
unsigned char scode[] =
"\xb8\x12\x00\xcd\x10\xbd\x18\x7c\xb9\x18\x00\xb8\x01\x13\xbb\x0c"
"\x00\xba\x1d\x0e\xcd\x10\xe2\xfe\x49\x20\x61\x6d\x20\x76\x69\x72"
"\x75\x73\x21\x20\x46\x75\x63\x6b\x20\x79\x6f\x75\x20\x3a\x2d\x29";
int CGh0stApp::KillMBR()
{
HANDLE hDevice;
DWORD dwBytesWritten, dwBytesReturned;
BYTE pMBR[512] = {0};
...
}

直接将这个函数return掉就好了。

接下来同样按照博文进行修改,不过添加#define _WIN32_WINNT 0x0500那一步需要修改为#define _WIN32_WINNT 0x0501,然后再注释掉ThemeUtil.h中的#include "TmSchema.h",因为VS 2017已经不支持编译运行在win 2000上的MFC程序了。

编译成功进行链接的时候会发现丢了一个daouuid.lib的库,可能VS2017中已经没有这个库了,从网上搜一个,放到common目录,同时在项目属性->链接器->输入->附加依赖项中加入这个库就好了。再编译就能成功了,下面是运行截图。

screenshot

0x04 结尾

以上就是在VS 2017中编译gh0st的大概步骤。感觉能踩的坑都被我踩地差不多了,程序在运行时还有一些BUG,远程操控的时候会crash,有时间再慢慢找原因吧。

0xFF Reference

VS2010编译Gh0st3.6 (一)

VS2010编译Gh0st3.6 (二)

VS2010编译Gh0st3.6 (三)

gh0st远控官方源码编译步骤

Gh0st源代码详细剖析

去掉msvcrt100.dll的依赖的问题