PE文件捆绑代码实现一:

在资源段添加PE文件并释放:

  这两天分析病毒,对PE文件释放很感兴趣。于是便想研究研究一下这种捆绑方式究竟是如何实现的。首先找到了一种在PE资源段添加自定义资源的方式,也就是我们也可以在资源段添加EXE或DLL,然后再将其释放到指定路径。由于自己编码能力实在有限,仅仅把今天在网上学到了这种方式实现了一遍,便以此作为自己在博客园的第一篇博客,并在以后慢慢将PE文件捆绑的各种方式全部实现。

实现环境:VS2013,SDK WIN32程序。

第一步:建立一个默认的WIN32程序,为源程序添加EXE资源,在项目上右键,添加资源,选择导入,找到待添加的目的EXE程序。然后资源添加成功。实现效果如图:

第二步: 在窗口回调函数里添加了一个WM_RBUTTONDOWN消息处理,在右键按下时,释放该exe文件(以添加目的程序小米脱壳为例),代码如下:

 1 case WM_RBUTTONDOWN:
 2     {
 3         //释放出PE文件.
 4         //定位自定义资源,返回值是定位到的资源的句柄(注意第一个参数是包含资源的可执行文件的句柄,不要混淆)
 5         HRSRC hRsrc =FindResource(NULL, //包含所需资源的可执行文件句柄,为NULL代表是程序本身的句柄
 6             MAKEINTRESOURCE(IDR_EXE1),    //资源ID
 7             _T("EXE"));                    //资源类型
 8         if (hRsrc == NULL)
 9         {
10             break;
11         }
12         //加载资源到内存中,返回值是相关资源数据的句柄
13         HGLOBAL hGlobal = LoadResource(NULL,    //同上,模块句柄
14             hRsrc);                                //定位资源函数的返回值
15         if (hGlobal==NULL)
16         {
17             break;
18         }
19         //锁定资源,返回值是指向该资源的内存指针(重要,之后便可以用该指针来进行操作)
20         LPVOID pBuffer = LockResource(hGlobal); //LoadResource的返回值
21         if (pBuffer==NULL)
22         {
23             break;
24         }
25         //获取资源的大小
26         DWORD dwSize = SizeofResource(NULL, hRsrc);
27         if (dwSize == 0)
28         {
29             break;
30         }
31         //测试写到磁盘
32         FILE *fp;
33         fopen_s(&fp, "hello.exe", "wb");
34         if (fp!=NULL)
35         {
36             //fwrite的三个参数(1,待写入的数据;2、(数据块的大小)每次写的长度;3、数据块的数目;4、文件指针)
37             //返回值是写入的数据块的个数。
38             if (fwrite(pBuffer, 1, dwSize, fp) == dwSize);
39             {
40                 fclose(fp);
41             }
42         }

实现效果:在本cpp目录下,生成一个名字为hello.exe的小米脱壳工具。

总结:加载自定义资源用到的三个函数(FindResource、LoadResource、LockResource);

posted @ 2016-01-09 14:59  Wings_翅膀  阅读(1435)  评论(0编辑  收藏  举报