เชฌเชจเชพเชตเชจเซ€ เชฎเชพเชนเชฟเชคเซ€ เชญเซ‡เช—เซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชชเชพเชตเชฐเชถเซ‡เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹

เชชเชพเชตเชฐเชถเซ‡เชฒ เช เชเช•เชฆเชฎ เชธเชพเชฎเชพเชจเซเชฏ เช“เชŸเซ‹เชฎเซ‡เชถเชจ เชŸเซ‚เชฒ เช›เซ‡ เชœเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฎเชพเชฒเชตเซ‡เชฐ เชกเซ‡เชตเชฒเชชเชฐเซเชธ เช…เชจเซ‡ เชฎเชพเชนเชฟเชคเซ€ เชธเซเชฐเช•เซเชทเชพ เชจเชฟเชทเซเชฃเชพเชคเซ‹ เชฌเช‚เชจเซ‡ เชฆเซเชตเชพเชฐเชพ เชฅเชพเชฏ เช›เซ‡.
เช† เชฒเซ‡เช– เชฎเชพเชนเชฟเชคเซ€ เชธเซเชฐเช•เซเชทเชพ เช˜เชŸเชจเชพเช“เชจเซ‹ เชœเชตเชพเชฌ เช†เชชเชคเซ€ เชตเช–เชคเซ‡ เช…เช‚เชคเชฟเชฎ เช‰เชชเช•เชฐเชฃเซ‹เชฎเชพเช‚เชฅเซ€ เชกเซ‡เชŸเชพเชจเชพ เชฆเซ‚เชฐเชธเซเชฅ เชธเช‚เช—เซเชฐเชน เชฎเชพเชŸเซ‡ เชชเชพเชตเชฐเชถเซ‡เชฒเชจเชพ เช‰เชชเชฏเซ‹เช— เชชเชฐ เชตเชฟเชšเชพเชฐ เช•เชฐเชถเซ‡. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชเช• เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชฒเช–เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชœเซ‡ เช…เช‚เชคเชฟเชฎ เช‰เชชเช•เชฐเชฃ เชชเชฐ เชšเชพเชฒเชถเซ‡, เช…เชจเซ‡ เชชเช›เซ€ เช† เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซเช‚ เชตเชฟเช—เชคเชตเชพเชฐ เชตเชฐเซเชฃเชจ เชนเชถเซ‡.

function CSIRT{
param($path)
if ($psversiontable.psversion.major -ge 5)
	{
	$date = Get-Date -Format dd.MM.yyyy_hh_mm
	$Computer = $env:COMPUTERNAME
	New-Item -Path $path$computer$date -ItemType 'Directory' -Force | Out-Null
	$path = "$path$computer$date"

	$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname,
	processid, commandline, parentprocessid

	$netTCP = Get-NetTCPConnection | select-object creationtime, localaddress,
	localport, remoteaddress, remoteport, owningprocess, state
	
	$netUDP = Get-NetUDPEndpoint | select-object creationtime, localaddress,
	localport, remoteaddress, remoteport, owningprocess, state

	$task = get-ScheduledTask | Select-Object author, actions, triggers, state, description, taskname|
	where author -notlike '*ะœะฐะนะบั€ะพัะพั„ั‚*' | where author -ne $null |
	where author -notlike '*@%systemroot%*' | where author -notlike '*microsoft*'

	$job = Get-ScheduledJob

	$ADS =  get-item * -stream * | where stream -ne ':$Data'

	$user = quser

	$runUser = Get-ItemProperty "HKCU:SoftwareMicrosoftWindowsCurrentVersionRun"

	$runMachine =  Get-ItemProperty "HKLM:SoftwareMicrosoftWindowsCurrentVersionRun"

	$array = $process, $netTCP, $netUDP, $task, $user, $runUser, $runMachine, $job, $ADS
	$arrayName = "Processes", "TCPConnect", "UDPConnect", "TaskScheduled", "Users", "RunUser", "RunMachine",
	"ScheduledJob", "AlternativeDataStream"


	for ($w = 0; $w -lt $array.count; $w++){
		$name = $arrayName[$w]
		$array[$w] >> $path$name.txt
		}

	}

}

