首页
论坛
课程
招聘
[调试逆向] [病毒木马] [原创]默默无闻·恶意代码分析Lab1
2021-4-3 21:45 1509

[调试逆向] [病毒木马] [原创]默默无闻·恶意代码分析Lab1

2021-4-3 21:45
1509

参照书籍:《恶意代码分析实战》、《windows PE权威指南》;

文件来源:官网随书文件、或者附件中(文件密码:apebro);

使用工具:WinHex、CFF、StudyPE+、Exeinfo PE、Resource Hacker、Depends Walker、OD、IDA、MSDN;


Lab1-1

这个实验使用Lab01-01.exe和Lab01-01.dll文件,使用本章描述的工具和技术来获取关于这些文件的信息;

问题

1、将文件上传至http://www.VirusTotal.com进行分析并查看报告。文件匹配到了已有的反病毒软件特征吗?

2、这些文件是什么时候编译的?

3、这两个文件中是否存在迹象说明它们是否被加壳或者混淆了?如果是,这些迹象在哪里?

4、是否有导入函数显示处了这个恶意代码是做说明的?如果是,是哪些导入函数?

5、是否有任何其他文件或基于主机的迹象,让你可以在受感染系统上查找?

6、是否有基于网络的迹象,可以用来发现受感染机器上的这个恶意代码?

7、你猜这些文件的目的是什么?

解题

1、在官网http://www.VirusTotal.com进行文件上传;

 

Lab01-01.exe检测结果:

 

image-20210403131453873

 

Lab01-01.dll检测结果:

 

image-20210403131709508

  • 因为时代久远的缘故,各有四十个安全厂商标识为病毒文件;

2、使用WinHex手动分析PE头;

 

Lab01-01.exe分析结果:

 

image-20210403134056115

  • 经过对PE头的分析,获得Lab01-01.exe的时间戳;

Lab01-01.dll分析结果:

 

image-20210403134707846

  • 经过对PE头的分析,获得Lab01-01.dll的时间戳;

经过分析发现,获得的两个文件的时间戳(4D0E2FD34D0E2FE6)都非常相近。通过使用StudyPE+工具进行时间戳计算:

 

image-20210403135514747

 

image-20210403135558599

  • 发现两个文件时间相近且相差在一分钟内,由此可以推断是同时编译的结果;

旁话:

 

时间戳数据并不可靠,仅仅是用来参考的。因为这个数据可以随便改。但是有些编译器对于此字段会有特殊的绝对或相对的给值。所以这个字段仅能用来参考;
关于时间戳字段,并不仅仅有这一个,还可以参考后面节区的TimeDateStamp字段;

 

3、使用Exeinfo PE工具进行查壳检测(关于手动查壳的讨论学习在后续的帖子进行讨论);

 

Lab01-01.exe分析结果:

 

image-20210403141507297

 

Lab01-01.dll分析结果:

 

image-20210403141530280

  • 很显然,并没有被加壳;

4、使用Depends工具查看导入函数;

 

Lab01-01.exe分析结果:

 

image-20210403142634345

  • 有几个值得注意的函数CreateFileMappingAFindFirstFileFindNextFileCopyFile,通过MSDN查询,了解函数细节;

CreateFileMapping():

1
2
3
4
5
6
7
8
9
10
11
12
HANDLE CreateFileMapping(
  HANDLE hFile,              // handle to file to map
  LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
                             // optional security attributes
  DWORD flProtect,           // protection for mapping object
  DWORD dwMaximumSizeHigh,   // high-order 32 bits of object size
  DWORD dwMaximumSizeLow,    // low-order 32 bits of object size
  LPCTSTR lpName             // name of file-mapping object
);
//Description:The CreateFileMapping function creates a named or unnamed file-mapping object for the specified file.
 
// 描述:CreateFileMapping函数为指定的文件创建一个命名的或未命名的文件映射对象。

总结:使用文件映射方式可以进行进程间共享数据;更多细节,请查看MSDN;

 

关于函数结尾A是因为参数使用了ANSI字符格式,更多关于Unicode字符和ANSI字符的函数,请查看《windows核心编程》

 

