Nim是一種靜態類型的編譯系統程式語言。它結合了來自成熟語言(如Python,Ada和Modula)的成功概念。
高效的
Nim生成不依賴於虛擬機的本機無依賴可執行文件,這些可執行文件很小並且允許重新分配。Nim編譯器和生成的可執行文件支持所有主要平臺,例如Windows,Linux,BSD和macOS。在C ++和Rust的啟發下,Nim的內存管理是確定性的,並且可以使用析構函數和移動語義進行自定義。它非常適合嵌入式硬實時系統。諸如零開銷的迭代器和用戶定義函數的編譯時評估之類的現代概念,與在堆棧上分配的基於值的數據類型的首選項相結合,導致了性能極高的代碼。支持各種後端:它可以編譯為C,C ++或JavaScript,因此Nim可用於所有後端和前端需求。富有表現力的
Nim是獨立的:編譯器和標準庫是在Nim中實現的。Nim具有強大的宏系統,可以直接操縱AST,提供幾乎無限的機會。優雅
宏無法更改Nim的語法,因為不需要它-語法足夠靈活。具有本地類型推斷,元組,泛型和和類型的現代類型系統。byt3bl33d3r大佬對nim的介紹
Compiles directly to C, C++, Objective-C and Javascript.Since it doesn't rely on a VM/runtime does not produce what I like to call "T H I C C malwarez" as supposed to other languages (e.g. Golang)Python inspired syntax, allows rapid native payload creation & prototyping.Has extremely mature FFI[1] (Foreign Function Interface) capabilities.Avoids making you actually write in C/C++ and subsequently avoids introducing a lot of security issues into your software.Super easy cross compilation to Windows from *nix/MacOS, only requires you to install the mingw toolchain and passing a single flag to the nim compiler.The Nim compiler and the generated executables support all major platforms like Windows, Linux, BSD and macOS. Can even compile to Nintendo switch , IOS & Android. See the cross-compilation section in the Nim compiler usage guide[2]You could technically write your implant and c2 backend both in Nim as you can compile your code directly to Javascript. Even has some initial support for WebAssembly's[3]下面引用紅隊學院Moriarty大佬 對Nim的看法:
有沒有必要學nim ?
nim 跟rust 一樣,都屬於小眾語言。 它的語法集python、lisp(主要是宏)、Ada之長於一身(可能對於習慣了C系語法的人來說有點不適應)。它其實更像是個「中間翻譯」語言:它把自身的語法翻譯成C/C++的,然後再藉助C編譯器(mingw)完成編譯連結。這個過程可以通過在nim命令行中添加「—nimcache」來查看。所以它編譯後的可執行文件的運行效率和體積都與直接用C/C++生成的文件不相上下。再加上它從語法層面上實現了複雜的數據結構和高級特性,因此從開發效率上講,它要更優一點。它又因為「中間翻譯」的特點,可以與C/C++無縫混編,對程序生成可以達到更底層的控制。 從紅隊角度來講,由於它實現了自己的GC,所以在生成的可執行文件中增加了不少自己的東西(這就是為什麼它生成的文件要比C/C++大一點),以及它強制動態獲取dll中的導出函數等特點,使得它生成的程序先天具備一定的靜態ABU的能力。
列舉了這麼多優點,那麼它到底適合什麼人學習呢?
首先,如果你只有python 等腳本語言的開發經驗,而又不想先過多的花時間在C/C++的入門學習上就能快速融入到類C2項目的開發中,那麼nim是你的首選。當然,後期你還是要精通C(以nim為主要開發語言的話,c++可以跳過,或者只簡單熟悉下語法便可)。 另外,nim的學習成本要比C++低很多,所以如果你和我一樣對C++有意見的話,就可以把C/C++變成C/Nim。
Window平臺準備nim環境對於windows安裝可參考官方手冊: use the installer on the official website[4]
下載適合自己電腦平臺的zip文件包,進行解壓。
編譯器依賴性Nim編譯器需要C編譯器才能編譯軟體。zip文件包含一個名為的簡單應用程式finish.exe,您可以finish.exe用來安裝MingW。由於國內網絡問題,我不推薦使用在線方式下載方式,建議離線方式提前下載並解壓,配置環境變量。
已知以下版本的MingW可以與最新版本的Nim一起使用。
打開CMD窗口執行g++、gcc,驗證C編譯器環境設置正確。
zip文件中的二進位文件位於bin目錄內。Nim開發人員通常在其[PATH環境變量中](https://en.wikipedia.org/wiki/PATH_(variable "PATH環境變量中"))包含兩個目錄 :
%USERPROFILE%\.nimble\bin(%USERPROFILE%主目錄)如果不清楚%USERPROFILE%在哪裡可以使用zip文件包含一個名為的簡單應用程式finish.exe幫你完成配置。根據提示進行輸入:
如果 你想使用nim編寫包含Windows API內容,還需要下載和安裝Winim[7]。下面提供帶有git環境和不帶有git環境的安裝方式:
With git on windows:
nimble install winimWithout git:
1. Download and unzip this moudle (by click "Clone or download" button).
2. Start a console, change current dir to the folder which include "winim.nimble" file.
(for example: C:\winim-master\winim-master>)
3. Run "nimble install"至此環境準備完畢。
參考資料[1]FFI: https://nim-lang.org/docs/manual.html#foreign-function-interface
[2]Nim compiler usage guide: https://nim-lang.github.io/Nim/nimc.html#crossminuscompilation
[3]initial support for WebAssembly's: https://forum.nim-lang.org/t/4779
[4]use the installer on the official website: https://nim-lang.org/install_windows.html
[5]-mingw32.7z: https://nim-lang.org/download/mingw32.7z
[6]-mingw64.7z: https://nim-lang.org/download/mingw64.7z
[7]Winim: https://github.com/khchen/winim