EagleMonitorRAT通信模型剖析及通信解密尝试

文章首发地址:
https://xz.aliyun.com/t/14514
文章首发作者:
T0daySeeker

概述

近期,笔者在技术研究的时候,发现了一款以前从未见过的开源远控,因此,抱着好奇的心态,笔者准备按照以往的思路对其进行详细的研究分析。

基于网络调研,笔者发现此开源远控的实际利用案例并不多,网络中更多的是对EagleMonitorRAT远控的介绍信息。「(笔者尝试使用了一下此开源远控,感觉远控功能还行,不清楚为什么实际使用案例不多,可能是不够知名吧。。。)」

为了能够深入的对EagleMonitorRAT远控进行详细的剖析,笔者准备从如下角度对EagleMonitorRAT远控进行剖析:

  • 开源EagleMonitorRAT利用分析:对EagleMonitorRAT开源项目进行简单分析,模拟利用Xeno-RAT开源远控程序;
  • 配置信息解密:对EagleMonitorRAT远控程序的配置信息进行提取,并对其解码方法进行剖析;
  • 功能分析:对EagleMonitorRAT远控程序的功能原理进行剖析;
  • 通信模型剖析:基于逆向分析,剖析EagleMonitorRAT远控程序的通信模型,并对通信过程中的二进制序列化数据进行剖析;
  • 模拟构建通信解密程序:模拟构建通信解密程序,实现对EagleMonitorRAT木马通信数据的多个会话进行批量解密;

开源EagleMonitorRAT利用分析

EagleMonitorRAT远控的开源地址为https://github.com/arsium/EagleMonitorRAT,我们可直接访问github即可对其工具源码、release版本程序进行下载研究。

通过对开源项目进行简单分析,发现:

  • EagleMonitorRAT远控工具于2022年4月7日首次发布,目前共推出15次迭代,最新版本为2022年12月12日发布的3.2.4.0版本;
  • EagleMonitorRAT开源项目的维护人员较少,目前只有1人维护,423余个标星,144个账号forks拷贝项目;
  • EagleMonitorRAT远控工具是由C#代码编写,是基于Visual Basic .NET语言下的HorusEyesRat项目升级而来的;
  • EagleMonitorRAT远控工具的远控功能较全面,支持文件管理、进程管理、键盘记录、远程桌面、远程网络摄像头等功能;

相关截图如下:

EagleMonitorRAT通信模型剖析及通信解密尝试

生成EagleMonitorRAT木马端程序

下载release版本程序并直接运行即可打开EagleMonitorRAT控制端的GUI界面,在GUI界面中选择【Builder】菜单即可对EagleMonitorRAT木马端程序进行自定义配置,相关截图如下:

EagleMonitorRAT通信模型剖析及通信解密尝试

木马上线

在受控主机中运行EagleMonitorRAT木马端程序,即可成功实现木马上线,上线后即可实现对受控主机的远控管理,相关截图如下:

EagleMonitorRAT通信模型剖析及通信解密尝试

配置信息解密

尝试对EagleMonitorRAT木马端程序进行分析,笔者发现EagleMonitorRAT远控默认生成的EagleMonitorRAT木马端程序是被混淆处理过的,因此,需要对其进行去混淆才能有效对其进行分析,相关截图如下:

EagleMonitorRAT通信模型剖析及通信解密尝试

尝试对EagleMonitorRAT木马端程序进行去混淆处理后,笔者发现在GClass0类中存放了EagleMonitorRAT端木马程序的配置信息,进一步分析,发现配置信息均为Base64编码,相关截图如下:

EagleMonitorRAT通信模型剖析及通信解密尝试

Base64解码情况如下:

MTI3LjAuMC4xOjk4NzU=
解码后字符串:127.0.0.1:9875
MTI3LjAuMC4xOjc3ODg=
解码后字符串:127.0.0.1:7788
MTIzNDU2Nzg5
解码后字符串:123456789
JU1VVEVYJQ==
解码后字符串:%MUTEX%

功能分析

加载DLL程序

通过分析,发现EagleMonitorRAT端木马程序运行后,将动态加载PacketLib.dll、Offline.dll文件用于后续功能:

  • PacketLib.dll:用于通信数据包的封装及加解密;
  • Offline.dll:用于反病毒软件及部分离线功能;

相关代码截图如下:

EagleMonitorRAT通信模型剖析及通信解密尝试

