[Research] 악성코드 분석용 VM 세팅을 자동화해보자!

서론

안녕하세요. idioth입니다. 오늘 가져온 주제는 “악성코드 분석용 가상 머신 설정 자동화”입니다.

닝겐은 귀찮은 행동을 하기 싫어합니다.(저만 그런 건 아니겠죠?) 보통 악성코드 분석은 가상 머신에서 수행하고, 또 분석용 VM을 여러 개 들고 있거나 아니면 다른 PC에 설치해야 할 일 등이 있죠. 예를 들어 저 같은 경우는 집에 있는 데스크톱과 학교나 카페 등에서 사용하는 노트북으로 나뉘어 있습니다.

Windows 가상 머신에다가 이런저런 도구들을 설정하면 용량이 커져서 압축하거나 옮기는 데에도 시간이 꽤 걸립니다. 밖에 있는데 노트북을 포맷하거나 하는 상황이 발생하면 Windows 가상 머신을 새로 만들어서 설정을 쭉 해야 하죠.

포너블을 공부할 때 사용하는 우분투에서는 제가 사용하는 툴 등을 쉘 스크립트로 다운로드 및 설정하게 만들어서 리눅스를 사용할 때 쉘 스크립트만 실행하고 딴짓을 하다 오면 세팅이 다 되는데 Windows도 가능할까?라는 생각에서 시작했습니다.

FireEye에서 배포하는 FlareVM도 존재하지만 모든 툴을 다 다운로드하기도 하고 오래 걸리면 하루 종일 걸리는 경우도 있더라고요… 그래서 거기서 영감을 얻어서 제가 자주 사용하는 툴들로 구성하여 작성을 해보았습니다.(FlareVM에서 가져온 코드도 있습니다 😂)

