petriage 0.5.0

Cross-platform PE file surface analysis tool for malware analysts
Documentation
use egui::{Color32, Ui};

use crate::analysis::AnalysisResult;

const ACCENT: Color32 = Color32::from_rgb(0, 210, 255);
const LABEL: Color32 = Color32::from_rgb(120, 130, 150);
const WARNING: Color32 = Color32::from_rgb(230, 190, 50);

pub fn show(ui: &mut Ui, result: &AnalysisResult) {
    let tls = match result.tls {
        Some(ref t) => t,
        None => {
            ui.colored_label(LABEL, "No TLS Directory found in this PE file.");
            return;
        }
    };

    ui.colored_label(ACCENT, egui::RichText::new("TLS DIRECTORY").size(14.0));
    ui.add_space(6.0);

    egui::Grid::new("tls_grid")
        .num_columns(2)
        .spacing([16.0, 6.0])
        .show(ui, |ui| {
            ui.colored_label(LABEL, "RawDataStart:");
            ui.monospace(&tls.raw_data_start);
            ui.end_row();

            ui.colored_label(LABEL, "RawDataEnd:");
            ui.monospace(&tls.raw_data_end);
            ui.end_row();

            ui.colored_label(LABEL, "AddressOfIndex:");
            ui.monospace(&tls.address_of_index);
            ui.end_row();

            ui.colored_label(LABEL, "AddressOfCallBacks:");
            ui.monospace(&tls.address_of_callbacks);
            ui.end_row();

            ui.colored_label(LABEL, "SizeOfZeroFill:");
            ui.monospace(format!("{:#x}", tls.size_of_zero_fill));
            ui.end_row();

            ui.colored_label(LABEL, "Characteristics:");
            ui.monospace(format!("{:#x}", tls.characteristics));
            ui.end_row();

            ui.colored_label(LABEL, "Callbacks:");
            if tls.callback_count > 0 {
                ui.colored_label(WARNING, format!("{}", tls.callback_count));
            } else {
                ui.monospace("0");
            }
            ui.end_row();
        });

    if !tls.callbacks.is_empty() {
        ui.add_space(10.0);
        ui.colored_label(ACCENT, egui::RichText::new("CALLBACK ADDRESSES").size(12.0));
        ui.add_space(4.0);

        for (i, cb) in tls.callbacks.iter().enumerate() {
            ui.horizontal(|ui| {
                ui.colored_label(LABEL, format!("  [{}]", i));
                ui.monospace(cb);
            });
        }
    }
}