前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[系统安全] 四十一.Powershell恶意代码检测系列 (2)Powershell基础语法和注册表操作

[系统安全] 四十一.Powershell恶意代码检测系列 (2)Powershell基础语法和注册表操作

作者头像
Eastmount
发布2023-02-28 17:24:36
2.7K0
发布2023-02-28 17:24:36
举报

该系列文章将系统整理和深入学习系统安全、逆向分析和恶意代码检测,文章会更加聚焦,更加系统,更加深入,也是作者的慢慢成长史。漫漫长征路,偏向虎山行。享受过程,一起加油~

前文分享了Powershell基础入门知识,涉及基础概念、管道和重定向、执行外部命令、别名用法、变量定义等。这篇文章将从Powershell条件语句、循环语句、数组、函数 、字符串操作、注册表访问等方面讲解。Powershell被广泛应用于安全领域,甚至成为每一位Web安全必须掌握的技术。本文参考了Bilibili的Hack学习老师的课程,同时也结合了作者之前的编程经验进行讲解。作者作为网络安全的小白,分享一些自学基础教程给大家,希望你们喜欢。同时,这些大佬是真的值得我们去学习,献上小弟的膝盖~fighting!

  • 只有更深入的了解PowerShell基础及用法,才能更好地检测恶意代码

文章目录:

  • 一.Powershell操作符
  • 二.Powershell条件语句 1.if条件判断 2.switch语句
  • 三.Powershell循环语句 1.foreach循环 2.while循环 3.break和continue关键词 4.for循环 5.switch循环
  • 四.Powershell数组 1.数组定义 2.访问数组
  • 五.Powershell函数 1.自定义函数及调用 2.函数返回值
  • 六.Powershell字符串及交互 1.定义文本及转义字符 2.用户交互 3.格式化字符串 4.字符串操作
  • 七.Powershell注册表操作
  • 八.总结

作者的github资源:

  • 逆向分析: https://github.com/eastmountyxz/ SystemSecurity-ReverseAnalysis
  • 网络安全: https://github.com/eastmountyxz/ NetworkSecuritySelf-study

作者作为网络安全的小白,分享一些自学基础教程给大家,主要是关于安全工具和实践操作的在线笔记,希望您们喜欢。同时,更希望您能与我一起操作和进步,后续将深入学习网络安全和系统安全知识并分享相关实验。总之,希望该系列文章对博友有所帮助,写文不易,大神们不喜勿喷,谢谢!如果文章对您有帮助,将是我创作的最大动力,点赞、评论、私聊均可,一起加油喔!

声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。(参考文献见后)


一.Powershell操作符

常见的比较运算符包括:

  • -eq 等于
  • -ne 不等于
  • -gt 大于
  • -lt 小于
  • -le 小于等于
  • -contains 包含
  • -notcontains 不包含
代码语言:javascript
复制
67 -eq 50
50 -eq 50
1gb -gt 1tb
(1,2,3) -contains 1
(1,2,3) -contains 2
(1,2,3) -contains 4

求反运算符:

  • -not
代码语言:javascript
复制
$a=89 -gt 50
$a
-not $a

逻辑运算:

  • -and 与运算
  • -or 或运算
  • -not 非运算
  • -xor 异或运算
代码语言:javascript
复制
$true -and $true
$true -and $false
$true -or $false
$false -or $false
-not $true
$true -xor $true

比较数组和集合,从中筛选出不等于0的数字。

代码语言:javascript
复制
1,5,8,0,9 -ne 0

二.Powershell条件语句

1.if条件判断

if-elseif-else条件判断,执行操作用大括号表示。

代码语言:javascript
复制
$num=100
if($num -gt 90) {"大于90"} else {"小于等于90"}
if($num -gt 100) {"大于100"} else {"小于等于100"}

注意,if-else中间可以增加新的判断elseif,如下所示:

代码语言:javascript
复制
if($num -gt 100) {"大于100"} elseif ($num -eq 100) {"等于100"} else {"小于100"}

2.switch语句

Switch语句主要用于多种情况的判断,这里在本地创建一个test01.ps1文件,并执行该代码。

传统的if判断如下:

