From cec56db9d4c84de13796ce7cd7dcd2631c443cec Mon Sep 17 00:00:00 2001 From: Dennis Brentjes Date: Thu, 8 Sep 2016 21:49:49 +0200 Subject: Refactored argument parsing, and added stub for extractfunction. --- disasm/extractfunction.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 disasm/extractfunction.cpp (limited to 'disasm/extractfunction.cpp') diff --git a/disasm/extractfunction.cpp b/disasm/extractfunction.cpp new file mode 100644 index 0000000..6d6f7bc --- /dev/null +++ b/disasm/extractfunction.cpp @@ -0,0 +1,39 @@ +#include "extractfunction.hpp" + +#include "parsefileandrewind.hpp" + +#include + +#include + +void extract_function(std::istream& is, binparse::Value32 object_id, binparse::Offset32 function_offset) { + + auto file = parse_file_and_rewind(is); + + is.ignore(file.le_header.data_page_offset); + + _DInst decodedInstructions[1]; + _DecodeType dt = Decode32Bits; + unsigned int decodedInstructionsCount = 0; + + auto object = file.object_table.entries[object_id]; + unsigned int object_size = object.nr_page_table_entries * file.le_header.page_size; + + std::vector code_buf; + code_buf.reserve(object_size); + std::copy_n(std::istream_iterator(is), object_size, std::back_inserter(code_buf)); + + _CodeInfo ci; + ci.code = code_buf.data() + function_offset; + ci.codeLen = code_buf.size() - function_offset; + ci.codeOffset = object.reloc_base_address + function_offset; + ci.dt = dt; + ci.features = DF_NONE; + + distorm_decompose64(&ci, decodedInstructions, 1, &decodedInstructionsCount); + + _DecodedInst inst; + distorm_format64(&ci, &decodedInstructions[0], &inst); + + std::cout << std::hex << std::setw(8) << std::setfill('0') << inst.offset << ":\t" << inst.mnemonic.p << " " << inst.operands.p << std::endl; +} -- cgit v1.2.3-70-g09d2