在资源段添加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);