// Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "components/zucchini/disassembler_elf.h" #include #include #include #include #include #include "components/zucchini/test_utils.h" #include "components/zucchini/type_elf.h" #include "testing/gtest/include/gtest/gtest.h" namespace zucchini { TEST(DisassemblerElfTest, QuickDetect) { std::vector image_data; ConstBufferView image; // Empty. EXPECT_FALSE(DisassemblerElfX86::QuickDetect(image)); EXPECT_FALSE(DisassemblerElfX64::QuickDetect(image)); // Unrelated. image_data = ParseHexString("DE AD"); image = {image_data.data(), image_data.size()}; EXPECT_FALSE(DisassemblerElfX86::QuickDetect(image)); EXPECT_FALSE(DisassemblerElfX64::QuickDetect(image)); // Only Magic. image_data = ParseHexString("7F 45 4C 46"); image = {image_data.data(), image_data.size()}; EXPECT_FALSE(DisassemblerElfX86::QuickDetect(image)); EXPECT_FALSE(DisassemblerElfX64::QuickDetect(image)); // Only identification. image_data = ParseHexString("7F 45 4C 46 01 01 01 00 00 00 00 00 00 00 00 00"); image = {image_data.data(), image_data.size()}; EXPECT_FALSE(DisassemblerElfX86::QuickDetect(image)); EXPECT_FALSE(DisassemblerElfX64::QuickDetect(image)); // Large enough, filled with zeros. image_data.assign(sizeof(elf::Elf32_Ehdr), 0); image = {image_data.data(), image_data.size()}; EXPECT_FALSE(DisassemblerElfX86::QuickDetect(image)); EXPECT_FALSE(DisassemblerElfX64::QuickDetect(image)); // Random. std::random_device rd; std::mt19937 gen{rd()}; std::generate(image_data.begin(), image_data.end(), gen); image = {image_data.data(), image_data.size()}; EXPECT_FALSE(DisassemblerElfX86::QuickDetect(image)); EXPECT_FALSE(DisassemblerElfX64::QuickDetect(image)); // Typical x86 elf header. { elf::Elf32_Ehdr header = {}; auto e_ident = ParseHexString("7F 45 4C 46 01 01 01 00 00 00 00 00 00 00 00 00"); std::copy(e_ident.begin(), e_ident.end(), header.e_ident); header.e_type = elf::ET_EXEC; header.e_machine = elf::EM_386; header.e_version = 1; header.e_shentsize = sizeof(elf::Elf32_Shdr); ConstBufferView image(reinterpret_cast(&header), sizeof(header)); EXPECT_TRUE(DisassemblerElfX86::QuickDetect(image)); EXPECT_FALSE(DisassemblerElfX64::QuickDetect(image)); } // Typical x64 elf header. { elf::Elf64_Ehdr header = {}; auto e_ident = ParseHexString("7F 45 4C 46 02 01 01 00 00 00 00 00 00 00 00 00"); std::copy(e_ident.begin(), e_ident.end(), header.e_ident); header.e_type = elf::ET_EXEC; header.e_machine = elf::EM_X86_64; header.e_version = 1; header.e_shentsize = sizeof(elf::Elf64_Shdr); ConstBufferView image(reinterpret_cast(&header), sizeof(header)); EXPECT_FALSE(DisassemblerElfX86::QuickDetect(image)); EXPECT_TRUE(DisassemblerElfX64::QuickDetect(image)); } } } // namespace zucchini