代码语言:javascript
复制
$num=56
if($num -gt 50 -and $num -lt 60) 
{
    "大于50并且小于60"
} 
elseif ($num -eq 50) 
{
    "等于50"
}
else
{
    "小于50"
}

去到桌面1019文件夹,输入“.\test01.ps1”执行代码,再打印该文件的源代码。

switch语句如下:$_表示对变量取值。

代码语言:javascript
复制
$num=56
switch($num)
{
    {$_ -lt 50} {"此数值小于50"}
    {$_ -eq 50} {"此数值等于50"}
    {$_ -gt 50} {"此数值大于50"}
}

三.Powershell循环语句

1.foreach循环

这里定义数组采用“$arr=1…10”实现,表示1到10的数字,在调用foreach循环输出。

代码语言:javascript
复制
$arr=1..10
foreach ($n in $arr){ $n*$n }

定义文件“test03.ps1”,只输出偶数内容。

代码语言:javascript
复制
$arr=1..10
foreach ($n in $arr)
{
    if (($n%2) -eq 0 )
    {
        $n
    }
}

接着利用foreach操作文件目录,将C盘python34文件夹下的路径全部提取出来,赋值到file中输出。

代码语言:javascript
复制
foreach ($file in dir c:\python34)
{
    if($file.length -gt 1kb)
    {
        $file.name
        $file.length
    }
}

原始文件内容如下所示:

也可以定义变量来指定路径

代码语言:javascript
复制
$path_value = dir c:\python34
foreach ($file in $path_value)
{
    if($file.length -gt 1kb)
    {
        $file.name
        $file.length
    }
}

2.while循环

while循环需要注意循环的终止条件,防止出现死循环,而do_while循环是先执行一次循环体,再进行判断。

下面这段代码是经典运算:1+2+3+…+99,文件名为“test05.ps1”。

代码语言:javascript
复制
$i=1
$s=0
while($i -lt 100)
{
    $s = $s + $i
    $i = $i + 1
}
$s
$i

do_whlie先执行循环体,再进行条件判断,如下所示:

代码语言:javascript
复制
$num=15
do
{
    $num
    $num=$num-1
}
while($num -gt 10)

3.break和continue关键词

break跳出整个循环,停止执行;continue跳出当前循环一次,继续执行下一个判断。

break:下面这个代码当数值小于6继续执行,当其等于4停止循环。

代码语言:javascript
复制
$i=1
while($i -lt 6)
{
    if($i -eq 4)
    {
        break
    }
    else
    {
        $i
        $i++
    }
}

continue:跳过了中间等于4的内容。

代码语言:javascript
复制
$i=1
while($i -lt 6)
{
    if($i -eq 4)
    {
        $i++
        continue
    }
    else
    {
        $i
        $i++
    }
}

4.for循环

利用for循环实现1+2+…+100的代码如下(test09.ps1)。

代码语言:javascript
复制
$sum=0
for($i=1;$i -le 100;$i++)
{
    $sum=$sum+$i
}
$sum

学习Powershell基础语法之后,更重要的是解决实际问题,后续作者将继续深入学习。


5.switch循环

使用switch循环实现输出数组1到10,并进行奇数和偶数判断。

代码语言:javascript
复制
$num=1..10
switch($num)
{
    default{"number=$_"}
}

$num=1..10
switch($num)
{
    {($_ % 2) -eq 0} {"$_ 数值是偶数"}
    {($_ % 2) -ne 0} {"$_ 数值是奇数"}
}

四.Powershell数组

1.数组定义

数组定义一种方法是逗号隔开不同的元素,另一种是通过两个点来定义数组。

代码语言:javascript
复制
$arr=1,2,3,4,5
$arr=1..5

判断是否是一个数组,使用如下语句。

代码语言:javascript
复制
$arr -is [array]

数组可以接受不同的数值。

代码语言:javascript
复制
$arr=1,3.14,"yangxiuzhang"
$arr
$arr -is [array]

空数组定义如下:

代码语言:javascript
复制
$arr=@()
$arr
$arr -is [array]

下面简单比较只有一个元素数组和变量的对比。

代码语言:javascript
复制
$arr=,"hello"
$arr
$arr -is [array]

