diff options
| author | Gabriel Schneider <[email protected]> | 2026-02-19 21:46:04 -0300 |
|---|---|---|
| committer | Gabriel Schneider <[email protected]> | 2026-02-19 21:46:04 -0300 |
| commit | b17c9042060156c8b2bf6fe91ebcd6292c8419a6 (patch) | |
| tree | 5fd216621867fff6b544447dc8d91d09e548cebf /src | |
| parent | 632a8daeb6377bdfde47cf83dcffd116d88e999a (diff) | |
| download | codenomicon-b17c9042060156c8b2bf6fe91ebcd6292c8419a6.tar.gz codenomicon-b17c9042060156c8b2bf6fe91ebcd6292c8419a6.zip | |
added simple frida-gum build
Diffstat (limited to 'src')
| -rw-r--r-- | src/elfo-pretty.zig | 103 |
1 files changed, 57 insertions, 46 deletions
diff --git a/src/elfo-pretty.zig b/src/elfo-pretty.zig index ea0b246..1482670 100644 --- a/src/elfo-pretty.zig +++ b/src/elfo-pretty.zig @@ -1,58 +1,29 @@ const std = @import("std"); const cs = @import("capstone"); -const SymbolRange = struct { - start: u64, - end: u64, - name: []u8, - kind: u8, -}; - -fn iterateSymbols( - h: std.elf.Header, - file_reader: *std.Io.File.Reader, - symtab: std.elf.Elf64_Shdr, -) SymbolIterator { - return .{ - .elf_header = h, - .file_reader = file_reader, - .symtab = symtab, - }; -} - -const SymbolIterator = struct { - elf_header: std.elf.Header, - file_reader: *std.Io.File.Reader, - symtab: std.elf.Elf64_Shdr, - index: usize = 0, - - pub fn next(it: *SymbolIterator) !?std.elf.Elf64_Sym { - defer it.index += 1; - - const size: u64 = if (it.elf_header.is_64) @sizeOf(std.elf.Elf64_Sym) else @sizeOf(std.elf.Elf64_Sym); - const offset = it.symtab.sh_offset + size * it.index; - - if (offset >= (it.symtab.sh_size + it.symtab.sh_offset)) - return null; - - try it.file_reader.seekTo(offset); - return try it.file_reader.interface.takeStruct(std.elf.Elf64_Sym, it.elf_header.endian); - } -}; - pub fn main(init: std.process.Init) !void { - // var args = init.environ_map.iterator(); - // _ = args.next(); // skip argv[0] + var args = try init.minimal.args.iterateAllocator(init.gpa); + defer args.deinit(); + _ = args.next(); // skip argv[0] var buffer: [64]u8 = undefined; const stderr = try init.io.lockStderr(&buffer, .escape_codes); + // TODO: finish passing custom alloc operations here + // const mem_config: cs.cs_opt_mem = undefined; + // std.debug.assert(cs.cs_option(0, cs.CS_OPT_MEM, @intFromPtr(&mem_config)) == cs.CS_ERR_OK); + + var handle: usize = undefined; + defer _ = cs.cs_close(@ptrCast(&handle)); + // TODO: read the arch from the elf so we open the equivalent capstone handle + std.debug.assert(cs.cs_open(cs.CS_ARCH_X86, cs.CS_MODE_64, @ptrCast(&handle)) == cs.CS_ERR_OK); + try printElf( init.gpa, init.io, - // args.next() orelse "./study-samples/split", - "./study-samples/split", + args.next() orelse "./study-samples/split", stderr.terminal(), + handle, .{ // .show_unaddressable_sections = true, // .skip_sections_content = true, @@ -65,6 +36,7 @@ pub fn printElf( io: std.Io, path: []const u8, term: std.Io.Terminal, + handle: usize, options: struct { show_unaddressable_sections: bool = false, skip_sections_content: bool = false, @@ -79,9 +51,6 @@ pub fn printElf( var reader = f.reader(io, buffer); const header = try std.elf.Header.read(&reader.interface); - var handle: usize = undefined; - std.debug.assert(cs.cs_open(cs.CS_ARCH_X86, cs.CS_MODE_64, @ptrCast(&handle)) == cs.CS_ERR_OK); - const shstrtab = blk: { var section_it = header.iterateSectionHeaders(&reader); var section_idx: u32 = 0; @@ -282,6 +251,9 @@ pub fn printElf( if (section.sh_type == std.elf.SHT_PROGBITS and (section.sh_flags & (std.elf.SHF_ALLOC | std.elf.SHF_EXECINSTR)) != 0) { const instrs: []cs.cs_insn = blk: { var insn: [*]cs.cs_insn = undefined; + // TODO: use iter API + // https://www.capstone-engine.org/iteration.html + // const count = cs.cs_disasm_iter(handle, section_slice.?.ptr, section_slice.?.len, section.sh_addr, @ptrCast(&insn)); const count = cs.cs_disasm(handle, section_slice.?.ptr, section_slice.?.len, section.sh_addr, 0, @ptrCast(&insn)); break :blk insn[0..count]; }; @@ -467,3 +439,42 @@ pub fn dumpHexFallible( try bw.writeByte('\n'); } } + +const SymbolRange = struct { + start: u64, + end: u64, + name: []u8, + kind: u8, +}; + +fn iterateSymbols( + h: std.elf.Header, + file_reader: *std.Io.File.Reader, + symtab: std.elf.Elf64_Shdr, +) SymbolIterator { + return .{ + .elf_header = h, + .file_reader = file_reader, + .symtab = symtab, + }; +} + +const SymbolIterator = struct { + elf_header: std.elf.Header, + file_reader: *std.Io.File.Reader, + symtab: std.elf.Elf64_Shdr, + index: usize = 0, + + pub fn next(it: *SymbolIterator) !?std.elf.Elf64_Sym { + defer it.index += 1; + + const size: u64 = if (it.elf_header.is_64) @sizeOf(std.elf.Elf64_Sym) else @sizeOf(std.elf.Elf64_Sym); + const offset = it.symtab.sh_offset + size * it.index; + + if (offset >= (it.symtab.sh_size + it.symtab.sh_offset)) + return null; + + try it.file_reader.seekTo(offset); + return try it.file_reader.interface.takeStruct(std.elf.Elf64_Sym, it.elf_header.endian); + } +}; |
