关于dll:Qakbot新型感染链使用Windows7系统侧加载感染设备

前言:DLL侧加载(DLL side-loading)是一种常见的攻打办法,也就是咱们常说的“白加黑”技术,它利用了Windows中解决动态链接库(DLL)的形式。Qakbot恶意软件的开发者通过应用Windows7零碎在被感化的计算机上侧加载歹意负载,最终达到感化设施的成果。近日,平安钻研人员ProxyLife发现,从往年7月11日开始Qakbot滥用Windows 7 Calculator应用程序进行DLL侧加载攻打。这种办法也被持续被用于歹意垃圾邮件流动。Qakbot 恶意软件的开发者通过应用Windows7零碎在被感化的计算机上侧加载歹意负载,最终达到感化设施的成果。DLL侧加载(DLL side-loading)动静链接DLL是蕴含了若干个函数、类和资源的库文件。它能够被其余可执行文件(如.EXE文件和其它DLL文件)动静调用。应用DL的第一个长处是使多个应用程序,甚至是不同语言编写的应用程序能够共享一个DL文件,真正实现了“资源共享”;另一个长处是将DL文件作为应用程序一个独立的模块设计时,能够进步软件的开发速度,为软件降级提供了不便。而DLL侧加载(DLL side-loading)是一种常见的攻打办法,也就是咱们常说的“白加黑”技术,它利用了Windows中解决动态链接库(DLL)的形式。DLL侧加载(DLL side-loading)恶意软件通过坑骗一个非法的DLL,会在Windows的WinSxS目录中搁置一个伪造的歹意DLL文件,以便操作系统加载它而不是非法文件。DLL侧加载攻打(DLL side-loading Attack)通常在Microsoft Windows中,程序能够通过指定残缺门路或应用清单等其余机制来定义在运行时加载哪些库或文件夹。程序清单能够包含DLL重定向、文件名或残缺门路。因而,如果清单只援用了一个库文件名,它被视为弱援用并且容易受到DLL侧加载攻打。DLL侧加载攻打次要是利用弱库援用和Windows默认的搜寻程序,在零碎上搁置一个伪装成非法DLL的歹意DLL文件,非法程序将主动加载该文件。DLL侧加载通常会被勒索软件运营商应用,他们利用DLL侧加载来执行勒索软件有效载荷,以回避平安产品的检测。Qakbot病毒Qakbot病毒最开始是一种银行木马,受影响零碎为微软Windows。Qakbot最早被发现于2009年,依据微软的剖析,Qakbot被认为是由网络立功组织Gold Lagoon创立的。Qakbot专门针对企业、银行、医疗、教育等机构进行弱小的信息窃取性能,并继续监控用户的银行流动以欺诈大量钱财。近年来,Qakbot发现了多个降级的变种,利用高级技术进行反检测与自我假装,试图躲过了杀毒软件检测。起初Qakbot演变成了恶意软件投递器,勒索软件团伙在攻打的晚期阶段应用它来投递攻打信标,造成了许多重大经济损失。而且Qakbot交付的其它勒索软件包含RansomExx、Maze、ProLock和Egregor,最近,还公布了Black Basta勒索软件。Qakbot新型感化链那么Qakbot病毒是如何运行DLL侧加载(DLL side-loading)?为了进攻这种危险链接和攻打,ProxyLife和Cyble的钻研人员记认真钻研和记录了新型的Qakbot感化链。在最新的流动中应用的电子邮件带有一个HTML文件附件,该附件下载了一个有密码保护的ZIP压缩包,其中蕴含一个ISO文件。关上ZIP文件的明码显示在HTML文件中,锁定存档的起因是为了规避反病毒软件的检测。ISO蕴含一个lnk文件,一个“calc.exe”(Windows计算器)的正本,以及两个DLL文件,即WindowsCodecs.dll和一个名7533.dll的无效负载。当用户挂载ISO文件时,它只显示lnk文件,该文件被伪装成有重要信息的PDF文件或应用Microsoft Edge浏览器关上的文件。然而,在Windows中,快捷方式指向计算器应用程序。单击快捷方式通过命令提示符执行Calc.exe最终就会触发感化。Qakbot恶意软件的新型感化链的关键在于感化文件会被伪装成其它文件。因为在加载时,Windows 7零碎会主动搜寻并尝试加载非法的WindowsCodecs DLL文件。然而,Windows 7零碎不会查看某些硬编码门路中的DLL,如果将DLL文件搁置在与Calc.exe可执行文件雷同的文件夹中,它将加载具备雷同名称的任何DLL。威逼者就是利用这个破绽,创立他们本人的歹意WindowsCodecs.dll文件,而后启动其它编号.dll文件。通过像Windows零碎程序安装Qakbot后,一些安全软件在加载恶意软件时则无奈检测出它,造成了这种威逼回避了安全软件检测。然而有一点,此DLL侧加载破绽不适用于Windows 10 Calc.exe及当前版本,这也是威逼者会针对Windows 7版本的起因。Qakbot曾经有十多年的历史了,尽管投放这种病毒的流动并不频繁,然而依据记录,Emotet僵尸网络已经通过分布这种病毒来投放勒索软件的有效载荷。(局部音讯链接:https://www.bleepingcomputer....)

July 26, 2022 · 1 min · jiezi

关于dll:日子越来越有判头了用DLL劫持搞点事情

0x01 dll简介在Windows零碎中,为了节俭内存和实现代码重用,微软在Windows操作系统中实现了一种共享函数库的形式。这就是DLL(Dynamic Link Library),即动态链接库,这种库蕴含了可由多个程序同时应用的代码和数据。 每个DLL都有一个入口函数(DLLMain),零碎在特定环境下会调用DLLMain。在上面的事件产生时就会调用dll的入口函数: 1.过程装载DLL。2.过程卸载DLL。3.DLL在被装载之后创立了新线程。4.DLL在被装载之后一个线程被终止了。 另外,每个DLL文件中都蕴含有一个导出函数表也叫输出表(存在于PE的.edata节中)。应用一些PE文件查看工具如LoadPE,就能够查看导出函数的符号名即函数名称和函数在导出函数表中的标识号。应用程序导入函数与DLL文件中的导出函数进行链接有两种形式:隐式链接(load-time dynamiclinking)也叫动态调用和显式链接(run-time dynamiclinking)也叫动静调用。隐式链接形式个别用于开发和调试,而显式链接形式就是咱们常见的应用LoadLibary或者LoadLibraryEx函数(注:波及到模块加载的函数有很多)来加载DLL去调用相应的导出函数。调用LoadLibrary或者LoadLibraryEx函数时能够应用DLL的相对路径也能够应用绝对路径,dll门路搜寻规定然而很多状况下,开发人员都是应用了相对路径来进行DLL的加载。那么,在这种状况下,Windows零碎会依照特定的程序去搜寻一些目录,来确定DLL的残缺门路。对于动态链接库的搜寻程序的更多详细资料请参阅MSDN。依据MSDN文档的约定,在应用了DLL的相对路径调用LoadLibrary函数时,零碎会顺次从上面几个地位去查找所须要调用的DLL文件。 1.程序所在目录。2.加载 DLL 时所在的当前目录。3.系统目录即 SYSTEM32 目录。4.16位系统目录即 SYSTEM 目录。5.Windows目录。6.PATH环境变量中列出的目录微软为了避免DLL劫持破绽的产生,在XP SP2之后,增加了一个SafeDllSearchMode的注册表属性。注册表门路如下:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SafeDllSearchMode当SafeDllSearchMode的值设置为1,即平安DLL搜寻模式开启时,查找DLL的目录程序如下: 1.程序所在目录2.系统目录即 SYSTEM32 目录。3.16位系统目录即 SYSTEM 目录。4.Windows目录。5.加载 DLL 时所在的当前目录。6.PATH环境变量中列出的目录。在win7以上版本微软为了更进一步的进攻零碎的DLL被劫持,将一些容易被劫持的零碎DLL写进了一个注册表项中,那么但凡此项下的DLL文件就会被禁止从EXE本身所在的目录下调用,而只能从系统目录即SYSTEM32目录下调用。注册表门路如下: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs以前常常应用的一些劫持DLL曾经被退出了KnownDLLs注册表项,这就意味着应用诸如usp10.dll,lpk.dll,ws2_32.dll去进行DLL劫持曾经生效了。 所以在win7及以上当启用了SafeDllSearchMode搜寻程序如下 1.应用程序所在目录。2.系统目录SYSTEM32 目录。3.16位系统目录。没有获取该目录门路的函数,但会对其进行搜寻。4.Windows目录。应用GetWindowsDirectory函数获取此目录的门路。5.当前目录6.环境变量PATH中所有目录。须要留神的是,这里不包含App Paths注册表项指定的应用程序门路。Windows操作系统通过“DLL门路搜寻目录程序”和“KnownDLLs注册表项”的机制来确定应用程序所要调用的DLL的门路,之后,应用程序就将DLL载入了本人的内存空间,执行相应的函数性能。不过,微软又莫名其妙的容许用户在上述注册表门路中增加“ExcludeFromKnownDlls”注册表项,排除一些被“KnownDLLs注册表项”机制爱护的DLL。也就是说,只有在“ExcludeFromKnownDlls”注册表项中增加你想劫持的DLL名称就能够对该DLL进行劫持,不过批改之后须要重新启动电脑能力失效。 在上述形容加载DLL的整个过程中,DLL劫持破绽就是在零碎进行装置“DLL门路搜寻目录程序”搜寻DLL的时候产生的。 无论平安DLL搜寻模式是否开启,零碎总是首先会从应用程序(程序安装目录)所在目录加载DLL,如果没有找到就依照下面的程序顺次进行搜寻。那么,利用这个个性,攻击者就能够伪造一个雷同名称的dll,只有这个dll不在KnownDLLs注册表项中,咱们就能够对该dll进行劫持测试。 键值 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLswin10的如下 0x02 寻找可劫持dll有很多软件能够查看exe加载的dll process-explorer https://docs.microsoft.com/zh... 火绒剑 Process Monitor https://docs.microsoft.com/zh... 应用的时候能够设置Filter,填入过滤条件,能够帮忙排除很多无用的信息 Include the following filters:Operation is CreateFileOperation is LoadImagePath contains .cplPath contains .dllPath contains .drvPath contains .exePath contains .ocxPath contains .scrPath contains .sysExclude the following filters:Process Name is procmon.exeProcess Name is Procmon64.exeProcess Name is SystemOperation begins with IRP_MJ_Operation begins with FASTIO_Result is SUCCESSPath ends with pagefile.sys相似下图这种就是该dll在KnownDLLs注册表项里 ...

September 17, 2021 · 2 min · jiezi

关于dll:dll丢失解决方案

每个人都遇到过“无奈找到.dll文件...”的音讯弹窗。各位,这个问题终于能够解决了!在这里你能够找到电脑上最常失落或损坏的文件 网站地址 登录后能够看到如下界面 点击搜寻,即可下载你所需的dll文件

March 4, 2021 · 1 min · jiezi

如何Electron中调用Dll

如何Electron中调用Dll客户端有些硬件的接口需要调试,是在电脑上连了一些硬件的设备,比如打印机、扫描仪或者进行串口通信等等。单靠JS是完成不了了,我们决定通过把C++或者C#把这些功能打包成Dll,然后在Electron客户端中通过Node调用Dll来实现所需要的功能。 Dll类型先简单说一下什么是Dll,Dll是动态链接库文件,也是一种代码库的形式,与静态链接库相比,它是在每次程序运行的时候去调用,而静态链接库指令都会被打包到最后的exe文件里,所以如果函数有什么变化那就需要重新生成exe,那动态链接库就不需要这么做了。生成Dll可以通过VS来完成,可以选择使用C#或者C++开发,C#开发界面的比较方便,如果你的功能需要弹出一些界面,那就要用C#编写相应的Dll。不过这里要注意了,用C#语言编写生成的Dll和用C++语言编写生成的Dll是不一样的,通过C#生成的Dll需要.net的开发环境,而C++生成的Dll就没有限制。 Node如何调用DllElectron里调用Dll其实就是node调用Dll,刚才说了,生成的Dll不一样,那么调用方式也不一样。我是用到了这两个模块,ffi和edge,使用ffi调用C++生成的Dll,使用edge调用C#生成的Dll。 ffi调用Dll比如我这里有个ffiTest.dll的文件,里面有个导出的函数叫做joinStr,就是暴露的方法,给定两个字符串,然后会返回这两个参数的拼接结果。注意C++生成的Dll要使用C风格extern “C”否则可能找不到对应的方法名。 var ffi = require('ffi');var path = require('path');var dllPath = path.resolve('ffiTest.dll');var lib = ffi.Library(dllPath, { 'joinStr': ['string', ['string', 'string']],})var result = lib.joinStr('hello', 'world');console.log(result); //打印 helloworld更详细的示例可以参考它的教程。ffi.Library里第二个参数是一个Json结构,key表示是方法名,value示一个数组,数组的第一个参数是返回值类型,第二个参数是方法的列表,如果返回值是空的话,那数组第一个参数应该是void。如果返回值或者参数类型不知道是什么类型就写void*。要使用ffi中的类型表示C/C++语言中的类型,对照表如下 基本类型int8 Signed 8-bit Integeruint8 Unsigned 8-bit Integerint16 Signed 16-bit Integeruint16 Unsigned 16-bit Integerint32 Signed 32-bit Integeruint32 Unsigned 32-bit Integerint64 Signed 64-bit Integeruint64 Unsigned 64-bit Integerfloat Single Precision Floating Point Number (float)double Double Precision Floating Point Number (double)pointer Pointer Typestring Null-Terminated String (char *)常见的C语言类型byte unsigned charchar charuchar unsigned charshort shortushort unsigned shortint intuint unsigned intlong longulong unsigned longlonglong longulonglong unsigned long longsize_t platform-dependent, usually pointer size如果是指针类型,可以利用ref模块来表示 ...

June 6, 2019 · 2 min · jiezi

JNA 使用总结

引言新系统起步,带领两个可爱的小组员李宜衡、潘佳琦一起学习、讨论、编码。系统中使用了JNA调用C++代码。之前对这项技术也只是听说过,也没用到过。以前帮同学调试过调用百度地图SDK一个地图项目,那个项目中就用到了百度地图提供的.so文件(动态链接库,Linux下为.so,Windows下为.dll),只是当时用的时候是直接调百度封装好的代码,也没有手动调用的机会。参考潘老师给出的示例代码,再配合他人的博客,一步步完成功能。感谢开源,感谢如此之多热爱分享技术的人。本文可能有些枯燥,但JNA的例子好像也举不出什么有意思的。JNAC++在学校学过C++,也不陌生了,但是当我打开头文件时,才发现,原来我学的不叫C++!(考高分有什么用呢?)C++太伟大了,甚至连它的设计者都不敢说能完全掌握C++。其实去看看我们平常使用的类,原来我们和C++息息相关。JDK中就有一些使用C++实现的原生方法。C++的好处不必说,就是快。目前对性能要求很高的主流系统会采用C++或Go作为开发语言。这里我们使用并不是因为性能,而是需要通过调用动态链接库来使用已经编写好的基础服务。JNAJava Native Access,拥有4600多Star的流行项目,我们可以使用其进行使用Java对C++的访问。Github地址:JNA - Github这个README写的挺好的,就是太枯燥了(至少我是看着看着就困了),如果是首次接触的话,不建议通过README来入门。可以去看看有关这方面的博客,虽然年代久远,但质量都是非常高的。映射JNA最大的难点就是:C++和Java的数据类型不同,如何在两种语言之间进行映射。public interface CLibrary extends Library { CLibrary INSTANCE = Native.loadLibrary(“PSA5”, CLibrary.class);}编写接口,继承Library,然后加载动态链接库获取INSTANCE,该接口就与动态链接库进行了映射。结构体映射看了好多篇文章,找到了一种算是被大多数开发者推崇的写法:继承Structure表示映射结构体:public class HostStruct extends Structure { public static class ByReference extends HostStruct implements Structure.ByReference { } public static class ByValue extends HostStruct implements Structure.ByValue { } public byte[] name = new byte[33]; public int context; @Override protected List<String> getFieldOrder() { return Arrays.asList(“name”, “context”); }}这里有两个和我们平常开发不同的地方:1.为什么属性是public的?这个也没找到原因,最开始使用private和get、set去映射时,一直报错,具体记不清了,应该是类似字段找不到的错误。应该是private的框架访问不到。2.这两个内部类是干什么的?一个ByReference,一个ByValue,应该能猜到,实现ByReference接口表示该类映射结构体的指针类型(指向结构体的指针),实现ByValue接口表示该类映射结构体的值类型(就是结构体)。所以实际使用的并不是HostStruct,而是他的两个内部类。例子某方法在头文件中如此声明:typedef PSA_STATUS (*LPFN_PSA_RebootHost)( IN PSA_HOST *psa_host );映射为如下的接口方法:NativeLong _PSA_RebootHost(HostStruct.ByReference host);小坑文档中的数据类型的表示非常好的,就是有一个缺陷,关于char *的问题。经过StackOverflow的参考与自己的亲身实践,只有const char *才能映射为String。普通的char *需要使用字节数组byte[]来实现,然后调用Native.toString()方法将字节数组转化为String。总结从看官方README,到放弃README看相关博客,到最后学会实现功能并在此总结,前后大概花了三天的时间。感谢官方的仓库,同时也感谢每一位分享技术的人。国家职业教育改革实施方案想到了学校的教育,在这里感慨一下几天前看到的新闻,国务院2月13日发布关于印发国家职业教育改革实施方案的通知。这么多年了,国家终于发现学校培养的和企业要的不是一回事。国家鼓励企业参与职业教育,2020年初步建设300个示范性职业教育集团。过去,是科教兴国。这么多年,这条路是对的,我国也在蓬勃发展,勇夺世界前列。科学,需要发展,但推动经济发展的,却是工程。一直以来,我始终坚信:既然存在于这世界,那每个人都是完美的,每个人都是平等的,只是教育资源短缺,所以非要拿分数来分个三六九等。来了河北工业大学,和衡水的学生比一比,我上的简直不叫高中。他们在晨读,我们还未起;他们在学习,我们在过周末。也羡慕过考上复旦的同学,看看人家的努力,一切都是公平的。为了弥补之前的遗憾,我一直努力着~加油!别放弃往昔的梦想,努努力,你我都可以! ...

February 17, 2019 · 1 min · jiezi