[系統安全] 四十一.Powershell惡意代碼檢測系列 (2)Powershell基礎語法和注冊表操作
一.Powershell操作符
常見的比較運算符包括:
- -eq 等于
- -ne 不等于
- -gt 大于
- -lt 小于
- -le 小于等于
- -contains 包含
- -notcontains 不包含
67 -eq 5050 -eq 501gb -gt 1tb(1,2,3) -contains 1(1,2,3) -contains 2(1,2,3) -contains 4

求反運算符:
- -not
$a=89 -gt 50$a-not $a

邏輯運算:
- -and 與運算
- -or 或運算
- -not 非運算
- -xor 異或運算
$true -and $true$true -and $false$true -or $false$false -or $false-not $true$true -xor $true

比較數組和集合,從中篩選出不等于0的數字。
1,5,8,0,9 -ne 0

二.Powershell條件語句
1.if條件判斷
if-elseif-else條件判斷,執行操作用大括號表示。
$num=100if($num -gt 90) {"大于90"} else {"小于等于90"}if($num -gt 100) {"大于100"} else {"小于等于100"}

注意,if-else中間可以增加新的判斷elseif,如下所示:
if($num -gt 100) {"大于100"} elseif ($num -eq 100) {"等于100"} else {"小于100"}

2.switch語句
Switch語句主要用于多種情況的判斷,這里在本地創建一個test01.ps1文件,并執行該代碼。

傳統的if判斷如下:
$num=56if($num -gt 50 -and $num -lt 60) { "大于50并且小于60"} elseif ($num -eq 50) { "等于50"}else{ "小于50"}
去到桌面1019文件夾,輸入“.\test01.ps1”執行代碼,再打印該文件的源代碼。

switch語句如下:$_表示對變量取值。
$num=56switch($num){ {$_ -lt 50} {"此數值小于50"} {$_ -eq 50} {"此數值等于50"} {$_ -gt 50} {"此數值大于50"}}

三.Powershell循環語句
1.foreach循環
這里定義數組采用“$arr=1…10”實現,表示1到10的數字,在調用foreach循環輸出。
$arr=1..10foreach ($n in $arr){ $n*$n }

定義文件“test03.ps1”,只輸出偶數內容。
$arr=1..10foreach ($n in $arr){ if (($n%2) -eq 0 ) { $n }}

接著利用foreach操作文件目錄,將C盤python34文件夾下的路徑全部提取出來,賦值到file中輸出。
foreach ($file in dir c:\python34){ if($file.length -gt 1kb) { $file.name $file.length }}

原始文件內容如下所示:

也可以定義變量來指定路徑
$path_value = dir c:\python34foreach ($file in $path_value){ if($file.length -gt 1kb) { $file.name $file.length }}
2.while循環
while循環需要注意循環的終止條件,防止出現死循環,而do_while循環是先執行一次循環體,再進行判斷。
下面這段代碼是經典運算:1+2+3+…+99,文件名為“test05.ps1”。
$i=1$s=0while($i -lt 100){ $s = $s + $i $i = $i + 1}$s$i

do_whlie先執行循環體,再進行條件判斷,如下所示:
$num=15do{ $num $num=$num-1}while($num -gt 10)

3.break和continue關鍵詞
break跳出整個循環,停止執行;continue跳出當前循環一次,繼續執行下一個判斷。
break:下面這個代碼當數值小于6繼續執行,當其等于4停止循環。
$i=1while($i -lt 6){ if($i -eq 4) { break } else { $i $i++ }}

continue:跳過了中間等于4的內容。
$i=1while($i -lt 6){ if($i -eq 4) { $i++ continue } else { $i $i++ }}

4.for循環
利用for循環實現1+2+…+100的代碼如下(test09.ps1)。
$sum=0for($i=1;$i -le 100;$i++){ $sum=$sum+$i}$sum
學習Powershell基礎語法之后,更重要的是解決實際問題,后續作者將繼續深入學習。

5.switch循環
使用switch循環實現輸出數組1到10,并進行奇數和偶數判斷
$num=1..10switch($num){ default{"number=$_"}}
$num=1..10switch($num){ {($_ % 2) -eq 0} {"$_ 數值是偶數"} {($_ % 2) -ne 0} {"$_ 數值是奇數"}}

四.Powershell數組
1.數組定義
數組定義一種方法是逗號隔開不同的元素,另一種是通過兩個點來定義數組。
$arr=1,2,3,4,5$arr=1..5
判斷是否是一個數組,使用如下語句。
$arr -is [array]

