shellcode的隱藏運行

學習shellcode程序設計時,在我們提取了shellcode以後,可以簡單的實現其隱藏運行。

 一、shellcode的運行

下面的這段代碼,是簡略的過程。

#include<windows.h>
unsigned char ShellCode[] = "\x55\x8B\xEC\x33\xFF\x57\x83\xEC\x08....";    //其餘省略
int main()
{
    ((void(*)(void)) &ShellCode)();
    return 0;
}

其中的((void(*)(void)) &ShellCode)();這句代碼是實現shellcode運行的主體代碼,比較不好理解,轉變爲彙編代碼可以清晰的瞭解VC中加載運行ShellCode的原理。

lea eax,ShellCode      //先把ShellCode字符串的地址傳給eax
jmp eax                         //跳到eax處執行ShellCode

如果直接跳過去的話,ShellCode執行完後會沒有返回的地方,運行完後會報錯,所以可將jmp換成call:
lea eax,ShellCode
call eax

 二、shellcode的隱藏

不過上面的代碼在運行的時候會出現虛擬DOS窗口,要實現隱藏運行,只需要在預編譯部分加入如下代碼,設置連接器選項
#pragma comment(linker,"/subsystem:windows /entry:mainCRTStartup");

因爲操作系統裝載了應用程序,完成初始化工作以後將會轉到程序的入口點執行。程序的默認入口點是由連接程序設置的,不同的連接器選擇的入口函數也不盡相同。在VC下,連接器對控制檯程序設置的入口函數是mainCRTStartup,然後由mainCRTStartup調用我們編寫的main函數;對圖形用戶界面(GUI)程序設置的入口函數是 WinMainCRTStartup,然後由WinMainCRTStartup 調用我們編寫的 WinMain 函數。

具體設置哪個入口點是由連接器的“/subsystem:”選項參數確定的,它告訴操作系統如何運行編譯生成的.EXE文件。我們主要關注下面兩個參數:

CONSOLE——win32 字符模式應用程序,運行時產生類似dos窗口的控制檯窗口。如果應用程序的主函數爲main或wmain,在默認情況下該應用程序就是一個控制檯應用程序。

WINDOWS——該類型的應用程序不產生console窗口,窗口由用戶自己創建,簡而言之就是一個標準的win32 application,其入口地址爲winmain或wwinmain的地址。如果在應用程序中定義的主函數爲winmain或wwinmain,在默認情況下該應用程序就是一個win32 application 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章