เชชเซเชฐเชพเชฐเช‚เชญ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชเช• เช•เชพเชฐเซเชฏ เชฌเชจเชพเชตเซ‹ CSIRT เชเช•เซเชธเซเชŸเซ‡เช‚เชถเชจ, เชœเซ‡ เชฆเชฒเซ€เชฒ เชฒเซ‡เชถเซ‡ - เชชเซเชฐเชพเชชเซเชค เชกเซ‡เชŸเชพเชจเซ‡ เชธเชพเชšเชตเชตเชพเชจเซ‹ เชฎเชพเชฐเซเช—. เชฎเซ‹เชŸเชพเชญเชพเช—เชจเชพ cmdlets Powershell v5 เชฎเชพเช‚ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡ เชนเช•เซ€เช•เชคเชจเซ‡ เช•เชพเชฐเชฃเซ‡, PowerShell เชตเชฐเซเชเชจเชจเซ€ เชคเชชเชพเชธ เชฏเซ‹เช—เซเชฏ เช•เชพเชฎเช—เซ€เชฐเซ€ เชฎเชพเชŸเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡.

function CSIRT{
		
param($path)# ะฟั€ะธ ะทะฐะฟัƒัะบะต ัะบั€ะธะฟั‚ะฐ ะฝะตะพะฑั…ะพะดะธะผะพ ัƒะบะฐะทะฐั‚ัŒ ะดะธั€ะตะบั‚ะพั€ะธัŽ ะดะปั ัะพั…ั€ะฐะฝะตะฝะธั
if ($psversiontable.psversion.major -ge 5)

เชฌเชจเชพเชตเซ‡เชฒ เชซเชพเชˆเชฒเซ‹ เชฆเซเชตเชพเชฐเชพ เชจเซ‡เชตเชฟเช—เซ‡เชถเชจเชจเซ€ เชธเชฐเชณเชคเชพ เชฎเชพเชŸเซ‡, เชฌเซ‡ เชตเซ‡เชฐเซ€เชเชฌเชฒ เชถเชฐเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡: $date เช…เชจเซ‡ $Computer, เชœเซ‡เชจเซ‡ เช•เชฎเซเชชเซเชฏเซเชŸเชฐเชจเซเช‚ เชจเชพเชฎ เช…เชจเซ‡ เชตเชฐเซเชคเชฎเชพเชจ เชคเชพเชฐเซ€เช– เชธเซ‹เช‚เชชเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

$date = Get-Date -Format dd.MM.yyyy_hh_mm
$Computer = $env:COMPUTERNAME
New-Item -Path $path$computer$date โ€“ItemType 'Directory' -Force | Out-Null 
$path = "$path$computer$date"

เช…เชฎเชจเซ‡ เชตเชฐเซเชคเชฎเชพเชจ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชตเชคเซ€ เชšเชพเชฒเซ€ เชฐเชนเซ‡เชฒเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“เชจเซ€ เชธเซ‚เชšเชฟ เชจเซ€เชšเซ‡ เชชเซเชฐเชฎเชพเชฃเซ‡ เชฎเชณเซ‡ เช›เซ‡: $process เชตเซ‡เชฐเซ€เชเชฌเชฒเชจเซ‡ win32_process เช•เซเชฒเชพเชธ เชธเชพเชฅเซ‡ get-ciminstance cmdlet เชธเซ‹เช‚เชชเซ€เชจเซ‡ เชฌเชจเชพเชตเซ‹. เชธเชฟเชฒเซ‡เช•เซเชŸ-เช“เชฌเซเชœเซ‡เช•เซเชŸ cmdlet เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, เชคเชฎเซ‡ เชตเชงเชพเชฐเชพเชจเชพ เช†เช‰เชŸเชชเซเชŸ เชชเชฐเชฟเชฎเชพเชฃเซ‹ เช‰เชฎเซ‡เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เช…เชฎเชพเชฐเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เช† เชชเซ‡เชฐเซ‡เชจเซเชŸเชชเซเชฐเซ‹เชธเซ‡เชธเซ€เชก (PPID เชชเซ‡เชฐเซ‡เชจเซเชŸ เชชเซเชฐเซ‹เชธเซ‡เชธ เช†เชˆเชกเซ€), เชฌเชจเชพเชตเชŸเชจเซ€ เชคเชพเชฐเซ€เช– (เชชเซเชฐเซ‹เชธเซ‡เชธ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชคเชพเชฐเซ€เช–), เชชเซเชฐเซ‹เชธเซ‡เชธเซเชก (PID เชชเซเชฐเซ‹เชธเซ‡เชธ เช†เชˆเชกเซ€), เชชเซเชฐเซ‹เชธเซ‡เชธเชจเซ‡เชฎ (เชชเซเชฐเซ‹เชธเซ‡เชธ เชจเชพเชฎ), เช•เชฎเชพเชจเซเชกเชฒเชพเชˆเชจ เชนเชถเซ‡. (เชชเซเชฐเชพเชฐเช‚เชญ เช†เชฆเซ‡เชถ).

$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname, processid, commandline, parentprocessid

เชฌเชงเชพ TCP เช…เชจเซ‡ UDP เช•เชจเซ‡เช•เซเชถเชจเซเชธเชจเซ€ เชธเซ‚เชšเชฟ เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡, $netTCP เช…เชจเซ‡ $netUDP เชตเซ‡เชฐเชฟเชฏเซ‡เชฌเชฒเซเชธเชจเซ‡ เช…เชจเซเช•เซเชฐเชฎเซ‡ Get-NetTCPConnection เช…เชจเซ‡ Get-NetTCPConnection cmdlets เชธเซ‹เช‚เชชเซ€เชจเซ‡ เชฌเชจเชพเชตเซ‹.

$netTCP = Get-NetTCPConnection | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state

$netUDP = Get-NetUDPEndpoint | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state

เชธเซเชจเชฟเชถเซเชšเชฟเชค เช•เชพเชฐเซเชฏเซ‹ เช…เชจเซ‡ เช•เชพเชฐเซเชฏเซ‹เชจเซ€ เชธเซ‚เชšเชฟ เชœเชพเชฃเชตเซ€ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชฐเชนเซ‡เชถเซ‡. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ get-ScheduledTask เช…เชจเซ‡ Get-ScheduledJob cmdlets เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช. เชšเชพเชฒเซ‹ เชคเซ‡เชฎเชจเซ‡ $task เช…เชจเซ‡ $job เชšเชฒเซ‹ เชธเซ‹เช‚เชชเซ€เช, เช•เชพเชฐเชฃ เช•เซ‡ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚, เชธเชฟเชธเซเชŸเชฎเชฎเชพเช‚ เช˜เชฃเชพ เชฌเชงเชพ เชธเซเชจเชฟเชถเซเชšเชฟเชค เช•เชพเชฐเซเชฏเซ‹ เช›เซ‡, เชชเช›เซ€ เชฆเซ‚เชทเชฟเชค เชชเซเชฐเชตเซƒเชคเซเชคเชฟเชจเซ‡ เช“เชณเช–เชตเชพ เชฎเชพเชŸเซ‡, เชคเซ‡ เช•เชพเชฏเชฆเซ‡เชธเชฐ เชธเซเชจเชฟเชถเซเชšเชฟเชค เช•เชพเชฐเซเชฏเซ‹เชจเซ‡ เชซเชฟเชฒเซเชŸเชฐ เช•เชฐเชตเชพ เชฏเซ‹เช—เซเชฏ เช›เซ‡. เชธเชฟเชฒเซ‡เช•เซเชŸ-เช“เชฌเซเชœเซ‡เช•เซเชŸ cmdlet เช…เชฎเชจเซ‡ เช†เชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเชถเซ‡.

$task = get-ScheduledTask | Select-Object author, actions, triggers, state, description, taskname| where author -notlike '*ะœะฐะนะบั€ะพัะพั„ั‚*' | where author -ne $null | where author -notlike '*@%systemroot%*' | where author -notlike '*microsoft*' # $task ะธัะบะปัŽั‡ะฐะตั‚ ะฐะฒั‚ะพั€ะพะฒ, ัะพะดะตั€ะถะฐั‰ะธั… โ€œะœะฐะนะบั€ะพัะพั„ั‚โ€, โ€œMicrosoftโ€, โ€œ*@%systemroot%*โ€, ะฐ ั‚ะฐะบะถะต ยซะฟัƒัั‚ั‹ั…ยป ะฐะฒั‚ะพั€ะพะฒ
$job = Get-ScheduledJob

เชเชจเชŸเซ€เชเชซเชเชธ เชซเชพเช‡เชฒ เชธเชฟเชธเซเชŸเชฎเชฎเชพเช‚, เชตเซˆเช•เชฒเซเชชเชฟเช• เชกเซ‡เชŸเชพ เชธเซเชŸเซเชฐเซ€เชฎเซเชธ (เชตเซˆเช•เชฒเซเชชเชฟเช• เชกเซ‡เชŸเชพ เชธเซเชŸเซเชฐเซ€เชฎเซเชธ, เชเชกเซ€เชเชธ) เชœเซ‡เชตเซ€ เชตเชธเซเชคเซ เช›เซ‡. เช†เชจเซ‹ เช…เชฐเซเชฅ เช เช›เซ‡ เช•เซ‡ NTFS เชชเชฐเชจเซ€ เชซเชพเช‡เชฒเชจเซ‡ เชฎเชจเชธเซเชตเซ€ เช•เชฆเชจเชพ เชฌเชนเซเชตเชฟเชง เชกเซ‡เชŸเชพ เชธเซเชŸเซเชฐเซ€เชฎ เชธเชพเชฅเซ‡ เชตเชงเซ เชธเชพเช‚เช•เชณเซ€ เชถเช•เชพเชฏ เช›เซ‡. ADS เชธเชพเชฅเซ‡, เชคเชฎเซ‡ เชเชตเชพ เชกเซ‡เชŸเชพเชจเซ‡ เช›เซเชชเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹ เชœเซ‡ เชฎเชพเชจเช• เชธเชฟเชธเซเชŸเชฎ เชคเชชเชพเชธ เชฆเซเชตเชพเชฐเชพ เชฆเซ‡เช–เชพเชถเซ‡ เชจเชนเซ€เช‚. เช† เชฆเซ‚เชทเชฟเชค เช•เซ‹เชก เชฆเชพเช–เชฒ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡ เช…เชจเซ‡/เช…เชฅเชตเชพ เชกเซ‡เชŸเชพ เช›เซเชชเชพเชตเซ€ เชถเช•เซ‡ เช›เซ‡.

เชชเชพเชตเชฐเชถเซ‡เชฒเชฎเชพเช‚ เชตเซˆเช•เชฒเซเชชเชฟเช• เชกเซ‡เชŸเชพ เชธเซเชŸเซเชฐเซ€เชฎเซเชธ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ เชคเชฎเชพเชฎ เชธเช‚เชญเชตเชฟเชค เชธเซเชŸเซเชฐเซ€เชฎเซเชธ เชœเซ‹เชตเชพ เชฎเชพเชŸเซ‡ * เชธเชฟเชฎเซเชฌเซ‹เชฒ เชธเชพเชฅเซ‡ เช—เซ‡เชŸ-เช†เช‡เชŸเชฎ cmdlet เช…เชจเซ‡ เชฌเชฟเชฒเซเชŸ-เช‡เชจ เชตเชฟเชจเซเชกเซ‹เช เชธเซเชŸเซเชฐเซ€เชฎ เชŸเซ‚เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชถเซเช‚, เช† เชฎเชพเชŸเซ‡ เช…เชฎเซ‡ $ADS เชšเชฒ เชฌเชจเชพเชตเซ€เชถเซเช‚.

$ADS = get-item * -stream * | where stream โ€“ne ':$Data' 

เชธเชฟเชธเซเชŸเชฎเชฎเชพเช‚ เชฒเซ‰เช— เช‡เชจ เชฅเชฏเซ‡เชฒเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“เชจเซ€ เชธเซ‚เชšเชฟ เชœเชพเชฃเชตเชพ เชฎเชพเชŸเซ‡ เชคเซ‡ เช‰เชชเชฏเซ‹เช—เซ€ เชฅเชถเซ‡, เช† เชฎเชพเชŸเซ‡ เช…เชฎเซ‡ $user เชšเชฒ เชฌเชจเชพเชตเซ€เชถเซเช‚ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ quser เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‹ เช…เชฎเชฒ เชธเซ‹เช‚เชชเซ€เชถเซเช‚.

$user = quser

เชธเชฟเชธเซเชŸเชฎเชฎเชพเช‚ เชชเช— เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡, เชนเซเชฎเชฒเชพเช–เซ‹เชฐเซ‹ เช“เชŸเซ‹เชฐเชจเชฎเชพเช‚ เชซเซ‡เชฐเชซเชพเชฐ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡. เช‘เชŸเซ‹เชชเซเชฒเซ‡เชฎเชพเช‚ เชตเชธเซเชคเซเช“ เชœเซ‹เชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเซ‡ Get-ItemProperty cmdlet เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.
เชšเชพเชฒเซ‹ เชฌเซ‡ เชšเชฒเซ‹ เชฌเชจเชพเชตเซ€เช: $runUser - เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชตเชคเซ€ เช“เชŸเซ‹เชฒเซ‹เชก เชœเซ‹เชตเชพ เชฎเชพเชŸเซ‡ เช…เชจเซ‡ $runMachine - เช•เชฎเซเชชเซเชฏเซเชŸเชฐ เชตเชคเซ€ เช“เชŸเซ‹เชฒเซ‹เชก เชœเซ‹เชตเชพ เชฎเชพเชŸเซ‡.

$runUser = Get-ItemProperty 
"HKCU:SoftwareMicrosoftWindowsCurrentVersionRun"
$runMachine = Get-ItemProperty 
"HKLM:SoftwareMicrosoftWindowsCurrentVersionRun"

เชฌเชงเซ€ เชฎเชพเชนเชฟเชคเซ€ เชตเชฟเชตเชฟเชง เชซเชพเชˆเชฒเซ‹ เชชเชฐ เชฒเช–เซ€ เชถเช•เชพเชฏ เชคเซ‡ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ เชตเซ‡เชฐเซ€เชเชฌเชฒ เชธเชพเชฅเซ‡ เชเชฐเซ‡ เช…เชจเซ‡ เชซเชพเชˆเชฒ เชจเชพเชฎเซ‹ เชธเชพเชฅเซ‡ เชเชฐเซ‡ เชฌเชจเชพเชตเซ€เช เช›เซ€เช.


$array = $process, $netTCP, $netUDP, $task, $user, $runUser, $runMachine, $job, $ADS
$arrayName = "Processes", "TCPConnect", "UDPConnect" "TaskScheduled", "Users", "RunUser", "RunMachine",
"ScheduledJob", "Alternative Data Stream"

เช…เชจเซ‡, เชซเซ‹เชฐ เชฒเซ‚เชชเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, เชชเชฐเชฟเชฃเชพเชฎเซ€ เชกเซ‡เชŸเชพ เชซเชพเช‡เชฒเซ‹เชฎเชพเช‚ เชฒเช–เชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

for ($w = 0; $w -lt $array.count; $w++){
	$name = $arrayName[$w]
	$array[$w] >> $path$name.txt

เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชเช•เซเชเชฟเช•เซเชฏเซเชŸ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชœเชฐเซ‚เชฐเซ€ เชฎเชพเชนเชฟเชคเซ€ เชงเชฐเชพเชตเชคเซ€ 9 เชŸเซ‡เช•เซเชธเซเชŸ เชซเชพเช‡เชฒเซ‹ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

เช†เชœเซ‡, เชธเชพเชฏเชฌเชฐ เชธเชฟเช•เซเชฏเซเชฐเชฟเชŸเซ€ เชชเซเชฐเซ‹เชซเซ‡เชถเชจเชฒเซเชธ เชคเซ‡เชฎเชจเชพ เช•เชพเชฐเซเชฏเชฎเชพเช‚ เชตเชฟเชตเชฟเชง เช•เชพเชฐเซเชฏเซ‹เชจเซ‡ เช‰เช•เซ‡เชฒเชตเชพ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เชฎเชพเชนเชฟเชคเซ€เชจเซ‡ เชธเชฎเซƒเชฆเซเชง เชฌเชจเชพเชตเชตเชพ PowerShell เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡. เช‘เชŸเซ‹เชฒเซ‹เชกเชฎเชพเช‚ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เช‰เชฎเซ‡เชฐเซ€เชจเซ‡, เชคเชฎเซ‡ เชกเชฎเซเชชเชฟเช‚เช—, เช›เชฌเซ€เช“ เชตเช—เซ‡เชฐเซ‡ เชตเช—เชฐ เช•เซ‡เชŸเชฒเซ€เช• เชฎเชพเชนเชฟเชคเซ€ เชฎเซ‡เชณเชตเซ€ เชถเช•เซ‹ เช›เซ‹.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