Re[4]: 2Sheridan: ну че, баттл? PS vs Bash...
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 02.02.09 14:58
Оценка: 1 (1)
Здравствуйте, octo47, Вы писали:

KV>>Я правильно понимаю, что если выразить задачу более абстрактно, то нужно с эталонной машины слить некие настройки из профиля эталонного пользователя и перенести их на удаленную машину?

O>Не совсем. В общем случае настройки моей рабочей станции имеют мало общего с серверными настройками.

Тогда зачем? Я просто не совсем себе представляю способ применения этого на винде Юникс-вэем попахивает

O>>>Просто интересно как это будет выглядить без winrar.exe

KV>>А зачем тут именно winrar? В винде есть вполне стандартный makecab.exe, а в .NET (которая является неотъемлемой частью PS) — System.IO.Packaging в целом, и ZipPackage в частности
O>Я про самораспаковывающийся шелл-скрипт (на PS).

Времени нет, но вот proof-of-concept (ps-скрипт, содержащий в себе зазипованный notepad.exe, который его из себя извлекает, распаковывает и запускает. используются только стандартные средства XP и .NET 2.0 и выше):

$scriptFullName = $MyInvocation.MyCommand.Path
$temporaryPath = $env:temp + '\' + $MyInvocation.MyCommand.Name
new-item -path $temporaryPath -type directory
$attachmentFullName = $temporaryPath + '\' + $MyInvocation.MyCommand.Name.Replace('.ps1', '.zip')

[Byte[]]$scriptContent = [System.IO.File]::ReadAllBytes($scriptFullName)

$attachmentPosition = 0
while ($scriptContent[$attachmentPosition] -ne 64 -or 
       $scriptContent[$attachmentPosition + 1] -ne 39)
{
    $attachmentPosition++
}
$attachmentPosition += 3

$attachmentSize = $scriptContent.Length - $attachmentPosition - 14

[Byte[]]$attachmentContent = New-Object Byte[] $attachmentSize
[Array]::Copy($scriptContent, $attachmentPosition, $attachmentContent, 0, $attachmentSize)
[System.IO.File]::WriteAllBytes($attachmentFullName, $attachmentContent)

$shellApplication = new-object -com Shell.Application
$zipFolder = $shellApplication.NameSpace($attachmentFullName)
$destinationFolder = $shellApplication.NameSpace($temporaryPath)
$folderItems = $zipFolder.Items()
$destinationFolder.CopyHere($folderItems);

invoke-item $temporaryPath\*.exe | Out-Null

@'
<здесь был бинарник внедренного zip-файла>
'@ | Out-Null


Работающий прототип можно взять тут. Распаковать и запустить файл в консоли ps. Запустится внедренный блокнот.

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.