using System;
using System.IO;
using PeNet;
using AstralPE.Obfuscator;
namespace AstralPE {
///
/// The main entry point for the AstralPE obfuscation tool.
/// Handles command-line arguments, performs obfuscation, and saves the modified PE file.
///
class Program {
///
/// Main method of the application. It handles command-line input, performs obfuscation,
/// and saves the resulting obfuscated PE file.
///
/// The command-line arguments passed to the application.
static void Main(string[] args) {
// Display tool info on start, with colorful terminal output.
Logging.Write("/CLR(WHITE)\n" +
" █████╗ ███████╗████████╗██████╗ █████╗ ██╗/CLR(DARKGRAY) ██████╗ ███████╗/CLR(WHITE)\n" +
" ██╔══██╗██╔════╝╚══██╔══╝██╔══██╗██╔══██╗██║/CLR(DARKGRAY) ██╔══██╗██╔════╝/CLR(WHITE)\n" +
" ███████║███████╗ ██║ ██████╔╝███████║██║/CLR(DARKGRAY) █████╗ ██████╔╝█████╗ /CLR(WHITE)\n" +
" ██╔══██║╚════██║ ██║ ██╔══██╗██╔══██║██║/CLR(DARKGRAY) ╚════╝ ██╔═══╝ ██╔══╝ /CLR(WHITE)\n" +
" ██║ ██║███████║ ██║ ██║ ██║██║ ██║███████╗/CLR(DARKGRAY) ██║ ███████╗/CLR(WHITE)\n" +
" ╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝/CLR(DARKGRAY) ╚═╝ ╚══════╝/CLR(WHITE)\n" +
" /CLR(GRAY)Advanced utility for mutation (shallow obfuscation) of PE files.\n" +
" GitHub: /CLR(BLUE)https://github.com/DosX-dev/Astral-PE/CLR(WHITE)\n");
// If no arguments are provided or the user asks for help, show the usage message.
if (args.Length == 0 || args.Contains("-h") || args.Contains("--help")) {
Logging.Write("/CLR(CYAN)[?] /CLR(WHITE)Usage: /CLR(YELLOW) [-o|--output ]");
return;
}
// Extract input file path from command-line arguments.
string inputPath = args[0];
// Check if the input file exists.
if (!File.Exists(inputPath)) {
Logging.Write("/CLR(RED)[!] File not found:/CLR(WHITE) " + inputPath);
return;
}
// Default output path setup.
string outputPath = Path.Combine(
Path.GetDirectoryName(inputPath) ?? "",
Path.GetFileNameWithoutExtension(inputPath) + "_ast" + Path.GetExtension(inputPath)
);
// Check if the user provided a custom output path via -o or --output arguments.
for (int i = 1; i < args.Length - 1; i++) {
if (args[i] == "-o" || args[i] == "--output") {
outputPath = args[i + 1];
break;
}
}
try {
// Read the raw bytes from the input file.
byte[] raw = File.ReadAllBytes(inputPath);
// Create a PeFile object for PE file parsing and manipulation.
PeFile pe = new PeFile(raw);
// Initialize the random number generator for any random operations.
Random rnd = new Random();
// Log the start of the obfuscation process.
Logging.Write("/CLR(CYAN)[@] /CLR(WHITE)Obfuscating: /CLR(GRAY)" + inputPath);
// Create a PeObfuscator instance and apply obfuscation.
PeMutator? obfuscator = new PeMutator(raw, pe, rnd, inputPath);
raw = obfuscator.Apply();
try {
// Write the obfuscated data to the output file.
File.WriteAllBytes(outputPath, raw);
using (var fs = new FileStream(outputPath, FileMode.Append, FileAccess.Write))
fs.WriteByte(0x00);
// Log the completion and the output path of the obfuscated file.
Logging.Write("/CLR(GREEN)[+] /CLR(WHITE)Saved as: /CLR(GRAY)" + outputPath);
} catch (Exception ex) {
Logging.Write("/CLR(RED)[!] Failed to save the obfuscated file: " + ex.Message);
}
} catch (Exception ex) {
Logging.Write("/CLR(RED)[!] An error occurred during obfuscation: " + ex.Message);
}
}
}
}