Этот код - кейлоггер? Что оно делает? - PullRequest
0 голосов
/ 03 марта 2020

Из-за моего Windows10 диспетчера задач у меня работает файл powershell.exe, который непрерывно потребляет 8% ЦП и блокирует 64 МБ ОЗУ. После проверки моего Windows журнала событий я обнаружил конвейерное событие (800) с последующим кодом:

Add-Type -AssemblyName System.Core
function Run-Server() {
  param([string]$h);
  $b = New-Object byte[] 8;
  $p = New-Object System.IO.Pipes.AnonymousPipeClientStream -ArgumentList @([System.IO.Pipes.PipeDirection]::In, $h);
  if ($p) {
    $l = $p.Read($b, 0, 8); while ($l -gt 7) {
      $c = [System.BitConverter]::ToInt32($b, 0); $l = System.BitConverter]::ToInt32($b, 4);
      $t = $null; if ($l -gt 0) {
        $t1 = New-Object byte[] $l;
        $l = $p.Read($t1, 0, $t1.Length);
        $t = [System.Text.Encoding]::UTF8.GetString($t1, 0, $l) }
      if ($c -eq 1) { Invoke-Expression $t } elseif ($c -eq 9) { break } $l = $p.Read($b, 0, 8) } 
   $p.Dispose() 
    } 
} Run-Server -h 728

Я работаю в корпоративной среде и не являюсь экспертом Powershell, но похоже, что скрипт отлавливает побайтово и делает из него строку? Ты хоть представляешь, для чего этот скрипт можно использовать? Как вы думаете, это может вызвать указанную индикацию использования 8% ЦП и 64 МБ ОЗУ?

1 Ответ

2 голосов
/ 03 марта 2020

Я отформатировал код, изменил имена переменных и добавил несколько комментариев, чтобы было легче понять:

Add-Type -AssemblyName System.Core

function Run-Server() {

    param(
        [string]$h
    );


    $buffer = New-Object byte[] 8;

    # Creates an annonymous pipe
    $pipe = New-Object System.IO.Pipes.AnonymousPipeClientStream -ArgumentList @([System.IO.Pipes.PipeDirection]::In, $h);

    if ($pipe) {

        # Read up to 8 bytes from the pipe
        $readBytes = $pipe.Read($buffer,0, 8); #(byte[] buffer, int offset, int count);

        # if it managed to read 8 bytes
        while ($readBytes -gt 7) {

            # Seems the sender is sending some kind of 'command' or instruction. 
            # If command is '1' means execute the rest as a script
            # If command is '9' means terminate
            $command = [System.BitConverter]::ToInt32($buffer,0); 

            # Seems that in position 4 it sends how big the text will be
            $textSize = [System.BitConverter]::ToInt32($buffer,4); # ToInt32 (byte[] value, int startIndex);

            # based on the $textSize, read the full message and convert it to string ($text)
            $text = $null;
            if ($readBytes -gt 0) {
                $text1 = New-Object byte[] $textSize;
                $readBytes = $pipe.Read($text1, 0, $text1.Length);
                $text = [System.Text.Encoding]::UTF8.GetString($text1, 0, $readBytes) 
            }

            if ($command -eq 1) { 
                # Scary! execute the text string that came from the pipe
                Invoke-Expression $text 
            }
            elseif ($command -eq 9) {
                 break 
            } 
            $readBytes = $pipe.Read($buffer,0, 8) 
        } 
        $pipe.Dispose() 
    } 
} 

Run-Server -h 728

Информация о канале: Класс AnonymousPipeClientStream

Эти коды создают In трубу с дескриптором 728 и получают скрипт от другого процесса, затем он выполняет скрипт

Некоторые детали:

Первое сообщение выглядит как команда ($ c) и указывает на то, насколько большим будет скрипт ($ l)

Тогда он читает второе сообщение размером ($ l) и, если команда == 1 , выполняет второе сообщение, как если бы это был скрипт powershell: Invoke-Expression $t (страшно !)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...