Home | History | Annotate | Download | only in courgette
      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