1、前言

分析木马程序常常遇到很多配置信息被加密的情况,虽然现在都不直接分析而是通过Wireshark之类的直接读记录。

2017年Gh0st样本大量新增,通过对木马源码的分析还发现有利用Gh0st加密方式来传播的源码中的后门。

2、加密思路

  • 控制端:对字符串异或、移位、Base64编码

  • 服务端:对字符串Base64解码、移位、异或

3、实践代码

  • 加密编码
  1. // Base64编码
  2. static char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  3. int C模仿Gh0st加密上线地址Dlg::base64_encode(const void *data, int size, char **str)
  4. {
  5. char *s, *p;
  6. int i;
  7. int c;
  8. const unsigned char *q;
  9. p = s = (char*)malloc(size * 4 / 3 + 4);
  10. if (p == NULL)
  11. return -1;
  12. q = (const unsigned char*)data;
  13. i = 0;
  14. for (i = 0; i < size;) {
  15. c = q[i++];
  16. c *= 256;
  17. if (i < size)
  18. c += q[i];
  19. i++;
  20. c *= 256;
  21. if (i < size)
  22. c += q[i];
  23. i++;
  24. p[0] = base64[(c & 0x00fc0000) >> 18]; //base64
  25. p[1] = base64[(c & 0x0003f000) >> 12];
  26. p[2] = base64[(c & 0x00000fc0) >> 6];
  27. p[3] = base64[(c & 0x0000003f) >> 0];
  28. if (i > size)
  29. p[3] = '=';
  30. if (i > size + 1)
  31. p[2] = '=';
  32. p += 4;
  33. }
  34. *p = 0;
  35. *str = s;
  36. return strlen(s);
  37. }
  38. // 加密函数
  39. char * C模仿Gh0st加密上线地址Dlg::MyEncode(char *str)
  40. {
  41. int i, len;
  42. char *s, *data;
  43. // 字符串长度
  44. len = strlen(str) + 1;
  45. // 开辟字符串相对应的内存空间
  46. s = (char *)malloc(len);
  47. // 将字符串拷贝到开辟出来的指针中
  48. memcpy(s, str, len);
  49. // 异或操作
  50. for (i = 0; i < len; i++)
  51. {
  52. s[i] ^= 0x19;
  53. s[i] += 0x86;
  54. }
  55. // Base64编码
  56. base64_encode(s, len, &data);
  57. free(s);
  58. return data;
  59. }
  • 解密编码
  1. // Base64密钥
  2. static char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  3. // 解码密钥
  4. int C模仿Gh0st加密上线地址Dlg::pos(char c)
  5. {
  6. char *p;
  7. for (p = base64; *p; p++)
  8. if (*p == c)
  9. return p - base64;
  10. return -1;
  11. }
  12. // Base64解码
  13. int C模仿Gh0st加密上线地址Dlg::base64_decode(const char *str, char **data)
  14. {
  15. const char *s, *p;
  16. unsigned char *q;
  17. int c;
  18. int x;
  19. int done = 0;
  20. int len;
  21. s = (const char *)malloc(strlen(str));
  22. q = (unsigned char *)s;
  23. for (p = str; *p && !done; p += 4) {
  24. x = pos(p[0]);
  25. if (x >= 0)
  26. c = x;
  27. else {
  28. done = 3;
  29. break;
  30. }
  31. c *= 64;
  32. x = pos(p[1]);
  33. if (x >= 0)
  34. c += x;
  35. else
  36. return -1;
  37. c *= 64;
  38. if (p[2] == '=')
  39. done++;
  40. else {
  41. x = pos(p[2]);
  42. if (x >= 0)
  43. c += x;
  44. else
  45. return -1;
  46. }
  47. c *= 64;
  48. if (p[3] == '=')
  49. done++;
  50. else {
  51. if (done)
  52. return -1;
  53. x = pos(p[3]);
  54. if (x >= 0)
  55. c += x;
  56. else
  57. return -1;
  58. }
  59. if (done < 3)
  60. *q++ = (c & 0x00ff0000) >> 16;
  61. if (done < 2)
  62. *q++ = (c & 0x0000ff00) >> 8;
  63. if (done < 1)
  64. *q++ = (c & 0x000000ff) >> 0;
  65. }
  66. len = q - (unsigned char*)(s);
  67. *data = (char*)realloc((void *)s, len);
  68. return len;
  69. }
  70. // 解密函数
  71. char* C模仿Gh0st加密上线地址Dlg::MyDecode(char *str)
  72. {
  73. int i, len;
  74. char *data = NULL;
  75. len = base64_decode(str, &data);
  76. for (i = 0; i < len; i++)
  77. {
  78. data[i] -= 0x86;
  79. data[i] ^= 0x19;
  80. }
  81. return data;
  82. }

