OLD | NEW |
| (Empty) |
1 // Copyright 2015 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 #ifndef COURGETTE_REL32_FINDER_WIN32_X86_H_ | |
6 #define COURGETTE_REL32_FINDER_WIN32_X86_H_ | |
7 | |
8 #include <stdint.h> | |
9 | |
10 #include <map> | |
11 #include <vector> | |
12 | |
13 #include "courgette/image_utils.h" | |
14 | |
15 namespace courgette { | |
16 | |
17 // A helper class to scan through a section of code to extract RVAs. | |
18 class Rel32FinderWin32X86 { | |
19 public: | |
20 Rel32FinderWin32X86(RVA relocs_start_rva, RVA relocs_end_rva); | |
21 virtual ~Rel32FinderWin32X86(); | |
22 | |
23 // Swaps data in |rel32_locations_| with |dest|. | |
24 void SwapRel32Locations(std::vector<RVA>* dest); | |
25 | |
26 #if COURGETTE_HISTOGRAM_TARGETS | |
27 // Swaps data in |rel32_target_rvas_| with |dest|. | |
28 void SwapRel32TargetRVAs(std::map<RVA, int>* dest); | |
29 #endif | |
30 | |
31 // Scans through [|start_pointer|, |end_pointer|) for rel32 addresses. Seeks | |
32 // RVAs that satisfy the following: | |
33 // - Do not overlap with |abs32_locations| (assumed sorted). | |
34 // - Do not overlap with [relocs_start_rva, relocs_end_rva). | |
35 // - Whose targets are in [|start_rva|, |end_rva|). | |
36 // The sorted results are written to |rel32_locations_|. | |
37 virtual void Find(const uint8_t* start_pointer, | |
38 const uint8_t* end_pointer, | |
39 RVA start_rva, | |
40 RVA end_rva, | |
41 const std::vector<RVA>& abs32_locations) = 0; | |
42 | |
43 protected: | |
44 const RVA relocs_start_rva_; | |
45 const RVA relocs_end_rva_; | |
46 | |
47 std::vector<RVA> rel32_locations_; | |
48 | |
49 #if COURGETTE_HISTOGRAM_TARGETS | |
50 std::map<RVA, int> rel32_target_rvas_; | |
51 #endif | |
52 }; | |
53 | |
54 // The basic implementation performs naive scan for rel32 JMP and Jcc opcodes | |
55 // (excluding JPO/JPE) disregarding instruction alignment. | |
56 class Rel32FinderWin32X86_Basic : public Rel32FinderWin32X86 { | |
57 public: | |
58 Rel32FinderWin32X86_Basic(RVA relocs_start_rva, RVA relocs_end_rva); | |
59 virtual ~Rel32FinderWin32X86_Basic(); | |
60 | |
61 // Rel32FinderWin32X86 implementation. | |
62 void Find(const uint8_t* start_pointer, | |
63 const uint8_t* end_pointer, | |
64 RVA start_rva, | |
65 RVA end_rva, | |
66 const std::vector<RVA>& abs32_locations) override; | |
67 }; | |
68 | |
69 } // namespace courgette | |
70 | |
71 #endif // COURGETTE_REL32_FINDER_WIN32_X86_H_ | |
OLD | NEW |