恶意代码启动技术之释放资源文件

来源:互联网 发布:mysql count distinct 编辑:程序博客网 时间:2024/05/03 07:25

正常情况下,windows PE文件格式中的资源节是供可执行程序使用的,但不应该是可执行程序的组成代码。正常资源节的内容包括图标、图片、菜单以及字符串。启动器通常在资源节存储恶意代码,当启动器运行时,它在运行嵌入的可执行程序或者DLL程序之前从资源节将恶意代码提取出来。如果资源节被压缩或者加密,则恶意代码必须在加载前进行资源节提取操作。这通常意味着你将会看到启动器使用资源操作API函数。
SizeofResource:返回指定资源的字节数大小。
LockResource:锁定资源并得到资源在内存中的第一个字节的指针。
LoadResource:装载指定资源到全局存储器。
FreeResource:给一个加载资源的引用计数减1,当引用计数为0时,资源占用的内存释放。
FindResource:确定指定模块中指定类型和名称的资源所在位置。
我们先编写一个程序,这个程序在控制台打印一句话:I am a hacker!命名为1.exe,放在D盘。


接下来编写一个程序把1.exe以资源的形式存储,在程序中释放并启动1.exe。如图所示,在VS2015的资源视图中添加资源文件。


下面是源代码。

#include<afx.h>#include<stdio.h>#include<WinDef.h>#include<shlwapi.h>#include<WinUser.h>#include"resource.h"int main(){try{HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE(IDR_EXE1), _T("EXE"));if (NULL == hRes) return 0;DWORD dwSize = SizeofResource(NULL, hRes);if (0 == dwSize) return 0;HGLOBAL hGlobal = LoadResource(NULL, hRes);if (NULL == hGlobal) return 0;LPVOID lp = LockResource(hGlobal);if (NULL == lp) return 0;CFile file;TCHAR szApp[MAX_PATH] = { _T("D://1.exe") };file.Open(szApp, CFile::modeCreate | CFile::modeWrite);file.Write(lp, dwSize);file.Close();FreeResource(hGlobal);if (PathFileExists(szApp)){STARTUPINFO si = { sizeof(si) };PROCESS_INFORMATION pi = { 0 };if (CreateProcess(NULL, szApp, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)){CloseHandle(pi.hThread);CloseHandle(pi.hProcess);}}}catch (CException* e){e->ReportError();e->Delete();}return 0;}

项目-->属性-->配置属性-->常规,然后在右边的项目默认值中的MFC的使用选项中选择在共享DLL中使用 MFC。


编译运行这个程序,可以看到1.exe被成功执行。


接下来使用PEView打开debug生成的exe,在rsrc节找到1.exe。


EXE和源代码在github:

https://github.com/houjingyi233/start-program-by-releases-resource-file/

0 0
原创粉丝点击