FindFirstFile():

1
2
3
4
5
6
7
8
9
HANDLE FindFirstFile(
  LPCTSTR lpFileName,  // pointer to name of file to search for
  LPWIN32_FIND_DATA lpFindFileData
                       // pointer to returned information
);
 
//Description:The FindFirstFile function searches a directory for a file whose name matches the specified filename. FindFirstFile examines subdirectory names as well as filenames.
 
// 描述:FindFirstFile函数的作用是:在一个目录中搜索文件名与指定文件名匹配的文件。FindFirstFile检查子目录名和文件名。

总结:有搜索文件系统的操作;更多细节,请查看MSDN;

 

FindNextFile():

1
2
3
4
5
6
7
8
9
BOOL FindNextFile(
  HANDLE hFindFile,  // handle to search
  LPWIN32_FIND_DATA lpFindFileData
                     // pointer to structure for data on found file
);
 
//Description:The FindNextFile function continues a file search from a previous call to the FindFirstFile function. 
 
// 描述:FindNextFile函数继续从先前调用的FindFirstFile函数进行文件搜索。

总结:搜索文件系统的操作;更多细节,请查看MSDN;

 

CopyFile:

1
2
3
4
5
6
7
8
9
10
BOOL CopyFile(
  LPCTSTR lpExistingFileName,
                          // pointer to name of an existing file
  LPCTSTR lpNewFileName,  // pointer to filename to copy to
  BOOL bFailIfExists      // flag for operation if file exists
);
 
//Description:The CopyFile function copies an existing file to a new file.
 
// 描述:CopyFile函数的作用是将一个现有文件复制到一个新的文件中。

总结:复制文件操作;更多细节,请查看MSDN;

 

image-20210403142702066

  • C语言运行库,没什么重点;

Lab01-01.dll分析结果:

 

image-20210403145453401

  • 这里需要关注CreateProcessASleep两个函数;

CreateProcess():

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
BOOL CreateProcess(
  LPCTSTR lpApplicationName,
                         // pointer to name of executable module
  LPTSTR lpCommandLine,  // pointer to command line string
  LPSECURITY_ATTRIBUTES lpProcessAttributes,  // process security attributes
  LPSECURITY_ATTRIBUTES lpThreadAttributes,   // thread security attributes
  BOOL bInheritHandles,  // handle inheritance flag
  DWORD dwCreationFlags, // creation flags
  LPVOID lpEnvironment,  // pointer to new environment block
  LPCTSTR lpCurrentDirectory,   // pointer to current directory name
  LPSTARTUPINFO lpStartupInfo,  // pointer to STARTUPINFO
  LPPROCESS_INFORMATION lpProcessInformation  // pointer to PROCESS_INFORMATION
);
//Description:The CreateProcess function creates a new process and its primary thread. The new process executes the specified executable file.
 
// 描述:函数的作用是:创建一个新进程及其主线程。新进程执行指定的可执行文件。

总结:创建进程或线程,可能涉嫌非法操作;更多细节,请查看MSDN;

 

Sleep():

1
2
3
4
5
6
VOID Sleep(
  DWORD dwMilliseconds   // sleep time in milliseconds
);
//Description:The Sleep function suspends the execution of the current thread for a specified interval.
 
// 描述:函数的作用是:Sleep函数在指定的时间间隔内挂起当前线程的执行。

总结:进程操作;更多细节,请查看MSDN;

 

image-20210403145518548

  • WS2_32.dllWsock32.dll两个是联网DLL,涉有一个都有可能有网络操作;

  • 因为使用了编号导入),所以并没有显示函数名。使用其他PE工具,可能只能看见编号而看不见函数,容易误判函数数量。所以书上推荐的Dependency Walker工具是挺好用的,下方还给出了相对编号的函数名;

  • send()[Ordinal-19]:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    int send (
      SOCKET s,             
      const char FAR * buf, 
      int len,              
      int flags             
    );
    //Description:The Windows Sockets send function sends data on a connected socket.
     
    // 描述:函数的作用是:Windows套接字send函数在连接的套接字上发送数据。

    总结:套接字数据发送;更多细节,请查看MSDN;

