From 836d35e76914c89aed2d74b62094163daf00db1f Mon Sep 17 00:00:00 2001 From: cpz <1337@live.it> Date: Wed, 15 Jul 2020 16:06:12 +0300 Subject: [PATCH] Release --- .gitignore | 118 ++++++++++++++++++++ .taskkey | 1 + LICENSE => LICENSE.md | 0 README.md | 16 ++- images/extension-logo.jpg | Bin 0 -> 7303 bytes sb-task/package-lock.json | 220 ++++++++++++++++++++++++++++++++++++++ sb-task/package.json | 31 ++++++ sb-task/task.js | 200 ++++++++++++++++++++++++++++++++++ sb-task/task.json | 93 ++++++++++++++++ sb-task/tsconfig.json | 69 ++++++++++++ vss-extension.json | 45 ++++++++ 11 files changed, 791 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100644 .taskkey rename LICENSE => LICENSE.md (100%) create mode 100644 images/extension-logo.jpg create mode 100644 sb-task/package-lock.json create mode 100644 sb-task/package.json create mode 100644 sb-task/task.js create mode 100644 sb-task/task.json create mode 100644 sb-task/tsconfig.json create mode 100644 vss-extension.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ac5ebf8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,118 @@ + +# Created by https://www.toptal.com/developers/gitignore/api/node +# Edit at https://www.toptal.com/developers/gitignore?templates=node + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# Sigbench +*.vsix +task.ts + +# End of https://www.toptal.com/developers/gitignore/api/node diff --git a/.taskkey b/.taskkey new file mode 100644 index 0000000..359b14f --- /dev/null +++ b/.taskkey @@ -0,0 +1 @@ +809ef638-f710-4688-9124-506475b245b4 \ No newline at end of file diff --git a/LICENSE b/LICENSE.md similarity index 100% rename from LICENSE rename to LICENSE.md diff --git a/README.md b/README.md index 7819bdd..73929e4 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,14 @@ -# sigbench -Azure DevOps Extension to signature bench your files. +# Signature Benchmark (short: Sigbench) +![Sigbench logo](https://raw.githubusercontent.com/cpz/sigbench/master/images/extension-logo.jpg) + +Sigbench is extension for Azure Pipelines. + +## Test your binary files against signature scans. +It will give you percent of difference and intersection. Difference percent higher is better meanwhile intersection otherwise. +It will also give you the signatures that matched both binaries. (Enable it in Signature Benchmark Advanced - Print Matched). + +## Contributing +Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. + +## License +[MIT](https://choosealicense.com/licenses/mit/) \ No newline at end of file diff --git a/images/extension-logo.jpg b/images/extension-logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e4686eb629ee613bc7e44b747c80456a55ed17a4 GIT binary patch literal 7303 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 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var fs = __importStar(require("fs")); +var tl = __importStar(require("azure-pipelines-task-lib/task")); +var sigSize = tl.getInput('sigSize', true); // size of signatures +var percentPrecise = tl.getInput('percentPrecise', true); // percent precise +var file1 = tl.getPathInput('file1', true); // file 1 to compare +var file2 = tl.getPathInput('file2', true); // file 2 to compare +var print_matched = tl.getBoolInput('printMatched', true); // prints in console Signatures which similiar +var custom_Var = tl.getBoolInput('customVar', true); // creates variable $(Sigbench.Percent) +var f1 = []; +var f2 = []; +function GetSigFiles(inputFile, SigArray) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + console.log("##[debug]GetSigFiles()::" + inputFile); + return [2 /*return*/, new Promise(function (resolve, reject) { + var fetchData = []; + fs.createReadStream(inputFile, { highWaterMark: sigSize }) + .on('data', function (chunk) { + SigArray.push(chunk); + }) + .on('end', function () { + resolve(fetchData); + }) + .on('error', reject); + })]; + }); + }); +} +function difference(a1, a2) { + var a = [], diff = []; + for (var i = 0; i < a1.length; i++) + a[a1[i]] = a1[i]; + for (var i = 0; i < a2.length; i++) + if (a[a2[i]]) + delete a[a2[i]]; + else + a[a2[i]] = a2[i]; + for (var k in a) + diff.push(a[k]); + return diff; +} +function intersect(a, b) { + var ai = 0, bi = 0; + var result = []; + while (ai < a.length && bi < b.length) { + if (a[ai] < b[bi]) { + ai++; + } + else if (a[ai] > b[bi]) { + bi++; + } + else /* they're equal */ { + result.push(a[ai]); + ai++; + bi++; + } + } + return result; +} +// https://stackoverflow.com/a/18650828 +function formatBytes(bytes, decimals) { + if (decimals === void 0) { decimals = 2; } + if (bytes === 0) + return '0 Bytes'; + var k = 1024; + var dm = decimals < 0 ? 0 : decimals; + var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; + var i = Math.floor(Math.log(bytes) / Math.log(k)); + return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; +} +function precise(x, precision) { + if (precision === void 0) { precision = 4; } + return Number.parseFloat(x).toPrecision(precision); +} +// Start function +function run() { + return __awaiter(this, void 0, void 0, function () { + var f1_size, f2_size, inter, inter_arr_debug, inter_arr_command, inter_length, diff, diff_arr_debug, diff_length, DifferencePercent, IntersectionPercent, err_1; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + _a.trys.push([0, 3, , 4]); + return [4 /*yield*/, GetSigFiles(file1, f1)]; + case 1: + _a.sent(); + return [4 /*yield*/, GetSigFiles(file2, f2)]; + case 2: + _a.sent(); + f1_size = f1.length * sigSize; + f2_size = f2.length * sigSize; + console.log('##[group]Information about files. (debug only)'); + console.log('##[debug]Signature Size (block size): ', sigSize); + console.log('##[debug]File 1 Signatures (total blocks in file 1): ', f1.length); + console.log('##[debug]File 2 Size: ', formatBytes(f1_size)); + console.log('##[debug]File 2 Signatures (total blocks in file 2): ', f2.length); + console.log('##[debug]File 2 Size: ', formatBytes(f2_size)); + console.log('##[debug]Total Signatures (blocks): ', f1.length + f2.length); + console.log('##[debug]Total Size: ', formatBytes(f1_size + f2_size)); + console.log('##[endgroup]'); + inter = intersect(f1, f2); + inter_arr_debug = inter.map(function (i) { return '##[debug]' + i; }); + console.log('##[group]Found Signtures (inter). (debug only)'); + console.log(inter_arr_debug); + console.log('##[endgroup]'); + if (print_matched) { + console.log('##[command]Signature Benchmark | Matched signatures: '); + inter_arr_command = inter.map(function (i) { return '##[command]' + i; }); + console.log(inter_arr_command); + } + else { + console.log('##[debug]Print Intersection set to false'); + } + inter_length = inter.length; + console.log('##[debug]Found Signtures Num (inter length): ', inter_length); + diff = difference(f1, f2); + diff_arr_debug = diff.map(function (i) { return '##[debug]' + i; }); + console.log('##[group]Found Signtures (diff). (debug only)'); + console.log(diff_arr_debug); + console.log('##[endgroup]'); + diff_length = diff.length; + console.log('##[debug]Found Signtures Num (diff length): ', diff_length); + DifferencePercent = 100 - diff_length / f2.length; + console.log('##[command]Difference Percent: ', DifferencePercent + '%'); + IntersectionPercent = inter_length / (f2.length + f1.length - inter_length); + console.log('##[command]Intersection Percent: ', IntersectionPercent + '%'); + if (custom_Var) { + tl.setVariable('Sigbench.DiffPercent', precise(DifferencePercent, percentPrecise)); + tl.setVariable('Sigbench.InterPercent', precise(IntersectionPercent, percentPrecise)); + } + else { + console.log('##[debug]Create Variables set to false'); + } + return [3 /*break*/, 4]; + case 3: + err_1 = _a.sent(); + tl.setResult(tl.TaskResult.Failed, err_1.message); + return [3 /*break*/, 4]; + case 4: return [2 /*return*/]; + } + }); + }); +} +run(); diff --git a/sb-task/task.json b/sb-task/task.json new file mode 100644 index 0000000..a9dd601 --- /dev/null +++ b/sb-task/task.json @@ -0,0 +1,93 @@ +{ + "id": "2eadfaf9-a99a-4a51-9815-6935b5aa39fe", + "name": "sigbench", + "friendlyName": "Signature Benchmark", + "description": "Azure DevOps Extension to signature benchmark your files.", + "author": "Konstantin 'cpz' L.", + "helpMarkDown": "https://github.com/cpz/sigbench", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "demands": [], + "version": { + "Major": "1", + "Minor": "0", + "Patch": "52" + }, + "minimumAgentVersion": "1.95.0", + "instanceNameFormat": "Signature Benchmark", + "groups": [{ + "name": "SigbenchConfig", + "displayName": "Signature Benchmark Configuration", + "isExpanded": true + }, + { + "name": "SigbenchData", + "displayName": "Signature Benchmark Advanced", + "isExpanded": false + } + ], + "inputs": [{ + "name": "sigSize", + "type": "string", + "label": "Signature Sizes", + "defaultValue": "32", + "required": true, + "groupName": "SigbenchConfig", + "helpMarkDown": "Signature Sizes (default: 32 or 34, because this length used by Battleye)" + }, + { + "name": "file1", + "type": "filePath", + "label": "File 1 to Compare", + "defaultValue": "**/*.dll", + "required": true, + "groupName": "SigbenchConfig", + "helpMarkDown": "Type path to file 1 to compare" + }, + { + "name": "file2", + "type": "filePath", + "label": "File 2 to Compare", + "defaultValue": "**/*.dll", + "required": true, + "groupName": "SigbenchConfig", + "helpMarkDown": "Type path to file 2 to compare" + }, + { + "name": "customVar", + "type": "boolean", + "label": "Create Variables", + "defaultValue": "false", + "required": false, + "groupName": "SigbenchData", + "helpMarkDown": "Creates variable $(Sigbench.DiffPercent) and $(Sigbench.InterPercent) which provides information about difference and intersection percentage. Example: 99.68362902369064 (difference) or 0.21652039927647887 (intersection)." + }, + { + "name": "printMatched", + "type": "boolean", + "label": "Print Matched Signatures", + "defaultValue": "false", + "required": false, + "groupName": "SigbenchData", + "helpMarkDown": "Prints signatures that matched both binaries." + }, + { + "name": "percentPrecise", + "type": "string", + "label": "Percent Precise", + "defaultValue": "4", + "required": false, + "groupName": "SigbenchData", + "helpMarkDown": "Changes Percent Precise (default: 4). Example: 99.68" + } + ], + "execution": { + "Node": { + "target": "task.js", + "argumentFormat": "" + } + } +} \ No newline at end of file diff --git a/sb-task/tsconfig.json b/sb-task/tsconfig.json new file mode 100644 index 0000000..c9f603c --- /dev/null +++ b/sb-task/tsconfig.json @@ -0,0 +1,69 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ + "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ + // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + // "outDir": "./", /* Redirect output structure to the directory. */ + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + "skipLibCheck": true, /* Skip type checking of declaration files. */ + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + } +} diff --git a/vss-extension.json b/vss-extension.json new file mode 100644 index 0000000..85a859b --- /dev/null +++ b/vss-extension.json @@ -0,0 +1,45 @@ +{ + "manifestVersion": 1, + "id": "sigbench", + "publisher": "cpz", + "version": "1.0.52", + "name": "Sigbench", + "description": "Azure DevOps Extension to signature benchmark your files.", + "public": false, + "demands": ["api-version/3.0"], + "categories": ["Azure Pipelines"], + "targets": [ + { + "id": "Microsoft.VisualStudio.Services" + } + ], + "icons": { + "default": "images/extension-logo.jpg" + }, + "content": { + "details": { + "path": "README.md" + }, + "license": { + "path": "LICENSE.md" + } + }, + "contributions": [ + { + "id": "sigbench-task", + "type": "ms.vss-distributed-task.task", + "targets": [ + "ms.vss-distributed-task.task" + ], + "properties": { + "name": "sb-task" + } + } + ], + "files": [ + { + "path": "sb-task", + "addressable": true + } + ] +}