feat: added decomp command
This commit is contained in:
parent
2a10226a0e
commit
536612f356
3 changed files with 49 additions and 0 deletions
|
@ -23,3 +23,4 @@ nix = "0.26.2"
|
||||||
pretty-hex = "0.3"
|
pretty-hex = "0.3"
|
||||||
signal-hook = "0.3.15"
|
signal-hook = "0.3.15"
|
||||||
procfs = "0.15.1"
|
procfs = "0.15.1"
|
||||||
|
iced-x86 = "1.18.0"
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
use std::{ffi::{c_void, c_int}, num::NonZeroUsize, sync::atomic::{AtomicBool, Ordering}};
|
use std::{ffi::{c_void, c_int}, num::NonZeroUsize, sync::atomic::{AtomicBool, Ordering}};
|
||||||
|
|
||||||
|
use iced_x86::{Decoder, DecoderOptions, IntelFormatter, Instruction, Formatter};
|
||||||
use mlua::{Lua, Error, Variadic, Value, ToLua, Table};
|
use mlua::{Lua, Error, Variadic, Value, ToLua, Table};
|
||||||
use nix::sys::{mman::{mprotect, ProtFlags, mmap, MapFlags, munmap}, signal::{Signal::SIGSEGV, SigHandler}};
|
use nix::sys::{mman::{mprotect, ProtFlags, mmap, MapFlags, munmap}, signal::{Signal::SIGSEGV, SigHandler}};
|
||||||
use procfs::{process::{Process, MemoryMaps, TasksIter, Status, Task, MemoryMap}, ProcError, ProcResult};
|
use procfs::{process::{Process, MemoryMaps, TasksIter, Status, Task, MemoryMap}, ProcError, ProcResult};
|
||||||
|
@ -39,6 +40,52 @@ pub fn lua_hexdump(lua: &Lua, (bytes, ret): (Vec<u8>, Option<bool>)) -> Result<V
|
||||||
Ok(Value::Nil)
|
Ok(Value::Nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn padding(size: i32) -> String {
|
||||||
|
if size <= 0 {
|
||||||
|
"".into()
|
||||||
|
} else {
|
||||||
|
(0..size as usize).map(|_| " ").collect::<String>()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn lua_decomp(lua: &Lua, (bytes, ret): (Vec<u8>, Option<bool>)) -> Result<Value, Error> {
|
||||||
|
let ret_value = ret.unwrap_or(false);
|
||||||
|
let bitness = 8 * std::mem::size_of::<usize>() as u32;
|
||||||
|
let mut decoder = Decoder::with_ip(bitness, bytes.as_slice(), 0, DecoderOptions::NONE);
|
||||||
|
let mut formatter = IntelFormatter::new();
|
||||||
|
let mut instr_buffer = String::new();
|
||||||
|
let mut raw_buffer = String::new();
|
||||||
|
let mut instruction = Instruction::default();
|
||||||
|
let mut output = String::new();
|
||||||
|
let mut retval = vec![];
|
||||||
|
let mut count = 0;
|
||||||
|
while decoder.can_decode() {
|
||||||
|
decoder.decode_out(&mut instruction);
|
||||||
|
instr_buffer.clear();
|
||||||
|
formatter.format(&instruction, &mut instr_buffer);
|
||||||
|
if ret_value {
|
||||||
|
retval.push(instr_buffer.clone());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
raw_buffer.clear();
|
||||||
|
let start_index = instruction.ip() as usize;
|
||||||
|
let instrs_bytes = &bytes[start_index..start_index+instruction.len()];
|
||||||
|
for b in instrs_bytes {
|
||||||
|
raw_buffer.push_str(&format!("{:02x} ", b));
|
||||||
|
}
|
||||||
|
let padding = padding(30 - raw_buffer.len() as i32);
|
||||||
|
output.push_str(&format!("{:08X}: {}{}{}\n", instruction.ip(), raw_buffer, padding, instr_buffer));
|
||||||
|
count += 1;
|
||||||
|
}
|
||||||
|
if ret_value {
|
||||||
|
Ok(retval.to_lua(lua)?)
|
||||||
|
} else {
|
||||||
|
let console : Console = lua.globals().get(GLOBAL_CONSOLE)?;
|
||||||
|
console.send(output)?;
|
||||||
|
Ok(count.to_lua(lua)?)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn lua_hex(l: &Lua, (value, prefix): (Value, Option<bool>)) -> Result<String, Error> {
|
pub fn lua_hex(l: &Lua, (value, prefix): (Value, Option<bool>)) -> Result<String, Error> {
|
||||||
let pre = if prefix.unwrap_or(true) { "0x" } else { "" };
|
let pre = if prefix.unwrap_or(true) { "0x" } else { "" };
|
||||||
match value {
|
match value {
|
||||||
|
|
|
@ -26,6 +26,7 @@ pub fn register_builtin_fn(lua: &Lua, console: broadcast::Sender<String>) -> Res
|
||||||
|
|
||||||
lua.globals().set("log", lua.create_function(lua_log)?)?;
|
lua.globals().set("log", lua.create_function(lua_log)?)?;
|
||||||
lua.globals().set("hexdump", lua.create_function(lua_hexdump)?)?;
|
lua.globals().set("hexdump", lua.create_function(lua_hexdump)?)?;
|
||||||
|
lua.globals().set("decomp", lua.create_function(lua_decomp)?)?;
|
||||||
lua.globals().set("read", lua.create_function(lua_read)?)?;
|
lua.globals().set("read", lua.create_function(lua_read)?)?;
|
||||||
lua.globals().set("write", lua.create_function(lua_write)?)?;
|
lua.globals().set("write", lua.create_function(lua_write)?)?;
|
||||||
lua.globals().set("find", lua.create_function(lua_find)?)?;
|
lua.globals().set("find", lua.create_function(lua_find)?)?;
|
||||||
|
|
Loading…
Reference in a new issue