Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1407)

Unified Diff: syzygy/pe/pe_relinker.h

Issue 2535563002: Added all code for integrity check transform (Closed)
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « syzygy/pe/pe_file_writer.cc ('k') | syzygy/pe/pe_relinker.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: syzygy/pe/pe_relinker.h
diff --git a/syzygy/pe/pe_relinker.h b/syzygy/pe/pe_relinker.h
index ceea0b42c0c1b682b584604c3d471a8d364806dd..7d3e399ff8d2ff0df935fb2641d1cc5e24bcf647 100644
--- a/syzygy/pe/pe_relinker.h
+++ b/syzygy/pe/pe_relinker.h
@@ -1,235 +1,235 @@
-// Copyright 2012 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-// Declares PERelinker. Relinking can be seen as decomposing an input image,
-// applying a sequence of block-graph transforms (some applied implicitly, and
-// others provided by the user), followed by a sequence of orderers (again, some
-// implicit, some provided by the user), laying-out, finalizing and finally
-// writing a new image. After writing the image a similar transformation
-// workflow is applied to the corresponding PDB file, consisting of applying
-// any user defined PDB mutations, followed by 2-3 (depending on PeRelinker
-// configuration) internal mutations (updating the GUID/age, adding the history
-// stream and adding the serialized block-graph stream). PERelinker encapsulates
-// this workflow.
-//
-// It is intended to be used as follows:
-//
-// PERelinker relinker;
-// relinker.set_input_path(...); // Required.
-// relinker.set_output_path(...); // Required.
-// relinker.set_input_pdb_path(...); // Optional.
-// relinker.set_output_pdb_path(...); // Optional.
-// relinker.Init(); // Check the return value!
-//
-// // At this point, the following accessors are valid:
-// relinker.input_pe_file();
-// relinker.input_image_layout();
-// relinker.block_graph();
-// relinker.dos_header_block();
-// relinker.output_guid();
-//
-// relinker.AppendTransform(...); // May be called repeatedly.
-// relinker.AppendOrderer(...); // May be called repeatedly.
-// relinker.AppendPdbMutator(...); // May be called repeatedly.
-//
-// relinker.Relink(); // Check the return value!
-//
-// NOTE: This split workflow is only necessary as a workaround to deal with
-// transforms and orderers built around legacy code. Intermediate
-// representations of serialized data-structures should be stored in such
-// a way so as not to explicitly require access to the untransformed image.
-// Additionally, for checking validity a transform or orderer should require
-// no more than the PESignature associated with the original module, and/or
-// the toolchain metadata present in the module, if there was any.
-//
-// TODO(chrisha): Resimplify this API once Reorderer has been reworked to move
-// away from Block pointers.
-
-#ifndef SYZYGY_PE_PE_RELINKER_H_
-#define SYZYGY_PE_PE_RELINKER_H_
-
-#include <vector>
-
-#include "base/files/file_path.h"
-#include "syzygy/block_graph/orderer.h"
-#include "syzygy/block_graph/transform.h"
-#include "syzygy/pdb/pdb_mutator.h"
-#include "syzygy/pe/image_layout.h"
-#include "syzygy/pe/pe_coff_relinker.h"
-#include "syzygy/pe/pe_file.h"
-#include "syzygy/pe/pe_transform_policy.h"
-
-namespace pe {
-
-// Embodies a transformation on a PE image, from decomposing an original image
-// to applying some transform(s) to it, to generating the layout and finally
-// writing the image and accompanying PDB to disk.
-//
-// Creating a PERelinker and not changing its default configuration yields
-// an identity relinker that will produce an identical (nearly, except for
-// cosmetic differences in some headers) image to the input. If no orderers
-// are specified the default original orderer will be applied. If, in
-// addition, no transforms have been added this effectively makes the entire
-// relinker an identity relinker.
-//
-// The workflow is as follows:
-//
-// 1. Relinker created with an input image. The PDB file is found automatically
-// and the image is decomposed. Optionally the PDB may be directly specified.
-// 2. The image is transformed:
-// a) Transforms provided by the user are applied.
-// b) AddMetadataTransform is conditionally applied.
-// c) AddPdbInfoTransform is applied.
-// d) PrepareHeadersTransform is applied.
-// 3. The image is ordered:
-// a) Orderers provided by the user are applied.
-// b) PEOrderer is applied.
-// 4. PEImageLayoutBuilder is used to convert the OrderedBlockGraph to an
-// ImageLayout.
-// 5. Image and accompanying PDB file are written. (Filenames are inferred from
-// input filenames or directly specified.)
-class PERelinker : public PECoffRelinker {
- public:
- // Constructor.
- // @param pe_transform_policy The policy that dictates how to apply
- // transforms.
- explicit PERelinker(const PETransformPolicy* pe_transform_policy);
-
- // @see RelinkerInterface::image_format()
- virtual ImageFormat image_format() const override {
- return BlockGraph::PE_IMAGE;
- }
-
- // @name Accessors.
- // @{
- const base::FilePath& input_pdb_path() const { return input_pdb_path_; }
- const base::FilePath& output_pdb_path() const { return output_pdb_path_; }
- bool add_metadata() const { return add_metadata_; }
- bool augment_pdb() const { return augment_pdb_; }
- bool compress_pdb() const { return compress_pdb_; }
- bool strip_strings() const { return strip_strings_; }
- size_t padding() const { return padding_; }
- size_t code_alignment() const { return code_alignment_; }
- // @}
-
- // @name Mutators for controlling relinker behaviour.
- // @{
- void set_input_pdb_path(const base::FilePath& input_pdb_path) {
- input_pdb_path_ = input_pdb_path;
- }
- void set_output_pdb_path(const base::FilePath& output_pdb_path) {
- output_pdb_path_ = output_pdb_path;
- }
- void set_add_metadata(bool add_metadata) {
- add_metadata_ = add_metadata;
- }
- void set_augment_pdb(bool augment_pdb) {
- augment_pdb_ = augment_pdb;
- }
- void set_compress_pdb(bool compress_pdb) {
- compress_pdb_ = compress_pdb;
- }
- void set_strip_strings(bool strip_strings) {
- strip_strings_ = strip_strings;
- }
- void set_padding(size_t padding) {
- padding_ = padding;
- }
- void set_code_alignment(size_t alignment) {
- code_alignment_ = alignment;
- }
- // @}
-
- // @see RelinkerInterface::AppendPdbMutator()
- virtual bool AppendPdbMutator(pdb::PdbMutatorInterface* pdb_mutator) override;
-
- // @see RelinkerInterface::AppendPdbMutators()
- virtual bool AppendPdbMutators(
- const std::vector<pdb::PdbMutatorInterface*>& pdb_mutators) override;
-
- // Runs the initialization phase of the relinker. This consists of decomposing
- // the input image, after which the intermediate data accessors declared below
- // become valid. This should typically be followed by a call to Relink.
- //
- // @returns true on success, false otherwise.
- // @pre input_path and output_path must be set prior to calling this.
- // input_pdb_path and output_pdb_path may optionally have been set prior
- // to calling this.
- // @post input_pe_file and input_image_layout may be called after this.
- // @note This entrypoint is virtual for unittest/mocking purposes.
- virtual bool Init() override;
-
- // Runs the relinker, generating an output image and PDB.
- //
- // @returns true on success, false otherwise.
- // @pre Init must have been called successfully.
- // @note This entrypoint is virtual for unittest/mocking purposes.
- virtual bool Relink() override;
-
- // @name Intermediate data accessors.
- // @{
- // These accessors only return meaningful data after Init has been called. By
- // the time any transforms or orderers are being called, these will contain
- // valid data.
- //
- // TODO(chrisha): Clean these up as part of the API simplification after
- // all legacy code has been refactored.
- //
- // @pre Init has been successfully called.
- const PEFile& input_pe_file() const { return input_pe_file_; }
- const GUID& output_guid() const { return output_guid_; }
- // @}
-
- protected:
- // The transform policy used by this relinker.
- const PETransformPolicy* pe_transform_policy_;
-
- base::FilePath input_pdb_path_;
- base::FilePath output_pdb_path_;
-
- // If true, metadata will be added to the output image. Defaults to true.
- bool add_metadata_;
- // If true, the PDB will be augmented with a serialized block-graph and
- // image layout. Defaults to true.
- bool augment_pdb_;
- // If true, then the augmented PDB stream will be compressed as it is written.
- // Defaults to false.
- bool compress_pdb_;
- // If true, strings associated with a block-graph will not be serialized into
- // the PDB. Defaults to false.
- bool strip_strings_;
- // Indicates the amount of padding to be added between blocks. Zero is the
- // default value and indicates no padding will be added.
- size_t padding_;
- // Minimal code block alignment.
- size_t code_alignment_;
-
- // The vectors of user supplied transforms, orderers and mutators to be
- // applied.
- std::vector<pdb::PdbMutatorInterface*> pdb_mutators_;
-
- // Intermediate variables that are initialized and used by Relink. They are
- // made externally accessible so that transforms and orderers may make use
- // of them if necessary.
-
- // These refer to the original image, and don't change after init.
- PEFile input_pe_file_;
-
- // These are for the new image that will be produced at the end of Relink.
- GUID output_guid_;
-};
-
-} // namespace pe
-
-#endif // SYZYGY_PE_PE_RELINKER_H_
+// Copyright 2012 Google Inc. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Declares PERelinker. Relinking can be seen as decomposing an input image,
+// applying a sequence of block-graph transforms (some applied implicitly, and
+// others provided by the user), followed by a sequence of orderers (again, some
+// implicit, some provided by the user), laying-out, finalizing and finally
+// writing a new image. After writing the image a similar transformation
+// workflow is applied to the corresponding PDB file, consisting of applying
+// any user defined PDB mutations, followed by 2-3 (depending on PeRelinker
+// configuration) internal mutations (updating the GUID/age, adding the history
+// stream and adding the serialized block-graph stream). PERelinker encapsulates
+// this workflow.
+//
+// It is intended to be used as follows:
+//
+// PERelinker relinker;
+// relinker.set_input_path(...); // Required.
+// relinker.set_output_path(...); // Required.
+// relinker.set_input_pdb_path(...); // Optional.
+// relinker.set_output_pdb_path(...); // Optional.
+// relinker.Init(); // Check the return value!
+//
+// // At this point, the following accessors are valid:
+// relinker.input_pe_file();
+// relinker.input_image_layout();
+// relinker.block_graph();
+// relinker.dos_header_block();
+// relinker.output_guid();
+//
+// relinker.AppendTransform(...); // May be called repeatedly.
+// relinker.AppendOrderer(...); // May be called repeatedly.
+// relinker.AppendPdbMutator(...); // May be called repeatedly.
+//
+// relinker.Relink(); // Check the return value!
+//
+// NOTE: This split workflow is only necessary as a workaround to deal with
+// transforms and orderers built around legacy code. Intermediate
+// representations of serialized data-structures should be stored in such
+// a way so as not to explicitly require access to the untransformed image.
+// Additionally, for checking validity a transform or orderer should require
+// no more than the PESignature associated with the original module, and/or
+// the toolchain metadata present in the module, if there was any.
+//
+// TODO(chrisha): Resimplify this API once Reorderer has been reworked to move
+// away from Block pointers.
+
+#ifndef SYZYGY_PE_PE_RELINKER_H_
+#define SYZYGY_PE_PE_RELINKER_H_
+
+#include <vector>
+
+#include "base/files/file_path.h"
+#include "syzygy/block_graph/orderer.h"
+#include "syzygy/block_graph/transform.h"
+#include "syzygy/pdb/pdb_mutator.h"
+#include "syzygy/pe/image_layout.h"
+#include "syzygy/pe/pe_coff_relinker.h"
+#include "syzygy/pe/pe_file.h"
+#include "syzygy/pe/pe_transform_policy.h"
+
+namespace pe {
+
+// Embodies a transformation on a PE image, from decomposing an original image
+// to applying some transform(s) to it, to generating the layout and finally
+// writing the image and accompanying PDB to disk.
+//
+// Creating a PERelinker and not changing its default configuration yields
+// an identity relinker that will produce an identical (nearly, except for
+// cosmetic differences in some headers) image to the input. If no orderers
+// are specified the default original orderer will be applied. If, in
+// addition, no transforms have been added this effectively makes the entire
+// relinker an identity relinker.
+//
+// The workflow is as follows:
+//
+// 1. Relinker created with an input image. The PDB file is found automatically
+// and the image is decomposed. Optionally the PDB may be directly specified.
+// 2. The image is transformed:
+// a) Transforms provided by the user are applied.
+// b) AddMetadataTransform is conditionally applied.
+// c) AddPdbInfoTransform is applied.
+// d) PrepareHeadersTransform is applied.
+// 3. The image is ordered:
+// a) Orderers provided by the user are applied.
+// b) PEOrderer is applied.
+// 4. PEImageLayoutBuilder is used to convert the OrderedBlockGraph to an
+// ImageLayout.
+// 5. Image and accompanying PDB file are written. (Filenames are inferred from
+// input filenames or directly specified.)
+class PERelinker : public PECoffRelinker {
+ public:
+ // Constructor.
+ // @param pe_transform_policy The policy that dictates how to apply
+ // transforms.
+ explicit PERelinker(const PETransformPolicy* pe_transform_policy);
+
+ // @see RelinkerInterface::image_format()
+ virtual ImageFormat image_format() const override {
+ return BlockGraph::PE_IMAGE;
+ }
+
+ // @name Accessors.
+ // @{
+ const base::FilePath& input_pdb_path() const { return input_pdb_path_; }
+ const base::FilePath& output_pdb_path() const { return output_pdb_path_; }
+ bool add_metadata() const { return add_metadata_; }
+ bool augment_pdb() const { return augment_pdb_; }
+ bool compress_pdb() const { return compress_pdb_; }
+ bool strip_strings() const { return strip_strings_; }
+ size_t padding() const { return padding_; }
+ size_t code_alignment() const { return code_alignment_; }
+ // @}
+
+ // @name Mutators for controlling relinker behaviour.
+ // @{
+ void set_input_pdb_path(const base::FilePath& input_pdb_path) {
+ input_pdb_path_ = input_pdb_path;
+ }
+ void set_output_pdb_path(const base::FilePath& output_pdb_path) {
+ output_pdb_path_ = output_pdb_path;
+ }
+ void set_add_metadata(bool add_metadata) {
+ add_metadata_ = add_metadata;
+ }
+ void set_augment_pdb(bool augment_pdb) {
+ augment_pdb_ = augment_pdb;
+ }
+ void set_compress_pdb(bool compress_pdb) {
+ compress_pdb_ = compress_pdb;
+ }
+ void set_strip_strings(bool strip_strings) {
+ strip_strings_ = strip_strings;
+ }
+ void set_padding(size_t padding) {
+ padding_ = padding;
+ }
+ void set_code_alignment(size_t alignment) {
+ code_alignment_ = alignment;
+ }
+ // @}
+
+ // @see RelinkerInterface::AppendPdbMutator()
+ virtual bool AppendPdbMutator(pdb::PdbMutatorInterface* pdb_mutator) override;
+
+ // @see RelinkerInterface::AppendPdbMutators()
+ virtual bool AppendPdbMutators(
+ const std::vector<pdb::PdbMutatorInterface*>& pdb_mutators) override;
+
+ // Runs the initialization phase of the relinker. This consists of decomposing
+ // the input image, after which the intermediate data accessors declared below
+ // become valid. This should typically be followed by a call to Relink.
+ //
+ // @returns true on success, false otherwise.
+ // @pre input_path and output_path must be set prior to calling this.
+ // input_pdb_path and output_pdb_path may optionally have been set prior
+ // to calling this.
+ // @post input_pe_file and input_image_layout may be called after this.
+ // @note This entrypoint is virtual for unittest/mocking purposes.
+ virtual bool Init() override;
+
+ // Runs the relinker, generating an output image and PDB.
+ //
+ // @returns true on success, false otherwise.
+ // @pre Init must have been called successfully.
+ // @note This entrypoint is virtual for unittest/mocking purposes.
+ virtual bool Relink() override;
+
+ // @name Intermediate data accessors.
+ // @{
+ // These accessors only return meaningful data after Init has been called. By
+ // the time any transforms or orderers are being called, these will contain
+ // valid data.
+ //
+ // TODO(chrisha): Clean these up as part of the API simplification after
+ // all legacy code has been refactored.
+ //
+ // @pre Init has been successfully called.
+ const PEFile& input_pe_file() const { return input_pe_file_; }
+ const GUID& output_guid() const { return output_guid_; }
+ // @}
+
+ protected:
+ // The transform policy used by this relinker.
+ const PETransformPolicy* pe_transform_policy_;
+
+ base::FilePath input_pdb_path_;
+ base::FilePath output_pdb_path_;
+
+ // If true, metadata will be added to the output image. Defaults to true.
+ bool add_metadata_;
+ // If true, the PDB will be augmented with a serialized block-graph and
+ // image layout. Defaults to true.
+ bool augment_pdb_;
+ // If true, then the augmented PDB stream will be compressed as it is written.
+ // Defaults to false.
+ bool compress_pdb_;
+ // If true, strings associated with a block-graph will not be serialized into
+ // the PDB. Defaults to false.
+ bool strip_strings_;
+ // Indicates the amount of padding to be added between blocks. Zero is the
+ // default value and indicates no padding will be added.
+ size_t padding_;
+ // Minimal code block alignment.
+ size_t code_alignment_;
+
+ // The vectors of user supplied transforms, orderers and mutators to be
+ // applied.
+ std::vector<pdb::PdbMutatorInterface*> pdb_mutators_;
+
+ // Intermediate variables that are initialized and used by Relink. They are
+ // made externally accessible so that transforms and orderers may make use
+ // of them if necessary.
+
+ // These refer to the original image, and don't change after init.
+ PEFile input_pe_file_;
+
+ // These are for the new image that will be produced at the end of Relink.
+ GUID output_guid_;
+};
+
+} // namespace pe
+
+#endif // SYZYGY_PE_PE_RELINKER_H_
« no previous file with comments | « syzygy/pe/pe_file_writer.cc ('k') | syzygy/pe/pe_relinker.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698