然后就是加密解密界面的内容。

函数代码:

  • 生成配置信息按钮
  1. void C模仿Gh0st加密上线地址Dlg::OnBnBuild()
  2. {
  3. // TODO: 在此添加控件通知处理程序代码
  4. UpdateData(TRUE);
  5. m_remote_host.Replace(L" ", L"");
  6. m_remote_port.Replace(L" ", L"");
  7. CString str = m_remote_host + ":" + m_remote_port;
  8. str.MakeLower();
  9. TCHAR * pWStrKey; // 合并后的内容
  10. // 开辟数组
  11. pWStrKey = new TCHAR[str.GetLength() + 1];
  12. pWStrKey = str.GetBuffer(0);
  13. // 第一次 调用确认转换后单字节字符串的长度,用于开辟空间
  14. int pSize = WideCharToMultiByte(CP_OEMCP, 0, pWStrKey, wcslen(pWStrKey), NULL, 0, NULL, NULL);
  15. // 单字符
  16. char* pCStrKey = new char[pSize + 1];
  17. // 第二次 调用将双字节字符串转换成单字节字符串
  18. WideCharToMultiByte(CP_OEMCP, 0, pWStrKey, wcslen(pWStrKey), pCStrKey, pSize, NULL, NULL);
  19. pCStrKey[pSize] = '\0';
  20. // 接收char*
  21. m_encode = MyEncode(pCStrKey);
  22. m_encode.Insert(0, L"AAAA");
  23. m_encode += "AAAA";
  24. UpdateData(FALSE);
  25. }
  • 解密配置信息按钮
  1. void C模仿Gh0st加密上线地址Dlg::OnBnGetLoginInfo()
  2. {
  3. // TODO: 在此添加控件通知处理程序代码
  4. UpdateData(TRUE);
  5. // 1 获取加密编辑控件里的字符串
  6. int pSize = m_encode.GetLength() + 1;
  7. wchar_t * pStart, *pEnd;
  8. wchar_t strKey[] = L"AAAA";
  9. wchar_t strEncode[1024];
  10. // 拿到最开始的字符串,如果前面是AAAA就赋值到pStart
  11. pStart = wcsstr(m_encode.GetBuffer(0), strKey);
  12. // 前移动4个字节,也就是跳过AAAA
  13. pStart += 4;
  14. // 如果AAAA匹配不到把strKey,也就是AAAA赋值给pEnd
  15. pEnd = wcsstr(pStart, strKey);
  16. // 清空原先AAAA字符串
  17. wmemset(strEncode, 0, wcslen(pStart) + 1);
  18. // 取key值之间的内容,配置字符串 - 字符串长度,取前面的真实加密字符串
  19. wmemcpy(strEncode, pStart, pEnd - pStart);
  20. // 单字符
  21. char* pCStrKey = new char[wcslen(strEncode) + 1];
  22. // 调用将双字节字符串转换成单字节字符串
  23. WideCharToMultiByte(CP_OEMCP, 0, strEncode, wcslen(strEncode) + 1, pCStrKey, wcslen(strEncode) + 1, NULL, NULL);
  24. pCStrKey[pSize] = '\0';
  25. // 解密代码
  26. m_decode = MyDecode(pCStrKey);
  27. UpdateData(FALSE);
  28. }

4、实际效果

5、参考

gh0st3.6源码分析(1)——木马的生成

http://blog.csdn.net/hjxyshell/article/details/19094609