$arr=1
$arr
$arr -is [array]

数组也可以是一个变量或命令,此时它仍然是一个数组。

代码语言:javascript
复制
$arr=ipconfig
$arr
$arr -is [array]

2.访问数组

首先定义一个多钟类型的数组。

代码语言:javascript
复制
$arr=1,"hello world",(get-date)
$arr

访问数组特定元素,第一个元素,获取两个元素,获取最后一个元素。

代码语言:javascript
复制
$arr[0]
$arr[0,1]
$arr[-1]

//提取部分元素
$arr[0..2]

获取数组元素大小调用count实现。

代码语言:javascript
复制
$num = $arr[0..2]
$num.count

如何将数组倒序输出呢?如下所示。

代码语言:javascript
复制
$arr[($arr.count)..0]

数组添加一个元素代码如下:

代码语言:javascript
复制
$arr=1,"hello world",(get-date)
$arr+="csdn"
$arr
$arr.count

更多数组操作,推荐读者结合实际应用进行学习。


五.Powershell函数

1.自定义函数及调用

函数通常包括函数名、参数、函数体,下面是定义及调用一个myping函数的代码(test11.ps1)。

代码语言:javascript
复制
function myping()
{
    ping www.baidu.com   
}

myping

同样,上面的代码可以修改为指定参数。

代码语言:javascript
复制
function myping($site)
{
    ping $site
}
myping www.baidu.com

下面这个代码是接收两个参数并显示的功能。

代码语言:javascript
复制
function myinfo($name,$age)
{
    $info="I am $name, and i am $age years old."
    write-host $info
}
myinfo yxz,28

2.函数返回值

函数返回值通过return实现,可以返回多个值。下面是test13.ps1例子。

代码语言:javascript
复制
function add($num1,$num2)
{
   $sum=$num1+$num2
   return $sum
}
add 2 4

function fun($num1,$num2)
{
   $sum=$num1+$num2
   $sum.gettype()
   $sum.gettype().fullname
   return $sum
}
fun 2.2 4.3


//多个返回值
function other($num1,$num2,$num3)
{
    $value=$num1,$num2,$num3
    return $value
}
other 2.2 4 6

六.Powershell字符串及交互

1.定义文本及转义字符

表达式中可以定义只,如下所示。同时,单引号和双引号可以相互嵌套,这和JAVA、PHP、Python中的变量套接类似。

代码语言:javascript
复制
"hello world $(get-date)"
"hello world $(5*7)"
"hello, my name is 'yangxiuzhang'"

输出结果如下图所示:

