From e232dc612584f55a6426051c8f59b6d9a00c3029 Mon Sep 17 00:00:00 2001 From: Christoph Egger Date: Thu, 26 Mar 2015 17:43:24 +0100 Subject: [PATCH] Add testcases for disassembler Testing basic functionality of the LLVM-based disassembler on amd64/elf and amd64/MachO. More tests will follow as soon as I get reasonable test binaries, we should at least also cover PE and arm (maybe ppc, mips, ..) --- CMakeLists.txt | 2 + .../llvm/tests/amd64LinuxDisassemblerTest.cxx | 72 ++++++++++++++++++ .../llvm/tests/amd64MachODisassemblerTest.cxx | 72 ++++++++++++++++++ .../binaries/crypt.clang.O2.amd64.elf | Bin 0 -> 7984 bytes .../binaries/crypt.clang.O2.amd64.elf.frida | Bin 0 -> 6152 bytes .../binaries/crypt.clang.O2.amd64.macho | Bin 0 -> 8828 bytes .../binaries/crypt.clang.O2.amd64.macho.frida | Bin 0 -> 1972 bytes 7 files changed, 146 insertions(+) create mode 100644 src/disassembler/llvm/tests/amd64LinuxDisassemblerTest.cxx create mode 100644 src/disassembler/llvm/tests/amd64MachODisassemblerTest.cxx create mode 100755 testdata/disassembler/binaries/crypt.clang.O2.amd64.elf create mode 100644 testdata/disassembler/binaries/crypt.clang.O2.amd64.elf.frida create mode 100755 testdata/disassembler/binaries/crypt.clang.O2.amd64.macho create mode 100644 testdata/disassembler/binaries/crypt.clang.O2.amd64.macho.frida diff --git a/CMakeLists.txt b/CMakeLists.txt index c54380d..fabb0d9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -129,6 +129,8 @@ set(fridatest_SOURCES src/core/tests/BasicBlockTest.cxx src/core/tests/FunctionTest.cxx src/core/tests/CommentTest.cxx + src/disassembler/llvm/tests/amd64LinuxDisassemblerTest.cxx + src/disassembler/llvm/tests/amd64MachODisassemblerTest.cxx ${frida_SOURCES} ) diff --git a/src/disassembler/llvm/tests/amd64LinuxDisassemblerTest.cxx b/src/disassembler/llvm/tests/amd64LinuxDisassemblerTest.cxx new file mode 100644 index 0000000..932f79a --- /dev/null +++ b/src/disassembler/llvm/tests/amd64LinuxDisassemblerTest.cxx @@ -0,0 +1,72 @@ +#include +#include + +#include "core/InformationManager.hxx" +#include "core/Function.hxx" +#include "core/BasicBlock.hxx" +#include "disassembler/llvm/LLVMDisassembler.hxx" + +extern char * TEST_DATA_DIRECTORY; + +static void testMainFunction(Function* main) { + ASSERT_NE(nullptr, main); + EXPECT_STREQ("main", main->getName().c_str()); + + auto blocks = main->blocks(); + auto block = blocks.begin()->second; + EXPECT_EQ(4, blocks.size()); + EXPECT_EQ(17, block->getInstructions().size()); + EXPECT_EQ(0x4007ea, block->getNextBlock(0)); + EXPECT_EQ(0x4007ce, block->getNextBlock(1)); + + EXPECT_TRUE(blocks.find(0x4007ea) != blocks.end()); + EXPECT_TRUE(blocks.find(0x4007ce) != blocks.end()); +} + +static void testCheckFunction(Function* check) { + ASSERT_NE(nullptr, check); + EXPECT_STREQ("check", check->getName().c_str()); + + auto blocks = check->blocks(); + auto block = blocks.begin()->second; + EXPECT_EQ(1, blocks.size()); + EXPECT_EQ(29, block->getInstructions().size()); + EXPECT_EQ(0x0, block->getNextBlock(0)); + EXPECT_EQ(0x0, block->getNextBlock(1)); +} + +TEST(llvmDisassemblerTest, amd64LinuxOpenBinaryBasicStructure) { + SCOPED_TRACE("opening cryptsample.clang.amd64.elf"); + InformationManager manager; + + llvm::InitializeAllTargetInfos(); + llvm::InitializeAllTargetMCs(); + llvm::InitializeAllAsmParsers(); + llvm::InitializeAllDisassemblers(); + + manager.reset(std::string(TEST_DATA_DIRECTORY) + + "/disassembler/binaries/crypt.clang.O2.amd64.elf"); + + ASSERT_NE(nullptr, manager.getDisassembler()); + EXPECT_EQ(0x4005F0, manager.getDisassembler()->entryAddress()); + testCheckFunction(manager.getFunction(0x4006f0)); + testMainFunction(manager.getFunction(0x400770)); +} + +TEST(llvmDisassemblerTest, amd64LinuxLoadBinaryBasicStructure) { + SCOPED_TRACE("loading cryptsample.clang.amd64.elf"); + InformationManager manager; + + llvm::InitializeAllTargetInfos(); + llvm::InitializeAllTargetMCs(); + llvm::InitializeAllAsmParsers(); + llvm::InitializeAllDisassemblers(); + + manager.load(std::string(TEST_DATA_DIRECTORY) + + "/disassembler/binaries/crypt.clang.O2.amd64.elf.frida"); + + ASSERT_NE(nullptr, manager.getDisassembler()); + EXPECT_EQ(0x4005F0, manager.getDisassembler()->entryAddress()); + testCheckFunction(manager.getFunction(0x4006f0)); + testMainFunction(manager.getFunction(0x400770)); +} diff --git a/src/disassembler/llvm/tests/amd64MachODisassemblerTest.cxx b/src/disassembler/llvm/tests/amd64MachODisassemblerTest.cxx new file mode 100644 index 0000000..db7eaec --- /dev/null +++ b/src/disassembler/llvm/tests/amd64MachODisassemblerTest.cxx @@ -0,0 +1,72 @@ +#include +#include + +#include "core/InformationManager.hxx" +#include "core/Function.hxx" +#include "core/BasicBlock.hxx" +#include "disassembler/llvm/LLVMDisassembler.hxx" + +extern char * TEST_DATA_DIRECTORY; + +static void testMainFunction(Function* main) { + SCOPED_TRACE("main"); + ASSERT_NE(nullptr, main); + EXPECT_STREQ("_main", main->getName().c_str()); + + auto blocks = main->blocks(); + auto block = blocks.begin()->second; + EXPECT_EQ(6, blocks.size()); + EXPECT_EQ(20, block->getInstructions().size()); + EXPECT_EQ(0x100000EB2, block->getNextBlock(0)); + EXPECT_EQ(0x100000E99, block->getNextBlock(1)); + + EXPECT_TRUE(blocks.find(0x100000EB2) != blocks.end()); + EXPECT_TRUE(blocks.find(0x100000E99) != blocks.end()); +} + +static void testCheckFunction(Function* check) { + SCOPED_TRACE("check"); + ASSERT_NE(nullptr, check); + EXPECT_STREQ("_check", check->getName().c_str()); + + auto blocks = check->blocks(); + auto block = blocks.begin()->second; + EXPECT_EQ(1, blocks.size()); + EXPECT_EQ(29, block->getInstructions().size()); + EXPECT_EQ(0x0, block->getNextBlock(0)); + EXPECT_EQ(0x0, block->getNextBlock(1)); +} + +TEST(llvmDisassemblerTest, amd64MachOOpenBinaryBasicStructure) { + SCOPED_TRACE("opening cryptsample.clang.amd64.macho"); + InformationManager manager; + + llvm::InitializeAllTargetInfos(); + llvm::InitializeAllTargetMCs(); + llvm::InitializeAllAsmParsers(); + llvm::InitializeAllDisassemblers(); + + manager.reset(std::string(TEST_DATA_DIRECTORY) + + "/disassembler/binaries/crypt.clang.O2.amd64.macho"); + + ASSERT_NE(nullptr, manager.getDisassembler()); + testCheckFunction(manager.getFunction(0x100000db0)); + testMainFunction(manager.getFunction(0x100000e30)); +} + +TEST(llvmDisassemblerTest, amd64MachOLoadBinaryBasicStructure) { + SCOPED_TRACE("loading cryptsample.clang.amd64.macho"); + InformationManager manager; + + llvm::InitializeAllTargetInfos(); + llvm::InitializeAllTargetMCs(); + llvm::InitializeAllAsmParsers(); + llvm::InitializeAllDisassemblers(); + + manager.load(std::string(TEST_DATA_DIRECTORY) + + "/disassembler/binaries/crypt.clang.O2.amd64.macho.frida"); + + ASSERT_NE(nullptr, manager.getDisassembler()); + testCheckFunction(manager.getFunction(0x100000db0)); + testMainFunction(manager.getFunction(0x100000e30)); +} diff --git a/testdata/disassembler/binaries/crypt.clang.O2.amd64.elf b/testdata/disassembler/binaries/crypt.clang.O2.amd64.elf new file mode 100755 index 0000000000000000000000000000000000000000..d5e8d0ad98c3e02a181667c6fd8c153b66800e06 GIT binary patch literal 7984 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 literal 0 HcmV?d00001 diff --git a/testdata/disassembler/binaries/crypt.clang.O2.amd64.elf.frida b/testdata/disassembler/binaries/crypt.clang.O2.amd64.elf.frida new file mode 100644 index 0000000000000000000000000000000000000000..e580ce7ccb841a56c09abc25746f4e8418534f75 GIT binary patch literal 6152 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 literal 0 HcmV?d00001 diff --git a/testdata/disassembler/binaries/crypt.clang.O2.amd64.macho b/testdata/disassembler/binaries/crypt.clang.O2.amd64.macho new file mode 100755 index 0000000000000000000000000000000000000000..edadd3c0ca1ba97edd35795b6feaf721a8b3da4b GIT binary patch literal 8828 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