본래 SSG 동아리 내부에서 악성코드 관련 스터디 등을 할 때 스크립트 주면서 이거 실행하면 될 거야~ 했는데 그걸 그대로 블로그에 올리기에는 코드가 너무 처참해서… (매우 더럽습니다.) 이번 기회에 깔끔하게 작성했습니다.(물론 제 기준에서만 깔끔할 수도 있어요! 양해 바랍니다. 🙂

파트는 크게 두 가지로 나뉠 예정입니다. 첫 번째 파트에서는 Windows 설정에 대한 스크립트를 작성할 예정이고, 두 번째 파트에서는 chocolatey를 활용한 툴들을 설치할 겁니다!

무엇을 설정해야 할까?

가장 먼저 스크립트를 통해서 무엇을 해야 할지 정리를 하고 시작합시다. 아무래도 악성코드 분석을 해야 하므로 Windows Defender와 Windows Update는 꺼놓는 것이 좋겠죠? 시작 프로그램에 등록되었을 때 복잡하게 하지 않기 위해서 시작 프로그램도 정리하고… 사용하지 않는 기본 앱 삭제 등… 제가 생각나는 대로 간단하게 정리해보았습니다.

  1. 사용하지 않는 기본 앱 삭제
  2. 방화벽 비활성화
  3. Windows Update 비활성화
  4. Windows Defender 비활성화
  5. 보안유지 정책 알림 비활성화
  6. 작업 스케줄러 삭제
  7. 시작 프로그램 삭제
  8. 숨김 파일 표시

Windows에서 쉘 스크립트로 한 번에 설정을 한다고? 뭔가 낯설게 느껴지시는 분들도 계시겠지만 Windows에는 Powershell이 존재합니다. Powershell을 사용해서 위의 작업들을 하나하나 진행해봅시다!

사용하지 않는 기본 앱 삭제

처음 Windows를 설치하면 3D 뷰어나, BingFinance, OfficeHub 등등 악성코드 분석에는 활용되지 않는 애플리케이션들이 많이 설치되어 있습니다. 이런 앱을 손수 지울 수도 있으나 Remove-AppxPackage 명령어를 통해서 삭제할 수 있습니다.

PS C:\Windows\system32> Get-AppxPackage Microsoft.XboxApp

Name              : Microsoft.XboxApp
Publisher         : CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
Architecture      : X64
ResourceId        :
Version           : 48.76.8001.0
PackageFullName   : Microsoft.XboxApp_48.76.8001.0_x64__8wekyb3d8bbwe
InstallLocation   : C:\Program Files\WindowsApps\Microsoft.XboxApp_48.76.8001.0_x64__8wekyb3d8bbwe
IsFramework       : False
PackageFamilyName : Microsoft.XboxApp_8wekyb3d8bbwe
PublisherId       : 8wekyb3d8bbwe
IsResourcePackage : False
IsBundle          : False
IsDevelopmentMode : False
NonRemovable      : False
Dependencies      : {Microsoft.NET.Native.Framework.1.7_1.7.27413.0_x64__8wekyb3d8bbwe, Microsoft.NET.Native.Runtime.1.7_1.7.27422.0_x64__8wekyb3d8bbwe, Microsoft.VCLibs.140.00_14.0.29231.0_x64__8wekyb3d8bbwe, Microsoft.VCLibs.140.00.UWPDesktop_14.0.29231.0_x64__8wekyb3
                    d8bbwe...}
IsPartiallyStaged : False
SignatureKind     : Store
Status            : Ok

예를 들어 XboxApp의 경우 분석에서는 아예 사용하지 않겠죠? Get-AppxPackage를 통해 패키지의 정보를 가져올 수 있고, 파이프라인으로 Remove-AppxPackage를 사용하면 해당 패키지가 삭제됩니다.

이를 토대로 작성한 소스 코드는 아래와 같습니다.

$packages = @(
    "7EE7776C.LinkedInforWindows"
    "C27EB4BA.DropboxOEM"
    "Microsoft.3DBuilder"
    "Microsoft.Microsoft3DViewer"
    "Microsoft.Advertising.Xaml"
    "Microsoft.Appconnector"
    "Microsoft.BingFinance"
    "Microsoft.BingFoodAndDrink"
    "Microsoft.BingHealthAndFitness"
    "Microsoft.BingNews"
    "Microsoft.BingSports"
    "Microsoft.BingTravel"
    "Microsoft.BingWeather"
    "Microsoft.CommsPhone"
    "Microsoft.ConnectivityStore"
    "Microsoft.DesktopAppInstaller"
    "Microsoft.Getstarted"
    "Microsoft.Messaging"
    "Microsoft.Microsoft3DViewer"
    "Microsoft.MicrosoftOfficeHub"
    "Microsoft.MicrosoftSolitaireCollection"
    "Microsoft.MixedReality.Portal"
    "Microsoft.Netflix"
    "Microsoft.NetworkSpeedTest"
    "Microsoft.Office.Desktop"
    "Microsoft.Office.OneNote"
    "Microsoft.Office.Sway"
    "Microsoft.OfficeLens"
    "Microsoft.OneConnect"
    "Microsoft.OneDrive"
    "Microsoft.People"
    "Microsoft.Print3D"
    "Microsoft.RemoteDesktop"
    "Microsoft.SkypeApp"
    "Microsoft.Wallet"
    "Microsoft.Windows.CloudExperienceHost"
    "Microsoft.Windows.NarratorQuickStart"
    "Microsoft.Windows.PeopleExperienceHost"
    "Microsoft.Windows.Photos"
    "Microsoft.WindowsAlarms"
    "Microsoft.WindowsCamera"
    "Microsoft.windowscommunicationsapps"
    "Microsoft.WindowsFeedbackHub"
    "Microsoft.WindowsMaps"
    "Microsoft.WindowsPhone"
    "Microsoft.WindowsReadingList"
    "Microsoft.WindowsSoundRecorder"
    "Microsoft.Xbox.TCUI"
    "Microsoft.XboxApp"
    "Microsoft.XboxGameCallableUI"
    "Microsoft.XboxGameOverlay"
    "Microsoft.XboxGamingOverlay"
    "Microsoft.XboxIdentityProvider"
    "Microsoft.XboxLive"
    "Microsoft.XboxSpeechToTextOverlay"
    "Microsoft.YourPhone"
    "Microsoft.ZuneMusic"
    "Microsoft.ZuneVideo"
    "Windows.CBSPreview"
)

foreach($name in $packages)
{
    Get-AppxPackage $name | Remove-AppxPackage
}

$packages에 있는 패키지 이름을 하나씩 가져와서 삭제를 하는 부분입니다. 추가되어 있지 않은 애플리케이션도 존재하기 때문에 혹시 본인이 삭제하고 싶지 않거나 삭제하고 싶은 프로그램이 있으면 추가를 하시면 됩니다.

삭제하고 싶은 앱이 있는데 패키지 이름을 모르시겠다고요? 걱정하지 마세요! 깔려있는 패키지를 이름으로 정렬해서 확인할 수 있습니다!

PS C:\Windows\system32> Get-AppxPackage | Select Name

Name
----
windows.immersivecontrolpanel
Microsoft.VCLibs.140.00
Microsoft.UI.Xaml.2.0
Windows.PrintDialog
Microsoft.Wallet
Microsoft.VCLibs.140.00
Microsoft.VCLibs.140.00
RealtekSemiconductorCorp.RealtekAudioControl
Microsoft.VCLibs.140.00.UWPDesktop
Microsoft.VCLibs.140.00.UWPDesktop
AdvancedMicroDevicesInc-2.AMDRadeonSoftware
Microsoft.XboxSpeechToTextOverlay
Microsoft.XboxGameOverlay
Microsoft.NET.Native.Runtime.2.2
Microsoft.NET.Native.Runtime.2.2
Microsoft.NET.Native.Framework.2.2
Microsoft.NET.Native.Framework.2.2
Microsoft.Xbox.TCUI
Microsoft.UI.Xaml.2.4
Microsoft.UI.Xaml.2.4
Microsoft.UI.Xaml.2.0
Microsoft.UI.Xaml.2.1
Microsoft.UI.Xaml.2.1
Microsoft.NET.Native.Framework.1.7
Microsoft.NET.Native.Framework.1.7
Microsoft.NET.Native.Runtime.1.7
Microsoft.NET.Native.Runtime.1.7
Microsoft.UI.Xaml.2.3
Microsoft.UI.Xaml.2.3
Microsoft.UI.Xaml.2.5
Microsoft.UI.Xaml.2.5
Microsoft.549981C3F5F10
Microsoft.StorePurchaseApp
Microsoft.LanguageExperiencePackko-KR
Microsoft.WinDbg
microsoft.windowscommunicationsapps
Microsoft.WebpImageExtension
Microsoft.XboxIdentityProvider
Microsoft.DesktopAppInstaller
Microsoft.Windows.Photos
Microsoft.WebMediaExtensions
Microsoft.XboxApp
Microsoft.MixedReality.Portal
Microsoft.People
Microsoft.WindowsStore
Microsoft.ZuneVideo
Microsoft.Microsoft3DViewer
Microsoft.WindowsFeedbackHub
Microsoft.MicrosoftStickyNotes
Microsoft.WindowsAlarms
Microsoft.GetHelp
Microsoft.BingWeather
Microsoft.WindowsCamera
Microsoft.ScreenSketch
Microsoft.WindowsMaps
Microsoft.WindowsCalculator
Microsoft.WindowsSoundRecorder
Microsoft.ZuneMusic
Microsoft.BioEnrollment
Microsoft.Windows.CloudExperienceHost
Microsoft.Windows.OOBENetworkConnectionFlow
Microsoft.AAD.BrokerPlugin
Microsoft.Windows.OOBENetworkCaptivePortal
MicrosoftWindows.UndockedDevKit
Microsoft.Windows.StartMenuExperienceHost
Microsoft.Windows.ShellExperienceHost
Microsoft.Windows.Search
Microsoft.MicrosoftEdge
Microsoft.Windows.ContentDeliveryManager
MicrosoftWindows.Client.CBS
Windows.CBSPreview
NcsiUwpApp
Microsoft.XboxGameCallableUI
Microsoft.Windows.XGpuEjectDialog
Microsoft.Windows.SecureAssessmentBrowser
Microsoft.Windows.SecHealthUI
Microsoft.Windows.PinningConfirmationDialog
Microsoft.Windows.PeopleExperienceHost
Microsoft.Windows.ParentalControls
Microsoft.Windows.NarratorQuickStart
Microsoft.Windows.CapturePicker
Microsoft.Windows.CallingShellApp
Microsoft.Windows.AssignedAccessLockApp
Microsoft.Windows.Apprep.ChxApp
Microsoft.Win32WebViewHost
Microsoft.MicrosoftEdgeDevToolsClient
Microsoft.LockApp
Microsoft.ECApp
Microsoft.CredDialogHost
Microsoft.AsyncTextService
Microsoft.AccountsControl
Microsoft.VP9VideoExtensions
Microsoft.XboxGamingOverlay
Microsoft.HEIFImageExtension
Microsoft.MSPaint
91750D7E.Slack
Microsoft.MicrosoftEdge.Stable
Microsoft.Getstarted
Microsoft.YourPhone

이름을 찾았는데 Xbox처럼 여러 개가 있는데 적기가 너무 귀찮다. 나는 한 번에 해치우고 싶다! 하시는 분은 Microsoft.Xbox*하시면 리눅스와 같이 Microsoft.Xbox1 등 뒤에 추가되어 있는(?) 뭐라 말해야 하지… 생각이 안 나네요! 아무튼! 저 문자열로 시작하는 친구들을 모두 삭제해줍니다!

그럼 이제 방화벽을 비활성화하러 가볼까요?

방화벽 비활성화

방화벽 비활성화는 굉장히~~ 코드가 간단합니다.

도메인, 공용, 개인에 대한 방화벽 모두를 비활성화하면 되는데 요거는 PowerShell을 통해 한번에 작업할 수 있습니다. XD

Set-NetFirewallProfile -Profile Domain, Public, Private -Enabled False

Windows Update 비활성화

Windows Update를 비활성화하기 위해서는 WindowsUpdate 레지스트리에 NoAutoUpdate를 설정해주면 됩니다.

New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows" -Name "WindowsUpdate" -ea 0 | Out-Null
New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" -Name "AU" -ea 0 | Out-Null
New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "NoAutoUpdate" -Value 1 -PropertyType DWORD -Force -ea 0 | Out-Null

Windows Defender 비활성화

방화벽 비활성화는 Windows Defender 레지스트리에 DisableAntiSpyware만 추가를 해놓았었는데, flare-vm에서 사용하는 코드를 그대로 가져왔습니다.

function disable_defender()
{
    Write-Host "[*] Disable Windows Defender"

    try
    {
        Get-Service WinDefend | Stop-Service -Force
        Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\WinDefend" -Name "Start" -Value 4 -Type DWORD -Force -ea 0 | Out-Null
    }
    catch
    {
        Write-Error "Failed disable WinDefend Service"
    }

    New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft" -Name "Windows Defender" -Force -ea 0 | Out-Null
    New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender" -Name "DisableAntiSpyware" -Value 1 -PropertyType DWORD -Force -ea 0 | Out-Null
    New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender" -Name "DisableRoutinelyTakingAction" -Value 1 -PropertyType DWORD -Force -ea 0 | Out-Null

    New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender" -Name "Spynet" -Force -ea 0 | Out-Null
    New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender\Spynet" -Name "SpyNetReporting" -Value 0 -PropertyType DWORD -Force -ea 0 | Out-Null
    New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender\Spynet" -Name "SubmitSamplesConsent" -Value 0 -PropertyType DWORD -Force -ea 0 | Out-Null

    New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft" -Name "MRT" -Force -ea 0 | Out-Null
    New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\MRT" -Name "DontReportInfectionInformation" -Value 1 -PropertyType DWORD -Force -ea 0 | Out-Null

    if(-Not ((Get-WmiObject -Class Win32_OperatingSystem).Version -eq "6.1.7601"))
    {
        Add-MpPreference -ExclusionPath "C:\" -Force -ea 0 | Out-Null
        Set-MpPreference -DisableArchiveScanning $true  -ea 0 | Out-Null
        Set-MpPreference -DisableBehaviorMonitoring $true -Force -ea 0 | Out-Null
        Set-MpPreference -DisableBlockAtFirstSeen $true -Force -ea 0 | Out-Null
        Set-MpPreference -DisableCatchupFullScan $true -Force -ea 0 | Out-Null
        Set-MpPreference -DisableCatchupQuickScan $true -Force -ea 0 | Out-Null
        Set-MpPreference -DisableIntrusionPreventionSystem $true  -Force -ea 0 | Out-Null
        Set-MpPreference -DisableIOAVProtection $true -Force -ea 0 | Out-Null
        Set-MpPreference -DisableRealtimeMonitoring $true -Force -ea 0 | Out-Null
        Set-MpPreference -DisableRemovableDriveScanning $true -Force -ea 0 | Out-Null
        Set-MpPreference -DisableRestorePoint $true -Force -ea 0 | Out-Null
        Set-MpPreference -DisableScanningMappedNetworkDrivesForFullScan $true -Force -ea 0 | Out-Null
        Set-MpPreference -DisableScanningNetworkFiles $true -Force -ea 0 | Out-Null
        Set-MpPreference -DisableScriptScanning $true -Force -ea 0 | Out-Null
        Set-MpPreference -EnableControlledFolderAccess Disabled -Force -ea 0 | Out-Null
        Set-MpPreference -EnableNetworkProtection AuditMode -Force -ea 0 | Out-Null
        Set-MpPreference -MAPSReporting Disabled -Force -ea 0 | Out-Null
        Set-MpPreference -SubmitSamplesConsent NeverSend -Force -ea 0 | Out-Null
        Set-MpPreference -PUAProtection Disabled -Force -ea 0 | Out-Null    
    }

}

WinDefend Service의 경우 에러가 뜨는 경우가 많아 try-catch 처리를 하였고, 마이크로소프트에 리포트를 보내는 것, 그리고 OS 버전이 6.1.7601 (Windows 7 Service Pack 1)이 아닐 경우 (Windows 10일 경우인 것 같습니다.) Defender에 추가된 다른 설정들을 비활성화해줍니다.

소스 코드를 가져와서 읽으면서 느낀 건 Windows 7 Service Pack 1로 검사하는 게 아니라 Windows 10과 Server 2019에 대한 Defender 명령어인 것 같은데 [System.Envrionment]::OSVersion.Version.Major -eq 10으로 Windows 10인지 확인하면 되지 않나? 싶었습니다.

사실상 저는 Windows 10 기준으로 스크립트를 작성했지만요.

보안 유지 정책 알림 비활성화

보안 유지 정책 알림 아이콘 비활성화입니다. 이건 굳이 필요 없어 보이긴 하지만 저는 빨간 불이 떠있다거나 느낌표가 떠있다거나 하면 신경이 굉장히 많이 쓰이는 사람이기에…

New-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer" -Name "HideSCAHealth" -Value 1 -PropertyType DWORD -Force -ea 0 | Out-Null

찾아보았더니 Microsoft Policies에 HideSCAHealth 레지스트리에 해당 부분을 비활성화할 수 있다는 사실을 알았습니다! 오예 바로 설정하죠! HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\ExplorerHideSCAHealth의 값을 1로 하면 해당 플래그가 설정되어 보안 알림 설정이 숨겨집니다!

작업 스케줄러 삭제

이제 Windows에 기본적으로 설정되어 있거나, 다른 애플리케이션을 추가하면서 등록된 불필요한 작업 스케줄러를 삭제할 시간입니다.

작업 스케줄러에 표시된 이 녀석들을 삭제를 하는 거죠. 이 작업엔 비하인드 에피소드가 있습니다. Task 리스트를 가져와서 모두 삭제를 해버리면 될 거라 생각했어요. 저 부분에 있는 친구들만 가져온다고 생각했습니다.

근데 테스트를 하는데… Windows 기능이 정상적으로 동작 안 하는 게 있는 거에요… 검색이 안 되고… 왜 이러지? 왜 이러지? 어디가 문제지? 하면서 함수 호출을 하나하나 주석 처리하다가 발견했습니다.

function remove_task()
{
    $TS = New-Object -ComObject Schedule.Service
    $TS.Connect($env:COMPUTERNAME)
    $TaskFolder = $TS.GetFolder('\')
    $Tasks = $TaskFolder.GetTasks(1)

    foreach($Task in $Tasks)
    {
        $TaskFolder.DeleteTask($Task.Name, 0)
    }

}

remove task는 ComObject를 통해 Schedule.Service에서 Task 리스트를 가져와서 삭제를 해줍니다. 시스템 스케줄까지 모두 삭제해버려서 발생한 해프닝이었습니다. ㅜ.ㅜ

시작 프로그램 삭제

악성코드를 실행하고, 어떤 것들이 autorun 되는지 확인할 때 여러 잡다한 프로그램들이 실행되면 보기 힘들겠죠? 그래서 이것 또한 지워버립시다!

function disable_startup()
{
    $user = New-Object System.Security.Principal.NTAccount($env:username)
    $sid = ($user.Translate([System.Security.Principal.SecurityIdentifier])).Value

    Remove-Item -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\*" -Recurse
    Remove-Item -Path "Registry::HKEY_USERS\S-1-5-19\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\*" -Recurse
    Remove-Item -Path "Registry::HKEY_USERS\S-1-5-20\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\*" -Recurse
    Remove-Item -Path "Registry::HKEY_USERS\$sid\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\*" -Recurse
}

특정 사용자에 한해 등록된 시작 프로그램은 그 사용자의 SID 경로를 통해 저장이 됩니다. 따라서 사용자에 따른 SID 값을 가져와서 삭제를 해주는 거죠! 일단은… 저렇게 지정을 했는데 안 지워지는 것들이 있더라구요…??? 이유를… 못 찾겠어서 남아있는 거는 손으로 지웠습니다.

최종본을 가져올 때는 꼭 수정해서 가져올게요! 이번만 너그러이 봐주시면…

숨김 파일 표시

이제 숨김 파일과 시스템 숨김 파일들을 표시해봅시다. 설치하고 숨김 파일을 체크하고 하는 것 또한 레지스트리를 통해서 작업할 수 있어요. Windows는 레지스트리를 통해서 이것저것 설정하니까요.

New-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name "Hidden" -Value 1 -PropertyType DWORD -Force -ea 0 | Out-Null
New-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name "ShowSuperHidden" -Value 1 -PropertyType DWORD -Force -ea 0 | Out-Null

HiddenShowSuperHidden의 값을 1로 설정해주면 끝입니다! 이제 기본적인 설정은 완료되었어요.

마치며

간단한 Windows 설정을 스크립트로 작성해보았습니다. 손으로 해도 얼마 안 걸리지만, 가끔 몇 개 까먹을 때도 있고 귀찮잖아요? 스크립트로 작성하면 실행만 하면 이 모든 것들을 무료! 까먹은 거 없이 설정할 수 있습니다.

다음 파트에서 chocolatey를 통해서 여러 가지 툴들을 설치하고 개인의 입맛에 맞게 작업 표시줄에 추가, 바탕화면 바로가기 만들기 등에 대해서 알아봅시다. 다음 파트가 모두 진행되고 나면 전체 소스 코드를 github에 올려서 링크를 걸어드리겠습니다! 마지막으로 해당 기능들을 구현할 때 참고 링크들을 작성하며 이만 물러가도록 하겠습니다. 그럼 안뇽~

Reference

disable security maintenance icon: https://admx.help/?Category=Windows_10_2016&Policy=Microsoft.Policies.TaskBar2::HideSCAHealth

show hidden files: https://www.python2.net/questions-1237399.htm

remove app list: https://community.spiceworks.com/topic/2230169-powershell-script-to-remove-xbox-gamebar-from-the-app-list

disable windows defender: https://github.com/fireeye/flare-vm/blob/master/install.ps1

disable windows update: https://social.technet.microsoft.com/Forums/lync/en-US/abde2699-0d5a-49ad-bfda-e87d903dd865/disable-windows-update-via-powershell?forum=winserverpowershell

get specific sid: https://techexpert.tips/powershell/powershell-get-user-sid/

remove all registry key under specific key: https://docs.microsoft.com/ko-kr/powershell/scripting/samples/working-with-registry-keys?view=powershell-7.1#removing-all-keys-under-a-specific-key

remove task: https://community.spiceworks.com/how_to/159324-delete-scheduled-task-with-powershell