usdt无需实名(www.payusdt.vip):​使用Speakeasy Emulation Framework快速剖析恶意程序

admin 1个月前 (09-16) 科技 83 1

USDT自动API接口

菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

Andrew Davis最近宣布了他的新Windows模拟框架,名为Speakeasy。本文将强调该框架的另一个壮大用途:自动大规模剖析恶意程序。我将通过代码示例演示若何通过编程方式使用Speakeasy:

绕过不受支持的Windows API以继续模拟和剖析;

使用API挂钩保留动态分配的代码的虚拟地址;

使用代码挂钩以外科方式直接执行代码的要害区域;

从模拟器内存中转储剖析的PE并修复其节头;

通过查询Speakeasy以获得符号信息来辅助重修导入表;

初始设置

与Speakeasy交互的一种方式是确立Speakeasy类的子类。图1显示了Python代码段,它设置了一个类,这个类将在后面的示例中扩展。

确立一个Speakeasy子类

图1中的代码接受一个Speakeasy设置字典,该字典可用于笼罩默认设置。 Speakeasy附带了几个设置文件。 Speakeasy类是基础模拟器类的压缩器类。凭证二进制文件的PE标头加载二进制文件或将其指定为shellcode时,会自动选择模拟器类。子类化Speakeasy使接见,扩展或修改接口变得容易,它另有助于在模拟时代读取和写入状态数据。

模拟二进制

图2显示了若何将二进制文件加载到Speakeasy模拟器中。

将二进制文件加载到模拟器中

load_module函数为磁盘上提供的二进制文件返回PeFile工具。它是在speakeasy/windows/common.py中界说的PeFile类的实例,该类是pefile的PE类的子类,或者,你可以使用data参数而不是指定文件名来提供二进制字节。图3显示了若何模拟已加载的二进制文件。

启动模拟

API挂钩

Speakeasy框架提供了对数百个Windows API的支持,并经常添加更多的API。这是通过界说在speakeasy/winenv/ API目录的适当文件中的Python API处置程序来实现的。当在模拟历程中挪用特定的API时,可以安装API挂钩以执行自己的代码。可以为任何API安装它们,而不管是否存在处置程序。API挂钩可用于笼罩现有处置程序,而且可以选择从你的挂钩中挪用该处置程序。 Speakeasy中的API挂钩机制提供了天真性和对模拟的控制。让我们研究一下在模拟剖析代码以检索剖析的有用载荷的上下文中API挂钩的几种用法。

绕过不受支持的API

当Speakeasy遇到不受支持的Windows API挪用时,它将住手模拟并提供不受支持的API函数的名称。若是所讨论的API函数对于剖析二进制文件不是至关主要的,则可以添加一个API挂钩,该挂钩仅返回允许执行继续的值。例如,最近的样本的剖析代码包罗对剖析历程没有影响的API挪用。这样的API挪用之一就是GetSysColor,为了绕过此挪用并允许执行继续,可以添加一个API挂钩,如图4所示。

添加的API挂钩

凭证MSDN,此函数接纳1参数,并返回示意为DWORD的RGB颜色值。若是要挂接的API函数的挪用约定不是stdcall,则可以在可选的call_conv参数中指定挪用约定。挪用约定常量在speakeasy/common/arch.py文件中界说。由于GetSysColor返回值不会影响剖析历程,以是我们可以简朴地返回0。图5显示了图4中指定的getsyscolor_hook函数的界说。

GetSysColor挂钩返回0

若是API函数需要更细腻的处置,则可以实现更详细,更有意义的挂钩,以知足你的需要。若是你的挂钩实现足够稳固,则可以思量将其作为API处置程序添加到Speakeasy项目!

添加API处置程序

在speakeasy / winenv / api目录中,你将找到usermode和kernelmode子目录,这些子目录包罗对应二进制模块的Python文件。这些文件包罗每个模块的API处置程序。在usermode / kernel32.py中,我们看到为SetEnvironmentVariable界说的处置程序,如图6所示。

SetEnvironmentVariable的API处置程序

处置程序以函数修饰符(第1行)开头,该修饰符界说API的名称及其接受的参数数目。在处置程序最先时,最好的做法是将MSDN纪录在案的原型作为注释(第3-8行)。

处置程序的代码首先将argv参数的元素存储在以响应API参数(第9行)命名的变量中,处置程序的ctx参数是一个字典,其中包罗有关API挪用的上下文信息。对于以“A”或“W”末尾的API函数(例如,CreateFileA),可以通过将ctx参数转达给get_char_width函数(第10行)来检索字符宽度。然后可以将此宽度值转达给read_mem_string之类的挪用(第12和13行),该挪用在给定地址读取模拟器的内存并返回一个字符串。