image-20210403145537918

  • C语言运行库,没什么重点;

5、使用IDA工具进行文件分析;

 

Lab01-01.exe分析结果:

  • 查看完导入函数,进入IDA后,在直接撸代码之前,查一查字符串,或许能找到点灵感;

image-20210403153119625

 

总结:这就非常有意思了,关于0(数字零)和O(大写字母O)和1(数字一)和l(小写字母L)的混淆还是蛮多的;

 

猜测:假的kerne132.dll文件是用来冒充混淆,可以作为基于主机的病毒特征,是分析Malware的重要线索;

 

6、使用IDA工具进行文件分析;

 

Lab01-01.dll分析结果:

  • 看完exe文件,我们再看看dll文件,同样是先盲猜一波字符串,说不定有惊喜;

image-20210403153930521

  • 很显然,这里有一个IP地址,有经验的话可以立即知道这是一个保留IP,没有什么实际用处(毕竟只是第一章的练习题);
  • 如果不知道,可以使用站长之家工具进行IP查询;

image-20210403154348198

  • 还有里面有一个exec字符串,可能是用来运行exec函数,用于运行网络传输的指令;

总结:一般情况下不太可能直接字符串能够查询到准确有用的数字,更多的时候都是被加密操作过的。所以,这个只能算是扫盲题。

 

7、胡说不是乱说;

 

回忆一下前面的操作,我们可以基本确认这两个程序是一个后门病毒。原本想小试牛刀逆一下,看了书后答案,原来Lab7还会有这个题目。那就等到那时候再详细写帖子;


Lab1-2

分析Lab01-02.exe文件

问题

1、将Lab01-02.exe文件上传至http://www.VirusTotal.com进行分析并查看报告。文件匹配到了已有的反病毒软件特征吗?

2、是否有这个文件被加壳或混淆的任何迹象?如果是这样,这些迹象是什么?如果该文件被加壳,请进行脱壳,如果可能的话。

3、有没有任何导入函数能够暗示出这个程序的功能?如果是,是哪些导入函数,它们会告诉你什么?

4、哪些基于主机或基于网络的迹象可以被用来确定被这个恶意代码所感染的机器?

解题

1、在官网http://www.VirusTotal.com进行文件上传;

 

Lab01-01.exe检测结果:

 

image-20210403160148067

  • 这个就有点多了,有52个安全厂商标识为病毒,看来此程序操作还是挺敏感的。

2、使用CFFExeinfo PE工具进行查壳检测;

  • 首先习惯性先用CFF查看一下PE:

image-20210403160638788

  • 这个好玩了,UPX节区,很明显了,但是还是用Exeinfo PE查一下确认一波:

image-20210403160815441

  • 很显然了,虽然CFF有自动脱UPX压缩壳的功能,但是为了学习,还是遵从题意,下载UPX工具,使用upx -d命令脱壳;

image-20210403161539751

  • 出现了正确的编译环境,就说明脱壳成功了;

3、使用Dependency Walker工具查看Lab01-02.exe文件的导入函数;

 

image-20210403161915933

  • Kernel32.dll文件包含了核心系统功能,包括但不限于访问和操作内存、文件和硬件;
  • 因为篇幅原因,文件内导入的函数功能直接给出,细节请查看MSDN;
1
2
3
4
5
6
7
8
9
10
11
12
SystemTimeToFileTime(...);//将系统时间转换为文件时间。
GetModuleFileNameA(...);//获取包含指定模块的可执行文件的完整路径和文件名。
CreateWaitableTimerA(...);//函数创建了一个“可等待的”计时器对象。
ExitProcess(...);//结束一个进程及其所有线程。
OpenMutexA(...);//返回一个已存在的命名互斥对象的句柄。
SetWaitableTimer(...);//激活指定的“可等待”计时器。当到期时间到达时,计时器被通知,设置
                        //计时器的线程调用可选的完成例程。