木马通信

通过分析,发现EagleMonitorRAT远控木马发送数据时,将调用两次send函数进行数据发送:

  • 第一次:发送5字节头部数据;
  • 第二次:发送后续载荷数据;

发送数据通信函数代码截图如下:

EagleMonitorRAT通信模型剖析及通信解密尝试

接收数据通信函数代码截图如下:

EagleMonitorRAT通信模型剖析及通信解密尝试

通信加解密

通过分析,发现EagleMonitorRAT远控木马将按照如下逻辑进行通信数据加解密:

  • 通信加密:
    • 调用BinaryFormatter().Serialize函数对通信数据进行序列化处理;
    • 调用QuickLZ压缩算法对数据进行压缩处理;
    • 调用PBKDF2算法生成AES算法的KEY值和IV值;
    • 调用AES CBC加密算法对数据进行加密处理;
  • 通信解密:
    • 调用PBKDF2算法生成AES算法的KEY值和IV值;
    • 调用AES CBC加密算法对通信数据进行解密处理;
    • 调用QuickLZ解压算法对数据进行解压处理;
    • 调用BinaryFormatter().Deserialize函数对数据进行反序列化处理;

相关代码截图如下:

EagleMonitorRAT通信模型剖析及通信解密尝试

EagleMonitorRAT通信模型剖析及通信解密尝试

远控功能

通过分析,发现EagleMonitorRAT的远控功能主要是通过动态加载插件DLL实现的,相关代码截图如下:

EagleMonitorRAT通信模型剖析及通信解密尝试

相关插件文件截图如下:

EagleMonitorRAT通信模型剖析及通信解密尝试

通信模型剖析

通过分析,梳理EagleMonitorRAT远控木马的通信模型如下:

  • 通信数据:4字节数据(载荷数据大小)+1字节标志数据  + AES加密数据
  • AES解密数据:16字节GUID值 + QuickLZ压缩数据
  • QuickLZ压缩数据解压后,即为BinaryFormatter().Deserialize序列化数据

基于通信数据进行实操解密案例如下:

#通信数据
4002000002 
cc11fb92bf6f4fd0b86878eac16d1b16e725a7c087f0d035f761ac79d934dc0bf4e7e5e46ef955d8784cd02170df8c6dc659de0eed23ef8c5e4fc46d44ea1f27c09f1fa5e27c93b0dc0126b87a4980ad26c8de0142e8b52f1e21adf4d54816779de694cfb6e2778e8e33be1375f1eb0dd987e931c0c8aef625a5cc2f69639e970e1f516c0d2bdbc10bd05539842f15d38a7716994569cab77e4d5ad6b5839b2305ace821647e49fb20ef8976017052bba3c774326f819cbda8a2874fedf097a915f8d91bf0f698ecdc145a5f78835ccac3f31a530a5054143824442b758183c75536c374b3d9ecdae5713fd52b64164ca07cb471b8c80a9e612c7534a88a3729844fb9da9554ccfa703fdf0bd352994013747266a6a6aec632d8919fe4b0aa7b9722f9e5b898929e3549b1b8963e5e65ff89d028b884c7283b26e61c4ac18c91ca44896e9759bbfb140a26c5e76e4a85448409f3a3a6a9522cb00f5be8e5e6eb6de8c58b76007f19a7df75ca0d2626e17a0943afaec02207449a42d679b66190e0b90e4c0e4fcc73d4040d961114c1c1ca6f38ac7e1b5dba2f5881941773b67b5de215acb69e1588aaf8aa13135b654893c69fdcad04c83194f7b744d06cb48cb40026a1c0882e5cb650a31d89e0c05372d0b77878b3e71ca716f53c25f5f36adb14366861785fa9487c5619bec61f29284cccbefe24b26517fa8ff1e3be42671ddb2e8f4aecc29d6830f3fcb986cc986fd9b63ec6e0b4a16d26b321df146e81aadb632894d65e7de63085b7865e377c485ce62f274152411cddfd602a0bbdb9

#
数据结构解析
40020000 #实际载荷数据大小
02   #PacketType标志
   #实际载荷数据
