如何确定病毒中哪些导入的函数决定了它的行为?

逆向工程 视窗 恶意软件 静态分析 dll 聚乙烯
2021-07-07 20:01:54

我想知道如何找到恶意软件工具中有趣的功能。比如我有一个未知病毒的样本(这个样本lab01-01.exe在实用恶意软件分析一书中lab1-01.dll)。它没有包装。

我应该通过了解导入的 DLL 及其使用的函数来找出该恶意软件的用途。以下是可执行文件中导入的函数lab01-01.exe

KERNEL32.dll :
CloseHandle
UnmapViewOfFile
IsBadReadPtr
MapViewOfFile
CreateFileMappingA
CreateFileA
FindClose
FindNextFileA
FindFirstFileA
CopyFileA

来自MSVCRT.dll

_getmainards
_p_initenv
_p_commode
_p_fmode
_set_apps_typr
_setusermatherr
_adjust_fdiv
_controlfp
_except_handler3
_exit
_initterm
_stricmp
_XcptFilter
exit
malloc

但是,我没有找到任何从lab01-01.dll.

我也想知道为什么,虽然书中提到了可执行文件和DLL都是相关的(应该是导入的)。

3个回答

DLL 不仅可以静态导入,也可以动态导入。对于动态情况,它用于LoadLibrary加载dll,并GetProcAddress解析它需要的函数的地址。

如果 dll 是静态导入的,那么简单的依赖遍历将为您提供有关每个 dll 其导入的信息以及它使用的每个 dll 中的函数的信息。此信息实际上存在于 PE 标头中,像Dependency walker这样的工具会向您显示该标头

如果 dll 是动态导入的,那么遍历导入不会让您了解它使用的 dll 和函数。在这种情况下,调试应用程序(如果可能)。kernel32.LoadLibraryA/kernel32.LoadLibraryW或什至未记录的文件上设置断点ntdll.LdrLoadDll并运行应用程序。当断点被击中时,您立即知道它正在尝试导入哪个 dll。类似地,设置断点GetProcAddress将显示应用程序想要使用的功能。

我这里说的是最简单的情况。您可能会遇到恶意软件,它通过实现自己的 PE 加载器来完全绕过 LoadLibrary 机制。有关此类示例,请参阅页面。同样GetProcAddress也可以通过手动解析导入表来绕过。

实用恶意软件分析一书中的这一章 为您提供了一些重要的 Windows API 函数的列表,这些函数可用于深入了解恶意软件的工作原理。

Extreme Coders 提供了关于 IAT(导入地址表)的很好的答案。

这个问题太陌生了,我本来不打算回答的,但我会试着快速总结一下你想要寻找的工具和东西。

首先,让我告诉您,任何导入或导出的函数都不能真正说它使用了主要恶意软件。例如,DeleteFile 可用于删除被视为恶意软件的重要文件,但实际 API 本身可用于常见的非相关恶意软件操作。

如果您想查看实际执行了哪些 API,您需要使用以下内容:http : //www.rohitab.com/apimonitor这将为您提供更好的图形展示并列出该已知 API 的所有函数参数. 因此可以使用更丰富的数据。因为看着长长的名单太难了。

在您发现看起来可疑的 API 之后,您可以进入调试器并开始调查 API 的使用情况,这是一个复杂的字段。例如,您必须知道软件应该如何工作。

假设您有一个文本编辑器,只是您下载的一个简单的记事本程序。您只需查看 API 是否存在异常活动,例如:

  1. 如果您在一个简单的文本编辑器上看到网络活动 - 为什么它需要网络?它是恶意相关的还是只是用于自我更新的自动修补程序?
  2. 如果您看到外部或内部流程修改 - 为什么要这样做?查看与内存修改WriteProcessMemory或较低级别 API相关的API 是NtWriteVirtualMemory.

虽然实际上您不能仅仅依靠检查 API,因为您可以syscall直接使用它会绕过任何列出的 API。

要确定恶意软件,您需要使用以下内容:http : //camas.comodo.com/

你会想要让自己拥有各种工具,例如:

  1. 虚拟机(VMWare、Virtual PC 或类似的东西)。因为您不想让您的主机感染恶意软件,是吗?但是,请注意复杂的恶意软件可能会从虚拟机中脱离出来!
  2. 用于比较文件系统和注册表执行前后的快照软件。微软开发了一个很好的。我在家的时候给你挖出来。因此,在运行应用程序之前和之后拍摄快照。
  3. 给自己找一个调试器,比如 IDA PRO(理想但非常昂贵),否则 OllyDbg 是我下一个最喜欢的调试器。

也许我跑题了?无论如何,我希望这些信息有用。如果是这样,我会扩大我的答案。

虽然其他人已经提供了一些答案,但我想补充几点。

您可以编写一个 pintool (DBI) 来记录所有 API 调用。您可以在 pintool 中添加一些过滤器以减少您记录的 API 调用量。使用 pintool 有一个优势,因为恶意软件使用的反调试技术不会对其产生影响。当然,我们假设恶意软件并没有试图保护自己免受 DBI 框架的影响。但是,如果您在 LoadLibrary 和 GetProcAddress 上设置断点以查看动态加载哪些库以及解析哪些函数地址,则可能会受到恶意软件使用的反调试技术的影响。在您到达断点之前,恶意软件已经发现它正在被调试并改变程序流程。

我建议您不要仅通过查看从不同模块导入的 API 名称来断定恶意软件的功能。一系列 API 调用有时可能表明存在恶意活动。例如,

CreateProcessW
VirtualAllocEx
WriteProcessMemory
WriteProcessMemory
GetThreadContext
SetThreadContext
ResumeThread

现在,当您在 CFF 资源管理器等软件中打开二进制文件时,您可以看到从 kernel32.dll 导入的这些 API 名称,但是要确定这些 API 的使用情况,API 跟踪会有所帮助。在这种情况下,它是几个二进制文件用来执行代码注入到另一个进程的地址空间的标准方法。