WaitForSingleObject(...);//WaitForSingleObject函数在下列情况之一发生时返回:
                            //指定的对象处于有信号状态。
                            //超时时间过期。
CreateMutexA(...);//创建一个命名的或未命名的互斥对象。
CreateThread(...);//创建一个线程,在调用进程的地址空间中执行。

image-20210403161941645

  • Advapi32.dll对windows核心组件的访问,比如服务管理器和注册表;
  • 因为篇幅原因,文件内导入的函数功能直接给出,细节请查看MSDN;
1
2
3
4
CreateServiceA(...);//创建一个服务对象,并将其添加到指定的服务控制管理器数据库中。
StartServiceCtrlDispatcherA(...);//服务进程的主线程连接到服务控制管理器,这将使线程成
                                    //为调用进程的服务控制调度程序线程。
OpenSCManagerA(...);//在指定的计算机上建立到业务控制管理中心的连接,并打开指定的业务控制管理中心数据库。

image-20210403162019151

  • Msvcrt.dll是微软的C运行环境库,这并非核心功能函数,可以跳过;

image-20210403162038590

  • Wininet.dll是Windows应用程序网络相关模块,层级相对更高,实现了例如FTP、HTTP和NTP等网络协议,这个模块也是病毒对抗中的经典了,改日再细说;
  • 因为篇幅原因,文件内导入的函数功能直接给出,细节请查看MSDN;
1
2
InternetOpenUrlA(...);//InternetOpenUrl函数解析URL字符串,建立到服务器的连接,并准备                            下载由URL标识的数据。
InternetOpenA(...);//是Win32应用程序调用的第一个Internet函数。它告诉Internet DLL初                        始化内部数据结构,并为将来从应用程序调用做准备。当应用程序结束使                        用Internet函数时,它应该调用InternetCloseHandle来释放该句                          柄和任何相关的资源。

总结:这个程序会进行联网操作并且创建服务;

 

4、使用IDA工具查看;

 

image-20210403165659092

  • 同样盲猜一波,啧,http://www.malwareanalysisbook.com字符串以及MalService字符串都可以表明这是一个基于网络的病毒代码;

Lab1-3

分析Lab01-03.exe文件

问题

1、将Lab01-03.exe文件上传至http://www.VirusTotal.com进行分析并查看报告。文件匹配到了已有的反病毒软件特征吗?

2、是否有这个文件被加壳或混淆的任何迹象?如果是这样,这些迹象是什么?如果该文件被加壳,请进行脱壳,如果可能的话。

3、有没有任何导入函数能够暗示处这个程序的功能?如果是,是哪些导入函数,它们会告诉你什么?

4、有哪些基于主机或基于网络的迹象,可以被用来确定被这个恶意代码所感染的机器?

解题

1、在官网http://www.VirusTotal.com进行文件上传;

 

image-20210403170248341

  • 有五十个安全厂商标识为病毒文件;

2、使用CFFExeinfo PEDependency Walker工具进行查壳检测;

 

image-20210403171800569

  • 首先看节表,节表名被抹了,所以PE文件肯定被修改了。

image-20210403172238740

  • 使用CFF工具也可以,但是我觉得太长了。我就使用了WinHex工具进行截图,发现只有导入表有文件,其他表都为0x00,这是不正常的;

image-20210403172606946

  • 加壳程序往往只有这两个导入函数,这种情况也可以被石锤为百分百加壳了。(就是最简单的Hello world程序也不止这两个导入函数。)

image-20210403172926727

  • 既然知道被加壳,我们就使用Exeinfo PE工具看看具体是哪种壳,图中显示为FSG 1.10

  • 暂时还没到脱壳章节,书后答案显示,18章课后习题将学习手动脱壳,再详细套路;

3、暂无,后面章节续写;

 

4、暂无,后面章节续写;


Lab1-4

分析Lab01-04.exe文件

问题

1、将Lab01-04.exe文件上传至http://www.VirusTotal.com进行分析并查看报告。文件匹配到了已有的反病毒软件特征吗?

