1 #include <gtest/gtest.h>
4 #include "core/InformationManager.hxx"
5 #include "core/Function.hxx"
6 #include "core/BasicBlock.hxx"
7 #include "disassembler/llvm/LLVMDisassembler.hxx"
9 extern char * TEST_DATA_DIRECTORY
;
11 static void testMainFunction(Function
* main
) {
13 ASSERT_NE(nullptr, main
);
14 EXPECT_STREQ("_main", main
->getName().c_str());
16 auto blocks
= main
->blocks();
17 auto block
= blocks
.begin()->second
;
18 EXPECT_EQ(6, blocks
.size());
19 EXPECT_EQ(20, block
->getInstructions().size());
20 EXPECT_EQ(0x100000EB2, block
->getNextBlock(0));
21 EXPECT_EQ(0x100000E99, block
->getNextBlock(1));
23 EXPECT_TRUE(blocks
.find(0x100000EB2) != blocks
.end());
24 EXPECT_TRUE(blocks
.find(0x100000E99) != blocks
.end());
27 static void testCheckFunction(Function
* check
) {
28 SCOPED_TRACE("check");
29 ASSERT_NE(nullptr, check
);
30 EXPECT_STREQ("_check", check
->getName().c_str());
32 auto blocks
= check
->blocks();
33 auto block
= blocks
.begin()->second
;
34 EXPECT_EQ(1, blocks
.size());
35 EXPECT_EQ(29, block
->getInstructions().size());
36 EXPECT_EQ(0x0, block
->getNextBlock(0));
37 EXPECT_EQ(0x0, block
->getNextBlock(1));
40 TEST(llvmDisassemblerTest
, amd64MachOOpenBinaryBasicStructure
) {
41 SCOPED_TRACE("opening cryptsample.clang.amd64.macho");
42 InformationManager manager
;
44 llvm::InitializeAllTargetInfos();
45 llvm::InitializeAllTargetMCs();
46 llvm::InitializeAllAsmParsers();
47 llvm::InitializeAllDisassemblers();
49 manager
.reset(std::string(TEST_DATA_DIRECTORY
)
50 + "/disassembler/binaries/crypt.clang.O2.amd64.macho");
52 ASSERT_NE(nullptr, manager
.getDisassembler());
53 testCheckFunction(manager
.getFunction(0x100000db0));
54 testMainFunction(manager
.getFunction(0x100000e30));
57 TEST(llvmDisassemblerTest
, amd64MachOLoadBinaryBasicStructure
) {
58 SCOPED_TRACE("loading cryptsample.clang.amd64.macho");
59 InformationManager manager
;
61 llvm::InitializeAllTargetInfos();
62 llvm::InitializeAllTargetMCs();
63 llvm::InitializeAllAsmParsers();
64 llvm::InitializeAllDisassemblers();
66 manager
.load(std::string(TEST_DATA_DIRECTORY
)
67 + "/disassembler/binaries/crypt.clang.O2.amd64.macho.frida");
69 ASSERT_NE(nullptr, manager
.getDisassembler());
70 testCheckFunction(manager
.getFunction(0x100000db0));
71 testMainFunction(manager
.getFunction(0x100000e30));