2.释放资源那些事

目录

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

原文地址:https://www.cnblogs.com/QKSword/p/10513388.html