2、是否有这个文件被加壳或混淆的任何迹象?如果是这样,这些迹象是什么?如果该文件被加壳,请进行脱壳,如果可能的话。

3、这个文件是什么时候被编译的?

4、有没有任何导入函数能够暗示处这个程序的功能?如果是,是哪些导入函数,它们会告诉你什么?

5、有哪些基于主机或基于网络的迹象,可以被用来确定被这个恶意代码所感染的机器?

6、这个文件在资源段中包含一个资源。使用Resource Hacker工具来检查资源,然后抽取资源。从资源中你能发现什么吗?

解题

1、在官网http://www.VirusTotal.com进行文件上传;

 

image-20210403173428483

  • 已被56个引擎判毒;

2、使用CFFExeinfo PEDependency Walker工具进行查壳分析;

 

image-20210403173706179

  • 使用CFF查看节表,显示正常;

image-20210403174016949

  • 通过使用WinHex工具进行分析发现,导入表、资源表、IAT表都正常存在;

image-20210403174339049

  • 最后使用Exeinfo PE工具查看,并没有加壳,能正确显示为VC++编译的MFC程序;

3、使用WinHexStudyPE+工具查看编译实现;

 

image-20210403174729009

 

image-20210403174809836

  • 使用StudyPE+工具验证我们查看到的时间戳,并且解码得到具体时间。(时间戳不可信,只能做参考);

4、使用Depends Walker工具查看导入函数;

 

image-20210403175119537

  • Kernel32.dll文件包含了核心系统功能,包括但不限于访问和操作内存、文件和硬件;
  • 因为篇幅原因,文件内导入的函数功能直接给出,细节请查看MSDN;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CloseHandle(...);//关闭一个打开的对象句柄.
CreateFileA(...);//创建或打开某个对象,并返回一个可用于访问该对象的句柄。
CreateRemoteThread(...);//创建一个运行在另一个进程的地址空间中的线程。
FindResourceA(...);//确定具有指定类型和名称的资源在指定模块中的位置。
GetCurrentProcess(...);//为当前进程返回一个伪句柄。。
GetModuleHandleA(...);//如果文件已经映射到调用进程的地址空间,则GetModuleHandle函数                            返回指定模块的模块句柄。
GetProcAddress(...);//返回指定的导出动态链接库(DLL)函数的地址。
GetTempPathA(...);//检索为临时文件指定的目录路径。
GetWindowsDirectoryA(...);//检索Windows目录的路径。Windows目录包含基于win32的应用                            程序、初始化文件和帮助文件等文件。
LoadLibraryA(...);//将指定的可执行模块映射到调用进程的地址空间。
LoadResource(...);//将指定的资源加载到全局内存中。
MoveFileA(...);//重命名一个现有的文件或目录(包括它的所有子目录)。
OpenProcess(...);//返回一个现有进程对象的句柄.
SizeofResource(...);//返回指定资源的大小(以字节为单位)。
WinExec(...);//运行指定的应用程序。
WriteFile(...);//将数据写入文件,并且设计用于同步和异步操作.

image-20210403175133897

  • Advapi32.dll对windows核心组件的访问,比如服务管理器和注册表;
  • 因为篇幅原因,文件内导入的函数功能直接给出,细节请查看MSDN;
1
2
3
AdjustTokenPrivileges(...);//作用是启用或禁用指定访问令牌中的特权。启用或禁用访问令牌中                                的权限需要TOKEN_ADJUST_PRIVILEGES访问。
LookupPrivilegeValueA(...);//检索在指定系统上用于本地表示指定特权名的本地惟一标识符                            (LUID)。
OpenProcessToken(...);//打开与进程相关联的访问令牌。

image-20210403175150221

  • C运行库函数,不是重点;

总结:从advapi32.dll的函数,表明会涉及系统服务的操作,导入函数WinExecWriteFile表明会有磁盘写操作和执行操作.

 

5、使用IDA工具进行分析;

 

