summary refs log tree commit diff
path: root/src/main.rs
diff options
context:
space:
mode:
authortzlil <tzlils@protonmail.com>2023-03-22 01:08:16 +0200
committertzlil <tzlils@protonmail.com>2023-03-22 01:08:16 +0200
commit2246c9e8a73fee10dc8ffcfe178538ff678df8bc (patch)
tree0b39a8bef7b584b2559dc916d63de7e0e2baae5f /src/main.rs
parentf9c58b9d960124a0e84a399333c19f1fa8e4b838 (diff)
add program headers
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs68
1 files changed, 50 insertions, 18 deletions
diff --git a/src/main.rs b/src/main.rs
index 5e6a07c..6032500 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,7 +1,9 @@
 // #![allow(incomplete_features)]
 // #![feature(unsized_locals)]
 mod structs;
-use crate::structs::{ElfHeader, ElfSectionHeader, ElfSectionType, ElfSymbol};
+use crate::structs::{
+    ElfHeader, ElfProgramHeader, ElfProgramType, ElfSectionHeader, ElfSectionType, ElfSymbol,
+};
 use std::io::Read;
 
 #[repr(C)]
@@ -10,7 +12,9 @@ struct Elf {
     header: &'static ElfHeader,
     sections: &'static [ElfSectionHeader],
     symbols: &'static [ElfSymbol],
-    strtab: *const u8,
+    programs: &'static [ElfProgramHeader],
+    shstrtab: *const u8,
+    start: *const u8,
 }
 
 impl Elf {
@@ -25,17 +29,25 @@ impl Elf {
             )
         };
 
-        let strtab = unsafe {
+        let shstrtab = unsafe {
             bytes
                 .as_ptr()
                 .add((&sections[header.shstrndx as usize]).offset as usize)
         };
 
+        let programs = unsafe {
+            std::slice::from_raw_parts(
+                bytes.as_ptr().add(header.phoff as usize) as *const ElfProgramHeader,
+                header.phnum as usize,
+            )
+        };
+        // dbg!(program);
+
         let symtab = sections
             .iter()
             .find(|&&sec| sec.r#type == ElfSectionType::SymTab)
             .expect("No symbol table!");
-        //dbg!(&sections[symtab.link as usize]);
+        // //dbg!(&sections[symtab.link as usize]);
         let symstrtab = &sections[symtab.link as usize];
         let symbols = unsafe {
             std::slice::from_raw_parts(
@@ -48,26 +60,28 @@ impl Elf {
         // .iter()
         // .filter(|sym| sym.shndx != 0)
         // .filter_map(|sym| unsafe {
-            // std::ffi::CStr::from_ptr(std::ptr::addr_of!(symstrtab).add(sym.name as usize) as *const i8).to_str().ok()
+        // std::ffi::CStr::from_ptr(std::ptr::addr_of!(symstrtab).add(sym.name as usize) as *const i8).to_str().ok()
         // })
         // .filter(|name| name.len() > 1)
         // .collect();
         // dbg!(symbols);
-        for sym in symbols {
-        //     dbg!(sym);
-            let name = unsafe {
-                std::ffi::CStr::from_ptr(bytes.as_ptr().add(symstrtab.offset as usize).add(sym.name as usize) as *const i8)
-                    .to_str()
-                    .unwrap_or("")
-            };
-            dbg!(name);
-        }
+        // for sym in symbols {
+        // // //     dbg!(sym);
+        //     let name = unsafe {
+        //        std::ffi::CStr::from_ptr(bytes.as_ptr().add(symstrtab.offset as usize).add(sym.name as usize) as *const i8)
+        //             .to_str()
+        //             .unwrap_or("")
+        //     };
+        //     dbg!(name);
+        // }
 
         Elf {
             header,
             sections,
             symbols,
-            strtab,
+            programs,
+            shstrtab,
+            start: bytes.as_ptr(),
         }
     }
 }
@@ -86,7 +100,7 @@ impl std::fmt::Display for Elf {
 
         for (i, section) in self.sections.iter().enumerate() {
             let name = unsafe {
-                std::ffi::CStr::from_ptr(self.strtab.add(section.name as usize) as *const i8)
+                std::ffi::CStr::from_ptr(self.shstrtab.add(section.name as usize) as *const i8)
                     .to_str()
                     .expect("Bad section name")
             };
@@ -101,7 +115,25 @@ impl std::fmt::Display for Elf {
             "  L (link order), O (extra OS processing required), G (group), T (TLS),\n",
         )?;
         formatter.write_str("  C (compressed), x (unknown), o (OS specific), E (exclude),\n")?;
-        formatter.write_str("  D (mbind), l (large), p (processor specific)\n")?;
+        formatter.write_str("  D (mbind), l (large), p (processor specific)\n\n")?;
+
+        formatter.write_str("Program Headers:\n")?;
+        formatter.write_str("  Type           Offset             VirtAddr           PhysAddr\n")?;
+        formatter
+            .write_str("                 FileSiz            MemSiz              Flags  Align\n")?;
+        for program in self.programs {
+            formatter.write_fmt(format_args!("  {}\n", program));
+            if program.r#type == ElfProgramType::Interp {
+                let interpreter = unsafe {
+                    std::ffi::CStr::from_ptr(self.start.add(program.offset as usize) as *const i8)
+                        .to_str()
+                        .expect("Bad interpreter name")
+                };
+                formatter.write_fmt(format_args!(
+                    "      [Requesting program interpreter: {interpreter}]\n"
+                ));
+            }
+        }
         Ok(())
     }
 }
@@ -117,7 +149,7 @@ fn main() {
         buffer
     };
     let elf = Elf::new(&buffer[..]);
-    // println!("{}", elf);
+    println!("{}", elf);
 
     // dbg!(symtab);
 }