20145314郑凯杰《网络对抗技术》资源融合捆绑(资源捆绑)的实现
一、本节摘要
- 简介:资源融合捆绑,在PE文件结构中有一块特殊的节结构——资源节。即是将被捆绑的文件,存至目标PE文件的资源节中,这样既可以实现文件的隐蔽捆绑,也可以在关键的时候将它调出来使用。可以通过将资源(恶意病毒或正常文件)注入该段,实现资源的隐藏。进一步可以通过另一种方法将资源再释放出来,就可以实现攻击。
- 目标:
- 用VS编译器对WIN32程序进行操作,将恶意程序注入进其资源节,实现绑定。
- 编写一个回调函数,利用API函数实现对资源内容的替换,在需要攻击的时候将恶意代码释放。1. 结合免杀后门,应用system语句实现释放资源时的自动攻击。
- 工作环境:
- Linux——Kali(提供回连靶机)
- Windows 7
- 最终成果:已全部实现目标
二、实现过程
1·在PE资源段注入目标文件
打开VS2013,建立一个WIN32程序(不可以用其他方式,首先是因为回调函数的需要,其次是因为只有在win32project下才有resource.h的资源头,对于病毒化游戏比较适合)。可见如图:
为源程序添加EXE资源,这里选择我的老资源,也就是运行游戏的EXE文件:
另外,还需要加上我们的后门,以达到病毒化程序的效果:
因此,直接在项目上右键,添加资源,选择导入:
将两个文件都导入进去,并在类型中,创建一项exe文件
这时候,就可以看到资源已经被添加进来了:
最关键的一步来了,此时的资源还不算是真正这个程序的资源,而是作为一种引用资源。这一点我们单击该资源,在下面的具体路径中就能看出。
所以现在要做的,就是把这个资源列为程序的资源段中的资源:
右击项目,打开属性:
找到:
配置属性→常规→项类型 将其中原本的“不参与生成”改为"PRI资源"(注意,不能改为“资源”,否则会出现路径错误)
此时,基本上就完成了捆绑,只要再在主程序中编写一个窗口,提示大家点击时解压。我们点击生成,一个捆绑了资源的EXE就出现了。
这时就可以把原来的EXE删掉了,对比大小,发现病毒化后的EXE还是会比原先大出一些的(不过在平时应用中,几十KB的变化没有人会在意,更何况360之类的愚蠢杀软还杀不出来)
执行后,出现弹窗。接下来我们要做的就是让大家点击这个弹窗后,释放存于该EXE中的文件,并执行我们的后门程序。
2·对绑定的文件分析,确认绑定
用PE explorer打开绑定后的exe文件,进入resourse view查看:
可以看到,已经绑定了三个EXE文件(其中一个是我绑了两次的后门程序)
看到上面的数字129 130 131,这个数字的含义是什么呢?
经过不断百度和学习,我确定了这个数字是资源ID
那么如何确认呢?
打开我们WIN32工程项目的resourse.h头文件,找到了这几个字段:
这就是资源的ID,每次添加PRI资源后,在该头文件都会进行追加定义,并赋予资源ID。
这有什么用呢?很显然的一点是可以在这个EXE中准确地找到该资源,对于我们的调出资源很有用。但是怎么用?
接下来我要开始编写一段回调函数,实现资源的调出。
3·将PE文件中捆绑的资源释放出来,最终实现攻击
首先确定是触发条件,因为在前面我已经编写了一个交互窗口,所以出发条件很显然就是点击那个按钮。
再来,思路是读出来、写进去
- 定位自定义资源——FindResource
- 加载资源到内存中,并获取对应句柄——LoadResource
- 锁定资源,获取指针——LockResource
- 最后将资源写入文件——fwrite
部分核心代码如下:
//定位自定义资源,返回资源的句柄
hRsrc = FindResource(NULL, //包含所需资源的可执行文件句柄,为NULL代表是程序本身的句柄
MAKEINTRESOURCE(IDR_EXE3),//资源ID
_T("EXE"));//资源类型
if (hRsrc == NULL)
{
break;
}
//加载资源到内存中,返回资源数据的句柄
hGlobal = LoadResource(NULL,//同上,模块句柄
hRsrc);//定位资源函数的返回值
if (hGlobal == NULL)
{
break;
}
//锁定资源,返回值是指向该资源的内存指针(重要,之后便可以用该指针来进行操作)
pBuffer = LockResource(hGlobal); //LoadResource的返回值
if (pBuffer == NULL)
{
break;
}
//获取资源的大小
dwSize = SizeofResource(NULL, hRsrc);
if (dwSize == 0)
{
break;
}
//测试写到磁盘
fopen_s(&fp, "辅助游戏程序.exe", "wb");
if (fp != NULL)
{
//fwrite的三个参数(1,待写入的数据;2、(数据块的大小)每次写的长度;3、数据块的数目;4、文件指针)
//返回值是写入的数据块的个数。
if (fwrite(pBuffer, 1, dwSize, fp) == dwSize);
{
fclose(fp);
}
}
这样就实现了从EXE中的资源节将资源释出来的效果
实测:
在游戏目录下,先把原EXE删了,再打开我们的病毒化入口程序:
单击按钮:
释放了两个EXE文件,并自动运行。讲解如图,根据系统时间和文件修改时间也能看出来,文件就是刚生成的。
另外图中有个亮点,就是360两大卫士一直傻乎乎的在看。hhhh
查杀一下
没有问题。完成免杀。