image-20210403182300437

  • 可以看见字符串中有路径文件字符串\\system32\\wupdmgr.exe,结合GetWindowDirectory()函数,可以猜测恶意代码是在此路径文件创建或者修改了某个文件;
  • 有意思的是,我查看答案的时候,书中说有一个网址字符串www.malwareanalysisbok.com,可惜我并没有找到,甚至用WinHex也没有搜到,如下图:

image-20210403182228002

  • 当然,当我开始做第六题,我才发现我漏掉了啥;

6、使用WinHexResource HackerIDA工具进行资源节查找和抽取;

 

image-20210403174016949

  • 首先查看资源节,是数据目录第三个;
    • 资源目录RVA:0x00004000;
    • 资源目录大小:0x00004060;

image-20210403184557176

  • 这是四个节表的RVA,由此可见在第四个节区;

    FOA=0x00004000-0x00004000+0x00004000=0x00004000

    • 文件地址为0x00004000,是0x0000026c开始的四字节;
  • 这里我们先复习一下资源表的整体结构.

image-20210403185734545

  • 资源目录头IMAGE_RESOUORCE_dIRCTORY结构:
1
2
3
4
5
6
7
8
typedef struct _IMAGE_RESOURCE_DIRECTORY {
    DWORD   Characteristics;        // dd    00h    -资源属性
    DWORD   TimeDateStamp;            // dd    04h    -时间戳
    WORD    MajorVersion;            // dw    08h    -资源大版本号
    WORD    MinorVersion;            // dw    0ah    -资源小版本
    WORD    NumberOfNamedEntries;   // dw    0ch    -以名称命名为入口数量  
    WORD    NumberOfIdEntries;      // dw    0eh    -ID命名的入口数量
} IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;
  • 相对应位置从WinHex中找出:

image-20210403190700947

 

我们发现,此资源表只有 一个 名称命名的入口点;

  • 复习完资源目录结构后,我们在看一下目录项的结构:

image-20210403191127416

  • 紧随其后的是资源目录项IMAGE_RESOURCE_DIRECTORY_ENTRY结构:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
    union {                        // dd 00h -目录项的名字、字符串指针或ID号   
        struct {
            DWORD NameOffset : 31;           //资源名偏移
            DWORD NameIsString : 1;          //资源名为字符串
        };
        DWORD   Name1;              //资源/语言类型
        WORD    Id;                 //资源数字ID
    };
    union {                        // dd 04h -目录指针
        DWORD   OffsetToData;       //数据偏移地址
        struct {
            DWORD   OffsetToDirectory : 31;   //子目录偏移地址
            DWORD   DataIsDirectory : 1;      //数据为目录
        };
    };
} IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;

这里有一个注意的地方就是,一个目录项的大小是8字节.这个很重要,因为这里用到了union结构.

  • 因为只有一个资源表项,相对应的在WinHex位置:

image-20210403191557584

  • 这段感觉很难看明白,但是有技巧.

    • 首先我们要看前四个字节0x80000058就看最高位是否为1 (16进制就是看是否为8) ;
      • 如果1,这就是个名称字符串;
      • 如果0 ,这就是个ID;
    • 后四个自己0x80000018描述的是前面字段的性质,如果最高位为1(16进制就是看是否为8) ;
      • 如果1,是个目录;
      • 如果0 ,是个数据;
  • 所以我们可以了解到这两个八字节的数据意思是它是个目录,目录名偏移是0x0058;

    • 这里有个重点是,这里的偏移是对资源表的偏移(Section offset),所以指向地址为0x00004058;

image-20210403201309754

  • 这里非常有意思,Pascal版本的Unicode类型字符串,它的特点就是字符串开头会声明字符大小.

    • 由图可知是个叫做BIN的资源目录名;
  • 后四个字节0x80000018去除最高位后就是资源目录项(也就是下一层结构)的偏移0x0018,它指向的文件地址是0x00004018;

    image-20210403202325034

