myph~ shellcode loader for your evasion needs |
| git clone https://github.com/matro7sh/myph.git |
| log | files | refs | archive | README | LICENSE |
crypting.go (5166B)
1 package tools 2 3 import ( 4 "crypto/aes" 5 "crypto/cipher" 6 "crypto/rand" 7 "errors" 8 "fmt" 9 "io" 10 11 "golang.org/x/crypto/blowfish" 12 "golang.org/x/crypto/chacha20poly1305" 13 ) 14 15 func GetChacha20Template() string { 16 return fmt.Sprintf(` 17 package main 18 19 import ( 20 "golang.org/x/crypto/chacha20poly1305" 21 22 "errors" 23 ) 24 25 func Decrypt(toDecrypt []byte, key []byte) ([]byte, error) { 26 enc, err := chacha20poly1305.NewX(key) 27 if err != nil { 28 return []byte{}, err 29 } 30 31 nonceSize := enc.NonceSize() 32 if len(toDecrypt) < nonceSize { 33 return nil, errors.New("Ciphertext too short") 34 } 35 36 nonce, ciphertext := toDecrypt[:nonceSize], toDecrypt[nonceSize:] 37 return enc.Open(nil, nonce, ciphertext, nil) 38 } 39 `) 40 } 41 42 func GetBlowfishTemplate() string { 43 return fmt.Sprintf(` 44 package main 45 46 import ( 47 "golang.org/x/crypto/blowfish" 48 49 "crypto/cipher" 50 ) 51 52 func Decrypt(toDecrypt []byte, key []byte) ([]byte, error) { 53 dcipher, err := blowfish.NewCipher(key) 54 if err != nil { 55 return []byte{}, err 56 } 57 58 div := toDecrypt[:blowfish.BlockSize] 59 decrypted := toDecrypt[blowfish.BlockSize:] 60 dcbc := cipher.NewCBCDecrypter(dcipher, div) 61 dcbc.CryptBlocks(decrypted, decrypted) 62 63 return decrypted, nil 64 } 65 `) 66 } 67 68 func GetAESTemplate() string { 69 return fmt.Sprintf(` 70 package main 71 72 import ( 73 "crypto/aes" 74 "crypto/cipher" 75 "errors" 76 ) 77 78 func Decrypt(encrypted []byte, key []byte) ([]byte, error) { 79 c, err := aes.NewCipher(key) 80 if err != nil { 81 return nil, err 82 } 83 84 gcm, err := cipher.NewGCM(c) 85 if err != nil { 86 return nil, err 87 } 88 89 nonceSize := gcm.NonceSize() 90 if len(encrypted) < nonceSize { 91 return nil, errors.New("ciphertext too short") 92 } 93 94 nonce, ciphertext := encrypted[:nonceSize], encrypted[nonceSize:] 95 return gcm.Open(nil, nonce, ciphertext, nil) 96 } 97 `) 98 } 99 100 func GetXORTemplate() string { 101 return fmt.Sprintf(` 102 package main 103 104 func Decrypt(toDecrypt []byte, key []byte) ([]byte, error) { 105 encrypted := make([]byte, len(toDecrypt)) 106 keyLen := len(key) 107 108 for i, b := range toDecrypt { 109 encrypted[i] = b ^ key[i %% keyLen] 110 } 111 return encrypted, nil 112 } 113 `) 114 } 115 116 func DecryptChacha20(toDecrypt []byte, key []byte) ([]byte, error) { 117 enc, err := chacha20poly1305.NewX(key) 118 if err != nil { 119 return []byte{}, err 120 } 121 122 nonceSize := enc.NonceSize() 123 if len(toDecrypt) < nonceSize { 124 return nil, errors.New("Ciphertext too short") 125 } 126 127 nonce, ciphertext := toDecrypt[:nonceSize], toDecrypt[nonceSize:] 128 return enc.Open(nil, nonce, ciphertext, nil) 129 } 130 131 func EncryptChacha20(toCrypt []byte, key []byte) ([]byte, error) { 132 133 enc, err := chacha20poly1305.NewX(key) 134 if err != nil { 135 return []byte{}, err 136 } 137 138 nonce := make([]byte, enc.NonceSize()) 139 _, err = io.ReadFull(rand.Reader, nonce) 140 if err != nil { 141 return []byte{}, err 142 } 143 144 return enc.Seal(nonce, nonce, toCrypt, nil), nil 145 } 146 147 func EncryptBlowfish(toCrypt []byte, key []byte) ([]byte, error) { 148 149 /* 150 let's add the required padding :)~ 151 source: https://stackoverflow.com/a/46747195 152 */ 153 154 modulus := len(toCrypt) % blowfish.BlockSize 155 if modulus != 0 { 156 padlen := blowfish.BlockSize - modulus 157 for i := 0; i < padlen; i++ { 158 toCrypt = append(toCrypt, 0) 159 } 160 } 161 162 ecipher, err := blowfish.NewCipher(key) 163 if err != nil { 164 return []byte{}, err 165 } 166 167 ciphertext := make([]byte, blowfish.BlockSize+len(toCrypt)) 168 eiv := ciphertext[:blowfish.BlockSize] 169 ecbc := cipher.NewCBCEncrypter(ecipher, eiv) 170 ecbc.CryptBlocks(ciphertext[blowfish.BlockSize:], toCrypt) 171 172 return ciphertext, nil 173 } 174 175 func DecryptBlowfish(toDecrypt []byte, key []byte) ([]byte, error) { 176 dcipher, err := blowfish.NewCipher(key) 177 if err != nil { 178 return []byte{}, err 179 } 180 181 div := toDecrypt[:blowfish.BlockSize] 182 decrypted := toDecrypt[blowfish.BlockSize:] 183 dcbc := cipher.NewCBCDecrypter(dcipher, div) 184 dcbc.CryptBlocks(decrypted, decrypted) 185 186 return decrypted, nil 187 } 188 189 func EncryptXOR(toEncrypt []byte, key []byte) ([]byte, error) { 190 encrypted := make([]byte, len(toEncrypt)) 191 keyLen := len(key) 192 193 for i, b := range toEncrypt { 194 encrypted[i] = b ^ key[i%keyLen] 195 } 196 return encrypted, nil 197 } 198 199 func DecryptXOR(toDecrypt []byte, key []byte) ([]byte, error) { 200 encrypted := make([]byte, len(toDecrypt)) 201 keyLen := len(key) 202 203 for i, b := range toDecrypt { 204 encrypted[i] = b ^ key[i%keyLen] 205 } 206 return encrypted, nil 207 } 208 209 func EncryptAES(toEncrypt []byte, key []byte) ([]byte, error) { 210 c, err := aes.NewCipher(key) 211 if err != nil { 212 return nil, err 213 } 214 215 gcm, err := cipher.NewGCM(c) 216 if err != nil { 217 return nil, err 218 } 219 220 nonce := make([]byte, gcm.NonceSize()) 221 if _, err = io.ReadFull(rand.Reader, nonce); err != nil { 222 return nil, err 223 } 224 225 return gcm.Seal(nonce, nonce, toEncrypt, nil), nil 226 } 227 228 func DecryptAES(encrypted []byte, key []byte) ([]byte, error) { 229 c, err := aes.NewCipher(key) 230 if err != nil { 231 return nil, err 232 } 233 234 gcm, err := cipher.NewGCM(c) 235 if err != nil { 236 return nil, err 237 } 238 239 nonceSize := gcm.NonceSize() 240 if len(encrypted) < nonceSize { 241 return nil, errors.New("ciphertext too short") 242 } 243 244 nonce, ciphertext := encrypted[:nonceSize], encrypted[nonceSize:] 245 return gcm.Open(nil, nonce, ciphertext, nil) 246 }