數組可以接受不同的數值。
$arr=1,3.14,"yangxiuzhang"$arr$arr -is [array]
空數組定義如下:
$arr=@()$arr$arr -is [array]

下面簡單比較只有一個元素數組和變量的對比。
$arr=,"hello"$arr$arr -is [array] $arr=1$arr$arr -is [array]

數組也可以是一個變量或命令,此時它仍然是一個數組。
$arr=ipconfig$arr$arr -is [array]

2.訪問數組
首先定義一個多鐘類型的數組。
$arr=1,"hello world",(get-date)$arr

訪問數組特定元素,第一個元素,獲取兩個元素,獲取最后一個元素。
$arr[0]$arr[0,1]$arr[-1] //提取部分元素$arr[0..2]

獲取數組元素大小調用count實現。
$num = $arr[0..2]$num.count
如何將數組倒序輸出呢?如下所示。
$arr[($arr.count)..0]

數組添加一個元素代碼如下:
$arr=1,"hello world",(get-date)$arr+="csdn"$arr$arr.count

更多數組操作,推薦讀者結合實際應用進行學習。
五.Powershell函數
1.自定義函數及調用
函數通常包括函數名、參數、函數體,下面是定義及調用一個myping函數的代碼(test11.ps1)。
function myping(){ ping www.baidu.com }
myping

同樣,上面的代碼可以修改為指定參數。
function myping($site){ ping $site}myping www.baidu.com
下面這個代碼是接收兩個參數并顯示的功能。
function myinfo($name,$age){ $info="I am $name, and i am $age years old." write-host $info}myinfo yxz,28

2.函數返回值
函數返回值通過return實現,可以返回多個值。下面是test13.ps1例子。
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中的變量套接類似。
"hello world $(get-date)""hello world $(5*7)""hello, my name is 'yangxiuzhang'"
輸出結果如下圖所示:

在Powershell中,轉義字符不再是斜杠(\)而是(`),如下所示。
- `n 換行
- `r 回車符
- `t tab鍵
- `b 退格符
- `’ 單引號
"hello,`n my name is `'yangxiuzhang`'"


2.用戶交互
read-host 讀取用戶的輸入。
$input = read-host "請輸入您的姓名""您好!您輸入的姓名是:$input"

3.格式化字符串
傳統的多個變量輸出方法:
$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"

格式化字符串輸出方法:
"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拼接、圖片或腳本文件獲取等都涉及字符串操作,下面進行簡單分享。
字符串分割
$str="c:\windows\system32\demo.txt"$str.split("\")//數組類型,可以通過數組下標訪問$str.split("\").gettype()

獲取圖片名稱
$str="https://blog.csdn.net/Eastmount/102781411/logo.png"$str.split("/")[-1]

是否以某個字符結尾和是否包含某個字符。
$str.endswith("png")$str.contains("csdn")

字符串比較,-1表示兩個字符串不一樣,相等輸出0。
$str="https://blog.csdn.net/Eastmount/102781411/logo.png"$str.compareto("window")$str.compareto("https://blog.csdn.net/Eastmount/102781411/logo.png")

其他操作如下:
//獲取下標$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中顯示注冊表指令如下:
cd hkcu:dir

對應注冊表圖形界面。

cd systemdir

對應圖形界面。

其他訪問也類似。
cd HKLM:

對應圖形界面:

讀取鍵值
get-itemproperty

設置鍵值
set-itemproperty
由于注冊表不能隨便修改,很容易造成系統故障,后續隨著作者深入學習,了解更多網絡安全中Powershell及注冊表工作再來分享,希望讀者喜歡該系列文章。
八.總結
寫到這里,這篇文章就介紹完畢,希望您喜歡,本文主要介紹PowerShell基礎之后,這將為后續PowerShell惡意代碼檢測提供基礎。文章非常長,作者也花費了很長時間,但相信只要你認真讀完,肯定會有收獲,尤其是對MSF的理解。
- 一.Powershell操作符
- 二.Powershell條件語句
- 三.Powershell循環語句
- 四.Powershell數組
- 五.Powershell函數
- 六.Powershell字符串及交互
- 七.Powershell注冊表操作
這篇文章中如果存在一些不足,還請海涵。作者作為網絡安全初學者的慢慢成長路吧!希望未來能更透徹撰寫相關文章。同時非常感謝參考文獻中的安全大佬們的文章分享,深知自己很菜,得努力前行。愛你們喔,祝大家安好。