# 教你解密Gh0st 1.0远控木马VIP版配置信息

Author: 乌云历史资料库 (@wooyun_archive)
Published: 2014-11-04T02:50:00Z
Canonical: https://wepostx.com/topics/615

> 乌云历史资料归档
>
> **原始作者：** New4
> **原始编号：** superkieran-wooyundrops:384
> **原始发布时间：** 2014-11-04 10:50
> **声明：内容仅用于技术研究和个人使用，版权归 wooyun.org。**

---

## 0x00 简介

Gh0st是一款非常优秀的开源远程控制软件，由红狼小组的Cooldiyer开发。开源3.6发布后一段时间，作者对其进行大量重写并发布1.0 Alpha，这个版本是有VIP的，我也有幸收集到一套。 当你拿到一个别人的免杀木马你想做什么，学习免杀方法？而你由发现你拿到的样本你手头的控制端可以完美兼容，你想把配置信息修改了写个专版生成器吗？想？那就跟我来吧！（其实你看完文章也不会写，我也没有写过）

![原文图片](/media/2016/06/0c0e6c68751edf558f9db8a6021ffed4)

## 0x01 分析过程

本文用到的Ollydbg快捷键：

```text
F9 运行程序/继续运行 F8 步过代码，遇到CALL容易跑飞建议少用 F7 跟进，不容易跑飞程序。 F2 下断点，然后F9可以跳过一些代码段。 F4 执行到所选行，常用。
```
想写生成器吗，前提条件要先把配置信息加密解密算法给解了，这里我从服务端exe入手，就不从生成器上下手了，毕竟我们多数情况只有服务端exe样本。

![原文图片](/media/2016/06/9a53031d8c15b826e51558def047a90f)

注意看生成器下面“GH0STC+用户配置信息+GH0STC”，这就是我们要解密的字符串。假如我们现在才抓到服务端exe怎么找配置？一般情况能直观快速找到的，1、写在资源文件里面 2、写在exe、dll尾部附加数据上。（我写DRAT的时候这两种都试过），我们用C32ASM工具16进制编辑。拖到最后发现文件尾部有配置信息。大家是否觉得有点简单…… 难的篇幅太大不在本文考虑范围内。

![原文图片](/media/2016/06/5c8005ed2296634064b4c82f51304935)

下面我们用动态调试工具Ollydbg打开，设置CreateFileW函数断点，这里我用工具直接设置，你也可以使用bp CreateFileW命令设置。为什么要这么做？它要读取自身配置肯定要“打开自己”所以断点设置在这个函数最合适，当然也有其他方法不在本文讨论范围，然后按F9把程序运行起来。

![原文图片](/media/2016/06/ee12cd116c6f7cd3b1816d5e7ebd6978)

![原文图片](/media/2016/06/56c1ecd5dcbdc49c99f52cedbb9aee86)

如上图所示的时候（如果不是的话继续按F9），我们按ALT+F9返回程序，按几下F8向下走。看到ReadFile函数还有CloseHandle、字符GH0STC，这个时候就说明程序已经把“配置”读取完了，正常情况下应该准备进入解密了。所以下面出现的CALL调用都要非常注意（一般要按F7进入，不要再按F8了可能会跳过关键）

![原文图片](/media/2016/06/0ccc85820e6a03050667d33b5d86cea7)

看到这个CALL，我们用F7跟进，然后按多个F8直到下一个CALL。

```text
004015F3 |. E8 88FEFFFF CALL server.00401480 n…… …… ……
```

![原文图片](/media/2016/06/d7344c61f6adbfa81a80675b091e810f)

![原文图片](/media/2016/06/26487f0759ad4c6ba8fc7ef1bcd20693)

看到关键算法CALL（00401527，至于怎么判断的我只能说我事先做过功课了，实践中大家要多试试），我们还是用F7跟进（其他无用部分你可以用F2+F9或F4跳过即可）。

```text
00401527 |. E8 B4FEFFFF CALL server.004013E0
```
在F7跟入就可以看到

![原文图片](/media/2016/06/f73370fd6929340b18912b72160d4f57)

```text
00401404 |> /8A1401 /MOV DL,BYTE PTR DS:[ECX+EAX] 00401407 |. |80EA 08 |SUB DL,8 0040140A |. |80F2 20 |XOR DL,20 0040140D |. |881401 |MOV BYTE PTR DS:[ECX+EAX],DL 00401410 |. |41 |INC ECX 00401411 |. |3BCE |CMP ECX,ESI 00401413 |.^\7C EF \JL SHORT server.00401404
```
这是解密算法关键部分记下地址，我们这里换个工具用IDA看看这个函数（004013E0）。 提示：IDA快速跳转地址快捷键是”G”，

![原文图片](/media/2016/06/165cb01d404fbdb0b304a64844dc4022)

转过去以后我喜欢用F5插件（Hex-Rays Decompiler），这里我直接按F5看C代码了（这部分操作就不截图装B了，事实是也没什么需要好截的）。

![原文图片](/media/2016/06/9733c35f66dc39bea10e9fe6abaa65a7)

对比下OD里面的汇编代码慢慢品，你会发现关键代码就两行。

```text
00401407 |. 80EA 08 |SUB DL,8 0040140A |. 80F2 20 |XOR DL,20
```
有一个字符，减8和异或20的操作。

```text
for (i = 0; i < len; i++) { data[i] -= 0x8; data[i] ^= 0x20; }
```
到这里我们已经找到关键算法部分，你可能没弄明白还是不知道怎么办。看下图的现成工具，实在懒的话自己百度找，或者你找一下gh0st 3.6开源代码然后差不多的改改就能用来解密了。

## 0x02 课后作业

留下三个作业给喜欢折腾的同学： 1、继续看下004010D0函数作用（看了没看明白看下3.6代码）
2、对比一下gh0st 3.6加密解密字符和1.0有什么区别（其实最关键部分我已经说了，其他都是除了头尾“GH0STC”不一样其他没变化）
3、写个配套生成器，还是参考3.6代码改改就行。
我这里就不发样本和其他附件了，有需要的来“暗组”论坛。你想要的这里都有！
下面在附上1.0字符串解密核心代码： decode.h

```text
#!c static char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static int pos(char c) { char *p; for(p = base64; *p; p++) if(*p == c) return p - base64; return -1; } int base64_decode(const char *str, char **data) { const char *s, *p; unsigned char *q; int c; int x; int done = 0; int len; s = (const char *)malloc(strlen(str)); q = (unsigned char *)s; for(p=str; *p && !done; p+=4){ x = pos(p[0]); if(x >= 0) c = x; else{ done = 3; break; } c*=64; x = pos(p[1]); if(x >= 0) c += x; else return -1; c*=64; if(p[2] == '=') done++; else{ x = pos(p[2]); if(x >= 0) c += x; else return -1; } c*=64; if(p[3] == '=') done++; else{ if(done) return -1; x = pos(p[3]); if(x >= 0) c += x; else return -1; } if(done < 3) *q++=(c&0x00ff0000)>>16; if(done < 2) *q++=(c&0x0000ff00)>>8; if(done < 1) *q++=(c&0x000000ff)>>0; } len = q - (unsigned char*)(s); *data = (char*)realloc((void *)s, len); return len; } char* MyDecode(char *str) { int i, len; char *data = NULL; len = base64_decode(str, &data); for (i = 0; i < len; i++) { data[i] -= 0x8; data[i] ^= 0x20; } return data; }
```
[gh0st附件](http://drops.wooyun.org/wp-content/uploads/2014/11/gh0st附件.zip)

## Replies