Gh0st配置加密与解密算法(异或、Base64)的更多相关文章

  1. DES的加密与解密算法(Python实现)

    DES的加密与解密算法(Python实现) 密码学实验:实现了DES的简单的加密和解密算法,DES算法的相关资料网上很多,这里不再赘述,仅仅贴出源代码给大家分享,源码中包含很多汉字注释,相信大家都是可 ...

  2. JAVA实现AES的加密和解密算法

    原文 JAVA实现AES的加密和解密算法 import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import ja ...

  3. 常见的加密和解密算法—AES

    一.AES加密概述 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用 ...

  4. 常见的加密和解密算法—DES

    一.DES加密概述 DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并 ...

  5. 常见的加密和解密算法—BASE64

    一.BASE64加密和解密概述 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,Base64编码可用于在HTTP环境下传递较长的标识信息.例如,在Java Persistence系 ...

  6. 常见的加密和解密算法—MD5

    一.MD5加密概述 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为RFC 13 ...

  7. BASE64,MD5,SHA,HMAC加密與解密算法(java)

    package com.ice.webos.util.security; import java.io.UnsupportedEncodingException; import java.math.B ...

  8. java之--加密、解密算法

    0.概述 在项目开发中,我们常需要用到加解密算法,加解密算法主要分为三大类: 1.对称加密算法,如:AES.DES.3DES 2.非对称加密算法,如:RSA.DSA.ECC 3.散列算法,如:MD5. ...

  9. c# DESEncrypt 加密、解密算法

    using System; using System.Security.Cryptography; using System.Text; namespace AttendService { publi ...

随机推荐

  1. UVALive6443_Alien Abduction Again

    题意为给你若干个三次函数,以及每一个函数所分布的区间,由于每个函数的所有的系数都是整数,所以最后的函数在整数点处的值也是整数. 现在每次可以插入函数或者询问区间,现在要求每次询问区间后,所有的函数在这 ...

  2. struts 类型转换

  3. 5W2H方法

    5W2H分析方法也叫七问分析法,是二战中美国陆军兵器修理部首创.简单.方便.易于理解.使用,富有启发意义,被广泛应用于企业管理和技术活动,对于决策和执行性的措施也非常有帮助,有助于弥补考虑问题的疏漏 ...

  4. 题解 P3870 【[TJOI2009]开关】

    这个题我愣是交了好几遍没有过...... 后来@_皎月半洒花dalao告诉我说要^儿子节点的tag,然后就明白了...... 行吧,先上题面: 题目描述 现有N(2 ≤ N ≤ 100000)盏灯排成 ...

  5. 知乎回答:每日完成任务用于打卡的APP

    其实我也一直在寻找最佳的解决方案.安卓上有这样的,叫做HabitHub.用过一段时间,不容易坚持,这个软件对于培养习惯来说无疑是最好的,但是仅限于记录,这样的软件实在太多.我这里提供一下我自己的方法, ...

  6. Discrete Square Roots UVALive - 4270(拓展欧几里得)

    a≡b(mod n)的含义是“a和b除以n的余数相同”,其充要条件是“a-b是n的整数倍”: 求所有满足条件r^2=x(mod m)的r 题目已经给定了一个初始的r,x,m #include < ...

  7. MT【143】统一分母

    已知$a,b>0$,则$m=\dfrac{b^2+2}{a+b}+\dfrac{a^2}{ab+1}$的最小值是______ 解答: $$m\geqslant \dfrac{b^2+2}{\sq ...

  8. 51nod 1293 球与切换器 | DP

    51nod 1293 球与切换器 | DP 题面 有N行M列的正方形盒子.每个盒子有三种状态0, -1, +1.球从盒子上边或左边进入盒子,从下边或右边离开盒子.规则: 如果盒子的模式是-1,则进入它 ...

  9. Java类编译、加载、和执行机制

    Java类编译.加载.和执行机制 标签: java 类加载 类编译 类执行 机制 0.前言 个人认为,对于JVM的理解,主要是两大方面内容: Java类的编译.加载和执行. JVM的内存管理和垃圾回收 ...

  10. Webpack + React 开发 02 JSX 语法

    HTML 语言直接写在 JavaScript 语言之中,不加任何引号,这就是 JSX 的语法,它允许 HTML 与 JavaScript 的混写: render(<h1>Hello Wor ...