[
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: BUG\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the bug and expected behavior**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Version**\n - OS: [e.g. Win7]\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: FEATURE REQUEST\nlabels: ''\nassignees: ''\n\n---\n\n**Would you like have a tool or script added? Please include a link**\nName of the tool requested and a link to the tool\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**If related to a problem, describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\navailable_packages.xml\n/Profiles/Custom.xml\n"
  },
  {
    "path": "Docs/Categories.md",
    "content": "# Categories\nThe following is the current list of supported categories for CommandoVM.\nThese will serve as the Folders used to organize \ntools in the user's Desktop\\Tools\\ directory.\n\n- Command & Control\n- Credential Access\n- Exploitation\n- Lateral Movement\n- Payload Development\n- Persistence\n- Privilege Escalation\n- Reconnaissance\n- Utilities\n- Wordlists"
  },
  {
    "path": "Docs/Changelog.md",
    "content": "# Changelog\n## 2023.3 - September 4 2023\n- Update to coincide with installer rearchitecture detailed in [this PR](https://github.com/mandiant/VM-Packages/pull/656)\n  - Changes include modularity of debloat and config functions which will aid in our support for Win11 and Win11ARM\n- Removed all debloater functions and moved into [common.vm](https://github.com/mandiant/VM-Packages/tree/main/packages/common.vm)\n- Added logic to detect OS and profile settings and move appropriate config file to expected location\n- renamed \"config.xml\" in install script to \"packages.xml\" to avoid confusion with new install features\n- Added \"config.xml\" as the OS customizations\n- Moved `Images\\Docs\\*` to `Docs\\img\\*`\n- Removed blue text output as Win10 default powershell has blue background and is very hard to read\n- Changed console prompt from red font to green\n- Disabled automatic malware sample sending in Victim profile\n- Created new low-priv user for Victim profile\n- Enabled Light Mode for Victim machine for easy visibility\n- Added blue logo for Victim machine for easy visibility\n\n## 3.0 - August 9 2023\n- Completely rebuilt everything\n\n## 2021.2 - July 14 2021\n- Require users to disable Defender before installing\n  * Too many issues arise from Defender magically turning itself back on. Disabling defender with the preconfig script has been unreliable since Win10 1909.\n- removed update requirement (legacy  requirement for Windows 7. Windows 7 support was  removed last year)\n- Added support for Windows 10 20H2 and 21H1\n- Removed vcpython27 #204\n- updated proxycap install args #203, #200. #196\n- updated sqlitebrowser.fireeye to remove newly created desktop shortcuts #200\n- Closed issues #203, #204, #202, #200, #196, #195, #192, #191, #190, #189, #188, #186, #185, #184, #177, #175, #174, #170, #169, #160, #134, #133\n\n## 2020.2 - June 17 2020\n- Added support for Windows 10 2004\n- Corrected syspin verb #124\n- Removed WSL from default install #146, #120\n- Removed Hyper V from default install #146, #120\n- Removed Kali from default install #95, #120\n- Removed Docker from default install #95, #120\n- Created wsl.fireeye package #95, #120\n- Created hyperv.fireeye package #95, #120 \n- Created multiple install profiles #95, #120\n  - Default, NestedV, Lite, Full, and Developer\n- Removed some dependencies causing %PATH% variable to be truncated to 1024 characters #141\n- Added logic to help speed up install\n- Removed dependency on custom libraries file #131\n- Added custom logging for installation of packages #70\n- Fixed bug in autohotkey script for unhardening of UNC paths #68\n- Updated Readme #140\n\n## 2020.1 - March 3 2020\n- added logic to attempt automatically updating system #88\n- added qbittorrent #88\n- added dbeaver #88\n- added hfsexplorer #88\n- added lockhunter #88\n- fixed typo for PwnedPasswordsNTLM in packages.json #101\n- added BeRoot\n- added BloodHound Custom Queries - Hausec\n- added Dumpert\n- added Recon-AD\n- added Net-GPPPassword\n- added Gadget2JScript\n- added OffensiveCSharp - matterpreter\n- added powercat\n- added Privesc - enjoiz\n- added PSBits\n- added ThreadContinue\n- added SysWhispers\n- added TikiTorch\n- added Virus Total Uploader #88\n- added NirLauncher #88\n- added SimpleDnsCrypt #88\n- added Tor Browser #88\n- added HeidiSQL #88\n- added HTTP File Server #88\n- Removed support for Windows 7 (install should still work, but is no longer maintained)\n- improved error handling for commandovm.win10.config.fireeye package\n- updated commandovm.win10.preconfig.fireeye\n- Fixed taskbar pinning on 1903 (still not working for 1909)\n- Updated install instructions on readme\n- Updated ~45 packages\n- Removed Watson binaries (static binaries are not updated in this repo)\n- Removed PoshC2 (deprecated, will look at supporting PoshC2 Python)\n- Removed Covenant (will support again in a future release)\n- Removed Elite (deprecated)\n\n## 2.0 - August 5 2019\n- Added Kali Linux https://www.kali.org\n- Added Docker https://www.docker.com #88\n- Added SpiderFoot https://github.com/smicallef/spiderfoot #84\n- Added Amass https://github.com/OWASP/Amass\n- Added customization support #42, #25 \n\n## 1.3 - June 28 2019\n- Added RottenPotatoNG https://github.com/breenmachine/RottenPotatoNG #63\n- Added Juicy Potato https://github.com/ohpe/juicy-potato #63, #64\n- Added Watson https://github.com/rasta-mouse/Watson #64\n- Added PwndPasswordsNTLM https://github.com/JacksonVD/PwnedPasswordsNTLM #67\n- Added FOCA https://github.com/JacksonVD/PwnedPasswordsNTLM #71 \n- Added Vulcan https://github.com/praetorian-code/vulcan\n- Added SharpClipHistory https://github.com/mwrlabs/SharpClipHistory\n- Added NetRipper https://github.com/NytroRST/NetRipper\n- Added RobotsDisallowed https://github.com/danielmiessler/RobotsDisallowed\n- Added Probable-Wordlists https://github.com/berzerk0/Probable-Wordlists\n- Added SharpSploit https://github.com/cobbr/SharpSploit\n- Changed WinRM configuration #65\n- Un-hardened UNC file paths #68\n- Fixed install issues with Covenant #61, #76\n\n## 1.2 - May 31 2019\n- Added recommended hardware settings #20, #17\n- Added DomainPasswordSpray https://github.com/dafthack/DomainPasswordSpray #2\n- Added GoBuster https://github.com/OJ/gobuster #39\n- Added Wfuzz https://github.com/xmendez/wfuzz #40\n- Added Notepad++ #30\n- Added TextFX plugin for Notepad++\n- Added Explorer Suite (CFF Explorer)\n\n## 1.1 - April 30 2019\n- Added AD-Control-Paths https://github.com/ANSSI-FR/AD-control-paths/releases\n- Added DefenderCheck https://github.com/matterpreter/DefenderCheck\n- Added dnsrecon https://github.com/darkoperator/dnsrecon\n- Added EvilClippy https://github.com/outflanknl/EvilClippy\n- Added NtdsAudit https://github.com/Dionach/NtdsAudit\n- Added SharpExec https://github.com/anthemtotheego/SharpExec\n- Added Subdomain-Bruteforce https://github.com/visualbasic6/subdomain-bruteforce\n- Fixed issue #18 with PATH \n- Added Commando Logos with transparent backgrounds to $Home\\Pictures\n- Pinned Firefox to Taskbar\n- Fixed misspellings in Readme #42/#43\n- Added Ruby and Ruby Devkit #1\n- Updated Rubeus package to current version (1.4.2) #31\n\n1.0.2 - April 10 2019\n- Added missing 'seclists.fireeye' package to packages.json #38\n\n1.0.1 - March 31 2019\n- Used https instead of http to install boxstarter #10"
  },
  {
    "path": "Docs/Commando_Quickstart_Guide.md",
    "content": "The goal of this guide is to get **anyone** who would like to contribute to the project get started, even with minimal experience with Git. \n\nThis guide does not assume prior experience of contributing to Github projects, because a large number of those performing, learning, or researching offensive security may not have had many experiences working on projects with multiple contributors.\n\nTo get started with the project, there are a couple key points a contributor will need to understand first:\n- CommandoVM is built using a combination of **Chocolatey, Boxstarter, and some custom powershell scripts**. Boxstarter allows installations to continue on reboot (since some package installations may require restarts to work properly), and **Chocolatey** is similar to package managers such as apt, brew, or yum.\n- All of the packages used for Commando can be found in the **[vm-packages](https://github.com/mandiant/VM-Packages)** repository. These are then built and pushed to a public package feed on MyGet, which is where Chocolatey goes to fetch the packages. The VM-Packages repository supports other Mandiant virtual machine projects as well, such as [FlareVM](https://github.com/mandiant/flare-vm).\n- The **VM-packages [wiki](https://github.com/mandiant/VM-Packages/wiki)** contains great information on contributing to the VM-packages repo.\n\n## What areas need work?\n### CommandoVM\nThere are a couple areas that will need work and regular maintenance. On the **CommandoVM** side, there can be improvements made to:\n- the installer. While this is mostly static, certain logic may change as Windows changes, such as certain locations of registry keys. Search for `Installer Functions` around line `932` to begin seeing the functions that contribute to installation logic (the section above handles GUI elements). [installer.ps1](https://github.com/mandiant/commando-vm/blob/main/install.ps1)\n\n- updating installation profiles with new tools. This ensures the latest packages are available and appropriate for the job at hand: offensive security. See the available [profiles](https://github.com/mandiant/commando-vm/tree/main/Profiles).\n\nOn top of all this, regular bugs, issues, and improvement recommendations are also provided by the community on the Github page.\n\n### VM-Packages\nMany issues have to do with missing packages or packages that fail to install because they are outdated or their installation paths have changed. For those issues, improvements and additions can be made to the **VM-Packages** repository. For more information on adding, testing, and fixing packages, see the **VM-packages [wiki](https://github.com/mandiant/VM-Packages/wiki)**\n\nOne major effort maintained here is the `debloat.vm` package that performs the cleanup of a fresh Windows VM, greatly reducing resources consumed (as well as general eye strain). The package can be found here: [debloat.vm](https://github.com/mandiant/VM-Packages/tree/main/packages/debloat.vm)\n\nAnother significant part of the project is the **common.vm** package. It helps provide a set of standardized powershell helper functions across Mandiant VMs and provides a method for customization through environment variables. Additional information can be found here [common.vm readme](https://github.com/mandiant/VM-Packages/tree/main/packages/common.vm) and the code is here in the [Common.vm Powershell Module](https://github.com/mandiant/VM-Packages/blob/main/packages/common.vm/tools/vm.common/vm.common.psm1).\n\n## Contributing to VM-Packages\nFor more information on adding, testing, and fixing packages, see the **VM-packages [wiki](https://github.com/mandiant/VM-Packages/wiki)** and specifically the \"**My first package [walk through](https://github.com/mandiant/VM-Packages/wiki/My-first-package-walk-through)**\" \n\nI highly recommend referring to recently closed PRs and newly added packages to get a good idea of how packages are structured.\n## Contributing to CommandoVM\nThis section covers the workflow for making a contribution to Commando VM. \n\n**1.** Create a fork of the repository in your Github account\n> ![](img/Fork-Commando.png)\n\n**2.** Clone the repository to your development computer \n```\ngit clone https://github.com/<your-username>/commando-vm\n```\n- Change directory into the newly cloned directory\n```\ncd commando-vm\n```\n- (Optional) set the remote upstream repository so you can keep your clone up to date.\n```\ngit remote add upstream https://github.com/mandiant/commando-vm\n```\n\n\n**3.** Create and checkout a branch for the change\n```\ngit checkout -b <update/fix-for-something>\n```\n\n**4.** Make the changes. Add and commit regularly so the comments are descriptive and helpful. Larger commits can be confusing to review.\n- After making changes, first stage the changed files.\n```\ngit add .\n```\n- Commit the changes with a message for each change.\n```\ngit commit -m \"This is a change\"\n```\n- Repeat as needed.\n\n**5.** Then push those commits to your fork of Commando VM. This will upload the changes to your Github repository.\n```\ngit push --set-upstream origin <branch-name>\n```\n\n**6.** Create a Pull Request to integrate the changes into the Mandiant repository of Commando VM.\n- Navigate to your cloned repository\n- Use the \"Compare & pull request\" button to create a pull request. Fill out the title and details about what was changed and the Mandiant team will either approve and merge the change or comment with questions/requested changes.\n> ![](img/CompareAndPullButton.png)\n\n**7.** Next time you want to use your cloned repository, make sure it is up to date with the following commands:\n- `git fetch upstream` to get the upstream changes locally.\n- `git checkout main` to select your main branch of the cloned fork.\n- `git merge upstream/main` merge the upstream changes with your version.\n- `git add .` to stage the changed files after the merge (resolve conflicts first if necessary)\n- `git commit` to commit the changes\n- `git push origin main` to update the remote fork with changes from the upstream repository\n"
  },
  {
    "path": "Docs/Contibuting.md",
    "content": "## Contributing\nWant to get started contributing? See the links below to learn how.\n\n### Installer\n* [Commando VM installation script, GUI, and configuration](https://github.com/mandiant/commando-vm)\n\n### Tool Packages\n* [Repository of all tool packages (VM-packages)](https://github.com/mandiant/VM-Packages)\n* [Documentation and contribution guides for tool packages](https://github.com/mandiant/VM-Packages/wiki)\n* [Submit new tool packages or report package related issues](https://github.com/mandiant/VM-Packages/issues)"
  },
  {
    "path": "Docs/Troubleshooting.md",
    "content": "# Troubleshooting the Install\n\nThis page lists the full steps necessary to install CommandoVM, with any additional information that might help you troubleshoot your issues:\n- [Requirements](#requirements)\n- [Pre-Install Steps](#pre-install-steps)\n- [Graphical Install](#graphical-install)\n- [Command-Line Install](#command-line-install)\n\n## CommandoVM Requirements\n\n- Windows 10 22H2\n- Windows 11 TBA\n- Minimum 70 GB Hard Drive\n- Minimum 4 GB RAM\n\n## Pre-Install Steps\n\n**Disclaimer**\n> The installer will not allow you to continue until you satisfy these requirements. You may skip them by passing the `-skipChecks` flag if you know what you are doing, but we do not recommend it.\n\n### Supported Operating System\n\nCommandoVM currently supports Windows 10 22H2 (19045).\n\n### Running in a Virtual Machine\n\nYou should never install CommandoVM on your host machine. CommandoVM makes irreversible changes to the system that you cannot uninstall. We recommend installing it on a virtual machine in VirtualBox or VMWare.\n\n### Storage Requirement\n\nWindows itself takes up significant space on disk and CommandoVM installs a large number of additional packages and tools. Ensure that you have at least **70GB** of storage in your VM. If you opt-in to install the **Full** CommandoVM profile, you will want approximately 110 GB.\n\n### Running as Administrator\n\nCommandoVM uses Chocolatey and Boxstarter to install its packages. Installing packages requires Administrator rights, so you must run your terminal as Administrator as shown on the image below.\n\n![run terminal as administrator](img/runasadmin.png)\n\n### PowerShell Execution Policy\n\nBy default PowerShell restricts scripts from being loaded on Windows Workstations and requires them to be signed by a trusted publisher on Windows servers. CommandoVM installation is performed using PowerShell, so you need to disable these restrictions using the following PowerShell command from an elevated prompt:\n```powershell\nSet-ExecutionPolicy Unrestricted\n```\n\n### PowerShell `Unblock-File`\nWhenever you download files from the internet, Windows places a \"Mark of the Web\" identifier on them. Scripts within this repository need to be unblocked so that they can run automatically and not cause issues with the install after clicking the \"Go\" button.\n\n### Windows Defender and Tamper Protection\n\nIn the past CommandoVM would try to programmatically disable Windows Defender for you. Unfortunately Windows Defender is constantly evolving, so we cannot keep up with the changes. You **must** disable Windows Defender and Tamper Protection manually before starting the install. It is not enough to simply disable Real-Time Protection, because **it will become re-enabled after a reboot**.\n\nSee the following links for the latest methods of disabling it known to us on Windows 10 and 11:\n- [Windows 10](https://superuser.com/questions/1757339/how-to-permanently-disable-windows-defender-real-time-protection-with-gpo)\n- [Windows 11](https://www.makeuseof.com/permanently-disable-microsoft-defender-windows-11/)\n\n> **WARNING:** If you do not properly disable Windows Defender, your installation will most certainly fail\n\n## Graphical Install\n\nFirst, download the CommandoVM repo from GitHub either as a ZIP, or using `git` from PowerShell if you have it installed already:\n```powershell\ngit clone https://github.com/mandiant/commando-vm.git\n```\n\nNext, run an elevated terminal and navigate to the folder where you cloned CommandoVM files. Once inside, run the `install.ps1` script:\n```powershell\n.\\install.ps1\n```\n\nThe pre-install checks menu will open. Make sure you go through the [Pre-Install Steps](#pre-install-steps) section of this page to ensure you pass all of them. The installer will not allow you to click \"Continue\" until the checks are satisfied or you override them. \n\n> **WARNING:** Do not override the checks if you have no idea why they are failing\n\n![gui step 1 - pre-checks](img/gui_step1.png)\n\nOnce you pass all the pre-install checks, the main installer window will open. If you wish to customize your install and change what packages are installed, see the [Customization](Customization.md) documentation page. Otherwise, select a profile from the dropdown menu and click \"Install\".\n\n![gui step 2 - installer](img/gui_step2.png)\n\nYou will get a password prompt for Boxstarter. If you do not have a password set or your password is blank, click \"OK\" without entering anything. Otherwise, enter your password into the textbox and click \"OK\".\n\n![gui step 3 - password](img/gui_step3.png)\n\nThe installer GUI will now close and the installation will start. You may monitor its progress inside the terminal window you used to launch the install script. During this time your system will restart multiple times. You will know that installation is finished when your background image gets changed to the Commando logo. \n\nInstallation may take over an hour, depending on the specs of the target virtual machine.\n\n> **WARNING:** CommandoVM is not a fully-unattended install. You need to monitor the install progress for any failures or errors.\n\n## Command-Line Install\n\nFirst, download the CommandoVM repo from GitHub either as a ZIP, or using `git` from PowerShell if you have it installed already:\n```powershell\ngit clone https://github.com/mandiant/commando-vm.git\n```\n\nThe CommandoVM CLI install is non-interactive. You will need to pass several flags for it to start properly:\n- `-cli` - required to avoid spawning the GUI installer\n- `-customProfile` - path to an XML profile. See [Customization](Customization.md) for the format.\n- `-noPassword` - if your user does not have a password set or the password is blank, pass this flag\n- `-password` - if your password is not blank, pass it to the installer using this flag\n\nHere is an example of how you can install the default profile without a password:\n```powershell\n.\\install.ps1 -cli -customProfile .\\Profiles\\Default.xml -noPassword\n```\n\nHere is an example of how you can install the default profile with a password:\n```powershell\n.\\install.ps1 -cli -customProfile .\\Profiles\\Default.xml -password \"Summer2023!\"\n```\n\nThe the installation will now start. During this time your system will restart multiple times. Installation may take over an hour, depending on the specs of the target virtual machine.\n\n> **WARNING:** CommandoVM is not a fully-unattended install. You need to monitor the install progress for any failures or errors.\n"
  },
  {
    "path": "License.txt",
    "content": "Apache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n\"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n\"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n\"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n\"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n\"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n\"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n\"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n\"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\nYou must give any other recipients of the Work or Derivative Works a copy of this License; and\nYou must cause any modified files to carry prominent notices stating that You changed the files; and\nYou must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\nIf the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. \n\nYou may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS"
  },
  {
    "path": "Profiles/Configs/win10config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<config> \n    <apps>\n        <!--\n        INFO:\n        Removes installed AppX packages. Try:\n        $packages = Get-AppxPackage\n        $packages.Name\n        FORMAT: \n        <app name=\"APP_NAME\"/>\n        -->\n    </apps>\n    <services>\n        <!--\n        INFO:\n        Sets Services to \"Manual\" startup type. Try:\n        $services = Get-WmiObject -Query \"SELECT * FROM Win32_Service WHERE StartMode='Auto'\" | Get-Service\n        $services.Name\n        FORMAT: \n        <service name=\"SERVICE_NAME\"/>\n        -->\n    </services>\n    <tasks>\n        <!--\n        INFO:\n        Disables Scheduled Tasks. Try:\n        $tasks = Get-ScheduledTask\n        $tasks.TaskName\n        FORMAT: \n        <task name=\"DESCRIPTIVE_NAME\" value=\"TASK_NAME\"/> \n        -->\n    </tasks>\n    <registry-items>\n        <!--\n        INFO:\n        Makes custom edits to the registry\n        FORMAT: \n        <registry-item name=\"DESCRIPTIVE_NAME\" path=\"REG_PATH\" value=\"REG_VALUE\" type=\"TYPE\" data=\"NEW_DATA\"/> \n        -->\n        <registry-item name=\"Set Dark Mode on System\" path=\"HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize\" value=\"SystemUsesLightTheme\" type=\"DWord\" data=\"0\"/>\n        <registry-item name=\"Set Dark Mode on Apps\" path=\"HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize\" value=\"AppsUseLightTheme\" type=\"DWord\" data=\"0\"/>\n        <registry-item name=\"Show full directory path in Explorer title bar\" path=\"HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CabinetState\" value=\"FullPath\" type=\"DWord\" data=\"1\"/>\n        <registry-item name=\"Show known file extensions\" path=\"HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\" value=\"HideFileExt\" type=\"DWord\" data=\"0\"/>\n        <registry-item name=\"Show hidden files\" path=\"HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\" value=\"Hidden\" type=\"DWord\" data=\"1\"/>\n        <registry-item name=\"Show super hidden files\" path=\"HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\" value=\"ShowSuperHidden\" type=\"DWord\" data=\"1\"/>\n        <registry-item name=\"Enable .NET Strong Crypto\" path=\"HKLM:\\SOFTWARE\\Microsoft\\.NETFramework\\v4.0.30319\" value=\"SchUseStrongCrypto\" type=\"DWord\" data=\"1\" />\n        <registry-item name=\"Enable .NET Strong Crypto Wow6432Node\" path=\"HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\.NETFramework\\v4.0.30319\" value=\"SchUseStrongCrypto\" type=\"DWord\" data=\"1\" />\n        <registry-item name=\"Enable NTFS Long Paths\" path=\"HKLM:\\SYSTEM\\CurrentControlSet\\Control\\FileSystem\" value=\"LongPathsEnabled\" type=\"DWord\" data=\"1\" />\n        <registry-item name=\"Disable SmartScreen\" path=\"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\System\" value=\"EnableSmartScreen\" type=\"DWord\" data=\"0\" />\n        <registry-item name=\"Disable Microsoft Edge Phishing Filter\" path=\"HKLM:\\SOFTWARE\\Policies\\Microsoft\\MicrosoftEdge\\PhishingFilter\" value=\"EnabledV9\" type=\"DWord\" data=\"0\" />\n        <registry-item name=\"Disable Windows Firewall (Standard Profile)\" path=\"HKLM:\\SOFTWARE\\Policies\\Microsoft\\WindowsFirewall\\StandardProfile\" value=\"EnableFirewall\" type=\"DWord\" data=\"0\" />\n        <registry-item name=\"Disable UAC Consent Prompt for Administrators\" path=\"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\" value=\"ConsentPromptBehaviorAdmin\" type=\"DWord\" data=\"0\" />\n        <registry-item name=\"Disable UAC Prompt on Secure Desktop\" path=\"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\" value=\"PromptOnSecureDesktop\" type=\"DWord\" data=\"0\" />\n        <registry-item name=\"Disable LLMNR\" path=\"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows NT\\DNSClient\" value=\"EnableMulticast\" type=\"DWord\" data=\"0\" />\n\n    </registry-items>\n    <path-items>\n        <!--\n        INFO:\n        Removes files and folders from the system\n        FORMAT: \n        <path-item name=\"DESCRIPTIVE_NAME\" type=\"dir/file\" path=\"DIR_PATH/FILE_PATH\"/>\n        -->\n    </path-items>\n    <custom-items>\n        <!--\n        INFO:\n        Performs custom commands\n        FORMAT: \n        <custom-item name=\"DESCRIPTIVE_NAME\"> <cmd value=\"PS_COMMAND\"/> ... </custom-item>\n        -->\n        <custom-item name=\"Renaming Computer to 'commando'\">\n            <cmd value=\"Rename-Computer -NewName 'commando'\" />\n        </custom-item>\n        <custom-item name=\"Disabling Windows Firewall\">\n            <cmd value=\"Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False\" />\n        </custom-item>\n    </custom-items>\n</config>"
  },
  {
    "path": "Profiles/Configs/win10victimconfig.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<config> \n    <apps>\n        <!--\n        INFO:\n        Removes installed AppX packages. Try:\n        $packages = Get-AppxPackage\n        $packages.Name\n        FORMAT: \n        <app name=\"APP_NAME\"/>\n        -->\n    </apps>\n    <services>\n        <!--\n        INFO:\n        Sets Services to \"Manual\" startup type. Try:\n        $services = Get-WmiObject -Query \"SELECT * FROM Win32_Service WHERE StartMode='Auto'\" | Get-Service\n        $services.Name\n        FORMAT: \n        <service name=\"SERVICE_NAME\"/>\n        -->\n    </services>\n    <tasks>\n        <!--\n        INFO:\n        Disables Scheduled Tasks. Try:\n        $tasks = Get-ScheduledTask\n        $tasks.TaskName\n        FORMAT: \n        <task name=\"DESCRIPTIVE_NAME\" value=\"TASK_NAME\"/> \n        -->\n    </tasks>\n    <registry-items>\n        <!--\n        INFO:\n        Makes custom edits to the registry\n        FORMAT: \n        <registry-item name=\"DESCRIPTIVE_NAME\" path=\"REG_PATH\" value=\"REG_VALUE\" type=\"TYPE\" data=\"NEW_DATA\"/> \n        -->\n        <registry-item name=\"Set Light Mode on System\" path=\"HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize\" value=\"SystemUsesLightTheme\" type=\"DWord\" data=\"1\"/>\n        <registry-item name=\"Set Light Mode on Apps\" path=\"HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize\" value=\"AppsUseLightTheme\" type=\"DWord\" data=\"1\"/>\n        <registry-item name=\"Show full directory path in Explorer title bar\" path=\"HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CabinetState\" value=\"FullPath\" type=\"DWord\" data=\"1\"/>\n        <registry-item name=\"Show known file extensions\" path=\"HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\" value=\"HideFileExt\" type=\"DWord\" data=\"0\"/>\n        <registry-item name=\"Show hidden files\" path=\"HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\" value=\"Hidden\" type=\"DWord\" data=\"1\"/>\n        <registry-item name=\"Show super hidden files\" path=\"HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\" value=\"ShowSuperHidden\" type=\"DWord\" data=\"1\"/>\n    </registry-items>\n    <path-items>\n        <!--\n        INFO:\n        Removes files and folders from the system\n        FORMAT: \n        <path-item name=\"DESCRIPTIVE_NAME\" type=\"dir/file\" path=\"DIR_PATH/FILE_PATH\"/>\n        -->\n    </path-items>\n    <custom-items>\n        <!--\n        INFO:\n        Performs custom commands\n        FORMAT: \n        <custom-item name=\"DESCRIPTIVE_NAME\"> <cmd value=\"PS_COMMAND\"/> ... </custom-item>\n        -->\n        <custom-item name=\"Renaming Computer to 'commando'\">\n            <cmd value=\"Rename-Computer -NewName 'commando'\" />\n        </custom-item>\n        <custom-item name=\"Create Exclusions folder\">\n            <cmd value=\"Set-MpPreference -ExclusionPath $Env:RAW_TOOLS_DIR\" />\n        </custom-item>\n        <custom-item name=\"Disable Defender Automatic Sample Submission\">\n            <cmd value=\"Set-MpPreference -SubmitSamplesConsent 2\" />\n        </custom-item>\n        <custom-item name=\"Create low-priv user account\">\n            <cmd name=\"Generate random password, create user, save password to logfile\" value=\"$userPassword = -join ((97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}); $securePassword = ConvertTo-SecureString -String $userPassword -AsPlainText -Force; New-LocalUser -Name 'prometheus' -Description 'Created by Commando Installer' -Password $securePassword; VM-Write-Log 'INFO' $('Created new user prometheus with password ' + $userPassword)\" />\n        </custom-item>\n    </custom-items>\n</config>"
  },
  {
    "path": "Profiles/Configs/win11armconfig.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<config> \n    <apps>\n        <!--\n        INFO:\n        Removes installed AppX packages. Try:\n        $packages = Get-AppxPackage\n        $packages.Name\n        FORMAT: \n        <app name=\"APP_NAME\"/>\n        -->\n    </apps>\n    <services>\n        <!--\n        INFO:\n        Sets Services to \"Manual\" startup type. Try:\n        $services = Get-WmiObject -Query \"SELECT * FROM Win32_Service WHERE StartMode='Auto'\" | Get-Service\n        $services.Name\n        FORMAT: \n        <service name=\"SERVICE_NAME\"/>\n        -->\n    </services>\n    <tasks>\n        <!--\n        INFO:\n        Disables Scheduled Tasks. Try:\n        $tasks = Get-ScheduledTask\n        $tasks.TaskName\n        FORMAT: \n        <task name=\"DESCRIPTIVE_NAME\" value=\"TASK_NAME\"/> \n        -->\n    </tasks>\n    <registry-items>\n        <!--\n        INFO:\n        Makes custom edits to the registry\n        FORMAT: \n        <registry-item name=\"DESCRIPTIVE_NAME\" path=\"REG_PATH\" value=\"REG_VALUE\" type=\"TYPE\" data=\"NEW_DATA\"/> \n        -->\n    </registry-items>\n    <path-items>\n        <!--\n        INFO:\n        Removes files and folders from the system\n        FORMAT: \n        <path-item name=\"DESCRIPTIVE_NAME\" type=\"dir/file\" path=\"DIR_PATH/FILE_PATH\"/>\n        -->\n    </path-items>\n    <custom-items>\n        <!--\n        INFO:\n        Performs custom commands\n        FORMAT: \n        <custom-item name=\"DESCRIPTIVE_NAME\"> <cmd value=\"PS_COMMAND\"/> ... </custom-item>\n        -->\n        <custom-item name=\"Renaming Computer to 'commando'\">\n            <cmd value=\"Rename-Computer -NewName 'commando'\" />\n        </custom-item>\n    </custom-items>\n</config>"
  },
  {
    "path": "Profiles/Configs/win11armvictimconfig.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<config> \n    <apps>\n        <!--\n        INFO:\n        Removes installed AppX packages. Try:\n        $packages = Get-AppxPackage\n        $packages.Name\n        FORMAT: \n        <app name=\"APP_NAME\"/>\n        -->\n    </apps>\n    <services>\n        <!--\n        INFO:\n        Sets Services to \"Manual\" startup type. Try:\n        $services = Get-WmiObject -Query \"SELECT * FROM Win32_Service WHERE StartMode='Auto'\" | Get-Service\n        $services.Name\n        FORMAT: \n        <service name=\"SERVICE_NAME\"/>\n        -->\n    </services>\n    <tasks>\n        <!--\n        INFO:\n        Disables Scheduled Tasks. Try:\n        $tasks = Get-ScheduledTask\n        $tasks.TaskName\n        FORMAT: \n        <task name=\"DESCRIPTIVE_NAME\" value=\"TASK_NAME\"/> \n        -->\n    </tasks>\n    <registry-items>\n        <!--\n        INFO:\n        Makes custom edits to the registry\n        FORMAT: \n        <registry-item name=\"DESCRIPTIVE_NAME\" path=\"REG_PATH\" value=\"REG_VALUE\" type=\"TYPE\" data=\"NEW_DATA\"/> \n        -->\n    </registry-items>\n    <path-items>\n        <!--\n        INFO:\n        Removes files and folders from the system\n        FORMAT: \n        <path-item name=\"DESCRIPTIVE_NAME\" type=\"dir/file\" path=\"DIR_PATH/FILE_PATH\"/>\n        -->\n    </path-items>\n    <custom-items>\n        <!--\n        INFO:\n        Performs custom commands\n        FORMAT: \n        <custom-item name=\"DESCRIPTIVE_NAME\"> <cmd value=\"PS_COMMAND\"/> ... </custom-item>\n        -->\n        <custom-item name=\"Renaming Computer to 'commando'\">\n            <cmd value=\"Rename-Computer -NewName 'commando'\" />\n        </custom-item>\n    </custom-items>\n</config>"
  },
  {
    "path": "Profiles/Configs/win11config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<config> \n    <apps>\n        <!--\n        INFO:\n        Removes installed AppX packages. Try:\n        $packages = Get-AppxPackage\n        $packages.Name\n        FORMAT: \n        <app name=\"APP_NAME\"/>\n        -->\n    </apps>\n    <services>\n        <!--\n        INFO:\n        Sets Services to \"Manual\" startup type. Try:\n        $services = Get-WmiObject -Query \"SELECT * FROM Win32_Service WHERE StartMode='Auto'\" | Get-Service\n        $services.Name\n        FORMAT: \n        <service name=\"SERVICE_NAME\"/>\n        -->\n    </services>\n    <tasks>\n        <!--\n        INFO:\n        Disables Scheduled Tasks. Try:\n        $tasks = Get-ScheduledTask\n        $tasks.TaskName\n        FORMAT: \n        <task name=\"DESCRIPTIVE_NAME\" value=\"TASK_NAME\"/> \n        -->\n    </tasks>\n    <registry-items>\n        <!--\n        INFO:\n        Makes custom edits to the registry\n        FORMAT: \n        <registry-item name=\"DESCRIPTIVE_NAME\" path=\"REG_PATH\" value=\"REG_VALUE\" type=\"TYPE\" data=\"NEW_DATA\"/> \n        -->\n    </registry-items>\n    <path-items>\n        <!--\n        INFO:\n        Removes files and folders from the system\n        FORMAT: \n        <path-item name=\"DESCRIPTIVE_NAME\" type=\"dir/file\" path=\"DIR_PATH/FILE_PATH\"/>\n        -->\n    </path-items>\n    <custom-items>\n        <!--\n        INFO:\n        Performs custom commands\n        FORMAT: \n        <custom-item name=\"DESCRIPTIVE_NAME\"> <cmd value=\"PS_COMMAND\"/> ... </custom-item>\n        -->\n        <custom-item name=\"Renaming Computer to 'commando'\">\n            <cmd value=\"Rename-Computer -NewName 'commando'\" />\n        </custom-item>\n    </custom-items>\n</config>"
  },
  {
    "path": "Profiles/Configs/win11victimconfig.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<config> \n    <apps>\n        <!--\n        INFO:\n        Removes installed AppX packages. Try:\n        $packages = Get-AppxPackage\n        $packages.Name\n        FORMAT: \n        <app name=\"APP_NAME\"/>\n        -->\n    </apps>\n    <services>\n        <!--\n        INFO:\n        Sets Services to \"Manual\" startup type. Try:\n        $services = Get-WmiObject -Query \"SELECT * FROM Win32_Service WHERE StartMode='Auto'\" | Get-Service\n        $services.Name\n        FORMAT: \n        <service name=\"SERVICE_NAME\"/>\n        -->\n    </services>\n    <tasks>\n        <!--\n        INFO:\n        Disables Scheduled Tasks. Try:\n        $tasks = Get-ScheduledTask\n        $tasks.TaskName\n        FORMAT: \n        <task name=\"DESCRIPTIVE_NAME\" value=\"TASK_NAME\"/> \n        -->\n    </tasks>\n    <registry-items>\n        <!--\n        INFO:\n        Makes custom edits to the registry\n        FORMAT: \n        <registry-item name=\"DESCRIPTIVE_NAME\" path=\"REG_PATH\" value=\"REG_VALUE\" type=\"TYPE\" data=\"NEW_DATA\"/> \n        -->\n    </registry-items>\n    <path-items>\n        <!--\n        INFO:\n        Removes files and folders from the system\n        FORMAT: \n        <path-item name=\"DESCRIPTIVE_NAME\" type=\"dir/file\" path=\"DIR_PATH/FILE_PATH\"/>\n        -->\n    </path-items>\n    <custom-items>\n        <!--\n        INFO:\n        Performs custom commands\n        FORMAT: \n        <custom-item name=\"DESCRIPTIVE_NAME\"> <cmd value=\"PS_COMMAND\"/> ... </custom-item>\n        -->\n        <custom-item name=\"Renaming Computer to 'commando'\">\n            <cmd value=\"Rename-Computer -NewName 'commando'\" />\n        </custom-item>\n    </custom-items>\n</config>"
  },
  {
    "path": "Profiles/Default - ARM.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<config>\n  <envs>\n    <env name=\"MIN_DISK_SPACE\" value=\"70\" />\n    <env name=\"VM_COMMON_DIR\" value=\"%ProgramData%\\_VM\" />\n    <env name=\"TOOL_LIST_DIR\" value=\"%ProgramData%\\Microsoft\\Windows\\Start Menu\\Programs\\Tools\" />\n    <env name=\"TOOL_LIST_SHORTCUT\" value=\"%UserProfile%\\Desktop\\Tools.lnk\" />\n    <env name=\"RAW_TOOLS_DIR\" value=\"%SystemDrive%\\Tools\" />\n  </envs>\n  <packages>\n    <package name=\"notepadplusplus.vm\" />\n    <package name=\"7zip-15-05.vm\" />\n    <package name=\"azurehound.vm\" />\n    <package name=\"bloodhound.vm\" />\n    <package name=\"cmder.vm\" />\n    <package name=\"cyberchef.vm\" />\n    <package name=\"gobuster.vm\" />\n    <package name=\"sqlrecon.vm\" />\n    <package name=\"awscli\" />\n    <package name=\"az.powershell\" />\n    <package name=\"azure-cli\" />\n    <package name=\"teamfiltration.vm\" />\n    <package name=\"obsidian\" />\n    <package name=\"firefox\" />\n    <package name=\"greenshot\" />\n    <package name=\"keepass\" />\n    <package name=\"ilspy.vm\" />\n    <package name=\"wireshark.vm\" />\n    <package name=\"cyberchef.vm\" />\n    <package name=\"pebear.vm\" />\n    <package name=\"sysinternals.vm\" />\n    <package name=\"situational-awareness-bof.vm\" />\n    <package name=\"unhook-bof.vm\" />\n    <package name=\"stracciatella.vm\" />\n    <package name=\"nanodump.vm\" />\n    <package name=\"truestedsec-remote-ops-bof.vm\" />\n    <package name=\"outflank-c2-tool-collection.vm\" />\n    <package name=\"certify.vm\" />\n    <package name=\"streamdivert.vm\" />\n    <package name=\"whisker.vm\" />\n    <package name=\"confuserex.vm\" />\n    <package name=\"dotnettojscript.vm\" />\n    <package name=\"gadgettojscript.vm\" />\n    <package name=\"sharpup.vm\" />\n    <package name=\"az.powershell\" />\n    <package name=\"azure-cli\" />\n    <package name=\"routesixtysink.vm\" />\n    <package name=\"sharphound.vm\" />\n    <package name=\"spoolsample.vm\" />\n    <package name=\"sharpview.vm\" />\n    <package name=\"seatbelt.vm\" />\n    <package name=\"telnet.vm\" />\n    <package name=\"badassmacros.vm\" />\n    <package name=\"bloodhound-custom-queries.vm\" />\n    <package name=\"burp-free.vm\" />\n    <package name=\"c3.vm\" />\n    <package name=\"covenant.vm\" />\n    <package name=\"credninja.vm\" />\n    <package name=\"dumpert.vm\" />\n    <package name=\"evilclippy.vm\" />\n    <package name=\"exiftool.vm\" />\n    <package name=\"gowitness.vm\" />\n    <package name=\"group3r.vm\" />\n    <package name=\"hxd.vm\" />\n    <package name=\"invokedosfuscation.vm\" />\n    <package name=\"invokeobfuscation.vm\" />\n    <package name=\"juicypotato.vm\" />\n    <package name=\"keethief.vm\" />\n    <package name=\"kerbrute.vm\" />\n    <package name=\"mailsniper.vm\" />\n    <package name=\"mfasweep.vm\" />\n    <package name=\"minidump.vm\" />\n    <package name=\"microburst.vm\" />\n    <package name=\"netgpppassword.vm\" />\n    <package name=\"nmap.vm\" />\n    <package name=\"payloadsallthethings.vm\" />\n    <package name=\"petitpotam.vm\" />\n    <package name=\"powercat.vm\" />\n    <package name=\"powermad.vm\" />\n    <package name=\"powersploit.vm\" />\n    <package name=\"powerupsql.vm\" />\n    <package name=\"powerzure.vm\" />\n    <package name=\"processdump.vm\" />\n    <package name=\"rubeus.vm\" />\n    <package name=\"sharpdpapi.vm\" />\n    <package name=\"sharplaps.vm\" />\n    <package name=\"sharpsecdump.vm\" />\n    <package name=\"sharpwmi.vm\" />\n    <package name=\"sliver.vm\" />\n    <package name=\"snaffler.vm\" />\n    <package name=\"syswhispers2.vm\" />\n    <package name=\"tor-browser.vm\" />\n    <package name=\"upx.vm\" />\n    <package name=\"windbg.vm\" />\n    <package name=\"adconnectdump.vm\" />\n    <package name=\"ldapnomnom.vm\" />\n    <package name=\"pesieve.vm\" />\n    <package name=\"shellcode_launcher.vm\" />\n    <package name=\"asreproast.vm\" />\n    <package name=\"dnspyex.vm\" />\n    <package name=\"fakenet-ng.vm\" />\n    <package name=\"nasm.vm\" />\n    <package name=\"mimikatz.vm\" />\n    <package name=\"safetykatz.vm\" />\n    <package name=\"sharpcliphistory.vm\" />\n    <package name=\"sharpdump.vm\" />\n    <package name=\"sharpexec.vm\" />\n    <package name=\"syswhispers3.vm\" />\n    <package name=\"vnc-viewer.vm\" />\n    <package name=\"wmimplant.vm\" />\n    <package name=\"x64dbg.vm\" />\n    <package name=\"getlapspasswords.vm\" />\n    <package name=\"inveigh.vm\" />\n    <package name=\"merlin.vm\" />\n    <package name=\"openvpn.vm\" />\n    <package name=\"resourcehacker.vm\" />\n    <package name=\"sqlitebrowser.vm\" />\n    <package name=\"winscp.vm\" />\n    <package name=\"jre8\" />\n    <package name=\"unxutils\" />\n  </packages>\n</config>"
  },
  {
    "path": "Profiles/Default.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<config>\n  <envs>\n    <env name=\"MIN_DISK_SPACE\" value=\"70\" />\n    <env name=\"VM_COMMON_DIR\" value=\"%ProgramData%\\_VM\" />\n    <env name=\"TOOL_LIST_DIR\" value=\"%ProgramData%\\Microsoft\\Windows\\Start Menu\\Programs\\Tools\" />\n    <env name=\"TOOL_LIST_SHORTCUT\" value=\"%UserProfile%\\Desktop\\Tools.lnk\" />\n    <env name=\"RAW_TOOLS_DIR\" value=\"%SystemDrive%\\Tools\" />\n  </envs>\n  <packages>\n    <package name=\"notepadplusplus.vm\" />\n    <package name=\"7zip-15-05.vm\" />\n    <package name=\"azurehound.vm\" />\n    <package name=\"bloodhound.vm\" />\n    <package name=\"cmder.vm\" />\n    <package name=\"cyberchef.vm\" />\n    <package name=\"gobuster.vm\" />\n    <package name=\"sqlrecon.vm\" />\n    <package name=\"awscli\" />\n    <package name=\"az.powershell\" />\n    <package name=\"azure-cli\" />\n    <package name=\"teamfiltration.vm\" />\n    <package name=\"obsidian\" />\n    <package name=\"googlechrome\" />\n    <package name=\"firefox\" />\n    <package name=\"vscode\" />\n    <package name=\"greenshot\" />\n    <package name=\"vlc\" />\n    <package name=\"keepass\" />\n    <package name=\"ilspy.vm\" />\n    <package name=\"wireshark.vm\" />\n    <package name=\"cyberchef.vm\" />\n    <package name=\"pebear.vm\" />\n    <package name=\"sysinternals.vm\" />\n    <package name=\"situational-awareness-bof.vm\" />\n    <package name=\"unhook-bof.vm\" />\n    <package name=\"stracciatella.vm\" />\n    <package name=\"nanodump.vm\" />\n    <package name=\"truestedsec-remote-ops-bof.vm\" />\n    <package name=\"outflank-c2-tool-collection.vm\" />\n    <package name=\"certify.vm\" />\n    <package name=\"streamdivert.vm\" />\n    <package name=\"whisker.vm\" />\n    <package name=\"confuserex.vm\" />\n    <package name=\"dotnettojscript.vm\" />\n    <package name=\"gadgettojscript.vm\" />\n    <package name=\"sharpup.vm\" />\n    <package name=\"az.powershell\" />\n    <package name=\"azure-cli\" />\n    <package name=\"routesixtysink.vm\" />\n    <package name=\"sharphound.vm\" />\n    <package name=\"spoolsample.vm\" />\n    <package name=\"sharpview.vm\" />\n    <package name=\"seatbelt.vm\" />\n    <package name=\"telnet.vm\" />\n    <package name=\"badassmacros.vm\" />\n    <package name=\"bloodhound-custom-queries.vm\" />\n    <package name=\"burp-free.vm\" />\n    <package name=\"c3.vm\" />\n    <package name=\"covenant.vm\" />\n    <package name=\"credninja.vm\" />\n    <package name=\"dumpert.vm\" />\n    <package name=\"evilclippy.vm\" />\n    <package name=\"exiftool.vm\" />\n    <package name=\"gowitness.vm\" />\n    <package name=\"group3r.vm\" />\n    <package name=\"hxd.vm\" />\n    <package name=\"invokedosfuscation.vm\" />\n    <package name=\"invokeobfuscation.vm\" />\n    <package name=\"juicypotato.vm\" />\n    <package name=\"keethief.vm\" />\n    <package name=\"kerbrute.vm\" />\n    <package name=\"mailsniper.vm\" />\n    <package name=\"mfasweep.vm\" />\n    <package name=\"minidump.vm\" />\n    <package name=\"microburst.vm\" />\n    <package name=\"netgpppassword.vm\" />\n    <package name=\"nmap.vm\" />\n    <package name=\"payloadsallthethings.vm\" />\n    <package name=\"petitpotam.vm\" />\n    <package name=\"powercat.vm\" />\n    <package name=\"powermad.vm\" />\n    <package name=\"powersploit.vm\" />\n    <package name=\"powerupsql.vm\" />\n    <package name=\"powerzure.vm\" />\n    <package name=\"processdump.vm\" />\n    <package name=\"rubeus.vm\" />\n    <package name=\"sharpdpapi.vm\" />\n    <package name=\"sharplaps.vm\" />\n    <package name=\"sharpsecdump.vm\" />\n    <package name=\"sharpwmi.vm\" />\n    <package name=\"sliver.vm\" />\n    <package name=\"snaffler.vm\" />\n    <package name=\"syswhispers2.vm\" />\n    <package name=\"tor-browser.vm\" />\n    <package name=\"upx.vm\" />\n    <package name=\"windbg.vm\" />\n    <package name=\"adconnectdump.vm\" />\n    <package name=\"ldapnomnom.vm\" />\n    <package name=\"pesieve.vm\" />\n    <package name=\"shellcode_launcher.vm\" />\n    <package name=\"asreproast.vm\" />\n    <package name=\"dnspyex.vm\" />\n    <package name=\"fakenet-ng.vm\" />\n    <package name=\"nasm.vm\" />\n    <package name=\"mimikatz.vm\" />\n    <package name=\"safetykatz.vm\" />\n    <package name=\"sharpcliphistory.vm\" />\n    <package name=\"sharpdump.vm\" />\n    <package name=\"sharpexec.vm\" />\n    <package name=\"syswhispers3.vm\" />\n    <package name=\"vnc-viewer.vm\" />\n    <package name=\"wmimplant.vm\" />\n    <package name=\"x64dbg.vm\" />\n    <package name=\"getlapspasswords.vm\" />\n    <package name=\"inveigh.vm\" />\n    <package name=\"merlin.vm\" />\n    <package name=\"openvpn.vm\" />\n    <package name=\"resourcehacker.vm\" />\n    <package name=\"sqlitebrowser.vm\" />\n    <package name=\"winscp.vm\" />\n    <package name=\"jre8\" />\n    <package name=\"unxutils\" />\n  </packages>\n</config>"
  },
  {
    "path": "Profiles/Developer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<config>\n  <envs>\n    <env name=\"MIN_DISK_SPACE\" value=\"80\" />\n    <env name=\"VM_COMMON_DIR\" value=\"%ProgramData%\\_VM\" />\n    <env name=\"TOOL_LIST_DIR\" value=\"%ProgramData%\\Microsoft\\Windows\\Start Menu\\Programs\\Tools\" />\n    <env name=\"TOOL_LIST_SHORTCUT\" value=\"%UserProfile%\\Desktop\\Tools.lnk\" />\n    <env name=\"RAW_TOOLS_DIR\" value=\"%SystemDrive%\\Tools\" />\n  </envs>\n  <packages>\n    <package name=\"notepadplusplus.vm\" />\n    <package name=\"apimonitor.vm\" />\n    <package name=\"badassmacros.vm\" />\n    <package name=\"bytecodeviewer.vm\" />\n    <package name=\"capa.vm\" />\n    <package name=\"codetrack.vm\" />\n    <package name=\"confuserex.vm\" />\n    <package name=\"covenant.vm\" />\n    <package name=\"cyberchef.vm\" />\n    <package name=\"dll-to-exe.vm\" />\n    <package name=\"dotnettojscript.vm\" />\n    <package name=\"evilclippy.vm\" />\n    <package name=\"gadgettojscript.vm\" />\n    <package name=\"hashmyfiles.vm\" />\n    <package name=\"invokedosfuscation.vm\" />\n    <package name=\"invokeobfuscation.vm\" />\n    <package name=\"merlin.vm\" />\n    <package name=\"openvpn.vm\" />\n    <package name=\"pebear.vm\" />\n    <package name=\"pesieve.vm\" />\n    <package name=\"pestudio.vm\" />\n    <package name=\"processdump.vm\" />\n    <package name=\"resourcehacker.vm\" />\n    <package name=\"rundotnetdll.vm\" />\n    <package name=\"scdbg.vm\" />\n    <package name=\"setdllcharacteristics.vm\" />\n    <package name=\"shellcode_launcher.vm\" />\n    <package name=\"sliver.vm\" />\n    <package name=\"stracciatella.vm\" />\n    <package name=\"sysinternals.vm\" />\n    <package name=\"syswhispers2.vm\" />\n    <package name=\"syswhispers3.vm\" />\n    <package name=\"telnet.vm\" />\n    <package name=\"tor-browser.vm\" />\n    <package name=\"unhook-bof.vm\" />\n    <package name=\"upx.vm\" />\n    <package name=\"visualstudio.vm\" />\n    <package name=\"vcbuildtools.vm\" />\n    <package name=\"windbg.vm\" />\n    <package name=\"winscp.vm\" />\n    <package name=\"wireshark.vm\" />\n    <package name=\"wmimplant.vm\" />\n    <package name=\"x64dbg.vm\" />\n    <package name=\"yara.vm\" />\n    <package name=\"c3.vm\" />\n    <package name=\"obsidian\" />\n    <package name=\"googlechrome\" />\n    <package name=\"firefox\" />\n    <package name=\"vscode\" />\n    <package name=\"greenshot\" />\n    <package name=\"vlc\" />\n    <package name=\"gimp\" />\n    <package name=\"keepass\" />\n    <package name=\"adobereader\" />\n    <package name=\"golang\" />\n    <package name=\"rust\" />\n    <package name=\"nim\" />\n    <package name=\"idafree.vm\" />\n    <package name=\"exiftool.vm\" />\n    <package name=\"hxd.vm\" />\n    <package name=\"cmder.vm\" />\n    <package name=\"python3\" />\n    <package name=\"fiddlerclassic.vm\" />\n    <package name=\"burp-free.vm\" />\n    <package name=\"nmap.vm\" />\n    <package name=\"git\" />\n    <package name=\"sublimetext3.app\" />\n    <package name=\"unxutils\" />\n    <package name=\"ghidra.vm\" />\n  </packages>\n</config>"
  },
  {
    "path": "Profiles/Full - ARM.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<config>\n  <envs>\n    <env name=\"MIN_DISK_SPACE\" value=\"100\" />\n    <env name=\"VM_COMMON_DIR\" value=\"%ProgramData%\\_VM\" />\n    <env name=\"TOOL_LIST_DIR\" value=\"%ProgramData%\\Microsoft\\Windows\\Start Menu\\Programs\\Tools\" />\n    <env name=\"TOOL_LIST_SHORTCUT\" value=\"%UserProfile%\\Desktop\\Tools.lnk\" />\n    <env name=\"RAW_TOOLS_DIR\" value=\"%SystemDrive%\\Tools\" />\n  </envs>\n  <packages>\n    <package name=\"notepadplusplus.vm\" />\n    <package name=\"7zip-15-05.vm\" />\n    <package name=\"azurehound.vm\" />\n    <package name=\"bloodhound.vm\" />\n    <package name=\"cmder.vm\" />\n    <package name=\"cyberchef.vm\" />\n    <package name=\"gobuster.vm\" />\n    <package name=\"sqlrecon.vm\" />\n    <package name=\"awscli\" />\n    <package name=\"az.powershell\" />\n    <package name=\"azure-cli\" />\n    <package name=\"teamfiltration.vm\" />\n    <package name=\"obsidian\" />\n    <package name=\"firefox\" />\n    <package name=\"greenshot\" />\n    <package name=\"gimp\" />\n    <package name=\"keepass\" />\n    <package name=\"adobereader\" />\n    <package name=\"golang\" />\n    <package name=\"rust\" />\n    <package name=\"nim\" />\n    <package name=\"visualstudio.vm\" />\n    <package name=\"ilspy.vm\" />\n    <package name=\"wireshark.vm\" />\n    <package name=\"cyberchef.vm\" />\n    <package name=\"pebear.vm\" />\n    <package name=\"sysinternals.vm\" />\n    <package name=\"situational-awareness-bof.vm\" />\n    <package name=\"unhook-bof.vm\" />\n    <package name=\"stracciatella.vm\" />\n    <package name=\"nanodump.vm\" />\n    <package name=\"truestedsec-remote-ops-bof.vm\" />\n    <package name=\"outflank-c2-tool-collection.vm\" />\n    <package name=\"certify.vm\" />\n    <package name=\"streamdivert.vm\" />\n    <package name=\"whisker.vm\" />\n    <package name=\"confuserex.vm\" />\n    <package name=\"dotnettojscript.vm\" />\n    <package name=\"gadgettojscript.vm\" />\n    <package name=\"sharpup.vm\" />\n    <package name=\"idafree.vm\" />\n    <package name=\"az.powershell\" />\n    <package name=\"azure-cli\" />\n    <package name=\"routesixtysink.vm\" />\n    <package name=\"sharphound.vm\" />\n    <package name=\"spoolsample.vm\" />\n    <package name=\"sharpview.vm\" />\n    <package name=\"seatbelt.vm\" />\n    <package name=\"telnet.vm\" />\n    <package name=\"badassmacros.vm\" />\n    <package name=\"bloodhound-custom-queries.vm\" />\n    <package name=\"burp-free.vm\" />\n    <package name=\"bytecodeviewer.vm\" />\n    <package name=\"c3.vm\" />\n    <package name=\"covenant.vm\" />\n    <package name=\"credninja.vm\" />\n    <package name=\"dumpert.vm\" />\n    <package name=\"evilclippy.vm\" />\n    <package name=\"exiftool.vm\" />\n    <package name=\"fuzzdb.vm\" />\n    <package name=\"ghidra.vm\" />\n    <package name=\"gowitness.vm\" />\n    <package name=\"group3r.vm\" />\n    <package name=\"hxd.vm\" />\n    <package name=\"invokedosfuscation.vm\" />\n    <package name=\"invokeobfuscation.vm\" />\n    <package name=\"juicypotato.vm\" />\n    <package name=\"keethief.vm\" />\n    <package name=\"kerbrute.vm\" />\n    <package name=\"mailsniper.vm\" />\n    <package name=\"mfasweep.vm\" />\n    <package name=\"minidump.vm\" />\n    <package name=\"microburst.vm\" />\n    <package name=\"netgpppassword.vm\" />\n    <package name=\"nmap.vm\" />\n    <package name=\"payloadsallthethings.vm\" />\n    <package name=\"pestudio.vm\" />\n    <package name=\"petitpotam.vm\" />\n    <package name=\"powercat.vm\" />\n    <package name=\"powermad.vm\" />\n    <package name=\"powersploit.vm\" />\n    <package name=\"powerupsql.vm\" />\n    <package name=\"powerzure.vm\" />\n    <package name=\"processdump.vm\" />\n    <package name=\"rubeus.vm\" />\n    <package name=\"seclists.vm\" />\n    <package name=\"sharpdpapi.vm\" />\n    <package name=\"sharplaps.vm\" />\n    <package name=\"sharpsecdump.vm\" />\n    <package name=\"sharpwmi.vm\" />\n    <package name=\"sliver.vm\" />\n    <package name=\"snaffler.vm\" />\n    <package name=\"statistically-likely-usernames.vm\" />\n    <package name=\"syswhispers2.vm\" />\n    <package name=\"tor-browser.vm\" />\n    <package name=\"upx.vm\" />\n    <package name=\"windbg.vm\" />\n    <package name=\"adconnectdump.vm\" />\n    <package name=\"ldapnomnom.vm\" />\n    <package name=\"pesieve.vm\" />\n    <package name=\"shellcode_launcher.vm\" />\n    <package name=\"asreproast.vm\" />\n    <package name=\"dnspyex.vm\" />\n    <package name=\"fakenet-ng.vm\" />\n    <package name=\"nasm.vm\" />\n    <package name=\"mimikatz.vm\" />\n    <package name=\"safetykatz.vm\" />\n    <package name=\"sharpcliphistory.vm\" />\n    <package name=\"sharpdump.vm\" />\n    <package name=\"sharpexec.vm\" />\n    <package name=\"syswhispers3.vm\" />\n    <package name=\"vnc-viewer.vm\" />\n    <package name=\"wmimplant.vm\" />\n    <package name=\"x64dbg.vm\" />\n    <package name=\"getlapspasswords.vm\" />\n    <package name=\"inveigh.vm\" />\n    <package name=\"merlin.vm\" />\n    <package name=\"openvpn.vm\" />\n    <package name=\"resourcehacker.vm\" />\n    <package name=\"sqlitebrowser.vm\" />\n    <package name=\"winscp.vm\" />\n    <package name=\"jre8\" />\n    <package name=\"tortoisesvn\" />\n    <package name=\"qbittorrent\" />\n    <package name=\"dbeaver\" />\n    <package name=\"hfsexplorer\" />\n    <package name=\"unxutils\" />\n  </packages>\n</config>"
  },
  {
    "path": "Profiles/Full.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<config>\n  <envs>\n    <env name=\"MIN_DISK_SPACE\" value=\"100\" />\n    <env name=\"VM_COMMON_DIR\" value=\"%ProgramData%\\_VM\" />\n    <env name=\"TOOL_LIST_DIR\" value=\"%ProgramData%\\Microsoft\\Windows\\Start Menu\\Programs\\Tools\" />\n    <env name=\"TOOL_LIST_SHORTCUT\" value=\"%UserProfile%\\Desktop\\Tools.lnk\" />\n    <env name=\"RAW_TOOLS_DIR\" value=\"%SystemDrive%\\Tools\" />\n  </envs>\n  <packages>\n    <package name=\"notepadplusplus.vm\" />\n    <package name=\"7zip-15-05.vm\" />\n    <package name=\"azurehound.vm\" />\n    <package name=\"bloodhound.vm\" />\n    <package name=\"cmder.vm\" />\n    <package name=\"cyberchef.vm\" />\n    <package name=\"gobuster.vm\" />\n    <package name=\"sqlrecon.vm\" />\n    <package name=\"awscli\" />\n    <package name=\"az.powershell\" />\n    <package name=\"azure-cli\" />\n    <package name=\"teamfiltration.vm\" />\n    <package name=\"obsidian\" />\n    <package name=\"googlechrome\" />\n    <package name=\"firefox\" />\n    <package name=\"vscode\" />\n    <package name=\"greenshot\" />\n    <package name=\"vlc\" />\n    <package name=\"gimp\" />\n    <package name=\"keepass\" />\n    <package name=\"adobereader\" />\n    <package name=\"golang\" />\n    <package name=\"rust\" />\n    <package name=\"nim\" />\n    <package name=\"visualstudio.vm\" />\n    <package name=\"ilspy.vm\" />\n    <package name=\"wireshark.vm\" />\n    <package name=\"cyberchef.vm\" />\n    <package name=\"pebear.vm\" />\n    <package name=\"sysinternals.vm\" />\n    <package name=\"situational-awareness-bof.vm\" />\n    <package name=\"unhook-bof.vm\" />\n    <package name=\"stracciatella.vm\" />\n    <package name=\"nanodump.vm\" />\n    <package name=\"truestedsec-remote-ops-bof.vm\" />\n    <package name=\"outflank-c2-tool-collection.vm\" />\n    <package name=\"certify.vm\" />\n    <package name=\"streamdivert.vm\" />\n    <package name=\"whisker.vm\" />\n    <package name=\"confuserex.vm\" />\n    <package name=\"dotnettojscript.vm\" />\n    <package name=\"gadgettojscript.vm\" />\n    <package name=\"sharpup.vm\" />\n    <package name=\"idafree.vm\" />\n    <package name=\"az.powershell\" />\n    <package name=\"azure-cli\" />\n    <package name=\"routesixtysink.vm\" />\n    <package name=\"sharphound.vm\" />\n    <package name=\"spoolsample.vm\" />\n    <package name=\"sharpview.vm\" />\n    <package name=\"seatbelt.vm\" />\n    <package name=\"telnet.vm\" />\n    <package name=\"badassmacros.vm\" />\n    <package name=\"bloodhound-custom-queries.vm\" />\n    <package name=\"burp-free.vm\" />\n    <package name=\"bytecodeviewer.vm\" />\n    <package name=\"c3.vm\" />\n    <package name=\"covenant.vm\" />\n    <package name=\"credninja.vm\" />\n    <package name=\"dumpert.vm\" />\n    <package name=\"evilclippy.vm\" />\n    <package name=\"exiftool.vm\" />\n    <package name=\"fuzzdb.vm\" />\n    <package name=\"ghidra.vm\" />\n    <package name=\"gowitness.vm\" />\n    <package name=\"group3r.vm\" />\n    <package name=\"hxd.vm\" />\n    <package name=\"invokedosfuscation.vm\" />\n    <package name=\"invokeobfuscation.vm\" />\n    <package name=\"juicypotato.vm\" />\n    <package name=\"keethief.vm\" />\n    <package name=\"kerbrute.vm\" />\n    <package name=\"mailsniper.vm\" />\n    <package name=\"mfasweep.vm\" />\n    <package name=\"minidump.vm\" />\n    <package name=\"microburst.vm\" />\n    <package name=\"netgpppassword.vm\" />\n    <package name=\"nmap.vm\" />\n    <package name=\"payloadsallthethings.vm\" />\n    <package name=\"pestudio.vm\" />\n    <package name=\"petitpotam.vm\" />\n    <package name=\"powercat.vm\" />\n    <package name=\"powermad.vm\" />\n    <package name=\"powersploit.vm\" />\n    <package name=\"powerupsql.vm\" />\n    <package name=\"powerzure.vm\" />\n    <package name=\"processdump.vm\" />\n    <package name=\"rubeus.vm\" />\n    <package name=\"seclists.vm\" />\n    <package name=\"sharpdpapi.vm\" />\n    <package name=\"sharplaps.vm\" />\n    <package name=\"sharpsecdump.vm\" />\n    <package name=\"sharpwmi.vm\" />\n    <package name=\"sliver.vm\" />\n    <package name=\"snaffler.vm\" />\n    <package name=\"statistically-likely-usernames.vm\" />\n    <package name=\"syswhispers2.vm\" />\n    <package name=\"tor-browser.vm\" />\n    <package name=\"upx.vm\" />\n    <package name=\"windbg.vm\" />\n    <package name=\"adconnectdump.vm\" />\n    <package name=\"ldapnomnom.vm\" />\n    <package name=\"pesieve.vm\" />\n    <package name=\"shellcode_launcher.vm\" />\n    <package name=\"asreproast.vm\" />\n    <package name=\"dnspyex.vm\" />\n    <package name=\"fakenet-ng.vm\" />\n    <package name=\"nasm.vm\" />\n    <package name=\"mimikatz.vm\" />\n    <package name=\"safetykatz.vm\" />\n    <package name=\"sharpcliphistory.vm\" />\n    <package name=\"sharpdump.vm\" />\n    <package name=\"sharpexec.vm\" />\n    <package name=\"syswhispers3.vm\" />\n    <package name=\"vnc-viewer.vm\" />\n    <package name=\"wmimplant.vm\" />\n    <package name=\"x64dbg.vm\" />\n    <package name=\"getlapspasswords.vm\" />\n    <package name=\"inveigh.vm\" />\n    <package name=\"merlin.vm\" />\n    <package name=\"openvpn.vm\" />\n    <package name=\"resourcehacker.vm\" />\n    <package name=\"sqlitebrowser.vm\" />\n    <package name=\"winscp.vm\" />\n    <package name=\"jre8\" />\n    <package name=\"tortoisesvn\" />\n    <package name=\"qbittorrent\" />\n    <package name=\"dbeaver\" />\n    <package name=\"hfsexplorer\" />\n    <package name=\"unxutils\" />\n  </packages>\n</config>"
  },
  {
    "path": "Profiles/Lite.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<config>\n  <envs>\n    <env name=\"MIN_DISK_SPACE\" value=\"60\" />\n    <env name=\"VM_COMMON_DIR\" value=\"%ProgramData%\\_VM\" />\n    <env name=\"TOOL_LIST_DIR\" value=\"%ProgramData%\\Microsoft\\Windows\\Start Menu\\Programs\\Tools\" />\n    <env name=\"TOOL_LIST_SHORTCUT\" value=\"%UserProfile%\\Desktop\\Tools.lnk\" />\n    <env name=\"RAW_TOOLS_DIR\" value=\"%SystemDrive%\\Tools\" />\n  </envs>\n  <packages>\n    <package name=\"notepadplusplus.vm\" />\n    <package name=\"bloodhound.vm\" />\n    <package name=\"burp-free.vm\" />\n    <package name=\"certify.vm\" />\n    <package name=\"credninja.vm\" />\n    <package name=\"confuserex.vm\" />\n    <package name=\"cyberchef.vm\" />\n    <package name=\"gobuster.vm\" />\n    <package name=\"fuzzdb.vm\" />\n    <package name=\"juicypotato.vm\" />\n    <package name=\"hashmyfiles.vm\" />\n    <package name=\"mimikatz.vm\" />\n    <package name=\"nanodump.vm\" />\n    <package name=\"nmap.vm\" />\n    <package name=\"openvpn.vm\" />\n    <package name=\"outflank-c2-tool-collection.vm\" />\n    <package name=\"petitpotam.vm\" />\n    <package name=\"powersploit.vm\" />\n    <package name=\"powerupsql.vm\" />\n    <package name=\"rubeus.vm\" />\n    <package name=\"seatbelt.vm\" />\n    <package name=\"seclists.vm\" />\n    <package name=\"sharphound.vm\" />\n    <package name=\"sharpdpapi.vm\" />\n    <package name=\"sharpup.vm\" />\n    <package name=\"sharpview.vm\" />\n    <package name=\"shellcode_launcher.vm\" />\n    <package name=\"situational-awareness-bof.vm\" />\n    <package name=\"snaffler.vm\" />\n    <package name=\"sysinternals.vm\" />\n    <package name=\"telnet.vm\" />\n    <package name=\"truestedsec-remote-ops-bof.vm\" />\n    <package name=\"unhook-bof.vm\" />\n    <package name=\"whisker.vm\" />\n    <package name=\"7zip-15-05.vm\" />\n    <package name=\"obsidian\" />\n    <package name=\"googlechrome\" />\n    <package name=\"firefox\" />\n    <package name=\"vscode\" />\n    <package name=\"git\" />\n    <package name=\"bloodhound-custom-queries.vm\" />\n    <package name=\"unxutils\" />\n  </packages>\n</config>"
  },
  {
    "path": "Profiles/Victim.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<config>\n  <envs>\n    <env name=\"MIN_DISK_SPACE\" value=\"50\" />\n    <env name=\"VM_COMMON_DIR\" value=\"%ProgramData%\\_VM\" />\n    <env name=\"TOOL_LIST_DIR\" value=\"%ProgramData%\\Microsoft\\Windows\\Start Menu\\Programs\\Tools\" />\n    <env name=\"TOOL_LIST_SHORTCUT\" value=\"%UserProfile%\\Desktop\\Tools.lnk\" />\n    <env name=\"RAW_TOOLS_DIR\" value=\"%SystemDrive%\\Tools\" />\n  </envs>\n  <packages>\n    <package name=\"apimonitor.vm\" />\n    <package name=\"capa.vm\" />\n    <package name=\"cmder.vm\" />\n    <package name=\"codetrack.vm\" />\n    <package name=\"cyberchef.vm\" />\n    <package name=\"dependencywalker.vm\" />\n    <package name=\"die.vm\" />\n    <package name=\"dnspyex.vm\" />\n    <package name=\"exeinfope.vm\" />\n    <package name=\"exiftool.vm\" />\n    <package name=\"file.vm\" />\n    <package name=\"floss.vm\" />\n    <package name=\"hashmyfiles.vm\" />\n    <package name=\"hollowshunter.vm\" />\n    <package name=\"hxd.vm\" />\n    <package name=\"idafree.vm\" />\n    <package name=\"malware-jail.vm\" />\n    <package name=\"map.vm\" />\n    <package name=\"ollydbg.vm\" />\n    <package name=\"pebear.vm\" />\n    <package name=\"peid.vm\" />\n    <package name=\"pesieve.vm\" />\n    <package name=\"pestudio.vm\" />\n    <package name=\"resourcehacker.vm\" />\n    <package name=\"rundotnetdll.vm\" />\n    <package name=\"scdbg.vm\" />\n    <package name=\"shellcode_launcher.vm\" />\n    <package name=\"vbdec.vm\" />\n    <package name=\"windbg.vm\" />\n    <package name=\"winscp.vm\" />\n    <package name=\"wireshark.vm\" />\n    <package name=\"x64dbg.vm\" />\n    <package name=\"yara.vm\" />\n    <package name=\"processdump.vm\" />\n    <package name=\"setdllcharacteristics.vm\" />\n    <package name=\"googlechrome\" />\n    <package name=\"firefox\" />\n    <package name=\"unxutils\" />\n    <package name=\"sysinternals.vm\" />\n    <package name=\"fiddlerclassic.vm\" />\n  </packages>\n</config>"
  },
  {
    "path": "README.md",
    "content": "![CommandoLogo](Images/commando-readme.png)\n\n## What is CommandoVM?\n\n**Complete Mandiant Offensive VM (\"CommandoVM\")** is a comprehensive and customizable, Windows-based security distribution for penetration testing and red teaming. CommandoVM comes packaged with a variety of offensive tools not included in [Kali Linux](https://www.kali.org/) which highlight the effectiveness of Windows as an attack platform.\n\n## Requirements\n* Windows 10\n> Insider Preview editions of Windows are not supported\n* 60 GB Hard Drive\n* 2 GB RAM\n\n## Recommended\n* Windows 10 22H2\n* 80+ GB Hard Drive\n* 4+ GB RAM\n* 2 network adapters\n\n# Install Instructions\nDeploy a Windows Virtual Machine\n   > [Where can I find a Windows 10 Virtual Machine?](https://www.microsoft.com/en-us/software-download/windows10ISO)\n\n## Pre-Install Procedures\n**You MUST disable Windows Defender for a smooth install**. The best way to accomplish this is through Group Policy.\n\nIn Windows versions 1909 and higher, Tamper Protection was added.\n**Tamper Protection must be disabled first, otherwise Group Policy settings are ignored.**\n\n1. Open Windows Security (type `Windows Security` in the search box)\n1. Virus & threat protection > Virus & threat protection settings > Manage settings\n1. Switch `Tamper Protection` to `Off` \n> It is not necessary to change any other setting (`Real Time Protection`, etc.)\n\n> **Important!** Tamper Protection must be disabled before changing Group Policy settings.\n\nTo permanently disable Real Time Protection:\n\n1. Make sure you disabled Tamper Protection\n1. Open Local Group Policy Editor (type `gpedit` in the search box)\n1. Computer Configuration > Administrative Templates > Windows Components > Microsoft Defender Antivirus > Real-time Protection\n1. Enable `Turn off real-time protection`\n1. **Reboot**\n> Make sure to **reboot** before making the next change\n\nTo permanently disable Microsoft Defender:\n\n1. Make sure you rebooted your machine\n1. Open Local Group Policy Editor (type `gpedit` in the search box)\n1. Computer Configuration > Administrative Templates > Windows Components > Microsoft Defender Antivirus\n1. Enable `Turn off Microsoft Defender Antivirus`\n1. **Reboot**\n\n  [1]: https://stackoverflow.com/questions/62174426/how-to-permanently-disable-windows-defender-real-time-protection-with-gpo\n\n## Installation \n1. Complete the pre-install procedures by disabling Defender\n1. Download and extract the zip of the Commando-VM repo\n1. Run PowerShell as Administrator\n1. `Set-ExecutionPolicy Unrestricted -force`\n1. `cd ~/Downloads/commando-vm`\n1. `Get-ChildItem .\\ -Recurse | Unblock-File`\n1. `.\\install.ps1` for a GUI install or `.\\install.ps1 -cli` for command-line\n\n\n## Contributing\nLooking to contribute? Check the links below to learn how!\n\n### Commando-VM (this repository)\n- See our quick start guide to go from zero to Commando ASAP! [https://github.com/mandiant/commando-vm/blob/main/Docs/Commando_Quickstart_Guide.md](https://github.com/mandiant/commando-vm/blob/main/Docs/Commando_Quickstart_Guide.md)\n\n### VM-Packages (where all the packages live)\n* [Repository of all tool packages (VM-packages)](https://github.com/mandiant/VM-Packages)\n* [Documentation and contribution guides for tool packages](https://github.com/mandiant/VM-Packages/wiki)\n* [Submit new tool packages or report package related issues](https://github.com/mandiant/VM-Packages/issues)\n\n## Troubleshooting\nSee the ![troubleshooting documentation](https://github.com/mandiant/commando-vm/blob/main/Docs/Troubleshooting.md) for more information.\n\n## Credits\n\n- Jake Barteaux         @day1player\n- Blaine Stancill       @MalwareMechanic\n- Nhan Huynh            @htnhan\n- Drew Farber           @0xFarbs\n- Alex Tselevich        @nos3curity\n- George Litvinov       @geo-lit\n- Dennis Tran           @Menn1s\n- Joseph Clay           @skollr34p3r\n- Ana Martinez Gomez    @anamma_06\n- Moritz Raabe\n- Derrick Tran          @dumosuku\n- Mandiant Red Team\n- Mandiant FLARE\n\n## Legal Notice\n\n```\nThis download configuration script is provided to assist penetration testers\nin creating handy and versatile toolboxes for offensive engagements. It provides \na convenient interface for them to obtain a useful set of pentesting Tools directly \nfrom their original sources. Installation and use of this script is subject to the \nApache 2.0 License.\n \nYou as a user of this script must review, accept and comply with the license\nterms of each downloaded/installed package listed below. By proceeding with the\ninstallation, you are accepting the license terms of each package, and\nacknowledging that your use of each package will be subject to its respective\nlicense terms.\n```\n"
  },
  {
    "path": "install.ps1",
    "content": "<#\n    .SYNOPSIS\n        Installation script for CommandoVM.\n    .DESCRIPTION\n        Placeholder\n    .PARAMETER cli\n        Switch parameter to skip customization GUI.\n    .PARAMETER victim\n        Switch parameter to to install the victim profile.\n    .PARAMETER skipChecks\n        Switch parameter to skip validation checks (not recommended).\n    .PARAMETER password\n        [CLI INSTALL] Current user password to allow reboot resiliency via Boxstarter\n    .PARAMETER noPassword\n        [CLI INSTALL] Used when the user password is not set or is blank\n    .PARAMETER customProfile\n        [CLI INSTALL] Path to a configuration XML file. May be a file path or URL.\n    .EXAMPLE\n        .\\install.ps1\n    .LINK\n        https://github.com/mandiant/commando-vm\n        https://github.com/mandiant/VM-Packages\n#>\n\nparam (\n    [switch]$cli,\n    [switch]$victim,\n    [switch]$skipChecks,\n    [switch]$noPassword,\n    [string]$password,\n    [string]$customProfile\n)\n\n$asciiArt = @'\n▄████▄   ▒█████   ███▄ ▄███▓ ███▄ ▄███▓ ▄▄▄       ███▄    █ ▓█████▄  ▒█████  \n▒██▀ ▀█  ▒██▒  ██▒▓██▒▀█▀ ██▒▓██▒▀█▀ ██▒▒████▄     ██ ▀█   █ ▒██▀ ██▌▒██▒  ██▒\n▒▓█    ▄ ▒██░  ██▒▓██    ▓██░▓██    ▓██░▒██  ▀█▄  ▓██  ▀█ ██▒░██   █▌▒██░  ██▒\n▒▓▓▄ ▄██▒▒██   ██░▒██    ▒██ ▒██    ▒██ ░██▄▄▄▄██ ▓██▒  ▐▌██▒░▓█▄   ▌▒██   ██░\n▒ ▓███▀ ░░ ████▓▒░▒██▒   ░██▒▒██▒   ░██▒ ▓█   ▓██▒▒██░   ▓██░░▒████▓ ░ ████▓▒░\n░ ░▒ ▒  ░░ ▒░▒░▒░ ░ ▒░   ░  ░░ ▒░   ░  ░ ▒▒   ▓▒█░░ ▒░   ▒ ▒  ▒▒▓  ▒ ░ ▒░▒░▒░ \n  ░  ▒     ░ ▒ ▒░ ░  ░      ░░  ░      ░  ▒   ▒▒ ░░ ░░   ░ ▒░ ░ ▒  ▒   ░ ▒ ▒░ \n░        ░ ░ ░ ▒  ░      ░   ░      ░     ░   ▒      ░   ░ ░  ░ ░  ░ ░ ░ ░ ▒  \n░ ░          ░ ░         ░          ░         ░  ░         ░    ░        ░ ░  \n░                                                             ░               \n'@\n\nAdd-Type -AssemblyName System.Drawing\n\n$errorColor = [System.Drawing.ColorTranslator]::FromHtml(\"#c80505\")\n$successColor = [System.Drawing.ColorTranslator]::FromHtml(\"#417505\")\n$grayedColor = [System.Drawing.ColorTranslator]::FromHtml(\"#959393\")\n$skippedColor = [System.Drawing.ColorTranslator]::FromHtml(\"#f59f00\")\n$skippedColor = [System.Drawing.ColorTranslator]::FromHtml(\"#f59f00\")\n\n# Load the GUI controls\nif (-not $cli.IsPresent) {\n\n    Add-Type -AssemblyName System.Windows.Forms\n  \n    [System.Windows.Forms.Application]::EnableVisualStyles()\n\n    $iconPath = Join-Path $PSScriptRoot \"Images/mandiant.png\"\n    $icon = [System.Drawing.Icon]::FromHandle((New-Object System.Drawing.Bitmap -ArgumentList $iconPath).GetHicon())\n\n    #################################################################################################\n    ################################ Installer Checks Form Controls #################################\n    #################################################################################################\n\n    $CommandoChecksManager           = New-Object system.Windows.Forms.Form\n    $CommandoChecksManager.ClientSize  = New-Object System.Drawing.Point(510,376)\n    $CommandoChecksManager.text      = \"CommandoVM Pre-Install Checks\"\n    $CommandoChecksManager.TopMost   = $true\n    $CommandoChecksManager.Icon      = $icon\n    $CommandoChecksManager.StartPosition = 'CenterScreen'\n    \n    $ChecksPanel                     = New-Object system.Windows.Forms.Panel\n    $ChecksPanel.height              = 274\n    $ChecksPanel.width               = 89\n    $ChecksPanel.location            = New-Object System.Drawing.Point(365,8)\n    \n    $InstallChecksGroup              = New-Object system.Windows.Forms.Groupbox\n    $InstallChecksGroup.height       = 289\n    $InstallChecksGroup.width        = 462\n    $InstallChecksGroup.text         = \"Installation Checks\"\n    $InstallChecksGroup.location     = New-Object System.Drawing.Point(23,14)\n    \n    ################################# Check Labels #################################\n\n    $RunningAsAdminLabel             = New-Object system.Windows.Forms.Label\n    $RunningAsAdminLabel.text        = \"Running as Administrator\"\n    $RunningAsAdminLabel.AutoSize    = $true\n    $RunningAsAdminLabel.width       = 25\n    $RunningAsAdminLabel.height      = 10\n    $RunningAsAdminLabel.location    = New-Object System.Drawing.Point(15,18)\n    $RunningAsAdminLabel.Font        = New-Object System.Drawing.Font('Microsoft Sans Serif',12,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n    \n    $ExecutionPolicyLabel            = New-Object system.Windows.Forms.Label\n    $ExecutionPolicyLabel.text       = \"Execution Policy Unrestricted\"\n    $ExecutionPolicyLabel.AutoSize   = $true\n    $ExecutionPolicyLabel.width      = 25\n    $ExecutionPolicyLabel.height     = 10\n    $ExecutionPolicyLabel.location   = New-Object System.Drawing.Point(15,59)\n    $ExecutionPolicyLabel.Font       = New-Object System.Drawing.Font('Microsoft Sans Serif',12,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n    \n    $WindowsDefenderLabel           = New-Object system.Windows.Forms.Label\n    $WindowsDefenderLabel.text      = \"Windows Defender Disabled\"\n    $WindowsDefenderLabel.AutoSize  = $true\n    $WindowsDefenderLabel.width     = 25\n    $WindowsDefenderLabel.height    = 10\n    $WindowsDefenderLabel.location  = New-Object System.Drawing.Point(15,104)\n    $WindowsDefenderLabel.Font      = New-Object System.Drawing.Font('Microsoft Sans Serif',12,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n    \n    $WindowsReleaseLabel             = New-Object system.Windows.Forms.Label\n    $WindowsReleaseLabel.text        = \"Compatible Windows Release\"\n    $WindowsReleaseLabel.AutoSize    = $true\n    $WindowsReleaseLabel.width       = 25\n    $WindowsReleaseLabel.height      = 10\n    $WindowsReleaseLabel.location    = New-Object System.Drawing.Point(15,149)\n    $WindowsReleaseLabel.Font        = New-Object System.Drawing.Font('Microsoft Sans Serif',12,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n    \n    $RunningVMLabel                  = New-Object system.Windows.Forms.Label\n    $RunningVMLabel.text             = \"Running in a Virtual Machine\"\n    $RunningVMLabel.AutoSize         = $true\n    $RunningVMLabel.width            = 25\n    $RunningVMLabel.height           = 10\n    $RunningVMLabel.location         = New-Object System.Drawing.Point(15,193)\n    $RunningVMLabel.Font             = New-Object System.Drawing.Font('Microsoft Sans Serif',12,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n    \n    $EnoughHardStorageLabel          = New-Object system.Windows.Forms.Label\n    $EnoughHardStorageLabel.text     = \"Enough Hard Drive Space\"\n    $EnoughHardStorageLabel.AutoSize  = $true\n    $EnoughHardStorageLabel.width    = 25\n    $EnoughHardStorageLabel.height   = 10\n    $EnoughHardStorageLabel.location  = New-Object System.Drawing.Point(15,239)\n    $EnoughHardStorageLabel.Font     = New-Object System.Drawing.Font('Microsoft Sans Serif',12,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n\n    ################################# Check Boolean Controls #################################\n    \n    $RunningAsAdmin                  = New-Object system.Windows.Forms.Label\n    $RunningAsAdmin.text             = \"False\"\n    $RunningAsAdmin.AutoSize         = $true\n    $RunningAsAdmin.width            = 25\n    $RunningAsAdmin.height           = 10\n    $RunningAsAdmin.location         = New-Object System.Drawing.Point(24,18)\n    $RunningAsAdmin.Font             = New-Object System.Drawing.Font('Microsoft Sans Serif',12,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n    $RunningAsAdmin.ForeColor        = $errorColor\n    \n    $ExecutionPolicy                 = New-Object system.Windows.Forms.Label\n    $ExecutionPolicy.text            = \"False\"\n    $ExecutionPolicy.AutoSize        = $true\n    $ExecutionPolicy.width           = 25\n    $ExecutionPolicy.height          = 10\n    $ExecutionPolicy.location        = New-Object System.Drawing.Point(24,63)\n    $ExecutionPolicy.Font            = New-Object System.Drawing.Font('Microsoft Sans Serif',12,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n    $ExecutionPolicy.ForeColor       = $errorColor\n    \n    $WindowsDefender                = New-Object system.Windows.Forms.Label\n    $WindowsDefender.text           = \"False\"\n    $WindowsDefender.AutoSize       = $true\n    $WindowsDefender.width          = 25\n    $WindowsDefender.height         = 10\n    $WindowsDefender.location       = New-Object System.Drawing.Point(24,108)\n    $WindowsDefender.Font           = New-Object System.Drawing.Font('Microsoft Sans Serif',12,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n    $WindowsDefender.ForeColor      = $errorColor\n    \n    $WindowsRelease                  = New-Object system.Windows.Forms.Label\n    $WindowsRelease.text             = \"False\"\n    $WindowsRelease.AutoSize         = $true\n    $WindowsRelease.width            = 25\n    $WindowsRelease.height           = 10\n    $WindowsRelease.location         = New-Object System.Drawing.Point(24,150)\n    $WindowsRelease.Font             = New-Object System.Drawing.Font('Microsoft Sans Serif',12,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n    $WindowsRelease.ForeColor        = $errorColor\n    \n    $RunningVM                       = New-Object system.Windows.Forms.Label\n    $RunningVM.text                  = \"False\"\n    $RunningVM.AutoSize              = $true\n    $RunningVM.width                 = 25\n    $RunningVM.height                = 10\n    $RunningVM.location              = New-Object System.Drawing.Point(24,195)\n    $RunningVM.Font                  = New-Object System.Drawing.Font('Microsoft Sans Serif',12,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n    $RunningVM.ForeColor             = $errorColor\n    \n    $EnoughHardStorage               = New-Object system.Windows.Forms.Label\n    $EnoughHardStorage.text          = \"False\"\n    $EnoughHardStorage.AutoSize      = $true\n    $EnoughHardStorage.width         = 25\n    $EnoughHardStorage.height        = 10\n    $EnoughHardStorage.location      = New-Object System.Drawing.Point(24,241)\n    $EnoughHardStorage.Font          = New-Object System.Drawing.Font('Microsoft Sans Serif',12,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n    $EnoughHardStorage.ForeColor     = $errorColor\n    \n    ################################# Check Tooltip Controls #################################\n\n    $RunningVMTooltip                = New-Object system.Windows.Forms.Label\n    $RunningVMTooltip.text           = \"Only run this script inside a Virtual Machine\"\n    $RunningVMTooltip.AutoSize       = $true\n    $RunningVMTooltip.width          = 25\n    $RunningVMTooltip.height         = 10\n    $RunningVMTooltip.location       = New-Object System.Drawing.Point(15,219)\n    $RunningVMTooltip.Font           = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n    $RunningVMTooltip.ForeColor      = $grayedColor\n    \n    $WindowsReleaseTooltip           = New-Object system.Windows.Forms.Label\n    $WindowsReleaseTooltip.text      = \"Ensure your Windows version is supported\"\n    $WindowsReleaseTooltip.AutoSize  = $true\n    $WindowsReleaseTooltip.width     = 25\n    $WindowsReleaseTooltip.height    = 10\n    $WindowsReleaseTooltip.location  = New-Object System.Drawing.Point(15,175)\n    $WindowsReleaseTooltip.Font      = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n    $WindowsReleaseTooltip.ForeColor  = $grayedColor\n    \n    $WindowsDefenderTooltip            = New-Object system.Windows.Forms.Label\n    $WindowsDefenderTooltip.text       = \"Disable Windows Defender and Tamper Protection\"\n    $WindowsDefenderTooltip.AutoSize   = $true\n    $WindowsDefenderTooltip.width      = 25\n    $WindowsDefenderTooltip.height     = 10\n    $WindowsDefenderTooltip.location   = New-Object System.Drawing.Point(15,130)\n    $WindowsDefenderTooltip.Font       = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n    $WindowsDefenderTooltip.ForeColor  = $grayedColor\n    \n    $ExecutionPolicyTooltip             = New-Object system.Windows.Forms.Label\n    $ExecutionPolicyTooltip.text        = \"PowerShell: Set-ExecutionPolicy Unrestricted\"\n    $ExecutionPolicyTooltip.AutoSize    = $true\n    $ExecutionPolicyTooltip.width       = 25\n    $ExecutionPolicyTooltip.height      = 10\n    $ExecutionPolicyTooltip.location    = New-Object System.Drawing.Point(15,85)\n    $ExecutionPolicyTooltip.Font        = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n    $ExecutionPolicyTooltip.ForeColor   = $grayedColor\n    \n    $RunningAsAdminTooltip              = New-Object system.Windows.Forms.Label\n    $RunningAsAdminTooltip.text         = \"Please run this script as Administrator\"\n    $RunningAsAdminTooltip.AutoSize     = $true\n    $RunningAsAdminTooltip.width        = 25\n    $RunningAsAdminTooltip.height       = 10\n    $RunningAsAdminTooltip.location     = New-Object System.Drawing.Point(15,41)\n    $RunningAsAdminTooltip.Font         = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n    $RunningAsAdminTooltip.ForeColor    = $grayedColor\n    \n    $EnoughHardStorageTooltip           = New-Object system.Windows.Forms.Label\n    $EnoughHardStorageTooltip.text      = \"Have at least 70GB of available storage\"\n    $EnoughHardStorageTooltip.AutoSize  = $true\n    $EnoughHardStorageTooltip.width     = 25\n    $EnoughHardStorageTooltip.height    = 10\n    $EnoughHardStorageTooltip.location  = New-Object System.Drawing.Point(15,266)\n    $EnoughHardStorageTooltip.Font      = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n    $EnoughHardStorageTooltip.ForeColor = $grayedColor\n\n    ################################# Check Completion Controls #################################\n\n    $BreakMyInstallCheckbox          = New-Object system.Windows.Forms.CheckBox\n    $BreakMyInstallCheckbox.text     = \"I understand that continuing without satisfying all\"\n    $BreakMyInstallCheckbox.AutoSize = $false\n    $BreakMyInstallCheckbox.width    = 324\n    $BreakMyInstallCheckbox.height   = 21\n    $BreakMyInstallCheckbox.location = New-Object System.Drawing.Point(30,319)\n    $BreakMyInstallCheckbox.Font     = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n    $BreakMyInstallCheckbox.Add_CheckStateChanged({\n        if ($BreakMyInstallCheckbox.Checked) {\n            $ChecksCompleteButton.enabled = $true\n        } else {\n            $ChecksCompleteButton.enabled = $false\n        }\n    })\n\n    $BreakMyInstallLabel             = New-Object system.Windows.Forms.Label\n    $BreakMyInstallLabel.text        = \"pre-install checks might cause install issues\"\n    $BreakMyInstallLabel.AutoSize    = $true\n    $BreakMyInstallLabel.width       = 25\n    $BreakMyInstallLabel.height      = 10\n    $BreakMyInstallLabel.location    = New-Object System.Drawing.Point(30,338)\n    $BreakMyInstallLabel.Font        = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n\n    $ChecksCompleteButton            = New-Object system.Windows.Forms.Button\n    $ChecksCompleteButton.text       = \"Continue\"\n    $ChecksCompleteButton.width      = 97\n    $ChecksCompleteButton.height     = 37\n    $ChecksCompleteButton.enabled    = $false\n    $ChecksCompleteButton.DialogResult   = [System.Windows.Forms.DialogResult]::OK\n    $ChecksCompleteButton.location   = New-Object System.Drawing.Point(387,315)\n    $ChecksCompleteButton.Font       = New-Object System.Drawing.Font('Microsoft Sans Serif',12)\n    $ChecksCompleteButton.Add_Click({\n        $global:checksPassed = $true\n        [void]$CommandoChecksManager.Close()\n    })\n\n    $InstallChecksGroup.controls.AddRange(@($ChecksPanel,$RunningAsAdminLabel,$ExecutionPolicyLabel,$WindowsDefenderLabel,$WindowsReleaseLabel,$RunningVMLabel,$RunningAsAdminTooltip,$ExecutionPolicyTooltip,$WindowsDefenderTooltip,$WindowsReleaseTooltip,$RunningVMTooltip,$EnoughHardStorageLabel, $EnoughHardStorageTooltip,$RunningAsAdmin,$EnoughHardStorage))\n    $CommandoChecksManager.controls.AddRange(@($InstallChecksGroup,$ChecksCompleteButton,$BreakMyInstallCheckbox,$BreakMyInstallLabel))\n    $ChecksPanel.controls.AddRange(@($RunningAsAdmin, $ExecutionPolicy,$WindowsDefender,$WindowsRelease,$RunningVM, $EnoughHardStorage))\n\n    #################################################################################################\n    ################################# Main Installer Form Controls ##################################\n    #################################################################################################\n\n    $CommandoInstaller               = New-Object system.Windows.Forms.Form\n    $CommandoInstaller.ClientSize    = New-Object System.Drawing.Point(693,574)\n    $CommandoInstaller.text          = \"CommandoVM Installer\"\n    $CommandoInstaller.TopMost       = $true\n    $CommandoInstaller.StartPosition = 'CenterScreen'\n    $CommandoInstaller.Icon          = $icon\n\n    $CommandoLogo                    = New-Object system.Windows.Forms.PictureBox\n    $CommandoLogo.width              = 338\n    $CommandoLogo.height             = 246\n    $CommandoLogo.location           = New-Object System.Drawing.Point(179,37)\n    $CommandoLogo.imageLocation      = Join-Path $PSScriptRoot \"Images/commando.png\"\n    $CommandoLogo.SizeMode           = [System.Windows.Forms.PictureBoxSizeMode]::zoom\n\n    ################################# Main Installer Profile Selection Controls #################################\n\n    $ProfileSelector                 = New-Object system.Windows.Forms.ComboBox\n    $ProfileSelector.text            = \"Select Profile\"\n    $ProfileSelector.width           = 141\n    $ProfileSelector.height          = 108\n    $ProfileSelector.location        = New-Object System.Drawing.Point(380,449)\n    $ProfileSelector.Font            = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n    $ProfileSelector.DropDownStyle   = [System.Windows.Forms.ComboBoxStyle]::DropDownList\n    $ProfileSelector.Add_SelectedIndexChanged({\n        $global:selectedProfile = $ProfileSelector.SelectedItem\n    \n        if ($ProfileSelector.SelectedItem -eq \"Custom\") {\n            $RecommendedDiskSpaceLabel.Visible = $false\n            $RecommendedDiskSpace.Visible = $false\n        } else {\n            # Find the DiskSize from $global:profileData where ProfileName equals $global:selectedProfile\n            $diskSize = ($global:profileData | Where-Object { $_.ProfileName -eq $global:selectedProfile }).DiskSize\n        \n            # Set $RecommendedDiskSpace.Text to the found DiskSize\n            $RecommendedDiskSpace.Text = \"$($diskSize)GB\"\n            $RecommendedDiskSpaceLabel.Visible = $true\n            $RecommendedDiskSpace.Visible = $true\n        }\n    })\n    \n\n    $ConfigureProfileButton          = New-Object system.Windows.Forms.Button\n    $ConfigureProfileButton.text     = \"Configure Profile\"\n    $ConfigureProfileButton.width    = 142\n    $ConfigureProfileButton.height   = 29\n    $ConfigureProfileButton.location  = New-Object System.Drawing.Point(380,478)\n    $ConfigureProfileButton.Font     = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n    $ConfigureProfileButton.Add_Click({Open-ProfileManager})\n\n    $RecommendedDiskSpace            = New-Object system.Windows.Forms.Label\n    $RecommendedDiskSpace.text       = \"50GB+\"\n    $RecommendedDiskSpace.AutoSize   = $true\n    $RecommendedDiskSpace.width      = 25\n    $RecommendedDiskSpace.height     = 10\n    $RecommendedDiskSpace.location   = New-Object System.Drawing.Point(590,523)\n    $RecommendedDiskSpace.Font       = New-Object System.Drawing.Font('Microsoft Sans Serif',10,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n\n    $RecommendedDiskSpaceLabel       = New-Object system.Windows.Forms.Label\n    $RecommendedDiskSpaceLabel.text  = \"Recommended Disk Space - \"\n    $RecommendedDiskSpaceLabel.AutoSize  = $true\n    $RecommendedDiskSpaceLabel.width  = 25\n    $RecommendedDiskSpaceLabel.height  = 10\n    $RecommendedDiskSpaceLabel.location  = New-Object System.Drawing.Point(390,523)\n    $RecommendedDiskSpaceLabel.Font  = New-Object System.Drawing.Font('Microsoft Sans Serif',10,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n    $RecommendedDiskSpaceLabel.ForeColor  = [System.Drawing.ColorTranslator]::FromHtml(\"#c10000\")\n\n    ################################# Main Installer Profile Labels #################################\n\n    $ProfileLabels                   = New-Object system.Windows.Forms.Groupbox\n    $ProfileLabels.height            = 166\n    $ProfileLabels.width             = 304\n    $ProfileLabels.text              = \"Available Profiles\"\n    $ProfileLabels.location          = New-Object System.Drawing.Point(38,342)\n\n    $ProfileLabelDefault             = New-Object system.Windows.Forms.Label\n    $ProfileLabelDefault.text        = \"Default\"\n    $ProfileLabelDefault.AutoSize    = $true\n    $ProfileLabelDefault.width       = 25\n    $ProfileLabelDefault.height      = 10\n    $ProfileLabelDefault.location    = New-Object System.Drawing.Point(20,25)\n    $ProfileLabelDefault.Font        = New-Object System.Drawing.Font('Microsoft Sans Serif',10,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n\n    $ProfileLabelFull                = New-Object system.Windows.Forms.Label\n    $ProfileLabelFull.text           = \"Full\"\n    $ProfileLabelFull.AutoSize       = $true\n    $ProfileLabelFull.width          = 25\n    $ProfileLabelFull.height         = 10\n    $ProfileLabelFull.location       = New-Object System.Drawing.Point(20,50)\n    $ProfileLabelFull.Font           = New-Object System.Drawing.Font('Microsoft Sans Serif',10,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n\n    $ProfileLabelLite                = New-Object system.Windows.Forms.Label\n    $ProfileLabelLite.text           = \"Lite\"\n    $ProfileLabelLite.AutoSize       = $true\n    $ProfileLabelLite.width          = 25\n    $ProfileLabelLite.height         = 10\n    $ProfileLabelLite.location       = New-Object System.Drawing.Point(20,75)\n    $ProfileLabelLite.Font           = New-Object System.Drawing.Font('Microsoft Sans Serif',10,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n\n    $ProfileLabelDeveloper           = New-Object system.Windows.Forms.Label\n    $ProfileLabelDeveloper.text      = \"Developer\"\n    $ProfileLabelDeveloper.AutoSize  = $true\n    $ProfileLabelDeveloper.width     = 25\n    $ProfileLabelDeveloper.height    = 10\n    $ProfileLabelDeveloper.location  = New-Object System.Drawing.Point(20,100)\n    $ProfileLabelDeveloper.Font      = New-Object System.Drawing.Font('Microsoft Sans Serif',10,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n\n    $ProfileLabelVictim              = New-Object system.Windows.Forms.Label\n    $ProfileLabelVictim.text         = \"Victim\"\n    $ProfileLabelVictim.AutoSize     = $true\n    $ProfileLabelVictim.width        = 25\n    $ProfileLabelVictim.height       = 10\n    $ProfileLabelVictim.location     = New-Object System.Drawing.Point(20,125)\n    $ProfileLabelVictim.Font         = New-Object System.Drawing.Font('Microsoft Sans Serif',10,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n\n    ################################# Main Installer Profile Description Labels #################################\n\n    $ProfileLabelDescriptionDefault   = New-Object system.Windows.Forms.Label\n    $ProfileLabelDescriptionDefault.text  = \"- numerous packages for pentesting\"\n    $ProfileLabelDescriptionDefault.AutoSize  = $true\n    $ProfileLabelDescriptionDefault.width  = 25\n    $ProfileLabelDescriptionDefault.height  = 10\n    $ProfileLabelDescriptionDefault.location  = New-Object System.Drawing.Point(70,25)\n    $ProfileLabelDescriptionDefault.Font  = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n\n    $ProfileLabelDescriptionFull     = New-Object system.Windows.Forms.Label\n    $ProfileLabelDescriptionFull.text  = \"- all tools suitable for CommandoVM\"\n    $ProfileLabelDescriptionFull.AutoSize  = $true\n    $ProfileLabelDescriptionFull.width  = 25\n    $ProfileLabelDescriptionFull.height  = 10\n    $ProfileLabelDescriptionFull.location  = New-Object System.Drawing.Point(50,50)\n    $ProfileLabelDescriptionFull.Font  = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n\n    $ProfileLabelDescriptionLite     = New-Object system.Windows.Forms.Label\n    $ProfileLabelDescriptionLite.text  = \"- only the bare minimum essential tools\"\n    $ProfileLabelDescriptionLite.AutoSize  = $true\n    $ProfileLabelDescriptionLite.width  = 25\n    $ProfileLabelDescriptionLite.height  = 10\n    $ProfileLabelDescriptionLite.location  = New-Object System.Drawing.Point(50,75)\n    $ProfileLabelDescriptionLite.Font  = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n\n    $ProfileLabelDescriptionDeveloper   = New-Object system.Windows.Forms.Label\n    $ProfileLabelDescriptionDeveloper.text  = \"- malware development tooling\"\n    $ProfileLabelDescriptionDeveloper.text  = \"- malware development tooling\"\n    $ProfileLabelDescriptionDeveloper.text  = \"- malware development tooling\"\n    $ProfileLabelDescriptionDeveloper.AutoSize  = $true\n    $ProfileLabelDescriptionDeveloper.width  = 25\n    $ProfileLabelDescriptionDeveloper.height  = 10\n    $ProfileLabelDescriptionDeveloper.location  = New-Object System.Drawing.Point(90,100)\n    $ProfileLabelDescriptionDeveloper.Font  = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n\n    $ProfileLabelDescriptionVictim   = New-Object system.Windows.Forms.Label\n    $ProfileLabelDescriptionVictim.text  = \"- set up with tools for payload testing\"\n    $ProfileLabelDescriptionVictim.AutoSize  = $true\n    $ProfileLabelDescriptionVictim.width  = 25\n    $ProfileLabelDescriptionVictim.height  = 10\n    $ProfileLabelDescriptionVictim.location  = New-Object System.Drawing.Point(65,125)\n    $ProfileLabelDescriptionVictim.Font  = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n\n    ################################# Main Installer License Labels #################################\n\n    $DisclaimerLabelLine1            = New-Object system.Windows.Forms.Label\n    $DisclaimerLabelLine1.text       = \"By proceeding with the installation, you are\"\n    $DisclaimerLabelLine1.AutoSize   = $true\n    $DisclaimerLabelLine1.width      = 262\n    $DisclaimerLabelLine1.height     = 12\n    $DisclaimerLabelLine1.location   = New-Object System.Drawing.Point(380,344)\n    $DisclaimerLabelLine1.Font       = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n\n    $DisclaimerLabelLine2            = New-Object system.Windows.Forms.Label\n    $DisclaimerLabelLine2.text       = \"accepting the license terms of each package,\"\n    $DisclaimerLabelLine2.AutoSize   = $true\n    $DisclaimerLabelLine2.width      = 262\n    $DisclaimerLabelLine2.height     = 10\n    $DisclaimerLabelLine2.location   = New-Object System.Drawing.Point(380,368)\n    $DisclaimerLabelLine2.Font       = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n\n    $DisclaimerLabelLine3            = New-Object system.Windows.Forms.Label\n    $DisclaimerLabelLine3.text       = \"and acknowledging that your use of each package\"\n    $DisclaimerLabelLine3.AutoSize   = $true\n    $DisclaimerLabelLine3.width      = 262\n    $DisclaimerLabelLine3.height     = 10\n    $DisclaimerLabelLine3.location   = New-Object System.Drawing.Point(380,392)\n    $DisclaimerLabelLine3.Font       = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n\n    $DisclaimerLabelLine4            = New-Object system.Windows.Forms.Label\n    $DisclaimerLabelLine4.text       = \" will be subject to its respective license terms.\"\n    $DisclaimerLabelLine4.AutoSize   = $true\n    $DisclaimerLabelLine4.width      = 262\n    $DisclaimerLabelLine4.height     = 10\n    $DisclaimerLabelLine4.location   = New-Object System.Drawing.Point(380,417)\n    $DisclaimerLabelLine4.Font       = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n\n    ################################# Main Installer Controls #################################\n\n    $InstallButton                   = New-Object system.Windows.Forms.Button\n    $InstallButton.text              = \"Install\"\n    $InstallButton.width             = 104\n    $InstallButton.height            = 60\n    $InstallButton.location          = New-Object System.Drawing.Point(548,446)\n    $InstallButton.Font              = New-Object System.Drawing.Font('Microsoft Sans Serif',12)\n    $InstallButton.Add_Click({\n        if (Open-PasswordEntry) {\n            [void]$CommandoInstaller.Close()\n\t\t    [void]$CommandoInstaller.Dispose()\n            Install-Profile -ProfileName $global:selectedProfile\n        }\n    })\n\n    $CommandoInstaller.controls.AddRange(@($CommandoLogo,$InstallButton,$ProfileSelector,$ConfigureProfileButton,$ProfileLabels,$RecommendedDiskSpaceLabel,$DisclaimerLabelLine1,$DisclaimerLabelLine2,$DisclaimerLabelLine3,$DisclaimerLabelLine4,$RecommendedDiskSpace))\n    $ProfileLabels.controls.AddRange(@($ProfileLabelDescriptionLite,$Label1,$ProfileLabelLite,$ProfileLabelFull,$ProfileLabelDescriptionFull,$ProfileLabelDefault,$ProfileLabelDescriptionDefault,$ProfileLabelDeveloper,$ProfileLabelDescriptionDeveloper,$ProfileLabelVictim,$ProfileLabelDescriptionVictim))\n\n    #################################################################################################\n    ################################# Profile Manager Form Controls #################################\n    #################################################################################################\n\n    $CommandoProfileManager          = New-Object system.Windows.Forms.Form\n    $CommandoProfileManager.ClientSize  = New-Object System.Drawing.Point(660,651)\n    $CommandoProfileManager.text     = \"CommandoVM Profile Manager\"\n    $CommandoProfileManager.TopMost  = $true\n    $CommandoProfileManager.StartPosition = 'CenterScreen'\n    $CommandoProfileManager.Icon     = $icon\n\n    ################################# Profile Manager Preset Selector Controls #################################\n\n    $PresetSelector                  = New-Object system.Windows.Forms.ComboBox\n    $PresetSelector.text             = \"Default\"\n    $PresetSelector.width            = 122\n    $PresetSelector.height           = 20\n    $PresetSelector.location         = New-Object System.Drawing.Point(252,11)\n    $PresetSelector.Font             = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n    $PresetSelector.DropDownStyle   = [System.Windows.Forms.ComboBoxStyle]::DropDownList\n    $PresetSelector.Add_SelectedIndexChanged({Set-ProfilePreset -ProfileName $PresetSelector.SelectedItem})\n\n    $PresetSelectorLabel             = New-Object system.Windows.Forms.Label\n    $PresetSelectorLabel.text        = \"Preset\"\n    $PresetSelectorLabel.AutoSize    = $true\n    $PresetSelectorLabel.width       = 25\n    $PresetSelectorLabel.height      = 10\n    $PresetSelectorLabel.location    = New-Object System.Drawing.Point(203,14)\n    $PresetSelectorLabel.Font        = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n\n    ################################# Profile Manager Package Installation Controls #################################\n\n    $SelectedPackagesList            = New-Object system.Windows.Forms.ListBox\n    $SelectedPackagesList.text       = \"listBox\"\n    $SelectedPackagesList.width      = 232\n    $SelectedPackagesList.height     = 266\n    $SelectedPackagesList.location   = New-Object System.Drawing.Point(16,69)\n    $SelectedPackagesList.Add_SelectedIndexChanged({\n        # We're only gonna reset the available package selection if we have a selection in this listbox\n        if ($SelectedPackagesList.SelectedIndex -ne -1) { \n            Set-PackageInformation -PackageName $SelectedPackagesList.SelectedItem\n            $AvailablePackagesList.ClearSelected() \n        }\n    })\n\n    $AvailablePackagesList           = New-Object system.Windows.Forms.ListBox\n    $AvailablePackagesList.text      = \"listBox\"\n    $AvailablePackagesList.width     = 228\n    $AvailablePackagesList.height    = 265\n    $AvailablePackagesList.location  = New-Object System.Drawing.Point(318,69)\n    $AvailablePackagesList.Add_SelectedIndexChanged({\n        # We're only gonna reset the selected package selection if we have a selection in this listbox\n        if ($AvailablePackagesList.SelectedIndex -ne -1) {\n            Set-PackageInformation -PackageName $AvailablePackagesList.SelectedItem\n            $SelectedPackagesList.ClearSelected()\n        }\n    })\n\n    $SelectedPackagesLabel           = New-Object system.Windows.Forms.Label\n    $SelectedPackagesLabel.text      = \"Selected Packages\"\n    $SelectedPackagesLabel.AutoSize  = $true\n    $SelectedPackagesLabel.width     = 25\n    $SelectedPackagesLabel.height    = 10\n    $SelectedPackagesLabel.location  = New-Object System.Drawing.Point(64,42)\n    $SelectedPackagesLabel.Font      = New-Object System.Drawing.Font('Microsoft Sans Serif',12)\n\n    $AvailablePackagesLabel          = New-Object system.Windows.Forms.Label\n    $AvailablePackagesLabel.text     = \"Available Packages\"\n    $AvailablePackagesLabel.AutoSize  = $true\n    $AvailablePackagesLabel.width    = 25\n    $AvailablePackagesLabel.height   = 10\n    $AvailablePackagesLabel.location  = New-Object System.Drawing.Point(360,42)\n    $AvailablePackagesLabel.Font     = New-Object System.Drawing.Font('Microsoft Sans Serif',12)\n\n    ################################# Profile Manager Package Addition Controls #################################\n\n    $PackageInstallationGroup        = New-Object system.Windows.Forms.Groupbox\n    $PackageInstallationGroup.height = 367\n    $PackageInstallationGroup.width  = 563\n    $PackageInstallationGroup.text   = \"Package Installation\"\n    $PackageInstallationGroup.location  = New-Object System.Drawing.Point(48,37)\n\n    $AddPackageButton                = New-Object system.Windows.Forms.Button\n    $AddPackageButton.text           = \"<\"\n    $AddPackageButton.width          = 43\n    $AddPackageButton.height         = 30\n    $AddPackageButton.location       = New-Object System.Drawing.Point(260,103)\n    $AddPackageButton.Font           = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n    $AddPackageButton.Add_Click({Add-SelectedPackage})\n\n    $AddAllPackagesButton            = New-Object system.Windows.Forms.Button\n    $AddAllPackagesButton.text       = \"<<\"\n    $AddAllPackagesButton.width      = 43\n    $AddAllPackagesButton.height     = 30\n    $AddAllPackagesButton.location   = New-Object System.Drawing.Point(260,147)\n    $AddAllPackagesButton.Font       = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n    $AddAllPackagesButton.Add_Click({Add-AllPackages})\n\n    $RemovePackageButton             = New-Object system.Windows.Forms.Button\n    $RemovePackageButton.text        = \">\"\n    $RemovePackageButton.width       = 43\n    $RemovePackageButton.height      = 30\n    $RemovePackageButton.location    = New-Object System.Drawing.Point(260,207)\n    $RemovePackageButton.Font        = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n    $RemovePackageButton.Add_Click({Remove-SelectedPackage})\n\n    $RemoveAllPackagesButton         = New-Object system.Windows.Forms.Button\n    $RemoveAllPackagesButton.text    = \">>\"\n    $RemoveAllPackagesButton.width   = 43\n    $RemoveAllPackagesButton.height  = 30\n    $RemoveAllPackagesButton.location  = New-Object System.Drawing.Point(260,254)\n    $RemoveAllPackagesButton.Font    = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n    $RemoveAllPackagesButton.Add_Click({Remove-AllPackages})\n\n    $AddChocoPackageButton               = New-Object system.Windows.Forms.Button\n    $AddChocoPackageButton.text          = \"Add Choco Package\"\n    $AddChocoPackageButton.width         = 150\n    $AddChocoPackageButton.height        = 25\n    $AddChocoPackageButton.location      = New-Object System.Drawing.Point(396,336)\n    $AddChocoPackageButton.Font          = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n    $AddChocoPackageButton.Add_Click({Open-AddChocoPackage})\n\n    ################################# Profile Manager Package Count Labels #################################\n\n    $SelectedCountLabel              = New-Object system.Windows.Forms.Label\n    $SelectedCountLabel.text         = \"Total:\"\n    $SelectedCountLabel.AutoSize     = $true\n    $SelectedCountLabel.width        = 25\n    $SelectedCountLabel.height       = 10\n    $SelectedCountLabel.location     = New-Object System.Drawing.Point(15,342)\n    $SelectedCountLabel.Font         = New-Object System.Drawing.Font('Microsoft Sans Serif',8)\n\n    $AvailableCountLabel             = New-Object system.Windows.Forms.Label\n    $AvailableCountLabel.text        = \"Total:\"\n    $AvailableCountLabel.AutoSize    = $true\n    $AvailableCountLabel.width       = 25\n    $AvailableCountLabel.height      = 10\n    $AvailableCountLabel.location    = New-Object System.Drawing.Point(316,340)\n    $AvailableCountLabel.Font        = New-Object System.Drawing.Font('Microsoft Sans Serif',8)\n\n    ################################# Profile Manager Package Information Controls #################################\n\n    $PackageInformationGroup         = New-Object system.Windows.Forms.Groupbox\n    $PackageInformationGroup.height  = 168\n    $PackageInformationGroup.width   = 562\n    $PackageInformationGroup.text    = \"Package Information\"\n    $PackageInformationGroup.location  = New-Object System.Drawing.Point(48,424)\n\n    $Authors                         = New-Object system.Windows.Forms.Label\n    $Authors.text                    = \"Authors\"\n    $Authors.AutoSize                = $false\n    $Authors.AutoEllipsis            = $true\n    $Authors.width                   = 450\n    $Authors.height                  = 20\n    $Authors.location                = New-Object System.Drawing.Point(70,25)\n    $Authors.Font                    = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n\n    $Version                         = New-Object system.Windows.Forms.Label\n    $Version.text                    = \"Version\"\n    $Version.AutoSize                = $true\n    $Version.width                   = 25\n    $Version.height                  = 10\n    $Version.location                = New-Object System.Drawing.Point(70,50)\n    $Version.Font                    = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n\n    $Description                     = New-Object system.Windows.Forms.Label\n    $Description.text                = \"Tool Description\"\n    $Description.AutoSize            = $false\n    $Description.width               = 529\n    $Description.height              = 50\n    $Description.location            = New-Object System.Drawing.Point(10,100)\n    $Description.Font                = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n\n    $AuthorsLabel                    = New-Object system.Windows.Forms.Label\n    $AuthorsLabel.text               = \"Authors:\"\n    $AuthorsLabel.AutoSize           = $true\n    $AuthorsLabel.width              = 25\n    $AuthorsLabel.height             = 10\n    $AuthorsLabel.location           = New-Object System.Drawing.Point(10,25)\n    $AuthorsLabel.Font               = New-Object System.Drawing.Font('Microsoft Sans Serif',10,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n\n    $VersionLabel                    = New-Object system.Windows.Forms.Label\n    $VersionLabel.text               = \"Version:\"\n    $VersionLabel.AutoSize           = $true\n    $VersionLabel.width              = 25\n    $VersionLabel.height             = 10\n    $VersionLabel.location           = New-Object System.Drawing.Point(10,50)\n    $VersionLabel.Font               = New-Object System.Drawing.Font('Microsoft Sans Serif',10,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n\n    $DescriptionLabel                = New-Object system.Windows.Forms.Label\n    $DescriptionLabel.text           = \"Tool Description\"\n    $DescriptionLabel.AutoSize       = $true\n    $DescriptionLabel.width          = 25\n    $DescriptionLabel.height         = 10\n    $DescriptionLabel.location       = New-Object System.Drawing.Point(10,75)\n    $DescriptionLabel.Font           = New-Object System.Drawing.Font('Microsoft Sans Serif',10,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n\n    ################################# Profile Manager Buttons #################################\n\n    $DoneButton                      = New-Object system.Windows.Forms.Button\n    $DoneButton.text                 = \"Done\"\n    $DoneButton.width                = 94\n    $DoneButton.height               = 30\n    $DoneButton.location             = New-Object System.Drawing.Point(424,604)\n    $DoneButton.Font                 = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n    $DoneButton.Add_Click({\n        Save-Profile\n    \n        # Check if \"Custom\" exists in $ProfileSelector.Items, and add it if it doesn't\n        if (\"Custom\" -notin $ProfileSelector.Items) {\n            $ProfileSelector.Items.Add(\"Custom\")\n        }\n    \n        # Set $ProfileSelector.Text to \"Custom\"\n        $ProfileSelector.Text = \"Custom\"\n    \n        [void]$CommandoProfileManager.Close()\n    })\n    \n\n    $SaveProfileButton               = New-Object system.Windows.Forms.Button\n    $SaveProfileButton.text          = \"Save Profile As\"\n    $SaveProfileButton.width         = 124\n    $SaveProfileButton.height        = 30\n    $SaveProfileButton.location      = New-Object System.Drawing.Point(115,604)\n    $SaveProfileButton.Font          = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n    $SaveProfileButton.Add_Click({Save-ProfileAs})\n\n    $ResetProfileButton              = New-Object system.Windows.Forms.Button\n    $ResetProfileButton.text         = \"Reset Profile\"\n    $ResetProfileButton.width        = 127\n    $ResetProfileButton.height       = 30\n    $ResetProfileButton.location     = New-Object System.Drawing.Point(269,604)\n    $ResetProfileButton.Font         = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n    $ResetProfileButton.Add_Click({Set-ProfilePreset -ProfileName $selectedProfile})\n\n    ################################# Profile Manager Form Constructor #################################\n\n    $CommandoProfileManager.controls.AddRange(@($PackageInstallationGroup,$DoneButton,$SaveProfileButton,$ResetProfileButton,$PackageInformationGroup))\n    $PackageInstallationGroup.controls.AddRange(@($SelectedPackagesLabel,$PresetSelectorLabel,$AddPackageButton,$AddAllPackagesButton,$RemovePackageButton,$RemoveAllPackagesButton,$PresetSelector,$AvailablePackagesLabel,$availableCountLabel,$selectedCountLabel,$SelectedPackagesList,$AvailablePackagesList,$AddChocoPackageButton))\n    $PackageInformationGroup.controls.AddRange(@($AuthorsLabel,$Description,$DescriptionLabel,$VersionLabel,$Authors,$Version))\n\n    #################################################################################################\n    ################################# Password Entry Form Controls ##################################\n    #################################################################################################\n\n    $CommandoPasswordManager         = New-Object system.Windows.Forms.Form\n    $CommandoPasswordManager.ClientSize  = New-Object System.Drawing.Point(400,270)\n    $CommandoPasswordManager.text    = \"CommandoVM Boxstarter Password\"\n    $CommandoPasswordManager.TopMost  = $true\n    $CommandoPasswordManager.Icon      = $icon\n    $CommandoPasswordManager.StartPosition = 'CenterScreen'\n\n    $PasswordOKButton                = New-Object system.Windows.Forms.Button\n    $PasswordOKButton.text           = \"OK\"\n    $PasswordOKButton.DialogResult   = [System.Windows.Forms.DialogResult]::OK\n    $PasswordOKButton.width          = 95\n    $PasswordOKButton.height         = 28\n    $PasswordOKButton.location       = New-Object System.Drawing.Point(153,230)\n    $PasswordOKButton.Font           = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n\n    $PasswordInfoLabel               = New-Object system.Windows.Forms.Label\n    $PasswordInfoLabel.text          = \"Boxstarter requires user credentials to automatically login and continue the install on a reboot. `n`nIf you do not have a password set, leave the field blank\"\n    $PasswordInfoLabel.AutoSize      = $true\n    $PasswordInfoLabel.Visible       = $false\n    $PasswordInfoLabel.MaximumSize   = New-Object System.Drawing.Size(350, 0)\n    $PasswordInfoLabel.location      = New-Object System.Drawing.Point(11,46)\n    $PasswordInfoLabel.Font          = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n\n    $PasswordInfoHeadingLabel        = New-Object system.Windows.Forms.Label\n    $PasswordInfoHeadingLabel.text   = \"Why is my password required?\"\n    $PasswordInfoHeadingLabel.AutoSize  = $true\n    $PasswordInfoHeadingLabel.width  = 25\n    $PasswordInfoHeadingLabel.height  = 10\n    $PasswordInfoHeadingLabel.location  = New-Object System.Drawing.Point(11,19)\n    $PasswordInfoHeadingLabel.Font   = New-Object System.Drawing.Font('Microsoft Sans Serif',12,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n\n    $PasswordInfoBoxstarterLabel     = New-Object system.Windows.Forms.Label\n    $PasswordInfoBoxstarterLabel.text  = \"Learn more at:\"\n    $PasswordInfoBoxstarterLabel.AutoSize  = $true\n    $PasswordInfoBoxstarterLabel.width  = 25\n    $PasswordInfoBoxstarterLabel.height  = 10\n    $PasswordInfoBoxstarterLabel.location  = New-Object System.Drawing.Point(11,117)\n    $PasswordInfoBoxstarterLabel.Font  = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n\n    $PasswordInfoBoxstarterLinkLabel   = New-Object system.Windows.Forms.Label\n    $PasswordInfoBoxstarterLinkLabel.text  = \"https://boxstarter.org/installingpackages\"\n    $PasswordInfoBoxstarterLinkLabel.AutoSize  = $true\n    $PasswordInfoBoxstarterLinkLabel.width  = 25\n    $PasswordInfoBoxstarterLinkLabel.height  = 10\n    $PasswordInfoBoxstarterLinkLabel.location  = New-Object System.Drawing.Point(104,117)\n    $PasswordInfoBoxstarterLinkLabel.Font  = New-Object System.Drawing.Font('Microsoft Sans Serif',10,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Underline))\n\n    $PasswordTextBox                 = New-Object system.Windows.Forms.TextBox\n    $PasswordTextBox.multiline       = $false\n    $PasswordTextBox.width           = 226\n    $PasswordTextBox.height          = 20\n    $PasswordTextBox.UseSystemPasswordChar = $True\n    $PasswordTextBox.location        = New-Object System.Drawing.Point(89,195)\n    $PasswordTextBox.Font            = New-Object System.Drawing.Font('Microsoft Sans Serif',14)\n\n    $PasswordEntryLabel              = New-Object system.Windows.Forms.Label\n    $PasswordEntryLabel.text         = \"Enter your user password:\"\n    $PasswordEntryLabel.AutoSize     = $true\n    $PasswordEntryLabel.width        = 25\n    $PasswordEntryLabel.height       = 10\n    $PasswordEntryLabel.location     = New-Object System.Drawing.Point(124,171)\n    $PasswordEntryLabel.Font         = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n\n    $PasswordInfoGroup               = New-Object system.Windows.Forms.Groupbox\n    $PasswordInfoGroup.height        = 145\n    $PasswordInfoGroup.width         = 380\n    $PasswordInfoGroup.text          = \"About\"\n    $PasswordInfoGroup.location      = New-Object System.Drawing.Point(10,17)\n\n    $CommandoPasswordManager.controls.AddRange(@($PasswordOKButton,$PasswordTextBox,$PasswordEntryLabel,$PasswordInfoGroup))\n    $PasswordInfoGroup.controls.AddRange(@($PasswordInfoLabel,$PasswordInfoHeadingLabel,$PasswordInfoBoxstarterLabel,$PasswordInfoBoxstarterLinkLabel))\n\n    #################################################################################################\n    ################################# Chocolatey Package Dialog Box #################################\n    #################################################################################################\n\n    $CommandoChocoManager                            = New-Object system.Windows.Forms.Form\n    $CommandoChocoManager.ClientSize                 = New-Object System.Drawing.Point(407,287)\n    $CommandoChocoManager.text                       = \"CommandoVM Chocolatey Package\"\n    $CommandoChocoManager.TopMost                    = $true\n    $CommandoChocoManager.Icon      = $icon\n    $CommandoChocoManager.StartPosition              = 'CenterScreen'\n    \n    $ChocoPackageTextBox                        = New-Object system.Windows.Forms.TextBox\n    $ChocoPackageTextBox.multiline              = $false\n    $ChocoPackageTextBox.width                  = 231\n    $ChocoPackageTextBox.height                 = 20\n    $ChocoPackageTextBox.location               = New-Object System.Drawing.Point(19,185)\n    $ChocoPackageTextBox.Font                   = New-Object System.Drawing.Font('Microsoft Sans Serif',14)\n    \n    $ChocoAboutGroup                       = New-Object system.Windows.Forms.Groupbox\n    $ChocoAboutGroup.height                = 118\n    $ChocoAboutGroup.width                 = 368\n    $ChocoAboutGroup.text                  = \"About\"\n    $ChocoAboutGroup.location              = New-Object System.Drawing.Point(19,22)\n    \n    $ChocoPackageErrorLabel                          = New-Object system.Windows.Forms.Label\n    $ChocoPackageErrorLabel.text                     = \"Chocolatey package not found\"\n    $ChocoPackageErrorLabel.AutoSize                 = $true\n    $ChocoPackageErrorLabel.visible                  = $false\n    $ChocoPackageErrorLabel.width                    = 25\n    $ChocoPackageErrorLabel.height                   = 10\n    $ChocoPackageErrorLabel.location                 = New-Object System.Drawing.Point(115,216)\n    $ChocoPackageErrorLabel.Font                     = New-Object System.Drawing.Font('Microsoft Sans Serif',10,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n    \n    $ChocoPackageLabel                          = New-Object system.Windows.Forms.Label\n    $ChocoPackageLabel.text                     = \"Enter Chocolatey package name:\"\n    $ChocoPackageLabel.AutoSize                 = $true\n    $ChocoPackageLabel.width                    = 25\n    $ChocoPackageLabel.height                   = 10\n    $ChocoPackageLabel.location                 = New-Object System.Drawing.Point(19,157)\n    $ChocoPackageLabel.Font                     = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n    \n    $ChocoAboutHeadingLabel                          = New-Object system.Windows.Forms.Label\n    $ChocoAboutHeadingLabel.text                     = \"Adding Chocolatey Packages\"\n    $ChocoAboutHeadingLabel.AutoSize                 = $true\n    $ChocoAboutHeadingLabel.width                    = 25\n    $ChocoAboutHeadingLabel.height                   = 10\n    $ChocoAboutHeadingLabel.location                 = New-Object System.Drawing.Point(4,17)\n    $ChocoAboutHeadingLabel.Font                     = New-Object System.Drawing.Font('Microsoft Sans Serif',12,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))\n    \n    $ChocoAboutLabel                          = New-Object system.Windows.Forms.Label\n    $ChocoAboutLabel.text                     = \"CommandoVM uses Chocolatey to install profile packages. You can add any package available in the Chocolatey Community Package Repository to the Commando install. \"\n    $ChocoAboutLabel.AutoSize                 = $true\n    $ChocoAboutLabel.MaximumSize              = New-Object System.Drawing.Size(370, 0)\n    $ChocoAboutLabel.location                 = New-Object System.Drawing.Point(4,42)\n    $ChocoAboutLabel.Font                     = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n    \n    $ChocoLearnMoreLabel                          = New-Object system.Windows.Forms.Label\n    $ChocoLearnMoreLabel.text                     = \"Learn More at:\"\n    $ChocoLearnMoreLabel.AutoSize                 = $true\n    $ChocoLearnMoreLabel.width                    = 25\n    $ChocoLearnMoreLabel.height                   = 10\n    $ChocoLearnMoreLabel.location                 = New-Object System.Drawing.Point(4,93)\n    $ChocoLearnMoreLabel.Font                     = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n    \n    $ChocoLinkLabel                          = New-Object system.Windows.Forms.Label\n    $ChocoLinkLabel.text                     = \"https://community.chocolatey.org/packages\"\n    $ChocoLinkLabel.AutoSize                 = $true\n    $ChocoLinkLabel.width                    = 25\n    $ChocoLinkLabel.height                   = 10\n    $ChocoLinkLabel.location                 = New-Object System.Drawing.Point(95,93)\n    $ChocoLinkLabel.Font                     = New-Object System.Drawing.Font('Microsoft Sans Serif',10,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Underline))    \n\n    $ChocoAddPackageButton                         = New-Object system.Windows.Forms.Button\n    $ChocoAddPackageButton.text                    = \"Add Package\"\n    $ChocoAddPackageButton.DialogResult            = [System.Windows.Forms.DialogResult]::OK\n    $ChocoAddPackageButton.width                   = 118\n    $ChocoAddPackageButton.height                  = 30\n    $ChocoAddPackageButton.enabled                 = $false\n    $ChocoAddPackageButton.location                = New-Object System.Drawing.Point(144,238)\n    $ChocoAddPackageButton.Font                    = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n\n    $ChocoFindPackageButton          = New-Object system.Windows.Forms.Button\n    $ChocoFindPackageButton.text     = \"Find Package\"\n    $ChocoFindPackageButton.width    = 118\n    $ChocoFindPackageButton.height   = 30\n    $ChocoFindPackageButton.enabled   = $true\n    $ChocoFindPackageButton.location  = New-Object System.Drawing.Point(269,185)\n    $ChocoFindPackageButton.Font      = New-Object System.Drawing.Font('Microsoft Sans Serif',10)\n    $ChocoFindPackageButton.Add_Click({\n        if (Get-ChocoPackage -PackageName $ChocoPackageTextBox.Text) {\n            $ChocoPackageErrorLabel.Text = \"Found Chocolatey package\"\n            $ChocoPackageErrorLabel.ForeColor = $successColor\n            $ChocoPackageErrorLabel.Visible = $true\n            $ChocoAddPackageButton.Enabled = $true\n        } else {\n            $ChocoPackageErrorLabel.text = \"Chocolatey package not found\"\n            $ChocoPackageErrorLabel.ForeColor = $errorColor\n            $ChocoPackageErrorLabel.Visible = $true\n            $ChocoAddPackageButton.Enabled = $false\n        }\n    })\n\n    $CommandoChocoManager.controls.AddRange(@($ChocoPackageTextBox,$ChocoAddPackageButton,$ChocoAboutGroup,$ChocoPackageErrorLabel,$ChocoPackageLabel,$ChocoFindPackageButton))\n    $ChocoAboutGroup.controls.AddRange(@($ChocoAboutHeadingLabel,$ChocoAboutLabel,$ChocoLearnMoreLabel,$ChocoLinkLabel))\n}\n\n#################################################################################################\n#################################################################################################\n###################################### Installer Functions ######################################\n#################################################################################################\n#################################################################################################\n\n################################# Functions that conduct Pre-Install Checks #################################\n\nfunction Check-Admin {\n    $currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())\n    return $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)\n}\nfunction Check-ExecutionPolicy {\n    return (Get-ExecutionPolicy).ToString() -eq \"Unrestricted\"\n}\nfunction Check-DefenderAndTamperProtection {\n    $defender = Get-WmiObject -Namespace \"root\\Microsoft\\Windows\\Defender\" -Class MSFT_MpPreference\n    if ($defender.DisableRealtimeMonitoring) {\n        if (Get-ItemProperty -Path \"HKLM:\\SOFTWARE\\Microsoft\\Windows Defender\\Features\" -Name \"TamperProtection\" -ea 0) {\n            return (Get-ItemProperty -Path \"HKLM:\\SOFTWARE\\Microsoft\\Windows Defender\\Features\" -Name \"TamperProtection\").TamperProtection -ne 5\n        }\n    }\n    return $false\n}\nfunction Check-SupportedOS {\n    $osVersion = (Get-WmiObject -class Win32_OperatingSystem).BuildNumber\n    $testedVersions = @(19045, 22621)\n    return $osVersion -in $testedVersions\n}\nfunction Check-VM {\n    $virtualModels = @('VirtualBox', 'VMware', 'Virtual Machine', 'Hyper-V')\n    $computerSystemModel = (Get-WmiObject win32_computersystem).model\n    $isVirtualModel = $false\n    \n    foreach ($model in $virtualModels) {\n        if ($computerSystemModel.Contains($model)) {\n            $isVirtualModel = $true\n            break\n        }\n    }\n\n    if (!$isVirtualModel) {\n        return $false\n    } else {\n        return $true\n    }\n}\nfunction Check-Storage {\n    $disk = Get-PSDrive (Get-Location).Drive.Name\n    Start-Sleep -Seconds 1\n    if (($disk.used + $disk.free)/1GB -gt 68.8) {\n        return $true\n    } else {\n        return $false\n    }\n}\n\n################################# Functions that change pre-install check configs #################################\n\nfunction Check-ChocoBoxstarterVersions {\n    $boxstarterVersionGood = $false\n    $chocolateyVersionGood = $false\n    if(${Env:ChocolateyInstall} -and (Test-Path \"${Env:ChocolateyInstall}\\bin\\choco.exe\")) {\n        $chocoVersion = choco --version\n        $chocolateyVersionGood = [System.Version]$chocoVersion -ge [System.Version]\"0.10.13\"\n        choco info -l -r \"boxstarter\" | ForEach-Object { $name, $chocoVersion = $_ -split '\\|' }\n        $boxstarterVersionGood = [System.Version]$chocoVersion -ge [System.Version]\"3.0.0\"\n        if ($chocolateyVersionGood -and $boxstarterVersionGood) {\n            return $true\n        } else {\n            return $false\n        }\n    } else {\n        return $false\n    }\n}\n\nfunction Check-ChocoBoxstarterInstalls {\n    [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072\n    # Fix WebThreatDefSvc permissions to prevent NuGet access denial\n    # See: https://github.com/mandiant/commando-vm/issues/330\n    try {\n          $webThreatDefPath = \"C:\\Windows\\System32\\WebThreatDefSvc\"\n          if (Test-Path $webThreatDefPath) {\n              Write-Host \"[+] Fixing WebThreatDefSvc permissions for NuGet access\" -ForegroundColor Yellow\n\n              # Take ownership of the directory\n              $takeownResult = takeown /f $webThreatDefPath /r /d y 2>&1\n              if ($LASTEXITCODE -ne 0) {\n                  Write-Host \"[!] Warning: Failed to take ownership of WebThreatDefSvc (Exit code: $LASTEXITCODE)\" -ForegroundColor Yellow\n              }\n\n              # Grant full control to Administrators\n              $icaclsAdmin = icacls $webThreatDefPath /grant \"Administrators:F\" /T /C /Q 2>&1\n              if ($LASTEXITCODE -ne 0) {\n                  Write-Host \"[!] Warning: Failed to grant admin permissions to WebThreatDefSvc (Exit code: $LASTEXITCODE)\" -ForegroundColor Yellow\n              }\n\n              # Grant full access to Network Service\n              $icaclsNetwork = icacls $webThreatDefPath /grant \"Network Service:(M)\" /T /C /Q 2>&1\n              if ($LASTEXITCODE -ne 0) {\n                  Write-Host \"[!] Warning: Failed to grant Network Service permissions to WebThreatDefSvc (Exit code: $LASTEXITCODE)\" -ForegroundColor Yellow       \n              }\n\n              Write-Host \"[+] WebThreatDefSvc permissions updated successfully\" -ForegroundColor Green\n          } else {\n              Write-Host \"[*] WebThreatDefSvc directory not found, skipping permission fix\" -ForegroundColor Gray\n          }\n      }\n      catch {\n          Write-Host \"[!] Warning: Error fixing WebThreatDefSvc permissions: $($_.Exception.Message)\" -ForegroundColor Yellow\n          Write-Host \"[*] Continuing with installation...\" -ForegroundColor Gray\n      }\n    Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://boxstarter.org/bootstrapper.ps1'))\n    Get-Boxstarter -Force\n\n    # Fix verbosity issues with Boxstarter v3\n    # See: https://github.com/chocolatey/boxstarter/issues/501\n    $fileToFix = \"${Env:ProgramData}\\boxstarter\\boxstarter.chocolatey\\Chocolatey.ps1\"\n    $offendingString = 'if ($val -is [string] -or $val -is [boolean]) {'\n    if ((Get-Content $fileToFix -raw) -contains $offendingString) {\n        $fixString = 'if ($val -is [string] -or $val -is [boolean] -or $val -is [system.management.automation.actionpreference]) {'\n        ((Get-Content $fileToFix -raw) -replace [regex]::escape($offendingString),$fixString) | Set-Content $fileToFix\n    }\n    $fileToFix = \"${Env:ProgramData}\\boxstarter\\boxstarter.chocolatey\\invoke-chocolatey.ps1\"\n    $offendingString = 'Verbose           = $VerbosePreference'\n    if ((Get-Content $fileToFix -raw) -contains $offendingString) {\n        $fixString = 'Verbose           = ($global:VerbosePreference -eq \"Continue\")'\n        ((Get-Content $fileToFix -raw) -replace [regex]::escape($offendingString),$fixString) | Set-Content $fileToFix\n    }\n}\nfunction Check-BoxstarterConfig {\n    $Boxstarter.RebootOk = (-not $noReboots.IsPresent)\n    $Boxstarter.AutoLogin = $true\n    $Boxstarter.SuppressLogging = $True\n    $global:VerbosePreference = \"SilentlyContinue\"\n    Set-BoxstarterConfig -NugetSources \"$env:USERPROFILE\\Desktop;.;https://www.myget.org/F/vm-packages/api/v2;https://chocolatey.org/api/v2\"\n}\n\nfunction Check-ChocoConfig {\n    choco sources add -n=\"vm-packages\" -s \"$env:USERPROFILE\\Desktop;.;https://www.myget.org/F/vm-packages/api/v2;https://chocolatey.org/api/v2\" --priority 1\n    choco feature enable -n allowGlobalConfirmation\n    choco feature enable -n allowEmptyChecksums\n    $cache = \"${Env:LocalAppData}\\ChocoCache\"\n    New-Item -Path $cache -ItemType directory -Force | Out-Null\n    choco config set cacheLocation $cache\n}\n\n################################# Functions that Get Profiles and Packages #################################\n\nfunction Get-ProfileData {\n    $profilesFolder = Join-Path $PSScriptRoot \"./Profiles/\"\n    $profiles = @()\n\n    # Loop over the profiles folder\n    Get-ChildItem -Path $profilesFolder -Filter \"*.xml\" | ForEach-Object {\n        $xmlContent = [xml](Get-Content $_.FullName)\n        $profileName = $_.BaseName\n        $diskSize = $xmlContent.config.envs.env | Where-Object { $_.name -eq \"MIN_DISK_SPACE\" } | Select-Object -ExpandProperty value\n\n        # Write the profile metadata to a variable\n        $profiles += [PSCustomObject]@{\n            ProfileName = $profileName\n            DiskSize    = $diskSize\n            XmlPath     = $_.FullName\n        }\n    }\n\n    return $profiles\n}\n\nfunction Get-PackagesFromProfile {\n    param (\n        [string]$ProfileName\n    )\n\n    # Get the XML profile path for the specified profile\n    $profilePath = $global:profileData | Where-Object { $_.ProfileName -eq $ProfileName } | Select-Object -ExpandProperty XmlPath\n\n    # Read the XML profile and pull the package names out\n    if ($profilePath) {\n        $xmlContent = [xml](Get-Content $profilePath)\n        $packages = $xmlContent.config.packages.package\n        return $packages\n    }\n    else {\n        Write-Host \"[!] Profile not found.\" -ForegroundColor Red\n        return @()\n    }\n}\n\nfunction Get-AvailablePackages {\n    $apiUrl = \"https://www.myget.org/F/vm-packages/Packages\"\n    $destination = Join-Path $PSScriptRoot \"./available_packages.xml\"\n    $blockList = @(\"flarevm.installer.vm\", \"common.vm\", \"debloat.vm\", \"installer.vm\")\n\n    $packages = @()\n\n    # Define XML namespaces\n    $nsManager = New-Object -TypeName \"System.Xml.XmlNamespaceManager\" -ArgumentList (New-Object System.Xml.XmlDocument).NameTable\n    $nsManager.AddNamespace(\"atom\", \"http://www.w3.org/2005/Atom\")\n    $nsManager.AddNamespace(\"d\", \"http://schemas.microsoft.com/ado/2007/08/dataservices\")\n    $nsManager.AddNamespace(\"m\", \"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\")\n\n    do {\n        # Download the XML from MyGet API\n        try {\n            Invoke-WebRequest -Uri $apiUrl -OutFile $destination -ErrorAction Stop\n        }\n        catch {\n            Write-Error \"Failed to download available_packages.xml. Error: $_\"\n            exit\n        }\n\n        # Load the XML content\n        $xmlContent = [xml](Get-Content $destination)\n\n        # Extract package information from the XML\n        $xmlContent.SelectNodes(\"//atom:entry\", $nsManager) | ForEach-Object {\n            $isLatestVersion = $_.SelectSingleNode(\"m:properties/d:IsLatestVersion\", $nsManager).InnerText\n\n            # There are multiple versions of packages, but we only display the latest\n            if ($isLatestVersion -eq \"true\") {\n                $packageName = $_.SelectSingleNode(\"m:properties/d:Id\", $nsManager).InnerText\n                $packageAuthor = $_.SelectSingleNode(\"atom:author/atom:name\", $nsManager).InnerText\n                $packageVersion = $_.SelectSingleNode(\"m:properties/d:Version\", $nsManager).InnerText\n                $packageSummary = $_.SelectSingleNode(\"m:properties/d:Description\", $nsManager).InnerText\n\n                # Check if package name is not in the blocklist\n                if ($packageName -notin $blockList) {\n                    $packages += [PSCustomObject]@{\n                        PackageName   = $packageName\n                        PackageAuthor = $packageAuthor\n                        PackageVersion = $packageVersion\n                        PackageSummary = $packageSummary\n                    }\n                }\n            }\n        }\n\n        # Check if there is a next link in the XML and set the API URL to that link if it exists\n        $nextLink = $xmlContent.SelectSingleNode(\"//atom:link[@rel='next']/@href\", $nsManager)\n        $apiUrl = $nextLink.\"#text\"\n    }\n    while ($apiUrl -ne $null)\n\n    return $packages\n}\n\nfunction Get-ChocoPackage {\n    param (\n        [Parameter(Mandatory=$true)]\n        [string]$PackageName\n    )\n\n    try {\n        # Call Chocolatey API to get package metadata\n        $response = Invoke-RestMethod -Uri ('https://community.chocolatey.org/api/v2/Packages()?$filter=Id%20eq%20%27' + $PackageName + '%27&$orderby=Version%20desc&$top=1')\n\n        if (!$response) {\n            return $false\n        }\n\n        return [PSCustomObject]@{\n            PackageName = $PackageName\n            PackageAuthor = $response.author.name\n            PackageVersion = $response.properties.version\n            PackageSummary = $response.summary.InnerText\n        }\n    }\n    catch {\n        return $false\n    }\n}\n\n\n################################# Functions that Set GUI Controls #################################\n\nfunction Set-SelectedPackages {\n    \n    # Get the packages for the specified profile\n    $packagesFromProfile = Get-PackagesFromProfile -ProfileName $global:selectedProfile\n\n    if (-not $null -eq $packagesFromProfile) {\n        # Update the SelectedPackagesList with the packages from the profile\n        $SelectedPackagesList.Items.Clear()\n        $SelectedPackagesList.Items.AddRange($packagesFromProfile.name)\n\n        # Update the count labels\n        $SelectedCountLabel.text = \"Total: $($SelectedPackagesList.Items.count)\"\n    }\n}\n\nfunction Set-AvailablePackages {\n    \n    # Update the AvailablePackagesList with all the package names from the $global:packageData that are not in the $SelectedPackagesList.Items\n    $AvailablePackagesList.Items.Clear()\n\n    $filteredPackages = $global:packageData.PackageName | Where-Object { $_ -notin $SelectedPackagesList.Items }\n    \n    # Add items only if there are items to add\n    if ($filteredPackages.Count -gt 0) {\n        $AvailablePackagesList.Items.AddRange($filteredPackages)\n    }\n\n    # Update the count labels\n    $AvailableCountLabel.text = \"Total: $($AvailablePackagesList.Items.count)\"\n}\n\n\n\nfunction Set-PackageInformation {\n    param (\n        [string]$PackageName\n    )\n\n    if ($PackageName -notmatch \"\\.vm$\") {\n        $package = Get-ChocoPackage -PackageName $PackageName\n    } else {\n        # Get the available package list\n        $package = $global:packageData | Where-Object { $_.PackageName -eq $PackageName }\n    }\n\n    # Populate the package information fields\n    if ($package) {\n        $Description.Text = $package.PackageSummary\n        $Authors.Text     = $package.PackageAuthor\n        $Version.Text     = $package.PackageVersion\n    } else {\n        Write-Host \"[!] Package not found.\"\n    }\n}\n\n\nfunction Set-ProfilePreset {\n    param (\n        [string]$ProfileName\n    )\n\n    # Change the selected profile\n    $global:selectedProfile = $ProfileName\n\n    # Re-render the package lists\n    Set-SelectedPackages\n    Set-AvailablePackages\n\n    # Check if SelectedPackagesList is empty\n    if ($SelectedPackagesList.Items.Count -gt 0) {\n        # If not empty, set the package info to the first package in the selected list\n        Set-PackageInformation -PackageName $SelectedPackagesList.Items[0]\n    }\n    else {\n        # If empty, set the package info to the first package in the available list\n        Set-PackageInformation -PackageName $AvailablePackagesList.Items[0]\n    }\n}\n\n################################# Functions that Select Packages #################################\n\nfunction Add-SelectedPackage {\n\n    $selectedItem = $AvailablePackagesList.SelectedItem\n\n    # Move the selected package over to selected listbox from available\n    if ($selectedItem) {\n        $SelectedPackagesList.Items.Add($selectedItem)\n        $AvailablePackagesList.Items.Remove($selectedItem)\n\n        # Update the total counts\n        $SelectedCountLabel.Text = \"Total: $($SelectedPackagesList.Items.Count)\"\n        $AvailableCountLabel.Text = \"Total: $($AvailablePackagesList.Items.Count)\"\n    }\n}\n\nfunction Add-AllPackages {\n    # Move all items from $AvailablePackagesList.Items to $SelectedPackagesList.Items\n    foreach ($item in $AvailablePackagesList.Items) {\n        $SelectedPackagesList.Items.Add($item)\n    }\n\n    # Empty out the $AvailablePackagesList.Items\n    $AvailablePackagesList.Items.Clear()\n\n    # Update the count labels\n    $SelectedCountLabel.text = \"Total: $($SelectedPackagesList.Items.Count)\"\n    $AvailableCountLabel.text = \"Total: $($AvailablePackagesList.Items.Count)\"\n}\n\nfunction Remove-SelectedPackage {\n    $selectedItem = $SelectedPackagesList.SelectedItem\n\n    # Move over the selected package from selected list to available\n    if ($selectedItem) {\n        $AvailablePackagesList.Items.Add($selectedItem)\n        $SelectedPackagesList.Items.Remove($selectedItem)\n\n        # Update the total counts\n        $SelectedCountLabel.Text = \"Total: $($SelectedPackagesList.Items.Count)\"\n        $AvailableCountLabel.Text = \"Total: $($AvailablePackagesList.Items.Count)\"\n    }\n}\n\nfunction Remove-AllPackages {\n\n    # Add each item from selected to available\n    foreach ($item in $SelectedPackagesList.Items) {\n        $AvailablePackagesList.Items.Add($item)\n    }\n\n    # Clear out the selected listbox\n    $SelectedPackagesList.Items.Clear()\n\n    $SelectedCountLabel.Text = \"Total: $($SelectedPackagesList.Items.Count)\"\n    $AvailableCountLabel.Text = \"Total: $($AvailablePackagesList.Items.Count)\"\n}\n\n################################# Functions that Save Profiles #################################\n\nfunction Save-Profile {\n    param (\n        [string]$ProfilePath = $(Join-Path -Path $PSScriptRoot (\".\\Profiles\" + \"\\Custom.xml\"))\n    )\n\n    # Get the path to the XML of the preset we're basing the profile on and read it into memory\n    $selectedProfilePath = ($global:profileData | Where-Object { $_.ProfileName -eq $global:selectedProfile }).XmlPath\n    [xml]$xmlContent = Get-Content -Path $selectedProfilePath\n\n    # Remove the profile if one already exists with the same name\n    if (Test-Path -Path $ProfilePath) {\n        Remove-Item -Path $ProfilePath -Force\n    }\n\n    # Clear out the packages section of the preset\n    $packagesNode = $xmlContent.config.packages\n    $packagesNode.RemoveAll()\n\n    # Overwrite the packages section with our own from the selected packages listbox\n    foreach ($item in $SelectedPackagesList.Items) {\n        $packageNode = $xmlContent.CreateElement(\"package\")\n        $packageNode.SetAttribute(\"name\", $item)\n        $packagesNode.AppendChild($packageNode)\n    }\n\n    $xmlContent.Save($ProfilePath)\n    $global:profileData = Get-ProfileData\n}\n\nfunction Save-ProfileAs {\n\n    $Title = \"Save CommandoVM Profile As\"\n    $Filter = \"XML Files (*.xml)|*.xml|All Files (*.*)|*.*\"\n    $InitialDirectory = Join-Path $PSScriptRoot \".\\Profiles\"\n\n    # Create a save-as dialog window at the profiles directory\n    $saveFileDialog = New-Object System.Windows.Forms.SaveFileDialog\n    $saveFileDialog.Title = $Title\n    $saveFileDialog.Filter = $Filter\n    $saveFileDialog.InitialDirectory = $InitialDirectory\n\n    $result = $saveFileDialog.ShowDialog()\n\n    # If the user picks a file location, we will pass it to Save-Profile\n    if ($result -eq \"OK\") {\n        Save-Profile -ProfilePath $saveFileDialog.FileName\n    }\n}\n\n################################# Functions that Install Packages #################################\n\nfunction Install-Profile {\n    param (\n        [Parameter(Mandatory = $false)]\n        [string]$ProfileName,\n\n        [Parameter(Mandatory = $false)]\n        [string]$ProfilePath\n    )\n    Write-Host \"[+] Settings updated, beginning install. Please wait for a popup letting you know the installation is complete!\" -ForegroundColor Green\n    if (-not $ProfileName -and -not $ProfilePath) {\n        throw \"Either ProfileName or ProfilePath must be specified.\"\n    }\n\n    try {\n        if (Check-ChocoBoxstarterVersions) {\n            Write-Host \"[+] Setting Boxstarter config\"\n            Check-BoxstarterConfig\n            Write-Host \"[+] Setting Chocolatey config\"\n            Check-ChocoConfig\n        } else {\n            Write-Host \"[+] Installing Boxstarter\"\n            Check-ChocoBoxstarterInstalls\n            Write-Host \"[+] Setting Boxstarter config\"\n            Check-BoxstarterConfig\n            Write-Host \"[+] Setting Chocolatey config\"\n            Check-ChocoConfig\n        }\n\n        # Set environment variable for Commando VM\n        [Environment]::SetEnvironmentVariable('VMname', 'Commando VM', [EnvironmentVariableTarget]::Machine)\n\n        Import-Module \"${Env:ProgramData}\\boxstarter\\boxstarter.chocolatey\\boxstarter.chocolatey.psd1\" -Force\n        \n        # Install base packages\n        Write-Host \"[+] Installing the common.vm shared module\" -ForegroundColor Yellow\n        choco install common.vm -y --force\n        refreshenv\n        Import-Module \"$Env:ProgramData\\_VM\\vm.common\\vm.common.psm1\" -DisableNameChecking -Force\n        VM-Write-Log \"INFO\" \"Common libraries installed.\"\n\n        Write-Host \"[+] Installing the debloat.vm debloater and performance package\"\n        choco install debloat.vm -y --force\n        VM-Write-Log \"INFO\" \"Debloating and performance enhancements completed\"\n\n        # Set profile to be installed\n        if (-not $ProfilePath) {\n            $ProfilePath = Join-Path $PSScriptRoot (\"\\Profiles\\\" + $ProfileName + \".xml\")\n        }\n        \n        $destinationPath = Join-Path ${Env:VM_COMMON_DIR} \"packages.xml\"\n\n        if (Test-Path $ProfilePath) {\n            Copy-Item $ProfilePath $destinationPath -Force\n            VM-Write-Log \"INFO\" \"Copied profile $ProfilePath to $destinationPath\"\n            Write-Host \"[+] Profile copied to %VM_COMMON_DIR%: $ProfileName\" -ForegroundColor Green\n        } else {\n            Write-Host \"[!] Error: Profile not found: $ProfileName\" -ForegroundColor Red\n        }\n        \n        # Set Windows OS VM configuration file\n        $configPath = Join-Path ${Env:VM_COMMON_DIR} \"config.xml\"\n        $configSource = Join-Path $PSScriptRoot \"Profiles\\Configs\"\n        $osVersion = VM-Get-WindowsVersion\n        if ($osVersion -eq \"Win10\" -and -not $victim.IsPresent){\n            VM-Write-Log \"INFO\" \"Windows 10 detected, setting win10config.xml for configuration file.\"\n            Copy-Item $(Join-Path $configSource \"win10config.xml\") $configPath -Force\n        } elseif ($osVersion -eq \"Win10\" -and $victim.IsPresent){\n            VM-Write-Log \"INFO\" \"Windows 10 Victim detected, setting win10victimconfig.xml for configuration file.\"\n            Copy-Item $(Join-Path $configSource \"win10victimconfig.xml\") $configPath -Force\n        } elseif ($osVersion -eq \"Win11\" -and -not $victim.IsPresent) {\n            VM-Write-Log \"INFO\" \"Windows 11 detected, setting win11config.xml for configuration file.\"\n            Copy-Item $(Join-Path $configSource \"win11config.xml\") $configPath -Force\n        } elseif ($osVersion -eq \"Win11\" -and $victim.IsPresent) {\n            VM-Write-Log \"INFO\" \"Windows 11 Victim detected, setting win11victimconfig.xml for configuration file.\"\n            Copy-Item $(Join-Path $configSource \"win11victimconfig.xml\") $configPath -Force\n        } elseif ($osVersion -eq \"Win11ARM\" -and -not $victim.IsPresent) {\n            VM-Write-Log \"INFO\" \"Windows 11 ARM detected, setting win11armconfig.xml for configuration file.\"\n            Copy-Item $(Join-Path $configSource \"win11armconfig.xml\") $configPath -Force\n        } elseif ($osVersion -eq \"Win11ARM\" -and $victim.IsPresent) {\n            VM-Write-Log \"INFO\" \"Windows 11 ARM Victim detected, setting win11armvictimconfig.xml for configuration file.\"\n            Copy-Item $(Join-Path $configSource \"win11armvictimconfig.xml\") $configPath -Force\n        } else {\n            VM-Write-Log \"WARN\" \"Unknown OS, choosing win10config.xml for configuration file.\"\n            Copy-Item $(Join-Path $configSource \"win10config.xml\") $configPath -Force\n        }\n\n        # Set background file\n        $backgroundImage = \"${Env:VM_COMMON_DIR}\\background.png\"\n        if ($victim.IsPresent){\n            $sourceImage = Join-Path $PSScriptRoot \"Images\\background-victim.png\"\n        } else {\n            $sourceImage = Join-Path $PSScriptRoot \"Images\\background.png\"\n        }\n        Copy-Item $sourceImage $backgroundImage -Force\n\n        # Set ico file\n        $icoImage = \"${Env:VM_COMMON_DIR}\\vm.ico\"\n        $sourceIco = Join-Path $PSScriptRoot \"Images\\commando.ico\"\n        Copy-Item -Path $sourceIco -Destination $icoImage\n        \n        # Begin the package install\n        Write-Host \"Installing profile: $ProfileName\" -ForegroundColor Yellow\n        $PackageName = \"installer.vm\"\n        if ($noPassword.IsPresent -or ($global:credentials -eq \"\")) {\n            $Boxstarter.NoPassword = $true\n            Install-BoxstarterPackage -PackageName $PackageName\n        } else {\n            $Boxstarter.NoPassword = $false\n            Install-BoxstarterPackage -PackageName $PackageName -Credential $global:credentials\n        }\n    }\n    catch {\n        Write-Host \"[!] Error: Failed to install profile: $PackageName\" -ForegroundColor Red\n        Write-Host $_.Exception.Message -ForegroundColor Red\n    }\n}\n\n################################# Functions that Open GUI Windows #################################\n\nfunction Open-CheckManager {\n\n    if ($CommandoChecksManager.ShowDialog() -ne [System.Windows.Forms.DialogResult]::OK) {\n        exit\n    }\n}\n\nfunction Open-Installer {\n\n    # Populate the profile selector combo box\n    $ProfileSelector.Items.Clear()\n    $ProfileSelector.Items.AddRange($global:profileData.ProfileName)\n\n    # Set the value of the profile selector to default\n    $ProfileSelector.Text = $global:selectedProfile\n\n    [void]$CommandoInstaller.ShowDialog()\n}\n\nfunction Open-ProfileManager {\n\n    # Populate the combo box with profile names from the $global:profileData array\n    $PresetSelector.Items.Clear()\n    $PresetSelector.Items.AddRange($global:profileData.ProfileName)\n\n    # Set the value of $PresetSelector.Text to $global:selectedProfile\n    $PresetSelector.Text = $global:selectedProfile\n\n    # Render the package lists\n    Set-SelectedPackages\n    Set-AvailablePackages\n\n    # Check if SelectedPackagesList is empty\n    if ($SelectedPackagesList.Items.Count -gt 0) {\n        # If not empty, set the package info to the first package in the selected list\n        Set-PackageInformation -PackageName $SelectedPackagesList.Items[0]\n    }\n    else {\n        # If empty, set the package info to the first package in the available list\n        Set-PackageInformation -PackageName $AvailablePackagesList.Items[0]\n    }\n\n    [void]$CommandoProfileManager.ShowDialog()\n}\n\n\nfunction Open-AddChocoPackage {\n\n    $ChocoPackageTextBox.Text = \"\"\n    $ChocoPackageErrorLabel.Visible = $false\n    $ChocoAddPackageButton.Enabled = $false\n\n    if ($CommandoChocoManager.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) {\n        $SelectedPackagesList.Items.Add($ChocoPackageTextBox.Text)\n        $SelectedCountLabel.Text = \"Total: \" + $SelectedPackagesList.Items.Count\n    }\n}\n\nfunction Open-PasswordEntry {\n    $PasswordInfoLabel.Visible = $true\n    $PasswordTextBox.Text = \"\"\n    \n    if ($CommandoPasswordManager.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK)\n    {\n        $Password = $PasswordTextBox.Text\n        if ($Password -ne \"\") {\n            $SecurePassword = ConvertTo-SecureString -String $Password -AsPlainText -Force\n            $global:credentials = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $env:username, $SecurePassword\n        }\n        [void]$CommandoInstaller.Close()\n        return $true\n    } else {\n        return $false\n    }\n}\n\n#################################################################################################\n#################################################################################################\n###################################### Installer Workflows ######################################\n#################################################################################################\n#################################################################################################\n\n# QuickEdit and Insert modes can sometimes freeze the powershell.exe window\nSet-ItemProperty -Path 'HKCU:\\Console' -Name 'QuickEdit' -Value 0\nSet-ItemProperty -Path 'HKCU:\\Console' -Name 'InsertMode' -Value 0\n\n# Setting global variables\n$global:checksPassed = $true\n$osInfo = Get-ComputerInfo\n$osArchitecture = $osInfo.OSArchitecture\nif ($osArchitecture -match \"ARM\") {\n    $global:selectedProfile = \"Default - ARM\"\n} else{\n    $global:selectedProfile = \"Default\"\n}\n$global:credentials = \"\"\n\n################################# GUI Workflow #################################\n\nif (-not $cli.IsPresent) {\n\n    if (-not $skipChecks.IsPresent) {\n\n        # Make sure that the user completed all pre-install steps\n        if (Check-Admin) {\n            $RunningAsAdmin.Text = \"True\"\n            $RunningAsAdmin.ForeColor = $successColor\n        } else {\n            $global:checksPassed = $false\n        }\n\n        if (Check-ExecutionPolicy) {\n            $ExecutionPolicy.Text = \"True\"\n            $ExecutionPolicy.ForeColor = $successColor\n        } else {\n            $global:checksPassed = $false\n        }\n\n        if (-not $victim.IsPresent) {\n            if (Check-DefenderAndTamperProtection) {\n                $WindowsDefender.Text = \"True\"\n                $WindowsDefender.ForeColor = $successColor\n            }\n        } else {\n            $WindowsDefender.Text = \"Skip\"\n            $WindowsDefender.ForeColor = $skippedColor\n            $global:selectedProfile = \"Victim\"\n        }\n        if (-not $victim.IsPresent) {\n            if (Check-DefenderAndTamperProtection) {\n                $WindowsDefender.Text = \"True\"\n                $WindowsDefender.ForeColor = $successColor\n            }\n        } else {\n            $WindowsDefender.Text = \"Skip\"\n            $WindowsDefender.ForeColor = $skippedColor\n            $global:selectedProfile = \"Victim\"\n        }\n\n        if (Check-SupportedOS) {\n            $WindowsRelease.Text = \"True\"\n            $WindowsRelease.ForeColor = $successColor\n        } else {\n            $global:checksPassed = $false\n        }\n\n        if (Check-VM) {\n            $RunningVM.Text = \"True\"\n            $RunningVM.ForeColor = $successColor\n        } else {\n            $global:checksPassed = $false\n        }\n\n        if (Check-Storage) {\n            $EnoughHardStorage.Text = \"True\"\n            $EnoughHardStorage.ForeColor = $successColor\n        } else {\n            $global:checksPassed = $false\n        }\n\n        if ($global:checksPassed) {\n            $ChecksCompleteButton.enabled = $true\n        }\n\n        Open-CheckManager\n    }\n    \n    if ($global:checksPassed -or $skipChecks.IsPresent) {\n\n        # Fetch profiles and packages\n        Write-Host \"[+] Retrieving available packages from MyGet. Please wait.\"\n        $global:profileData = Get-ProfileData\n        $global:packageData = Get-AvailablePackages\n\n        Write-Host \"[+] Beginning graphical install\"\n\n        Open-Installer\n    }\n}\n\n################################# CLI Workflow #################################\n\nif ($cli.IsPresent) {\n\n    Write-Host \"`n$asciiArt\" -ForegroundColor Red\n    Write-Host \"`t`tComplete Mandiant Offensive VM - Version 3.0\" -ForegroundColor Red\n    Write-Host \"`t`t`tcommandovm@mandiant.com\" -ForegroundColor DarkYellow\n\n    if ($customProfile -eq \"\") {\n        Write-Host \"[+] No profile specified, selecting default\"\n        $customProfile = Join-Path $PSScriptRoot \"Profiles/Default.xml\"\n    }\n\n    if (-not $noPassword.IsPresent) {\n        # Get user credentials for autologin during reboots\n        if ([string]::IsNullOrEmpty($password)) {\n            Set-ItemProperty \"HKLM:\\SOFTWARE\\Microsoft\\PowerShell\\1\\ShellIds\" -Name \"ConsolePrompting\" -Value $True\n            Start-Sleep -Milliseconds 500\n            Write-Host \"[+] No password provided. Enter it now or use -noPassword if blank.\"\n            $global:credentials = Get-Credential ${Env:username}\n        } else {\n            $securePassword = ConvertTo-SecureString -String $password -AsPlainText -Force\n            $global:credentials = New-Object -TypeName \"System.Management.Automation.PSCredential\" -ArgumentList ${Env:username}, $securePassword\n        }\n    }\n\n    if (-not $skipChecks.IsPresent) {\n        # Make sure that the user completed all pre-install steps\n        Write-Host \"=================== CommandoVM Pre-Installation Checks ===================\"\n\n        if (Check-Admin) {\n            Write-Host \"`t[+] Running as administrator\" -ForegroundColor Green\n        } else {\n            $global:checksPassed = $false\n            Write-Host \"`t[-] Not running as administrator\" -ForegroundColor Red\n        }\n\n        if (Check-ExecutionPolicy) {\n            Write-Host \"`t[+] Execution policy is unrestricted\" -ForegroundColor Green\n        } else {\n            $global:checksPassed = $false\n            Write-Host \"`t[-] Execution policy is not unrestricted\" -ForegroundColor Red\n        }\n        \n        if (-not $victim.IsPresent) {\n            if (Check-DefenderAndTamperProtection) {\n                Write-Host \"`t[+] Windows Defender and Tamper Protection are disabled\" -ForegroundColor Green\n            } else {\n                $global:checksPassed = $false\n                Write-Host \"`t[-] Windows Defender and Tamper Protection are enabled\" -ForegroundColor Red\n            }\n        } else {\n            Write-Host \"`t[+] Skipping Windows Defender checks\"\n        }\n        if (-not $victim.IsPresent) {\n            if (Check-DefenderAndTamperProtection) {\n                Write-Host \"`t[+] Windows Defender and Tamper Protection are disabled\" -ForegroundColor Green\n            } else {\n                $global:checksPassed = $false\n                Write-Host \"`t[-] Windows Defender and Tamper Protection are enabled\" -ForegroundColor Red\n            }\n        } else {\n            Write-Host \"`t[+] Skipping Windows Defender checks\"\n        }\n\n        if (Check-SupportedOS) {\n            Write-Host \"`t[+] Current Windows release is supported by CommandoVM\" -ForegroundColor Green\n        } else {\n            $global:checksPassed = $false\n            Write-Host \"`t[-] Current Windows release is not supported by CommandoVM\" -ForegroundColor Red\n        }\n\n        if (Check-VM) {\n            Write-Host \"`t[+] Virtual Machine detected\" -ForegroundColor Green\n        } else {\n            $global:checksPassed = $false\n            Write-Host \"`t[-] Virtual Machine not detected\" -ForegroundColor Red\n        }\n\n        if (Check-Storage) {\n            Write-Host \"`t[+] At least 70GB of storage detected\" -ForegroundColor Green\n        } else {\n            $global:checksPassed = $false\n            Write-Host \"`t[-] At least 70GB of storage not found\" -ForegroundColor Red\n        }\n    }\n\n    if ($global:checksPassed -or $skipChecks.IsPresent) {\n        Write-Host \"===================== Installing CommandoVM =====================\"\n        Install-Profile -ProfileName $customProfile\n    } else {\n        Write-Host \"`n[+] Some checks failed. Use the -skipChecks flag if you know what you are doing\"\n    }\n}\n"
  }
]