cc11fb92bf6f4fd0b86878eac16d1b16e725a7c087f0d035f761ac79d934dc0bf4e7e5e46ef955d8784cd02170df8c6dc659de0eed23ef8c5e4fc46d44ea1f27c09f1fa5e27c93b0dc0126b87a4980ad26c8de0142e8b52f1e21adf4d54816779de694cfb6e2778e8e33be1375f1eb0dd987e931c0c8aef625a5cc2f69639e970e1f516c0d2bdbc10bd05539842f15d38a7716994569cab77e4d5ad6b5839b2305ace821647e49fb20ef8976017052bba3c774326f819cbda8a2874fedf097a915f8d91bf0f698ecdc145a5f78835ccac3f31a530a5054143824442b758183c75536c374b3d9ecdae5713fd52b64164ca07cb471b8c80a9e612c7534a88a3729844fb9da9554ccfa703fdf0bd352994013747266a6a6aec632d8919fe4b0aa7b9722f9e5b898929e3549b1b8963e5e65ff89d028b884c7283b26e61c4ac18c91ca44896e9759bbfb140a26c5e76e4a85448409f3a3a6a9522cb00f5be8e5e6eb6de8c58b76007f19a7df75ca0d2626e17a0943afaec02207449a42d679b66190e0b90e4c0e4fcc73d4040d961114c1c1ca6f38ac7e1b5dba2f5881941773b67b5de215acb69e1588aaf8aa13135b654893c69fdcad04c83194f7b744d06cb48cb40026a1c0882e5cb650a31d89e0c05372d0b77878b3e71ca716f53c25f5f36adb14366861785fa9487c5619bec61f29284cccbefe24b26517fa8ff1e3be42671ddb2e8f4aecc29d6830f3fcb986cc986fd9b63ec6e0b4a16d26b321df146e81aadb632894d65e7de63085b7865e377c485ce62f274152411cddfd602a0bbdb9

#
第一层:AES解密
573c55f68426994aa17609a155317c9f472b0200008c030000000201800001000000ffffffff1200000000000c020100405061636b65744c69622c205665000000807273696f6e3d332e322e342e302c2043756c747572653d6e65757472616c2c0000a082205075626c69634b6579546f6b656e3d6e756c6c0512002067762e64762e436f6e6ea000088065637465646476110100153c485749443e6b5f5f42715d696e674669656c64173c42209050c8617365497080ec12506c7567696e8eec1b3c6476547970658eec1c9562537461746f8d173c4224c42308a075738eec213c4461236476402416869153697a6f8d143c52414d8eec183c497336344269748eec1a000202823c50726976696c65676f8d173c4f534e616d6f8d193c557365726e70b3131b3c526567870040b0f1988079148693466c61678eec1e3c6b65796c6f674f66666c696e6f8d173c736967d12d8eec010084dfa50107040401010001010112110001021b6476a1f6b663647632e522001c6476aff642246522000801220006020000c00301001438343746374438303233323042423437303442380a0a05fcffffffe0601c01880bc412000776616c75655f5f000222000205fb010090601d1b00082200000000000a0a0100000606010040500280033847620607010002333206080100042250060901001e4d6963726f736f6674205769000008906e646f777320313020e4b893e4b89ae7898806a2000561646d696e060b01000a43000000804e202d204368696e61060c00000002636e000a0b
#数据结构解析
 #GUID
573c55f68426994aa17609a155317c9f 
 #QuickLZ压缩数据
472b0200008c030000000201800001000000ffffffff1200000000000c020100405061636b65744c69622c205665000000807273696f6e3d332e322e342e302c2043756c747572653d6e65757472616c2c0000a082205075626c69634b6579546f6b656e3d6e756c6c0512002067762e64762e436f6e6ea000088065637465646476110100153c485749443e6b5f5f42715d696e674669656c64173c42209050c8617365497080ec12506c7567696e8eec1b3c6476547970658eec1c9562537461746f8d173c4224c42308a075738eec213c4461236476402416869153697a6f8d143c52414d8eec183c497336344269748eec1a000202823c50726976696c65676f8d173c4f534e616d6f8d193c557365726e70b3131b3c526567870040b0f1988079148693466c61678eec1e3c6b65796c6f674f66666c696e6f8d173c736967d12d8eec010084dfa50107040401010001010112110001021b6476a1f6b663647632e522001c6476aff642246522000801220006020000c00301001438343746374438303233323042423437303442380a0a05fcffffffe0601c01880bc412000776616c75655f5f000222000205fb010090601d1b00082200000000000a0a0100000606010040500280033847620607010002333206080100042250060901001e4d6963726f736f6674205769000008906e646f777320313020e4b893e4b89ae7898806a2000561646d696e060b01000a43000000804e202d204368696e61060c00000002636e000a0b

