1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
// Copyright Antony Polukhin, 2015-2025
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt
// or copy at http://www.boost.org/LICENSE_1_0.txt)
// For more information, see http://www.boost.org
#include <boost/dll/library_info.hpp>
#include <fstream>
#include <boost/filesystem.hpp>
#include <boost/core/lightweight_test.hpp>
int main(int argc, char* argv[]) {
BOOST_TEST(argc >= 1);
const auto self_binary = boost::filesystem::path(argv[0]);
const auto corrupted_binary = self_binary.parent_path() / "corrupted";
boost::filesystem::copy_file(self_binary, corrupted_binary, boost::filesystem::copy_options::overwrite_existing);
{
std::ofstream ofs{corrupted_binary.string(), std::ios::binary};
ofs.seekp(0);
ofs << "bad";
}
try {
boost::dll::library_info lib_info(corrupted_binary.string());
BOOST_TEST(false);
} catch (const std::exception& ) {}
#if BOOST_OS_WINDOWS
boost::filesystem::copy_file(self_binary, corrupted_binary, boost::filesystem::copy_options::overwrite_existing);
{
std::ofstream ofs{corrupted_binary.string(), std::ios::binary};
ofs.seekp(
sizeof(boost::dll::detail::DWORD_)
+ sizeof(boost::dll::detail::IMAGE_FILE_HEADER_)
+ offsetof(boost::dll::detail::IMAGE_OPTIONAL_HEADER_template<boost::dll::detail::ULONGLONG_>, NumberOfRvaAndSizes)
);
const char data[] = "\0\0\0\0\0\0\0\0\0\0\0\0";
ofs.write(data, sizeof(data));
}
try {
boost::dll::library_info lib_info(corrupted_binary.string());
lib_info.sections();
BOOST_TEST(false);
} catch (const std::exception& ) {}
#endif
#if !BOOST_OS_WINDOWS && !BOOST_OS_MACOS && !BOOST_OS_IOS
// Elf
boost::filesystem::copy_file(self_binary, corrupted_binary, boost::filesystem::copy_options::overwrite_existing);
{
std::ofstream ofs{corrupted_binary.string(), std::ios::binary};
ofs.seekp(40); // header->e_shoff
ofs << "\xff\xff\xff\xff";
}
try {
boost::dll::library_info lib_info(corrupted_binary.string());
lib_info.sections();
BOOST_TEST(false);
} catch (const std::exception& ) {}
#endif
return boost::report_errors();
}
|