目录
1.资源释放(环境设置、加载资源代码)
2.逆向分析
3.工具
4.参考
资源释放
在维基百科里对程序中资源的解释为:资源是嵌入在可移植可执行文件中的只读数据。说白了就是数据,不过这些数据可能包含了程序的图标、对话框、字符串、版本信息等内容(可以没有资源文件)。同样的,恶意软件也可以把恶意代码存放到资源里,在运行时释放并执行恶意代码。
1.环境设置
这里先从正向说一下资源加载的事,我这里是以VS2015为例:
在VS2015中,一般新建的项目就会有资源文件
我们这时候就可以往里面添加内容了,选择资源文件然后右键->添加->新建项(Ctrl+Shift+a)。我们要添加的是一个程序,所以选择资源里的资源文件
双击新建的rc文件,就会跳转到资源视图,右键选择添加资源
资源类型选择Accelerator然后导入程序,这里就可以选择你想要导入的文件,最后的自定义资源类型可以随意命名一个字符串,我这里是“File”
最后的显示如图,这里的IDR_FILE1属于资源的标记,下面会用到它来寻找资源
2.加载资源代码
代码主要参考了微软给的例子,我这里没有设置文件释放的路径,程序默认会在当前目录释放资源。如果想释放到临时目录可以看下面参考哪里。
1 #include<Windows.h> 2 #include<stdio.h> 3 4 #include"resource.h" //要包含资源文件的头文件 5 6 int main() 7 { 8 HRSRC Virus; 9 HGLOBAL LoadVirus; 10 HANDLE hFile; 11 DWORD VirusSize; 12 DWORD dwByteWrite = 0; 13 LPVOID LockVirus; 14 BOOL Flag = FALSE; 15 16 //找到资源 17 Virus = FindResource(NULL, MAKEINTRESOURCE(IDR_FILE1), TEXT("File")); 18 if (Virus == NULL) 19 { 20 printf("Could not locate dialog box."); 21 return 0; 22 } 23 24 //加载资源 25 LoadVirus = LoadResource(NULL, Virus); 26 if (LoadVirus == NULL) 27 { 28 printf("Could not lock dialog box."); 29 return 0; 30 } 31 32 //获取指向资源的指针 33 LockVirus = LockResource(LoadVirus); 34 if (LockVirus == NULL) 35 { 36 printf("Could not lock dialog box."); 37 return 0; 38 } 39 40 //获取资源大小,用于下面写文件 41 VirusSize = SizeofResource(NULL, Virus); 42 43 //创建文件 44 hFile = CreateFile(L"Virus.dat", GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); 45 if (hFile == INVALID_HANDLE_VALUE) 46 { 47 printf("Unable to open file"); 48 } 49 50 //写入文件 51 Flag = WriteFile(hFile, LockVirus, VirusSize, &dwByteWrite, NULL); 52 if (Flag == FALSE) 53 { 54 printf("Fail to WriteFile"); 55 } 56 57 return 0; 58 }
逆向分析
在恶意软件分析中,资源释放的代码也比较明显,在OD中可以明显的看出它的特征是依次调用函数FindResourse、LoadResourse、LockResourse,知道它有资源释放这种行为,我们就可以对应的进行分析了
1 //查找资源 2 FindResource(NULL, MAKEINTRESOURCE(IDR_FILE1), TEXT("File")); 3 4 //加载资源 5 LoadResource(NULL, Virus); 6 7 //获取指向资源的指针 8 LockVirus = LockResource(LoadVirus); 9 10 //获取资源大小,用于下面写文件 11 VirusSize = SizeofResource(NULL, Virus);
对于资源的提取,一般都是用Resourse Hacker这个工具 ,下载链接在下面给出,把编写的程序拉进去就可以看到资源文件相关信息,一个程序可能有很多个资源,那如何定位到哪一个是我们想要的呢?可通过OD动态调试程序,定位到FindResourse这个函数,这个API的第二个参数就是资源的标记,根据这个值就可以定位到Resourse Hacker中的资源
找到自己所需要的资源文件就可以右键把资源保存起来
工具
Resourse Hacker:http://www.angusj.com/resourcehacker/
参考
使用资源文件:https://docs.microsoft.com/zh-cn/windows/desktop/menurc/using-resources
写资源文件: https://docs.microsoft.com/zh-cn/windows/desktop/FileIO/opening-a-file-for-reading-or-writing
获取临时目录:https://docs.microsoft.com/zh-cn/windows/desktop/FileIO/creating-and-using-a-temporary-file