目录
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中的资源
找到自己所需要的资源文件就可以右键把资源保存起来