最好的作法是用响应的字符串值(第14和15行)笼罩argv参数中的字符串指针值。这使Speakeasy能够在其API日志中显示字符串值而不是指针值。为了说明更新argv值的影响,请检查图7中所示的Speakeasy输出。在VirtualAlloc条目中,符号常量字符串PAGE_EXECUTE_READWRITE替换值0x40。在GetModuleFileNameA和CreateFileA条目中,指针值被替换为文件路径。

Speakeasy API日志

保留剖析的代码地址

压缩样本通常使用VirtualAlloc之类的函数来分配用于存储剖析样本的内存。捕捉剖析后的代码的位置和巨细的有用方式是首先挂接剖析存根使用的内存分配函数。图8显示了挂钩VirtualAlloc以捕捉虚拟地址和API挪用分配的内存量的示例。

VirtualAlloc挂钩可以保留内存转储信息

图8中的挂钩在第12行挪用Speakeasy的VirtualAlloc的API处置程序,以分配内存。 API处置程序返回的虚拟地址将保留到名为rv的变量。由于VirtualAlloc可用于分配与剖析历程无关的内存,因此在第13行使用附加检查以确认截获的VirtualAlloc挪用是剖析代码中使用的挪用。凭证先前的剖析,我们正在寻找一个VirtualAlloc挪用,该挪用将吸收lpAddress值0和flProtect值PAGE_EXECUTE_READWRITE(0x40)。若是存在这些自变量,则虚拟地址和指定的巨细将存储在第15行和第16行,因此在剖析代码完成后,可以将它们用于从内存中提取剖析的有用载荷。最后,在第17行,该挂钩返回VirtualAlloc处置程序的返回值。

,

USDT场外交易平台

U交所(www.payusdt.vip)是使用TRC-20协议的Usdt官方交易所,开放USDT帐号注册、usdt小额交易、usdt线下现金交易、usdt实名不实名交易、usdt场外担保交易的平台。免费提供场外usdt承兑、低价usdt渠道、Usdt提币免手续费、Usdt交易免手续费。U交所开放usdt otc API接口、支付回调等接口。

,

使用API和代码挂钩的外科式代码模拟

Speakeasy是一个壮大的模拟框架,然则,你可能会遇到包罗大量有问题代码的二进制文件。例如,一个示例可能会挪用许多不受支持的API,或者只是破费太长时间而无法举行模拟。在以下情形中形貌了战胜这两个挑战的示例。

作废隐藏在MFC项目中的存根

一种用于掩饰恶意有用载荷的盛行手艺涉及将它们隐藏在大型的开源MFC项目中。 MFC是Microsoft Foundation Class的缩写,它是用于构建Windows桌面应用程序的盛行库。这些MFC项目通常是从盛行的网站(例如Code Project)中随便选择的,只管MFC库使确立桌面应用程序变得容易,然则MFC应用程序由于其巨细和庞大性而难以举行反向工程。由于它们挪用许多差其余Windows API的大型初始化例程,因此稀奇难以模拟。以下是对我使用Speakeasy编写Python剧本以自动剖析自界说压缩程序的履历的形貌,该自界说压缩程序将其剖析存根隐藏在MFC项目中。

对压缩程序举行反向工程后发现,在CWinApp工具的初始化历程中最终会挪用剖析存根,该历程在C运行时和MFC初始化之后发生。实验绕过不受支持的API之后,我意识到,纵然乐成,模拟也将破费太长时间而无法实现。我思量过完全跳过初始化代码,然后直接跳转到剖析存根。不幸的是,为了乐成模拟剖析存根,需要执行C运行时初始化代码。

我的解决方案是在代码中确定在C运行时初始化后落在MFC初始化例程中的早期位置,检查完图9所示的Speakeasy API日志后,很容易发现该位置。与图形相关的API函数GetDeviceCaps在MFC初始化例程的早期被挪用。这是基于以下事实推论得出的:1.MFC是与图形相关的框架,2.在C运行时初始化时代不太可能挪用GetDeviceCaps。

在Speakeasy API日志中标识MFC代码的开头

为了在此阶段阻挡执行,我为GetDeviceCaps确立了一个API挂钩,如图10所示。该挂钩确认该函数在第2行中首次被挪用。

GetDeviceCaps的API挂钩集

