LIEF: Library to Instrument Executable Formats Version 0.17.0
Loading...
Searching...
No Matches
PE/Section.hpp
Go to the documentation of this file.
1/* Copyright 2017 - 2025 R. Thomas
2 * Copyright 2017 - 2025 Quarkslab
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#ifndef LIEF_PE_SECTION_H
17#define LIEF_PE_SECTION_H
18#include <ostream>
19#include <vector>
20#include <string>
21#include <memory>
22
23#include "LIEF/iostream.hpp"
24#include "LIEF/visibility.h"
26#include "LIEF/enums.hpp"
27
28namespace LIEF {
29class SpanStream;
30
31namespace PE {
32
33class Parser;
34class Builder;
35class Binary;
36class COFFString;
37
38namespace details {
39struct pe_section;
40}
41class LIEF_API Section : public LIEF::Section {
44
45 friend class Parser;
46 friend class Builder;
47 friend class Binary;
48
49 public:
51 static constexpr size_t MAX_SECTION_NAME = 8;
52
53 enum class CHARACTERISTICS: uint64_t {
54 TYPE_NO_PAD = 0x00000008,
55 CNT_CODE = 0x00000020,
56 CNT_INITIALIZED_DATA = 0x00000040,
57 CNT_UNINITIALIZED_DATA = 0x00000080,
58 LNK_OTHER = 0x00000100,
59 LNK_INFO = 0x00000200,
60 LNK_REMOVE = 0x00000800,
61 LNK_COMDAT = 0x00001000,
62 GPREL = 0x00008000,
63 MEM_PURGEABLE = 0x00010000,
64 MEM_16BIT = 0x00020000,
65 MEM_LOCKED = 0x00040000,
66 MEM_PRELOAD = 0x00080000,
67 ALIGN_1BYTES = 0x00100000,
68 ALIGN_2BYTES = 0x00200000,
69 ALIGN_4BYTES = 0x00300000,
70 ALIGN_8BYTES = 0x00400000,
71 ALIGN_16BYTES = 0x00500000,
72 ALIGN_32BYTES = 0x00600000,
73 ALIGN_64BYTES = 0x00700000,
74 ALIGN_128BYTES = 0x00800000,
75 ALIGN_256BYTES = 0x00900000,
76 ALIGN_512BYTES = 0x00A00000,
77 ALIGN_1024BYTES = 0x00B00000,
78 ALIGN_2048BYTES = 0x00C00000,
79 ALIGN_4096BYTES = 0x00D00000,
80 ALIGN_8192BYTES = 0x00E00000,
81 LNK_NRELOC_OVFL = 0x01000000,
82 MEM_DISCARDABLE = 0x02000000,
83 MEM_NOT_CACHED = 0x04000000,
84 MEM_NOT_PAGED = 0x08000000,
85 MEM_SHARED = 0x10000000,
86 MEM_EXECUTE = 0x20000000,
87 MEM_READ = 0x40000000,
88 MEM_WRITE = 0x80000000
89 };
90
91 Section(const details::pe_section& header);
92 Section() = default;
93 Section(std::string name) :
94 Section::Section()
95 {
96 name_ = std::move(name);
97 }
98
99 Section(std::string name, std::vector<uint8_t> content) :
100 Section(std::move(name))
101 {
102 content_ = std::move(content);
103 size_ = content_.size();
104 }
105
106 Section& operator=(const Section&) = default;
107 Section(const Section&) = default;
108 ~Section() override = default;
109 uint32_t sizeof_raw_data() const;
112 uint32_t virtual_size() const {
117 return virtual_size_;
118 }
119 span<const uint8_t> content() const override {
122 return content_;
123 }
124 span<const uint8_t> padding() const {
127 return padding_;
128 }
129 uint32_t pointerto_raw_data() const;
132 uint32_t pointerto_relocation() const {
139 return pointer_to_relocations_;
140 }
141 uint32_t pointerto_line_numbers() const {
146 return pointer_to_linenumbers_;
147 }
148 uint16_t numberof_relocations() const {
151 return number_of_relocations_;
152 }
153 uint16_t numberof_line_numbers() const {
156 return number_of_linenumbers_;
157 }
158 uint32_t characteristics() const {
163 return characteristics_;
164 }
165 bool has_characteristic(CHARACTERISTICS c) const {
168 return (characteristics() & (uint32_t)c) > 0;
169 }
170 std::vector<CHARACTERISTICS> characteristics_list() const;
173 bool is_discardable() const {
178 return has_characteristic(CHARACTERISTICS::MEM_DISCARDABLE);
179 }
180 void clear(uint8_t c);
183 void content(const std::vector<uint8_t>& data) override;
184
185 void name(std::string name) override;
186
187 void virtual_size(uint32_t virtual_sz) {
188 virtual_size_ = virtual_sz;
189 }
190
191 void pointerto_raw_data(uint32_t ptr) {
192 offset(ptr);
193 }
194
195 void pointerto_relocation(uint32_t ptr) {
196 pointer_to_relocations_ = ptr;
197 }
198
199 void pointerto_line_numbers(uint32_t ptr) {
200 pointer_to_linenumbers_ = ptr;
201 }
202
203 void numberof_relocations(uint16_t nb) {
204 number_of_relocations_ = nb;
205 }
206
207 void numberof_line_numbers(uint16_t nb) {
208 number_of_linenumbers_ = nb;
209 }
210
211 void sizeof_raw_data(uint32_t size) {
212 this->size(size);
213 }
214
215 void characteristics(uint32_t characteristics) {
216 characteristics_ = characteristics;
217 }
218 COFFString* coff_string() {
224 return coff_string_;
225 }
226
227 const COFFString* coff_string() const {
228 return coff_string_;
229 }
230
231 Section& remove_characteristic(CHARACTERISTICS characteristic) {
232 characteristics_ &= ~static_cast<size_t>(characteristic);
233 return *this;
234 }
235
236 Section& add_characteristic(CHARACTERISTICS characteristic) {
237 characteristics_ |= static_cast<size_t>(characteristic);
238 return *this;
239 }
240
241 std::unique_ptr<SpanStream> stream() const;
242 LIEF_LOCAL Section& reserve(size_t size, uint8_t value = 0) {
245 content_.resize(size, value);
246 return *this;
247 }
248 LIEF_LOCAL vector_iostream edit() {
251 return vector_iostream(content_);
252 }
253
254 span<uint8_t> writable_content() {
255 return content_;
256 }
257
258 void accept(Visitor& visitor) const override;
259
260 LIEF_API friend std::ostream& operator<<(std::ostream& os, const Section& section);
261
262 private:
263 std::vector<uint8_t> content_;
264 std::vector<uint8_t> padding_;
265 uint32_t virtual_size_ = 0;
266 uint32_t pointer_to_relocations_ = 0;
267 uint32_t pointer_to_linenumbers_ = 0;
268 uint16_t number_of_relocations_ = 0;
269 uint16_t number_of_linenumbers_ = 0;
270 uint32_t characteristics_ = 0;
271
272 COFFString* coff_string_ = nullptr;
273};
274
275LIEF_API const char* to_string(Section::CHARACTERISTICS e);
276
277} // namespace PE
278} // namespace LIEF
279
280ENABLE_BITMASK_OPERATORS(LIEF::PE::Section::CHARACTERISTICS)
281
282#endif
Section.hpp
LIEF::PE::Binary
Class which represents a PE binary This is the main interface to manage and modify a PE executable.
Definition PE/Binary.hpp:56
LIEF::PE::Builder
Class that is used to rebuild a raw PE binary from a PE::Binary object.
Definition PE/Builder.hpp:45
LIEF::PE::COFFString
This class represents a string located in the COFF string table.
Definition COFFString.hpp:33
LIEF::PE::Parser
Main interface to parse PE binaries. In particular the static functions: Parser::parse should be used...
Definition PE/Parser.hpp:52
LIEF::PE::Section
Class which represents a PE section.
Definition PE/Section.hpp:43
LIEF::PE::Section::coff_string
COFFString * coff_string()
Return the COFF string associated with the section's name (or a nullptr)
Definition PE/Section.hpp:223
LIEF::PE::Section::Section
Section(const Section &)=default
LIEF::PE::Section::pointerto_line_numbers
uint32_t pointerto_line_numbers() const
The file pointer to the beginning of line-number entries for the section. This is set to zero if ther...
Definition PE/Section.hpp:145
LIEF::PE::Section::sizeof_raw_data
void sizeof_raw_data(uint32_t size)
Definition PE/Section.hpp:211
LIEF::PE::Section::Section
Section(std::string name)
Definition PE/Section.hpp:93
LIEF::PE::Section::pointerto_relocation
uint32_t pointerto_relocation() const
The file pointer to the beginning of the COFF relocation entries for the section. This is set to zero...
Definition PE/Section.hpp:138
LIEF::PE::Section::remove_characteristic
Section & remove_characteristic(CHARACTERISTICS characteristic)
Definition PE/Section.hpp:231
LIEF::PE::Section::operator<<
friend std::ostream & operator<<(std::ostream &os, const Section &section)
LIEF::PE::Section::coff_string
const COFFString * coff_string() const
Definition PE/Section.hpp:227
LIEF::PE::Section::operator=
Section & operator=(const Section &)=default
LIEF::PE::Section::has_characteristic
bool has_characteristic(CHARACTERISTICS c) const
Check if the section has the given CHARACTERISTICS.
Definition PE/Section.hpp:167
LIEF::PE::Section::numberof_line_numbers
uint16_t numberof_line_numbers() const
No longer used in recent PE binaries produced by Visual Studio.
Definition PE/Section.hpp:155
LIEF::PE::Section::is_discardable
bool is_discardable() const
True if the section can be discarded as needed.
Definition PE/Section.hpp:177
LIEF::PE::Section::~Section
~Section() override=default
LIEF::PE::Section::CHARACTERISTICS
CHARACTERISTICS
Definition PE/Section.hpp:53
LIEF::PE::Section::Section
Section()=default
LIEF::PE::Section::content
span< const uint8_t > content() const override
The actual content of the section.
Definition PE/Section.hpp:121
LIEF::PE::Section::clear
void clear(uint8_t c)
Fill the content of the section with the given char
LIEF::PE::Section::pointerto_raw_data
void pointerto_raw_data(uint32_t ptr)
Definition PE/Section.hpp:191
LIEF::PE::Section::characteristics_list
std::vector< CHARACTERISTICS > characteristics_list() const
List of the section characteristics.
LIEF::PE::Section::characteristics
uint32_t characteristics() const
Characteristics of the section: it provides information about the permissions of the section when map...
Definition PE/Section.hpp:162
LIEF::PE::Section::name
void name(std::string name) override
Change the section's name.
LIEF::PE::Section::pointerto_relocation
void pointerto_relocation(uint32_t ptr)
Definition PE/Section.hpp:195
LIEF::PE::Section::sizeof_raw_data
uint32_t sizeof_raw_data() const
Return the size of the data in the section.
LIEF::PE::Section::padding
span< const uint8_t > padding() const
Content of the section's padding area.
Definition PE/Section.hpp:126
LIEF::PE::Section::pointerto_line_numbers
void pointerto_line_numbers(uint32_t ptr)
Definition PE/Section.hpp:199
LIEF::PE::Section::stream
std::unique_ptr< SpanStream > stream() const
LIEF::PE::Section::writable_content
span< uint8_t > writable_content()
Definition PE/Section.hpp:254
LIEF::PE::Section::characteristics
void characteristics(uint32_t characteristics)
Definition PE/Section.hpp:215
LIEF::PE::Section::virtual_size
void virtual_size(uint32_t virtual_sz)
Definition PE/Section.hpp:187
LIEF::PE::Section::content
void content(const std::vector< uint8_t > &data) override
Change section content.
LIEF::PE::Section::pointerto_raw_data
uint32_t pointerto_raw_data() const
The offset of the section data in the PE file.
LIEF::PE::Section::numberof_line_numbers
void numberof_line_numbers(uint16_t nb)
Definition PE/Section.hpp:207
LIEF::PE::Section::Section
Section(const details::pe_section &header)
LIEF::PE::Section::numberof_relocations
uint16_t numberof_relocations() const
No longer used in recent PE binaries produced by Visual Studio.
Definition PE/Section.hpp:150
LIEF::PE::Section::accept
void accept(Visitor &visitor) const override
LIEF::PE::Section::Section
Section(std::string name, std::vector< uint8_t > content)
Definition PE/Section.hpp:99
LIEF::PE::Section::virtual_size
uint32_t virtual_size() const
Return the size of the data when mapped in memory.
Definition PE/Section.hpp:116
LIEF::PE::Section::add_characteristic
Section & add_characteristic(CHARACTERISTICS characteristic)
Definition PE/Section.hpp:236
LIEF::PE::Section::numberof_relocations
void numberof_relocations(uint16_t nb)
Definition PE/Section.hpp:203
LIEF::Section::name
virtual std::string name() const
section's name
Definition Abstract/Section.hpp:44
LIEF::SpanStream
Definition SpanStream.hpp:32
enums.hpp
ENABLE_BITMASK_OPERATORS
#define ENABLE_BITMASK_OPERATORS(X)
Definition enums.hpp:24
iostream.hpp
LIEF::PE::details
Definition DataDirectory.hpp:37
LIEF::PE
Namespace related to the LIEF's PE module.
Definition Abstract/Header.hpp:32
LIEF::PE::to_string
const char * to_string(AuxiliaryWeakExternal::CHARACTERISTICS e)
LIEF
LIEF namespace.
Definition Abstract/Binary.hpp:36
visibility.h
LIEF_API
#define LIEF_API
Definition visibility.h:41
LIEF_LOCAL
#define LIEF_LOCAL
Definition visibility.h:42