NSIS脚本如果向下滚动脚本,我们会很快注意到文件正在复制到新创建的名为%APPDATA%\Farvelade\Skaermfeltet的文件夹中。虽然不清楚原因,但所使用的文件路径似乎是丹麦语。在复制活动之后,脚本中有常规的安装逻辑,但是有一个名为func_30的有趣函数。在此函数被调用之前,字符串$INSTDIR\Filterposerne\Malkekvg. exeNat被复制到名为$4的字符串变量中,如图2和图3所示。函数func_30从Programmeludviklinger210中读取数据。Kon文件并构建代码,它将在字符Z被看到后立即调用这些代码。NSIS允许开发人员能够从Windows DLL调用任何导出的函数,并且还允许他们将结果直接保存在NSIS寄存器/堆栈中。此功能允许恶意软件开发者在运行时动态调用Windows API函数,并使静态分析更加困难,因为在分析之前必须对其进行评估。
调用函数func_30
解码NSIS代码要解码动态代码,我们可以编写一个简短的Python脚本,该脚本再现行为并提取Windows API调用:
下图显示了上述脚本产生的解码数据
解码的Windows API调用解码后的函数一起从NSIS压缩文件中的另一个文件中读取shellcode,并使用EnumWindows函数执行它。如果我们必须用伪代码编写这个过程,它看起来应该是这样的:
为了使其余的分析更容易,我们将使用shellcode生成一个PE。为了生成可执行文件,我们可以使用Cerbero Profiler或LIEF Python库等工具。在本例中,我们使用了LIEF库来构建一个新的可执行文件。我们所要做的就是添加一个包含Malkekvg.Nat文件内容的新部分,并将入口点设置为正确的偏移量。一旦我们得到了这些,就应该能够在IDAPro中打开shellcode,并看到它包含有效的x86指令。
在IDA Pro的入口点生成PE文件Shellcode分析现在我们在PE文件中有了Shellcode的第一阶段,我们可以在动态分析中运行它,看看会发生什么。我们将看到的第一件事是它检测到虚拟机,并在显示消息框后停止执行。此文本在运行时使用4字节XOR密钥解密。
无法在虚拟环境中执行该示例如果我们在IDA Pro中打开文件并稍微遵循代码,就应该能够看到用于解密第一阶段的大函数。虽然函数图概述看起来很大,但识别垃圾代码仍然很容易。进行解密的代码如下图所示。在下图中,我们可以看到跳转到第二阶段的最终调用。此时,我们可以将第二阶段转储到另一个可执行文件中进行解密。我们可以直接从内存中转储可执行文件,但是必须确保将入口点修补到正确的地址(在本例中为0x404328)。
第一阶段的Shellcode解密
调用到下一阶段第二阶段使用了许多反分析技术,其中的一些反分析技术为:内存扫描已知沙盒字符串;虚拟机监控程序检查;时间测量;为了获得GuLoader正在下载的最终负载,我们必须手动绕过所有这些检查,在不受所有这些技术影响的沙盒中运行它,或者在裸金属沙盒上运行它。提取有效负载信息为了在不分析第二阶段的情况下获得有效负载信息(包括所有字符串),我们可以使用Spamhaus描述的一个小技巧。GuLoader使用简单的XOR加密来加密其字符串,其中包括有效负载URL。要解密字符串,我们可以对已经知道存在于第二阶段中的模式使用暴力。XOR运算的结果就密钥。对此的唯一限制是模式必须足够大,以便我们能够完全解密有效负载URL。例如,一个好的模式可能是用户代理字符串,默认设置为Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) ,如Gecko。为了快速自动找到解密密钥,我们必须首先加密一个短模式(例如,用户代理字符串的前8个字节),然后搜索该结果是否在文件中的某个位置。如果它在文件中的某个位置,那么我们可以继续解密剩余的模式以获得完整的加密密钥。我们会在本文的最后附上Python脚本,该脚本能够通过上述方法从有效负载中找到加密密钥。在任何转储的第二阶段GuLoader负载上运行脚本后,我们应该能够看到一些字符串和负载URL。GuLoader有时在有效负载URL前面包含7到8个随机字符,它在运行时将其替换为http://或https://。使用http还是https的区别是由随机模式中的第四个字符决定的。
在此示例中,有效负载URL为http://ozd[.]com[.]ar/wp-includes/nHMoYlbGLWls101.qxd,并且在分析时有效载荷仍然在线。最终下载的有效负载来自FormBook恶意软件家族,其SHA256值为fa0b6404535c2b3953e2b571608729d15fb78435949037f13f05d1f5c1758173。机器学习如何检测?在之前的一篇文章中,我们详细介绍了在实时沙盒运行期间可以从内存中提取的几种可观察工件。我们发现,当与机器学习结合使用多种逃避技术检测恶意软件时,来自内存分析的数据是非常强大的。接下来我们回仔细观察所有这些关于运行时内存中被修改的内容,并将它们与大规模的机器学习相结合,用于恶意软件检测。该算法可以自动找到模式,并且可以识别恶意软件试图在内存中隐藏其足迹、动态分配和执行shellcode或使用解包的共性。在这个GuLoader示例中,人类分析人员会立即识别出有几个独特的函数指针。我们还会注意到,恶意软件已经将其自身进程内存中的多个页面的页面权限更改为可写和可执行。我们的机器学习模型能够自动执行这些活动,从各种内存构件中提取有关特征来检测GuLoader示例。如上所述,我们为Advanced WildFire创建的自动分析平台将以一种高性能的方式自动提取所有这些基于内存的工件。这意味着所有与动态解析函数指针、权限更改和解包可执行文件相关的信息都可以在我们手动管理的检测逻辑中使用,也可以用于我们的机器学习渠道。使用机器学习模式的检测下图显示了我们如何创建一个机器学习模型渠道的高级视图,该模型渠道是根据从上述基于内存的工件中提取的自定义特征进行训练的。我们选择的特性被设计成保留来自冗长工件的最有用的信息。我们还将恶意软件执行跟踪作为额外的信息源,并构建了一个集成模型来检测恶意样本。如下图所示,从四个内存工件和恶意软件执行痕迹中自动提取各种自定义特征,并将它们传递给一个分类模型以检测恶意样本。此外,我们还构建了一个集成模型,该模型基于内存工件和基于执行跟踪的特性进行训练,以提高其性能。
机器学习模型架构文件样本由流程渠道处理,以将内存工件和其他恶意软件属性保存到功能存储中。特征提取阶段使用流式处理和批处理PySpark作业的组合来生成用于训练模型的最终特征向量。ground truth标签来自一个单独的渠道,该渠道根据恶意软件特征和研究人员输入为样本分配标签。该渠道通过使用样本首次出现的时间和哈希来生成非重叠的训练和评估数据集。解释模型预测为了识别模型的局限性和能力,理解机器学习模型的预测是至关重要的。机器学习很容易出现误报,因为它严重依赖于训练数据的质量和多样性,以及对不断变化的文件进行预测的泛化能力。因此,具有识别预测的因果特征的能力是非常有用的。Shapley值Shapley加法解释(SHAP)是一种博弈论方法,用于解释任何机器学习模型的输出。与基线预测相比,SHAP值解释了每个特征对输入特征向量的实际预测的影响。在下图中,从右到左的红色特征是将模型推向恶意预测的最顶层特征。从左到右,蓝色的特征表示降低预测为恶意软件概率的最顶层特征。
如上图所示,我们绘制了具有重要SHAP值的前七个特征及其相应原始特征值的力图。由于这些顶级特征的存在,我们的机器学习模型能够检测到GuLoader。这些特性对应于几个特定的动态解析API指针及其在内存中的相对位置,以及样本所做的内存页权限更改的相对类型。通过聚类寻找相似样本另一种理解模型预测的方法是在训练数据集中识别相似的样本。我们使用基于密度的扫描(DBScan)作为聚类技术,如下图所示,因为它允许异常值和不同形状的聚类。
基于DBSCAN的集群总结GuLoader家族是unit42开发的机器学习模型检测恶意软件的一个很好的示例,因为GuLoader使用沙盒逃避和静态防护,使得传统防御很难单独使用结构线索和执行日志进行检测。在Advanced WildFire中,开发人员引入了一个基于虚拟机监控程序的沙盒,它可以在执行期间暗中观察GuLoader的内存,以解析有意义的内存驻留工件和对机器学习检测渠道有用的信息。这允许安全防护人员使用从观察到的基于内存的工件中提取的特征来准确地检测恶意行为。我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t