第4行显示了使用Speakeasy类的add_code_hook函数确立代码挂钩,代码挂钩允许你指定在模拟每个指令之前挪用的回调函数。 Speakeasy还允许你通过指定begin和end参数来指定代码挂钩对其有用的地址局限。

在第4行上添加代码挂钩之后,GetDeviceCaps挂钩完成,而且在执行示例的下一条指令之前,将挪用start_unpack_func_hook函数。此函数如图11所示。

更改指令指针的代码挂钩

代码挂钩吸收模拟器工具,当前指令的地址和巨细以及上下文字典(第1行)。在第2行,代码挂钩将自身禁用。由于代码挂钩是与每个指令一起执行的,以是这会大大降低模拟速率。因此,应郑重使用并尽快将其禁用。在第3行,该挂钩盘算了剖析函数的虚拟地址。使用正则表达式定位用于执行此盘算的偏移量。为了精练起见,省略了该示例。

self.module属性先前是在图2所示的示例代码中设置的。它是从pefile的PE类中继续而来的,它使我们可以在第3行接见有用的函数,例如get_rva_from_offset()。该行还包罗一个使用self的示例。 .module.get_base()以检索模块的基本虚拟地址。

最后,在第4行,使用set_pc函数更改了指令指针,并在剖析代码处继续举行模拟。图10和图11中的代码段使我们能够在C运行时初始化完成后将执行重定向到剖析代码,并阻止使用MFC初始化代码。

宣布和修复未压缩的PE

一旦模拟到达了剖析样本的原始入口点,就该删除PE并对其举行修复了。通常,一个挂钩会将剖析的PE的基址保留在该类的属性中,如图8的第15行所示。若是剖析的PE在其PE标头中未包罗准确的入口点,则真实入口点也可能需要在模拟历程中捕捉。图12显示了若何将模拟器内存转储到文件的示例。

转储未压缩的PE

若是要转储已加载到内存中的PE,则由于节对齐方式的差异,其结构将与磁盘上的结构差异。因此,可能需要修改转储的PE头。一种方式是修改每个部门的PointerToRawData值以匹配其VirtualAddress字段。为了相符PE可选标头中指定的FileAlignment值,可能需要填充每个部门的SizeOfRawData值。请记着,天生的PE不太可能乐成执行。然则,这些起劲将使大多数静态剖析工具能够准确运行。

修复转储的PE的最后一步是修复其导入表,这是一个很庞大的义务,在此不详细讨论。然则,第一步涉及在模拟器内存中网络库函数名称及其地址的列表。若是知道剖析程序存根使用GetProcAddress API来剖析剖析的PE的导入,则可以挪用get_dyn_imports函数,如图13所示。

查看动态导入

否则,你可以通过挪用get_symbols函数来查询模拟器类以检索其符号信息,如图14所示。

从模拟器类检索符号信息

此数据可用于发现未压缩PE的IAT并修复或重修其导入相关表。

总结

编写Speakeasy脚原天职析恶意程序样本可以分为以下步骤:

1.对剖析存根举行反向工程,以识别:

1.1剖析的代码将驻留在那里或分配其内存的位置;

1.2执行转移到剖析的代码的位置;

1.3任何可能引入问题的有问题代码,例如不受支持的API,缓慢模拟或反剖析检查。

2.若有需要,请设置挂钩以绕过有问题的代码;

3.设置一个挂钩以标识虚拟地址,以及可选的剖析二进制文件的巨细;

4.设置一个挂钩,以在剖析代码的原始入口点执行时或之后住手模拟;

5.网络Windows API的虚拟地址并重修PE的导入表;

6.修复PE的标头,并将字节写入文件中以举行进一步剖析;

7.有关剖析UPX样本的剧本的示例,请在Speakeasy存储库中查看UPX剖析剧本。

Speakeasy框架提供了一个易于使用、天真且函数壮大的编程界面,使剖析职员能够解决诸如剖析恶意程序之类的庞大问题。使用Speakeasy自动化这些解决方案可以使它们大规模执行。

本文翻译自:https://www.fireeye.com/blog/threat-research/2020/12/using-speakeasy-emulation-framework-programmatically-to-unpack-malware.html:
Allbet声明:该文看法仅代表作者自己,与本平台无关。转载请注明:usdt无需实名(www.payusdt.vip):​使用Speakeasy Emulation Framework快速剖析恶意程序

网友评论

  • (*)

最新评论

站点信息

  • 文章总数:2799
  • 页面总数:0
  • 分类总数:8
  • 标签总数:3655
  • 评论总数:1522
  • 浏览总数:450250