Как стать автором
Обновить

Комментарии 11

Львиная доля возможностей и команд powershell, применимых для работы с удалёнными компьютерами, требуют открытых smb портов (135, 445). Но для ряда функций есть обходные решения, позволяющие выполнить то же самое, но в разы быстрее и без необходимости открытых портов.
Где-нибудь есть сводная информация, какие функции и методы какие порты используют для работы, и какие сервисы нужны на удалённом компе? (например, RPC, WMI, RemoteRegistry, etc.)
Приходится разбираться индивидуально с каждым случаем и искать обходные пути.
Сводной информации не встречал, но для универсальности и минимизации открытия доступов можно заворачивать как отдельные команды, так и целые скрипты, в Invoke-Command (в том числе фоново, флагом AsJob). Ему, в свою очередь, необходимо указывать сеанс удалённого компьютера, через аргумент SessionName. Тогда потребуется открывать только порт WinRM (или два, если нужны и http, и https), потому что работа с сервисами будет выполняться локально на удалённой станции. А ещё с какой-то версии PowerShell можно поменять «транспорт» на SSH.
А как в powershell поправить несколько байт в бинарном файле (например контрольную сумму в PE файле)?
Get-FileHash <filepath> -Algorithm MD5
# Запускать ярлык командной строки в меню "Пуск" от имени Администратора
[byte[]]$bytes = Get-Content -Path "$env:APPDATA\Microsoft\Windows\Start menu\Programs\System Tools\Command Prompt.lnk" -Encoding Byte -Raw
$bytes[0x15] = $bytes[0x15] -bor 0x20
Set-Content -Path "$env:APPDATA\Microsoft\Windows\Start menu\Programs\System Tools\Command Prompt.lnk" -Value $bytes -Encoding Byte -Force
А есть возможность оформить это в виде подпрограммы?

То есть?

Типа такого:
#!/usr/bin/lua

function patch(filename)
	local f,err=io.open(filename,"wb")
	if not f then error(err) end
	return function(body)
		body:gsub("%s*(%x+)%s+(%x+)",function(ofs,val)
			ofs=tonumber(ofs,16)
			val=tonumber(val,16)
			print(string.format("write 0x%08X %02X",ofs,val))
			f:seek("set",ofs) f:write(string.char(val))
		end)
		f:close()
	end
end

patch "a.txt" [[
00000010 0A
000001FE A5
000001FF 5A
]]

patch "b.txt" [[
00000200 FF
00000201 C8
]]

Что бы не писать "$env:APPDATA\Microsoft\Windows\Start menu\Programs\System Tools\Command Prompt.lnk" много раз.
# Запускать ярлык командной строки в меню "Пуск" от имени Администратора
function bytes
{
	[CmdletBinding()]
	Param
	(
		[Parameter(Mandatory = $True)]
		$Path
	)
	[byte[]]$bytes = Get-Content -Path $Path -Encoding Byte -Raw
	$bytes[0x15] = $bytes[0x15] -bor 0x20
	Set-Content -Path $Path -Value $bytes -Encoding Byte -Force
}
# bytes -Path "$env:APPDATA\Microsoft\Windows\Start menu\Programs\System Tools\Command Prompt.lnk"
$bytes[$var] = $bytes[$var] -bor 0x20

Если я правильно понял. В ЛС скинул ссылку.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.