zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    iOS 在Host App 与 App Extension 之间发送通知
    将博客搬至CSDN
    ios7 UITableView 分割线在 使用selectedBackgroundView 选中时有些不显示
    UITableViewCell 分割线如何满屏
    CocoaPods管理的项目移植到别人电脑后找不到头文件
    iOS Touch ID 简易开发教程
    iOS内存泄露统计
    iOS开发之Objective-c的AES128加密和解密算法的实现
    iOS中使用RNCryptor对资源文件加密
    iOS持续集成:命令行创建工程
  • 原文地址:https://www.cnblogs.com/QKSword/p/10513388.html
Copyright © 2011-2022 走看看