1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "courgette/disassembler_win32_x86.h" 6 7 #include "base/memory/scoped_ptr.h" 8 #include "courgette/base_test_unittest.h" 9 10 class DisassemblerWin32X86Test : public BaseTest { 11 public: 12 void TestExe() const; 13 void TestExe64() const; 14 void TestResourceDll() const; 15 }; 16 17 void DisassemblerWin32X86Test::TestExe() const { 18 std::string file1 = FileContents("setup1.exe"); 19 20 scoped_ptr<courgette::DisassemblerWin32X86> disassembler( 21 new courgette::DisassemblerWin32X86(file1.c_str(), file1.length())); 22 23 bool can_parse_header = disassembler->ParseHeader(); 24 EXPECT_TRUE(can_parse_header); 25 26 // The executable is the whole file, not 'embedded' with the file 27 EXPECT_EQ(file1.length(), disassembler->length()); 28 29 EXPECT_TRUE(disassembler->ok()); 30 EXPECT_TRUE(disassembler->has_text_section()); 31 EXPECT_EQ(449536U, disassembler->size_of_code()); 32 EXPECT_TRUE(disassembler->is_32bit()); 33 EXPECT_EQ(courgette::DisassemblerWin32X86::SectionName( 34 disassembler->RVAToSection(0x00401234 - 0x00400000)), 35 std::string(".text")); 36 37 EXPECT_EQ(0, disassembler->RVAToFileOffset(0)); 38 EXPECT_EQ(1024, disassembler->RVAToFileOffset(4096)); 39 EXPECT_EQ(46928, disassembler->RVAToFileOffset(50000)); 40 41 std::vector<courgette::RVA> relocs; 42 bool can_parse_relocs = disassembler->ParseRelocs(&relocs); 43 EXPECT_TRUE(can_parse_relocs); 44 45 const uint8* offset_p = disassembler->OffsetToPointer(0); 46 EXPECT_EQ(reinterpret_cast<const void*>(file1.c_str()), 47 reinterpret_cast<const void*>(offset_p)); 48 EXPECT_EQ('M', offset_p[0]); 49 EXPECT_EQ('Z', offset_p[1]); 50 51 const uint8* rva_p = disassembler->RVAToPointer(0); 52 EXPECT_EQ(reinterpret_cast<const void*>(file1.c_str()), 53 reinterpret_cast<const void*>(rva_p)); 54 EXPECT_EQ('M', rva_p[0]); 55 EXPECT_EQ('Z', rva_p[1]); 56 } 57 58 void DisassemblerWin32X86Test::TestExe64() const { 59 std::string file1 = FileContents("pe-64.exe"); 60 61 scoped_ptr<courgette::DisassemblerWin32X86> disassembler( 62 new courgette::DisassemblerWin32X86(file1.c_str(), file1.length())); 63 64 bool can_parse_header = disassembler->ParseHeader(); 65 EXPECT_FALSE(can_parse_header); 66 67 // The executable is the whole file, not 'embedded' with the file 68 EXPECT_EQ(file1.length(), disassembler->length()); 69 70 EXPECT_FALSE(disassembler->ok()); 71 EXPECT_TRUE(disassembler->has_text_section()); 72 EXPECT_EQ(43008U, disassembler->size_of_code()); 73 EXPECT_FALSE(disassembler->is_32bit()); 74 } 75 76 void DisassemblerWin32X86Test::TestResourceDll() const { 77 std::string file1 = FileContents("en-US.dll"); 78 79 scoped_ptr<courgette::DisassemblerWin32X86> disassembler( 80 new courgette::DisassemblerWin32X86(file1.c_str(), file1.length())); 81 82 bool can_parse_header = disassembler->ParseHeader(); 83 EXPECT_FALSE(can_parse_header); 84 85 // The executable is the whole file, not 'embedded' with the file 86 EXPECT_EQ(file1.length(), disassembler->length()); 87 88 EXPECT_FALSE(disassembler->ok()); 89 EXPECT_FALSE(disassembler->has_text_section()); 90 EXPECT_EQ(0U, disassembler->size_of_code()); 91 EXPECT_TRUE(disassembler->is_32bit()); 92 } 93 94 TEST_F(DisassemblerWin32X86Test, All) { 95 TestExe(); 96 TestExe64(); 97 TestResourceDll(); 98 } 99