如何反混淆此 PowerShell 命令

问题描述 投票:0回答:1

长期读者,第一次发帖。

我最近读了一篇关于命令行混淆的文章,我需要一个成年人向我解释巴尼风格是如何做到的

( [字符串]::加入(” ,('39s33-43%114y56F116j114%57V116y43V41-36k111F46V96V110k46y37-46m96j121s106s102V103-111m46s32k41F33V43s114s57s116%114y56F 116%43y36k111k46k38-104s46F37F46m101s101%46-32′.分割( ‘y-sm%kjV>F’)| FOreach-OBject{ [ChAR] ( $_ -BXOr 0x09 )} )) )

可能会变成

(ipconfig /全部)

我以为我在此之前了解了PowerShell...并且提到的功能都单独有意义,但我基本上不明白这里发生了什么。

powershell command-line-arguments obfuscation deobfuscation
1个回答
1
投票

因此,我设法对您的帖子进行了反混淆,以便我可以解释命令的混淆。

其实很简单。

首先,你有字符串

39s33-43%114y56F116j114%57V116y43V41-36k111F46V96V110k46y37-46m96j121s106s102V103-111m46s32k41F33V43s114s57s116%114y56F116%43y36k111k46k38-104s46F37F46m101s101%46-32

然后使用字符串 .Split()

 作为值,使用方法 
y-sm%kjV>F
 将字符串分隔在字符串数组中。
基本上,这会导致从字符串中删除
y-sm%kjV>F
中的每个字符。
注意:这仅适用于 Powershell 5.1,Powershell 7.x 需要转换为
[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
)和一个点源(用于将它们作为命令启动)组成。

简而言之:将字符串拆分为数组以删除无用的部分,转换数组的元素,将数组连接回字符串中,将字符串作为命令处理。

© www.soinside.com 2019 - 2024. All rights reserved.