diff options
| author | Dennis Brentjes <d.brentjes@gmail.com> | 2016-09-10 16:04:23 +0200 |
|---|---|---|
| committer | Dennis Brentjes <d.brentjes@gmail.com> | 2016-09-10 16:04:23 +0200 |
| commit | 4f65043e40dbaf8e4cc290327e34270645dedce3 (patch) | |
| tree | 8fe2979b77d0edfd99d64db77ae43a437b888fca | |
| parent | cec56db9d4c84de13796ce7cd7dcd2631c443cec (diff) | |
| download | openwar-4f65043e40dbaf8e4cc290327e34270645dedce3.tar.gz openwar-4f65043e40dbaf8e4cc290327e34270645dedce3.tar.bz2 openwar-4f65043e40dbaf8e4cc290327e34270645dedce3.zip | |
Fixes differences in between input buffers in different parts.
Now opens files in binary mode, and added some conveniance functions to
read parts of the binary file.
| -rw-r--r-- | disasm/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | disasm/disasm.cpp | 8 | ||||
| -rw-r--r-- | disasm/dumpobject.cpp | 26 | ||||
| -rw-r--r-- | disasm/dumpobject.hpp | 2 | ||||
| -rw-r--r-- | disasm/extractfunction.cpp | 50 | ||||
| -rw-r--r-- | disasm/extractfunction.hpp | 2 | ||||
| -rw-r--r-- | disasm/leparseutil.cpp | 31 | ||||
| -rw-r--r-- | disasm/leparseutil.hpp | 11 | ||||
| -rw-r--r-- | disasm/parsefileandrewind.cpp | 11 | ||||
| -rw-r--r-- | disasm/parsefileandrewind.hpp | 7 |
10 files changed, 88 insertions, 62 deletions
diff --git a/disasm/CMakeLists.txt b/disasm/CMakeLists.txt index 7c21409..cd5113c 100644 --- a/disasm/CMakeLists.txt +++ b/disasm/CMakeLists.txt @@ -1,7 +1,7 @@ add_executable(disasm disasm.cpp - parsefileandrewind.hpp parsefileandrewind.cpp + leparseutil.hpp leparseutil.cpp dumpobject.hpp dumpobject.cpp extractfunction.hpp extractfunction.cpp ) diff --git a/disasm/disasm.cpp b/disasm/disasm.cpp index d5b1333..a38a71d 100644 --- a/disasm/disasm.cpp +++ b/disasm/disasm.cpp @@ -155,9 +155,7 @@ int parse_dumpobject_options(std::vector<std::string> arguments) { return ret; } - std::ifstream file_stream(file_path.string()); - - dump_object(file_stream, object_id); + dump_object(file_path.string(), object_id); } int parse_extractfunction_options(std::vector<std::string> arguments) { @@ -199,7 +197,5 @@ int parse_extractfunction_options(std::vector<std::string> arguments) { return ret; } - std::ifstream file_stream(file_path.string()); - - extract_function(file_stream, object_id, function_offset); + extract_function(file_path.string(), object_id, function_offset); } diff --git a/disasm/dumpobject.cpp b/disasm/dumpobject.cpp index 4f1a5cc..ae09b12 100644 --- a/disasm/dumpobject.cpp +++ b/disasm/dumpobject.cpp @@ -1,31 +1,27 @@ #include "dumpobject.hpp" -#include "parsefileandrewind.hpp" - -#include "le_file.hpp" +#include "leparseutil.hpp" #include <distorm.h> #include <iomanip> -void dump_object(std::ifstream& ifs, binparse::Value32 object_id) -{ - auto file = parse_file_and_rewind(ifs); - - std::vector<uint8_t> code(std::istreambuf_iterator<char>(ifs), {}); +void dump_object(std::string file_name, binparse::Value32 object_id) +{ + std::ifstream ifs(file_name, std::ios::binary); + ifs.unsetf(std::ios::skipws); + auto file = parse_file(ifs); + std::vector<_DecodedInst> instructions; instructions.resize(100000); unsigned int read_inst; - - auto object = file.object_table.entries[object_id]; - auto index = object.page_table_index; - binparse::Offset32 offset = file.le_header.data_page_offset; + std::vector<uint8_t> code = read_object(ifs, file, object_id); auto result = distorm_decode64( - object.reloc_base_address, - code.data() + offset + (index - 1) * file.le_header.page_size, - file.object_table.entries[1].nr_page_table_entries * file.le_header.page_size, + file.object_table.entries[object_id].reloc_base_address, + code.data(), + code.size(), Decode32Bits, instructions.data(), instructions.size(), diff --git a/disasm/dumpobject.hpp b/disasm/dumpobject.hpp index 8685588..94c7e34 100644 --- a/disasm/dumpobject.hpp +++ b/disasm/dumpobject.hpp @@ -5,4 +5,4 @@ #include <fstream> #include <cstdint> -void dump_object(std::ifstream& ifs, binparse::Value32 object_id);
\ No newline at end of file +void dump_object(std::string file_name, binparse::Value32 object_id);
\ No newline at end of file diff --git a/disasm/extractfunction.cpp b/disasm/extractfunction.cpp index 6d6f7bc..4fb675c 100644 --- a/disasm/extractfunction.cpp +++ b/disasm/extractfunction.cpp @@ -1,39 +1,49 @@ #include "extractfunction.hpp" -#include "parsefileandrewind.hpp" +#include "leparseutil.hpp" #include <distorm.h> #include <iomanip> +#include <fstream> -void extract_function(std::istream& is, binparse::Value32 object_id, binparse::Offset32 function_offset) { - - auto file = parse_file_and_rewind(is); +void extract_function(std::string file_path, binparse::Value32 object_id, binparse::Offset32 function_offset) { + + std::ifstream ifs(file_path, std::ios::binary); + ifs.unsetf(std::ios::skipws); - is.ignore(file.le_header.data_page_offset); + auto file = parse_file(ifs); - _DInst decodedInstructions[1]; + _DInst decinst; _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<uint8_t> code_buf = read_object(ifs, file, object_id); - std::vector<uint8_t> code_buf; - code_buf.reserve(object_size); - std::copy_n(std::istream_iterator<uint8_t>(is), object_size, std::back_inserter(code_buf)); + binparse::Offset32 base_reloc_offset = file.object_table.entries[object_id].reloc_base_address; + binparse::Offset32 buffer_offset = binparse::Offset32(function_offset - base_reloc_offset); _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.code = code_buf.data() + buffer_offset; + ci.codeLen = code_buf.size() - buffer_offset; + ci.codeOffset = base_reloc_offset + buffer_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; + while(true) { + distorm_decompose64(&ci, &decinst, 1, &decodedInstructionsCount); + + if(decinst.flags == FLAG_NOT_DECODABLE) { + break; + } + + _DecodedInst inst; + distorm_format64(&ci, &decinst, &inst); + + std::cout << std::hex << std::setw(8) << std::setfill('0') << inst.offset << ":\t" << inst.mnemonic.p << " " << inst.operands.p << std::endl; + + ci.code += decinst.size; + ci.codeLen -= decinst.size; + ci.codeOffset += decinst.size; + } } diff --git a/disasm/extractfunction.hpp b/disasm/extractfunction.hpp index 57e0597..0b3099b 100644 --- a/disasm/extractfunction.hpp +++ b/disasm/extractfunction.hpp @@ -3,4 +3,4 @@ #include "le_file.hpp" #include "types.hpp" -void extract_function(std::istream& is, binparse::Value32 object_id, binparse::Offset32 function_offset); +void extract_function(std::string file_path, binparse::Value32 object_id, binparse::Offset32 function_offset); diff --git a/disasm/leparseutil.cpp b/disasm/leparseutil.cpp new file mode 100644 index 0000000..9c4e790 --- /dev/null +++ b/disasm/leparseutil.cpp @@ -0,0 +1,31 @@ +#include "leparseutil.hpp" + +std::vector<uint8_t> read_file_part(std::istream& is, std::streamsize offset, size_t length) { + is.clear(); + is.seekg(0, std::ios::beg); + + is.ignore(offset); + + std::vector<uint8_t> vec; + vec.reserve(length); + + std::copy_n(std::istream_iterator<uint8_t>(is), length, std::back_inserter(vec)); + return vec; +} + +std::vector<uint8_t> read_object(std::istream& is, le::File file, binparse::Value32 object_id) { + auto object = file.object_table.entries[object_id]; + auto index = object.page_table_index; + + return read_file_part(is, file.le_header.data_page_offset, file.le_header.page_size * (object.nr_page_table_entries -(index -1))); +} + +le::File parse_file(std::istream& is) +{ + is.clear(); + is.seekg(0, std::ios::beg); + + auto file = le::parse_file(is); + + return file; +} diff --git a/disasm/leparseutil.hpp b/disasm/leparseutil.hpp new file mode 100644 index 0000000..d44bc18 --- /dev/null +++ b/disasm/leparseutil.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include "le_file.hpp" + +#include <istream> + +le::File parse_file(std::istream& is); + +std::vector<uint8_t> read_file_part(std::istream& is, std::streamsize offset, size_t length); + +std::vector<uint8_t> read_object(std::istream& is, le::File file, binparse::Value32 object_id);
\ No newline at end of file diff --git a/disasm/parsefileandrewind.cpp b/disasm/parsefileandrewind.cpp deleted file mode 100644 index 704e9da..0000000 --- a/disasm/parsefileandrewind.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include "parsefileandrewind.hpp" - -le::File parse_file_and_rewind(std::istream& is) -{ - auto file = le::parse_file(is); - - is.clear(); - is.seekg(0, std::ios::beg); - - return file; -} diff --git a/disasm/parsefileandrewind.hpp b/disasm/parsefileandrewind.hpp deleted file mode 100644 index 4d564ac..0000000 --- a/disasm/parsefileandrewind.hpp +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -#include "le_file.hpp" - -#include <istream> - -le::File parse_file_and_rewind(std::istream& is); |