#
第二层:QuickLZ解压缩
0001000000FFFFFFFF01000000000000000C02000000405061636B65744C69622C2056657273696F6E3D332E322E342E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D6E756C6C0501000000205061636B65744C69622E5061636B65742E436F6E6E65637465645061636B657411000000153C485749443E6B5F5F4261636B696E674669656C64173C4261736549703E6B5F5F4261636B696E674669656C64173C506C7567696E3E6B5F5F4261636B696E674669656C641B3C5061636B6574547970653E6B5F5F4261636B696E674669656C641C3C5061636B657453746174653E6B5F5F4261636B696E674669656C64173C5374617475733E6B5F5F4261636B696E674669656C64213C446174655061636B65745374617475733E6B5F5F4261636B696E674669656C641B3C5061636B657453697A653E6B5F5F4261636B696E674669656C64143C52414D3E6B5F5F4261636B696E674669656C64183C497336344269743E6B5F5F4261636B696E674669656C641A3C50726976696C6567653E6B5F5F4261636B696E674669656C64173C4F534E616D653E6B5F5F4261636B696E674669656C64193C557365726E616D653E6B5F5F4261636B696E674669656C641B3C526567696F6E4E616D653E6B5F5F4261636B696E674669656C641B3C526567696F6E466C61673E6B5F5F4261636B696E674669656C641E3C6B65796C6F674F66666C696E653E6B5F5F4261636B696E674669656C64173C7369674B65793E6B5F5F4261636B696E674669656C640101070404010100010101010101010001021B5061636B65744C69622E5061636B65742E5061636B657454797065020000001C5061636B65744C69622E5061636B65742E5061636B657453746174650200000008010200000006030000001438343746374438303233323042423437303442380A0A05FCFFFFFF1B5061636B65744C69622E5061636B65742E5061636B657454797065010000000776616C75655F5F0002020000000205FBFFFFFF1C5061636B65744C69622E5061636B65742E5061636B65745374617465010000000776616C75655F5F000802000000000000000A0A0000000006060000000338476206070000000233320608000000045573657206090000001E4D6963726F736F66742057696E646F777320313020E4B893E4B89AE78988060A0000000561646D696E060B0000000A434E202D204368696E61060C00000002636E000A0B

#
第三层:BinaryFormatter().Deserialize反序列化
基于代码中的结构体信息输出结构体数据

BinaryFormatter序列化

通过对PacketLib.dll文件进行分析,笔者发现不同功能下的通信数据结构均不同,因此,若要实现对EagleMonitorRAT远控木马的序列化数据进行解析,则需要提取不同功能下的通信数据结构,并调用BinaryFormatter().Deserialize反序列化函数对其序列化数据进行解析,相关代码截图如下:

EagleMonitorRAT通信模型剖析及通信解密尝试

由于EagleMonitorRAT远控木马中的通信数据结构太多,因此,笔者认为直接对其进行梳理可能会花不少时间。为了能够快速的对序列化通信数据进行剖析,笔者尝试对序列化通信数据的二进制信息进行了分析,发现:

  • 二进制序列化数据中存在通信数据结构体名称

EagleMonitorRAT通信模型剖析及通信解密尝试

  • 二进制序列化数据中会记录结构体成员名称,成员名称顺序与反编译代码中的结构体名称顺序相同

EagleMonitorRAT通信模型剖析及通信解密尝试

EagleMonitorRAT通信模型剖析及通信解密尝试

  • 二进制序列化数据中会记录结构体成员对应的数据,其中字符串数据的数据结构为:1字节数据长度+字符串数据

EagleMonitorRAT通信模型剖析及通信解密尝试

模拟构建通信解密程序

为了更便利的对EagleMonitorRAT远控工具的通信数据进行解密,笔者尝试编写了一个解密程序,可对EagleMonitorRAT木马通信数据的多个会话进行批量解密,解密效果如下:

EagleMonitorRAT通信模型剖析及通信解密尝试

「备注:脚本使用方法请参考上一篇《Xeno-RAT通信模型剖析及自动化解密脚本实现》文章的“模拟构建通信解密程序”章节。」

代码实现

代码结构如下:

EagleMonitorRAT通信模型剖析及通信解密尝试

  • main.go
package main

