@TOC關於惡意代碼攻擊原理
惡意代碼實現入侵的相關技術
(1) 滲透技術:
滲透的方式感染可執行程序、分區表和數據文件;
通過移動介質;
通過人、社會工程方式;
藉助於系統和軟件漏洞;
通過電子郵件Web網站和網頁;
P2P文件共享;
即時通信工具和ARP欺騙方式;
(2) 自啓動技術:(目的是保證惡意代碼在受害主機下一次開啓主機後再次被激活)
基本方法:
1) 通過服務啓動;
很多開機啓動程序僅僅在啓動項裏面,只有登錄後才能真正的啓動,windows服務在開機前未進行用戶登錄前就啓動了,惡意代碼通過服務啓動的方式滲透
2) 通過添加註冊表啓動;
3) 通過文件關聯啓動;
4) 通過修改程序系統配置的文件啓動;
5) 作爲其他程序的插件啓動;
6) 通過文件綁定方式啓動;
(3) 自我保護技術
(一) 反靜態分析:
1) 自身隱藏在註冊表、重要文件或系統文件或系統文件夾等隱蔽性很強的位置,躲避反惡意代碼的檢測
2)
微信截圖_20190417215950.png
加殼/多態技術:將惡意代碼用一段不被非法修改或反編譯的程序封裝起來,在這一個可執行的文件中,通過一些被非法修改或反編譯的程序,即外殼保護後壓縮原來exe文件,通過loader加載映射進入exe文件,實現了惡意代碼返檢測的功能
相關加殼技術的代碼(查找了相關的資料學過java的可以上機運行一下)
bool CPack::Pack(WCHAR * szPath)
{
CPe objPe;
//讀取要被加殼的PE文件
DWORD dwReadFilSize = 0;
HANDLE hFile = CreateFile(szPath,GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD dwFileSize = GetFileSize(hFile, NULL);
char * pFileBuf = new char[dwFileSize];
memset(pFileBuf, 0, dwFileSize);
ReadFile(hFile, pFileBuf, dwFileSize, &dwReadFilSize, NULL);
//獲取PE頭文件信息
PEHEADERINFO pPeHead = { 0 };
objPe.GetPeHeaderinfo(pFileBuf, &pPeHead);
//加密
IMAGE_SECTION_HEADER pTxtSection;
objPe.GetSectionInfo(pFileBuf, &pTxtSection, ".text");
objPe.XorCode((LPBYTE)(pTxtSection.PointerToRawData + pFileBuf), pTxtSection.SizeOfRawData);
//用loadLibrary加載殼文件
HMODULE pLoadStubBuf = LoadLibrary(L"..\\Release\\Stub.dll");
//存儲必要的信息
PPACKINFO PackInfoAdd = (PPACKINFO)GetProcAddress((HMODULE)pLoadStubBuf, "g_PackInfo");
PackInfoAdd->dwOriStartPoint = pPeHead.pOptionHeader->AddressOfEntryPoint; //需要跳轉的OEP
PackInfoAdd->dwImageBase = pPeHead.pOptionHeader->ImageBase; //默認加載基址
PackInfoAdd->dwXorCode = pTxtSection.VirtualAddress; //加密代碼段地址
PackInfoAdd->dwXorKey = 0xE; //加密密鑰
PackInfoAdd->dwXorSize = pTxtSection.SizeOfRawData; //加密大小
PackInfoAdd->stcPeRelocDir = pPeHead.pOptionHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC]; //重定位表信息
PackInfoAdd->dwSizeOfImage = pPeHead.pOptionHeader->SizeOfImage; //原PE的大小
//拷貝一份
MODULEINFO stcModInfo = { 0 };
GetModuleInformation(GetCurrentProcess(), pLoadStubBuf, &stcModInfo, sizeof(MODULEINFO));
char * pStubBuf = new char[stcModInfo.SizeOfImage];
memset(pStubBuf, 0, stcModInfo.SizeOfImage);
memcpy(pStubBuf, pLoadStubBuf, stcModInfo.SizeOfImage);
//申請新空間存儲新PE
int NewPeSize = objPe.GetAddSectionSize(pFileBuf, (char*)pLoadStubBuf, stcModInfo.SizeOfImage);
char * pNewPeBuf = new char[NewPeSize];
memset(pNewPeBuf, 0, NewPeSize);
memcpy(pNewPeBuf, pFileBuf, dwFileSize);
//修改重定位表
objPe.FixReloc(pStubBuf, pNewPeBuf);
// 添加一個區段
objPe.AddSection(pNewPeBuf, pStubBuf, stcModInfo.SizeOfImage);
//設置入口點
//自己定義的殼的開始位置的原始偏移
DWORD Offset = PackInfoAdd->dwStartPoint - (DWORD)pLoadStubBuf;
//相對於新PE的起始位置的偏移
unsigned int NewOep = Offset + pPeHead.pOptionHeader->SizeOfImage;
objPe.SetOep(pNewPeBuf, NewOep);
//保存成文件
SavePackFile(szPath, pNewPeBuf, NewPeSize);
//釋放內存
delete[]pFileBuf;
delete[]pStubBuf;
delete[]pNewPeBuf;
return true;
}
作者:woshigeshusheng
來源:CSDN
原文:https://blog.csdn.net/woshigeshusheng/article/details/68489843
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!
未加殼時:惡意代碼數據流想入侵受害主機或許被防火牆阻隔,或者是相關的反惡意代碼的檢測機制,阻斷了惡意代碼的入侵途徑
加殼後:惡意代碼數據流在外殼的保護下可以直接通過防火牆或者欺騙過反惡意代碼的檢查機制成功入侵受害主機
(二) 反動態跟蹤:
(4) 隱蔽通信(通過遠程控制,即實質上是加密被控主機端和控制端之間傳送命令和命令執行結果)
遠程控制的基本流程:
(a) 服務器監聽:服務器端套接字並不定位具體的客戶端套接字,而是處於等待連接的狀態,即實時監控網絡的狀態
(b) 客戶端的請求:指由客戶端的套接字提出連接的要求,要連接的目標是服務器端的套接字,指出服務器端的套接字的地址和端口號,然後就向服務器端提出連接請求
(c) 連接確認:是指當服務器端套接字監聽或者接收到客戶端套接字的連接請求,它就相應客戶端套接字的請求,建立一個新的線程,把服務器端的套接字的描述發給客戶端,一旦客戶端確認了此描述,連接就建立好了,而服務器端的套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連接請求
常見的隱蔽通信的方式:
1) 直接使用套接字進行通訊控制
(a) 服務器端偵聽,客戶端連接:
(b) 客戶端偵聽,服務器端連接:
à這兩樣方式都會引起防火牆報警
因此(a)的方法可以通過全局IP地址,通過限制惡意代碼的活動範圍使其精準地入侵受害主機;而(b)的方法通過線程注入的方式,具體方法如下:在當前所有運行的進程中找到目標進程;其次將我們的DLL內容寫入目標進程的私有空間;通過關鍵的API創建線程加載到DLL中
2) 隱蔽通道
3) ICMP隧道:
利用ICMP_ECHO和ICMP_ECHOREPLY兩種報文
4) 使用第三方交互服務進行通訊
5) 通過ARP欺騙或DHCP欺騙等網絡代理木馬欺騙方式
微信圖片_20190417222207.jpg
ARP欺騙
惡意代碼通過調用ARP上的壓縮數據包,將其傳送到網絡,尤其是網關上,目的是將特定的IP地址的數據流被錯誤的送到攻擊者所取代的地方
(5) 攻擊技術
攻擊技術是指一切試圖跨越系統安全邊界危害受害主機的可用性、可靠性、數據完整性、或者消耗受害者主機的系統資源以及受害主機危害他人的所有行爲;歸納起來就是拒絕服務攻擊、信息竊取、數據破壞、修改系統配置