咦,很奇怪,为什么会是0x00呢?

  • 其实这里就是一个重点了;
    • 资源表结构是一个层级递归的结构;
      • 也就是说,资源目录项(IMAGE_RESOURCE_DIRECTORY_ENTRY)指向的还是一个从资源目录(IMAGE_RESOUORCE_dIRCTORY)的结构;
  • 所以,还是16个字节的资源目录头(IMAGE_RESOUORCE_dIRCTORY)的结构;

image-20210403202732998

 

由图所得,这一层只有一个ID命名的目录入口点;

 

image-20210403202908037

 

紧随其后的就是资源目录项IMAGE_RESOURCE_DIRECTORY_ENTRY结构;

  • 由上面的结论所知,第一个4字节数据0x00000065表示:

    • 这是一个目录ID;
    • ID编号为0x00000065,它的十进制编号是101;
  • 第二个4字节数据0x80000030表示:

    • 这是一个目录;
    • 指向下一层位置为:0x00004030;

重点来了

 

image-20210403203917520

 

又是一个16个字节的资源目录头(IMAGE_RESOUORCE_dIRCTORY)的结构和资源目录项IMAGE_RESOURCE_DIRECTORY_ENTRY结构;

  • 资源目录头表示只有一个ID命名的目录入口点;
  • 资源目录项表示:
    • 第一个4字节数据0x00000409表示:
      • 这是一个代码页;
      • 代码页编号0x00000409,它对应的是英文语言(在IDE中的项目属性中可以设置);
        • 如果是简体中文环境,代码页编号应该是0x0000000804;
    • 第二个4字节数据0x00000048表示:
      • 这是一个数据;
      • 数据地址在0x00004048,其指向的就是资源数据项结构地址;(只要最高位不为一,我们就要解释成资源数据项; )
  • 最后我们先复习一下资源数据项结构;

image-20210403195231486

 

  • 资源数据项 IMAGE_RESOURCE_DATA_ENTRY结构;
1
2
3
4
5
6
typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
    DWORD   OffsetToData;    //dd 00h -资源数据的RVA
    DWORD   Size;    // dd 04h -资源数据的长度
    DWORD   CodePage;// dd 08h -代码页
    DWORD   Reserved;// dd 0ch -保留字段
} IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;

image-20210403205912157

  • offsetToData0x00004060,这里要注意的是不再是一个节内偏移,而是RVA;

    • 我们要换算为文件内偏移:
      • 我们首先要看一下节表分布:

    image-20210403184557176

    ​ FOA=0x00004060-0x00004000+0x00004000=0x00004060;

  • Size0x00004000大小的数量;

image-20210403211509641

 

然后从0x00004060开始,向下到0x000080600x4000大小复制出来,新建文件,就抽取出了资源节中隐藏的代码段了;

 

以上就是手动抽取资源节的步骤了

 

当然,什么年代了,当然有非常棒的工具了,这就是Resource Hacker工具了;

 

image-20210403211938082

  • 这就导出了资源节中的资源了;

再通过IDA工具分析;

 

image-20210403212102419

 

这我们就找到了书中答案所说的下载恶意代码的网络位置了.

 

再使用Dependency工具查看导入表 ;

 

image-20210403212433134

 

image-20210403212454059

  • 通过了解到WinExec()URLDownloadToFileA()两个函数,我们终于确定,它涉嫌了通过网络下载文件并且执行了.

总结

大学开始接触逆向,但可惜囊中羞涩,报不了什么速成班,故自学了很久,走了太多的歧路。

 

现今已二战败北,准备找一个病毒分析的工作,为了学习,自此开始写《恶意代码分析实战》的学习帖子。希望写完后能找一个相关工作吧。

 

如有不正之处,还请各位大佬指正。


[公告] 2021 KCTF 春季赛 防守方征题火热进行中!

最后于 3天前 被平头猿小哥编辑 ,原因: 上传文件
上传的附件:
收藏
点赞3
打赏
分享
最新回复 (2)
雪    币: 5241
活跃值: 活跃值 (5066)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
SSH山水画 活跃值 1 2021-4-3 22:24
2
1
加油
雪    币: 193
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
ookkaa 活跃值 2021-4-4 11:12
3
1
加油
游客
登录 | 注册 方可回帖
返回