import (
 "awesomeProject5/common"
 "encoding/hex"
 "fmt"
 "io/ioutil"
 "strings"
)

func main() {
 key := "123456789"
 files, err := common.WalkDir("C:\Users\admin\Desktop\新建文件夹""")
 if err != nil {
  fmt.Println("Error:", err.Error())
 }
 for _, onefile := range files {
  log_filename := onefile + ".dec"
  content, err := ioutil.ReadFile(onefile)
  if err != nil {
   fmt.Println("Error reading file:", err)
   return
  }
  data := string(content)

  data = strings.ReplaceAll(data, "n0x""0x")
  datas := strings.Split(data, "n")

  lable := strings.Split(datas[0], "_")[0]

  recvbuf := []byte{}
  for _, str := range datas {
   if str == "" {
    break
   }
   buf := strings.ReplaceAll(strings.Split(strings.Split(str, " };")[0], "*/0x")[1], ", 0x""")
   hex_buf, _ := hex.DecodeString(buf)
   if len(hex_buf) == 5 {
    recvbuf = append(recvbuf, hex_buf...)
    continue
   } else {
    recvbuf = append(recvbuf, hex_buf...)
    data1 := recvbuf[5:]
    if common.BytesToInt_Little(recvbuf[:4]) == len(data1) {
     if strings.HasPrefix(str, lable) {
      fmt.Println("************send************")
      common.Writefile_A(log_filename, "************send************rn")
      decryptd_text := common.Decrypt(data1, key)
      fmt.Println("原始16进制数据:", hex.EncodeToString(recvbuf))
      common.Writefile_A(log_filename, "原始16进制数据:"+hex.EncodeToString(recvbuf)+"rn")
      fmt.Println("数据标志:", hex.EncodeToString(append([]byte{}, recvbuf[4])))
      common.Writefile_A(log_filename, "数据标志:"+hex.EncodeToString(append([]byte{}, recvbuf[4]))+"rn")
      fmt.Println("解密后16进制数据:", hex.EncodeToString(decryptd_text))
      common.Writefile_A(log_filename, "解密后16进制数据:"+hex.EncodeToString(decryptd_text)+"rn")
      fmt.Println("解密后字符串数据:"string(decryptd_text))
      common.Writefile_A(log_filename, "解密后字符串数据:"+string(decryptd_text)+"rn")
     } else if strings.HasPrefix(str, "char peer") {
      fmt.Println("************recv************")
      common.Writefile_A(log_filename, "************recv************rn")
      decryptd_text := common.Decrypt(data1, key)
      fmt.Println("原始16进制数据:", hex.EncodeToString(recvbuf))
      common.Writefile_A(log_filename, "原始16进制数据:"+hex.EncodeToString(recvbuf)+"rn")
      fmt.Println("数据标志:", hex.EncodeToString(append([]byte{}, recvbuf[4])))
      common.Writefile_A(log_filename, "数据标志:"+hex.EncodeToString(append([]byte{}, recvbuf[4]))+"rn")
      fmt.Println("解密后16进制数据:", hex.EncodeToString(decryptd_text))
      common.Writefile_A(log_filename, "解密后16进制数据:"+hex.EncodeToString(decryptd_text)+"rn")
      fmt.Println("解密后字符串数据:"string(decryptd_text))
      common.Writefile_A(log_filename, "解密后字符串数据:"+string(decryptd_text)+"rn")
     }
    }
    recvbuf = []byte{}
   }
  }
 }
}
  • common.go
package common

import (
 quicklz "awesomeProject5/quicklz_z"
 "bytes"
 "crypto/aes"
 "crypto/cipher"
 "crypto/sha1"
 "encoding/binary"
 "encoding/hex"
 "fmt"
 "golang.org/x/crypto/pbkdf2"
 "io"
 "os"
 "path/filepath"
 "strings"
)

func WalkDir(dirPth, suffix string) (files []string, err error) {
 files = make([]string030)
 suffix = strings.ToUpper(suffix) //忽略后缀匹配的大小写

 err = filepath.Walk(dirPth, func(filename string, fi os.FileInfo, err error) error { //遍历目录
  if fi.IsDir() { // 忽略目录
   return nil
  }

  if strings.HasSuffix(strings.ToUpper(fi.Name()), suffix) {
   files = append(files, filename)
  }

  return nil
 })

 return files, err
}

func checkPathIsExist(filename string) bool {
 var exist = true
 if _, err := os.Stat(filename); os.IsNotExist(err) {
  exist = false
 }
 return exist
}

