Adversarial C2 Protocol Implemented in Zig
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Chunk stdin

+31 -12
+31 -12
src/main.zig
··· 51 51 if (i < args.len) { 52 52 flags.relay = args[i]; 53 53 } else { 54 - std.debug.print("-r/--relay requires a string\n", .{}); 55 - return error.InvalidArguments; 54 + flags.relay = ""; 56 55 } 57 56 }, 58 57 .dest => { ··· 94 93 defer client.deinit(); 95 94 96 95 if (flags.relay != null) { 97 - var chunk_writer: Writer = blk: { 98 - var buf: [2048]u8 = undefined; 99 - break :blk .fixed(&buf); 100 - }; 101 - var output_iter = std.mem.window(u8, flags.relay.?, SaprusClient.max_payload_len, SaprusClient.max_payload_len); 102 - while (output_iter.next()) |chunk| { 103 - chunk_writer.end = 0; 104 - try chunk_writer.print("{b64}", .{chunk}); 105 - try client.sendRelay(init.io, chunk_writer.buffered(), parseDest(flags.dest)); 106 - try init.io.sleep(.fromMilliseconds(40), .real); 96 + var chunk_writer_buf: [2048]u8 = undefined; 97 + var chunk_writer: Writer = .fixed(&chunk_writer_buf); 98 + if (flags.relay.?.len > 0) { 99 + var output_iter = std.mem.window(u8, flags.relay.?, SaprusClient.max_payload_len, SaprusClient.max_payload_len); 100 + while (output_iter.next()) |chunk| { 101 + chunk_writer.end = 0; 102 + try chunk_writer.print("{b64}", .{chunk}); 103 + try client.sendRelay(init.io, chunk_writer.buffered(), parseDest(flags.dest)); 104 + try init.io.sleep(.fromMilliseconds(40), .real); 105 + } 106 + } else { 107 + var stdin_file: std.Io.File = .stdin(); 108 + var stdin_file_reader = stdin_file.reader(init.io, &.{}); 109 + var stdin_reader = &stdin_file_reader.interface; 110 + var lim_buf: [SaprusClient.max_payload_len]u8 = undefined; 111 + var limited = stdin_reader.limited(.limited(10 * lim_buf.len), &lim_buf); 112 + var stdin = &limited.interface; 113 + 114 + while (stdin.fillMore()) { 115 + chunk_writer.end = 0; 116 + try chunk_writer.print("{b64}", .{stdin.buffered()}); 117 + try client.sendRelay(init.io, chunk_writer.buffered(), parseDest(flags.dest)); 118 + try init.io.sleep(.fromMilliseconds(40), .real); 119 + try stdin.discardAll(stdin.end); 120 + } else |err| switch (err) { 121 + error.EndOfStream => { 122 + log.debug("end of stdin", .{}); 123 + }, 124 + else => |e| return e, 125 + } 107 126 } 108 127 return; 109 128 }