在Powershell中,转义字符不再是斜杠(\)而是(`),如下所示。

  • `n 换行
  • `r 回车符
  • `t tab键
  • `b 退格符
  • `’ 单引号
代码语言:javascript
复制
"hello,`n my name is `'yangxiuzhang`'"

2.用户交互

read-host 读取用户的输入。

代码语言:javascript
复制
$input = read-host "请输入您的姓名"
"您好!您输入的姓名是:$input"

3.格式化字符串

传统的多个变量输出方法:

代码语言:javascript
复制
$name="yangxiuzhang"
$age=25
$body="strong"
$height=1.72
"My name is $name, i am $age years old, and my body is $body, my height is $height"

格式化字符串输出方法:

代码语言:javascript
复制
"My name is {0}, i am {1} years old, and my body is {2}, my height is {3}" -f $name,$age,$body,$height

4.字符串操作

任何编程语言,都绕不过字符串操作,在网络安全领域,获取ip地址、URL拼接、图片或脚本文件获取等都涉及字符串操作,下面进行简单分享。

字符串分割

代码语言:javascript
复制
$str="c:\windows\system32\demo.txt"
$str.split("\")
//数组类型,可以通过数组下标访问
$str.split("\").gettype()

获取图片名称

代码语言:javascript
复制
$str="https://blog.csdn.net/Eastmount/102781411/logo.png"
$str.split("/")[-1]

是否以某个字符结尾和是否包含某个字符。

代码语言:javascript
复制
$str.endswith("png")
$str.contains("csdn")

字符串比较,-1表示两个字符串不一样,相等输出0。

代码语言:javascript
复制
$str="https://blog.csdn.net/Eastmount/102781411/logo.png"
$str.compareto("window")
$str.compareto("https://blog.csdn.net/Eastmount/102781411/logo.png")

其他操作如下:

代码语言:javascript
复制
//获取下标
$str.indexof("s")

//字符插入
$str.insert(4,"yxz")

//字符串替换
$str.replace("n","N")

七.Powershell注册表操作

注册表(Registry,繁体中文版Windows操作系统称之为登录档)是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息。早在Windows 3.0推出OLE技术的时候,注册表就已经出现。随后推出的Windows NT是第一个从系统级别广泛使用注册表的操作系统。但是,从Microsoft Windows 95操作系统开始,注册表才真正成为Windows用户经常接触的内容,并在其后的操作系统中继续沿用至今。

在CMD中输入regedit即可打开注册表,如下图所示。

注册表图形化界面显示如下,包括各种程序的配置信息,不能随便修改它,很容易造成系统故障。

  • HKEY_CLASSES_ROOT:定义文档的类型\类以及与类型关联的信息以及COM组件的配置数据
  • HKEY_CURRENT_USER:包含当前登录到Windows的用户的配置信息
  • HKEY_LOCAL_MACHINE:包含与计算机相关的配置信息,不管用户是否登录
  • HKEY_USERS:包含有关默认用户配置的信息
  • HKEY_CURRENT_CONFIG:包含有关非用户特定的硬件的配置信息

在Powershell中显示注册表指令如下:

代码语言:javascript
复制
cd hkcu:
dir

对应注册表图形界面。

代码语言:javascript
复制
cd system
dir

对应图形界面。

其他访问也类似。

代码语言:javascript
复制
cd HKLM:

对应图形界面:

读取键值

代码语言:javascript
复制
get-itemproperty

设置键值

代码语言:javascript
复制
set-itemproperty

由于注册表不能随便修改,很容易造成系统故障,后续随着作者深入学习,了解更多网络安全中Powershell及注册表工作再来分享,希望读者喜欢该系列文章。

八.总结

写到这里,这篇文章就介绍完毕,希望您喜欢,本文主要介绍PowerShell基础之后,这将为后续PowerShell恶意代码检测提供基础。文章非常长,作者也花费了很长时间,但相信只要你认真读完,肯定会有收获,尤其是对MSF的理解。

  • 一.Powershell操作符
  • 二.Powershell条件语句
  • 三.Powershell循环语句
  • 四.Powershell数组
  • 五.Powershell函数
  • 六.Powershell字符串及交互
  • 七.Powershell注册表操作

这篇文章中如果存在一些不足,还请海涵。作者作为网络安全初学者的慢慢成长路吧!希望未来能更透彻撰写相关文章。同时非常感谢参考文献中的安全大佬们的文章分享,深知自己很菜,得努力前行。爱你们喔,祝大家安好。

(By:Eastmount 2022-11-29 夜于火星)

参考文献,感谢这些大佬。

  • [1] https://www.bilibili.com/video/av66327436 [推荐B站老师视频]
  • [2]《安全之路Web渗透技术及实战案例解析》陈小兵老师
  • [3] https://baike.baidu.com/item/Windows Power Shell/693789
  • [4] https://www.pstips.net/powershell-piping-and-routing.html
  • [5] https://www.pstips.net/using-the-powershell-pipeline.html
  • [6] 微软官方PowerShell文档
  • [7] C# 系统应用之注册表使用详解 - Eastmount
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 娜璋AI安全之家 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.Powershell操作符
  • 二.Powershell条件语句
    • 1.if条件判断
      • 2.switch语句
      • 三.Powershell循环语句
        • 1.foreach循环
          • 2.while循环
            • 4.for循环
              • 5.switch循环
              • 四.Powershell数组
                • 1.数组定义
                  • 2.访问数组
                  • 五.Powershell函数
                    • 1.自定义函数及调用
                      • 2.函数返回值
                      • 六.Powershell字符串及交互
                        • 1.定义文本及转义字符
                          • 2.用户交互
                            • 3.格式化字符串
                              • 4.字符串操作
                              • 七.Powershell注册表操作
                              • 八.总结
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档