• 20145314郑凯杰《网络对抗技术》资源融合捆绑(资源捆绑)的实现


    20145314郑凯杰《网络对抗技术》资源融合捆绑(资源捆绑)的实现

    一、本节摘要

    • 简介:资源融合捆绑,在PE文件结构中有一块特殊的节结构——资源节。即是将被捆绑的文件,存至目标PE文件的资源节中,这样既可以实现文件的隐蔽捆绑,也可以在关键的时候将它调出来使用。可以通过将资源(恶意病毒或正常文件)注入该段,实现资源的隐藏。进一步可以通过另一种方法将资源再释放出来,就可以实现攻击。
    • 目标:
      1. 用VS编译器对WIN32程序进行操作,将恶意程序注入进其资源节,实现绑定。
      2. 编写一个回调函数,利用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文件中捆绑的资源释放出来,最终实现攻击

    首先确定是触发条件,因为在前面我已经编写了一个交互窗口,所以出发条件很显然就是点击那个按钮。

    再来,思路是读出来、写进去

    1. 定位自定义资源——FindResource
    2. 加载资源到内存中,并获取对应句柄——LoadResource
    3. 锁定资源,获取指针——LockResource
    4. 最后将资源写入文件——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

    查杀一下

    没有问题。完成免杀。

  • 相关阅读:
    mysql主从复制配置
    mysql三种修改密码的方式
    mysqldump数据库备份与恢复
    mysql多实例安装
    线性回归与梯度下降法——原理与实现
    K-Means聚类算法原理
    EFcodeFirst+T4=操纵任意数据库
    涨姿势UWP源码——IsolatedStorage
    记一次Project插件开发
    基于Nodejs生态圈的TypeScript+React开发入门教程
  • 原文地址:https://www.cnblogs.com/5314zkj/p/7029275.html
Copyright © 2020-2023  润新知