func Writefile_A(filename string, buffer string) {
 var f *os.File
 var err1 error

 if checkPathIsExist(filename) { //如果文件存在
  f, err1 = os.OpenFile(filename, os.O_APPEND, 0666//打开文件
 } else {
  f, err1 = os.Create(filename) //创建文件
 }
 _, err1 = io.WriteString(f, buffer)
 if err1 != nil {
  fmt.Println("写文件失败", err1)
  return
 }
 _ = f.Close()
}

func BytesToInt_Little(bys []byte) int {
 bytebuff := bytes.NewBuffer(bys)
 var data int32
 binary.Read(bytebuff, binary.LittleEndian, &data)
 return int(data)
}

func Aes_z_Decrypt(input, key, iv []byte) (output, newiv []byte) {
 output, err := aes_decrypt_cbc(input, key, iv)
 if err != nil {
  panic(err)
 }
 newiv = append(newiv, input[len(input)-16:]...)
 return
}

func aes_decrypt_cbc(data []byte, key []byte, iv []byte) ([]byte, error) {
 data_new := []byte{}
 data_new = append(data_new, iv...)
 data_new = append(data_new, data...)

 block, err := aes.NewCipher(key)
 if err != nil {
  return nil, err
 }

 if len(data_new) < aes.BlockSize {
  return nil, fmt.Errorf("加密数据太短")
 }

 iv = data_new[:aes.BlockSize]
 data_new = data_new[aes.BlockSize:]

 if len(data_new)%aes.BlockSize != 0 {
  return nil, fmt.Errorf("加密数据长度不是块大小的整数倍")
 }

 mode := cipher.NewCBCDecrypter(block, iv)
 mode.CryptBlocks(data_new, data_new)

 data_new = pkcs5UnPadding(data_new)

 return data_new, nil
}

func pkcs5UnPadding(ciphertext []byte) []byte {
 length := len(ciphertext)
 unpadding := int(ciphertext[length-1])
 return ciphertext[:(length - unpadding)]
}

func Decrypt(data []byte, key string) (output []byte) {
 key_hex := asciToUnicode(key)
 rfc2898DeriveBytes := pbkdf2_Rfc2898DeriveBytes(key_hex)
 aes_key := rfc2898DeriveBytes[:16]
 aes_iv := rfc2898DeriveBytes[16:]

 decryptd_text1, _ := Aes_z_Decrypt(data, aes_key, aes_iv)

 decryptd_text2 := quicklz.QuickLZ_Decompress(decryptd_text1[16:])

 output = append(output, decryptd_text2...)
 return
}

func asciToUnicode(hexStr string) []byte {
 decoded := []byte(hexStr)
 var buffer bytes.Buffer
 for _, b := range decoded {
  buffer.WriteByte(b)    // 添加原始字节
  buffer.WriteByte(0x00// 添加00字节
 }
 return buffer.Bytes() // 将添加00字节后的字节转换为十六进制字符串
}

func pbkdf2_Rfc2898DeriveBytes(masterKey []byte) []byte {
 salt, _ := hex.DecodeString("0000000000000000")
 iterations := 1
 keyLength := 32 // 密钥长度为字节单位
 derivedKey := pbkdf2.Key(masterKey, salt, iterations, keyLength, sha1.New)
 return derivedKey
}
  • quicklz_z.go
package quicklz

import (
 "fmt"
 "github.com/Hiroko103/go-quicklz"
)

func QuickLZ_Decompress(input []byte) (output []byte) {
 source := []byte{}
 source = append(source, input...)

 qlz, err := quicklz.New(quicklz.COMPRESSION_LEVEL_1, quicklz.STREAMING_BUFFER_0)
 if err != nil {
  fmt.Println(err)
  return
 }
 decompressed_size := quicklz.Size_decompressed(&source)
 destination := make([]byte, decompressed_size)
 decompressed_size, err = qlz.Decompress(&source, &destination)
 if err != nil {
  fmt.Println(err)
  return
 }
 output = append(output, destination...)
 return
}


原文始发于微信公众号(T0daySeeker):EagleMonitorRAT通信模型剖析及通信解密尝试

版权声明:admin 发表于 2024年5月17日 上午7:31。
转载请注明:EagleMonitorRAT通信模型剖析及通信解密尝试 | CTF导航

相关文章