Adversarial C2 Protocol Implemented in Zig
0
fork

Configure Feed

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

Simplify RawSocketWriter

Does not need to use an allocator anymor.
Just uses the internal buffer properly.

+13 -27
+12 -26
src/RawSocketWriter.zig
··· 1 1 const std = @import("std"); 2 2 const gcat = @import("gatorcat"); 3 - const Writer = @This(); 3 + const RawSocketWriter = @This(); 4 + const Writer = std.Io.Writer; 4 5 const assert = std.debug.assert; 5 6 6 - interface: std.Io.Writer, 7 + interface: Writer, 7 8 socket: gcat.nic.RawSocket, 8 - alloc: std.mem.Allocator, 9 9 10 - fn drain(io_w: *std.Io.Writer, data: []const []const u8, splat: usize) std.Io.Writer.Error!usize { 11 - const w: *Writer = @alignCast(@fieldParentPtr("interface", io_w)); 10 + fn drain(io_w: *std.Io.Writer, data: []const []const u8, splat: usize) Writer.Error!usize { 11 + const w: *RawSocketWriter = @alignCast(@fieldParentPtr("interface", io_w)); 12 + const rem_buf = io_w.unusedCapacitySlice(); 13 + var rem_w = Writer.fixed(rem_buf); 14 + const res = rem_w.writeSplat(data, splat) catch rem_buf.len; 15 + io_w.advance(res); 12 16 const buffered = io_w.buffered(); 13 - var res: usize = 0; 14 - if (buffered.len > 0) { 15 - w.socket.linkLayer().send(buffered) catch return error.WriteFailed; 16 - _ = io_w.consumeAll(); 17 - } 18 - 19 - for (data[0 .. data.len - 1]) |d| { 20 - w.socket.linkLayer().send(d) catch return error.WriteFailed; 21 - res += d.len; 22 - } 23 - 24 - if (splat > 0 and data[data.len - 1].len > 0) { 25 - var splatBuffer: std.ArrayList(u8) = .empty; 26 - defer splatBuffer.deinit(w.alloc); 27 - for (0..splat) |_| { 28 - splatBuffer.appendSlice(w.alloc, data[data.len - 1]) catch return error.WriteFailed; 29 - } 30 - w.socket.linkLayer().send(splatBuffer.items) catch return error.WriteFailed; 31 - } 17 + w.socket.linkLayer().send(buffered) catch return error.WriteFailed; 18 + _ = io_w.consumeAll(); 32 19 33 20 return res; 34 21 } 35 22 36 - pub fn init(interface_name: [:0]const u8, buffer: []u8, alloc: std.mem.Allocator) !Writer { 23 + pub fn init(interface_name: [:0]const u8, buffer: []u8) !RawSocketWriter { 37 24 return .{ 38 25 .interface = .{ 39 26 .vtable = &.{ .drain = drain }, 40 27 .buffer = buffer, 41 28 }, 42 29 .socket = try .init(interface_name), 43 - .alloc = alloc, 44 30 }; 45 31 }
+1 -1
src/main.zig
··· 47 47 } 48 48 49 49 var sock_buffer: [2048]u8 = undefined; 50 - var rawSocketWriter: RawSocketWriter = try .init("enp7s0", &sock_buffer, gpa); // /proc/net/dev 50 + var rawSocketWriter: RawSocketWriter = try .init("enp7s0", &sock_buffer); // /proc/net/dev 51 51 var client = try SaprusClient.init(&rawSocketWriter.interface); 52 52 defer client.deinit(); 53 53