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 /disasm | |
| 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.
Diffstat (limited to 'disasm')
| -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); |
