长期读者,第一次发帖。
我最近读了一篇关于命令行混淆的文章,我需要一个成年人向我解释巴尼风格是如何做到的
( [字符串]::加入(” ,('39s33-43%114y56F116j114%57V116y43V41-36k111F46V96V110k46y37-46m96j121s106s102V103-111m46s32k41F33V43s114s57s116%114y56F 116%43y36k111k46k38-104s46F37F46m101s101%46-32′.分割( ‘y-sm%kjV>F’)| FOreach-OBject{ [ChAR] ( $_ -BXOr 0x09 )} )) )
可能会变成
(ipconfig /全部)
我以为我在此之前了解了PowerShell...并且提到的功能都单独有意义,但我基本上不明白这里发生了什么。
因此,我设法对您的帖子进行了反混淆,以便我可以解释命令的混淆。
其实很简单。
首先,你有字符串
39s33-43%114y56F116j114%57V116y43V41-36k111F46V96V110k46y37-46m96j121s106s102V103-111m46s32k41F33V43s114s57s116%114y56F116%43y36k111k46k38-104s46F37F46m101s101%46-32
然后使用字符串 .Split()
作为值,使用方法
y-sm%kjV>F
将字符串分隔在字符串数组中。y-sm%kjV>F
中的每个字符。[char]
数组:.split([char[]]'y-sm%kjV>F')
结果等于
393343114561161145711643413611146961104637469612110610210311146324133431145711611456116433611146381044637461011014632
我在这里将其渲染为单个 [string]
:它实际上是一个 [string]
数组,每个字符都是一个项目。
这个
[string]
数组通过管道传输到 Foreach-Object
,它在其脚本块中对数组的每个项目执行操作(读取:对每个字符),在脚本块中表示为 $_
。
该操作是一个按位异或移位,基本上,将字符的值更改为0x09
(为了更好的混淆而将其写为十六进制值),然后将结果作为[char]
值返回,从而产生[char]
数组。
所有这些都封装在
::Join()
类的 [string]
静态方法中,该方法将生成的 [char]
数组合并到单个 [string]
中,每个元素由方法中的第一个参数分隔,在本例中为空(所以没有分离)。
生成的
[string]
是 .("{1}{0}" -f'ig','ipconf') ("{0}{1}"-f'/a','ll')
,它由两个 [string]
格式化(生成 ipconfig
和 /all
)和一个点源(用于将它们作为命令启动)组成。
简而言之:将字符串拆分为数组以删除无用的部分,转换数组的元素,将数组连接回字符串中,将字符串作为命令处理。