2013-11-22 19:25:24 -05:00
|
|
|
pe-parse
|
2020-03-17 13:38:56 -04:00
|
|
|
========
|
2014-08-08 17:44:43 -04:00
|
|
|
|
2019-12-23 09:28:47 -06:00
|
|
|
[](https://github.com/trailofbits/pe-parse/actions?query=workflow%3ACI)
|
2014-08-08 17:44:43 -04:00
|
|
|
|
2020-03-17 13:38:56 -04:00
|
|
|
pe-parse is a principled, lightweight parser for windows portable executable files.
|
|
|
|
It was created to assist in compiled program analysis, potentially of programs of unknown origins.
|
|
|
|
This means that it should be resistant to malformed or maliciously crafted PE files, and it should
|
|
|
|
support questions that analysis software would ask of an executable program container.
|
|
|
|
For example, listing relocations, describing imports and exports, and supporting byte reads from
|
|
|
|
virtual addresses as well as file offsets.
|
2013-11-22 19:19:18 -05:00
|
|
|
|
|
|
|
pe-parse supports these use cases via a minimal API that provides methods for
|
|
|
|
* Opening and closing a PE file
|
|
|
|
* Iterating over the imported functions
|
|
|
|
* Iterating over the relocations
|
|
|
|
* Iterating over the exported functions
|
|
|
|
* Iterating over sections
|
2013-12-24 12:41:59 -05:00
|
|
|
* Iterating over resources
|
2013-11-22 19:19:18 -05:00
|
|
|
* Reading bytes from specified virtual addresses
|
|
|
|
* Retrieving the program entry point
|
|
|
|
|
2020-03-17 13:38:56 -04:00
|
|
|
The interface is defined in `parser-library/parse.h`.
|
2013-11-22 19:19:18 -05:00
|
|
|
|
2020-03-17 13:38:56 -04:00
|
|
|
The program in `dump-prog/dump.cpp` is an example of using the parser-library API to dump
|
|
|
|
information about a PE file.
|
|
|
|
|
|
|
|
Internally, the parser-library uses a bounded buffer abstraction to access information stored in
|
|
|
|
the PE file. This should help in constructing a sane parser that allows for detection of the use
|
|
|
|
of bogus values in the PE that would result in out of bounds accesses of the input buffer.
|
|
|
|
Once data is read from the file it is sanitized and placed in C++ STL containers of internal types.
|
|
|
|
|
|
|
|
pe-parse includes Python bindings via `pepy`, which can be installed via `pip`:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
$ pip3 install pepy
|
|
|
|
```
|
|
|
|
|
|
|
|
More information about `pepy` can be found in its [README](./pepy/README.md).
|
|
|
|
|
|
|
|
## Dependencies
|
2013-11-22 19:28:04 -05:00
|
|
|
|
2018-03-26 14:30:34 +02:00
|
|
|
### CMake
|
2017-03-11 19:25:58 -05:00
|
|
|
* Debian/Ubuntu: `sudo apt-get install cmake`
|
|
|
|
* RedHat/Fedora: `sudo yum install cmake`
|
|
|
|
* OSX: `brew install cmake`
|
2018-03-26 14:30:34 +02:00
|
|
|
* Windows: Download the installer from the [CMake page](https://cmake.org/download/)
|
|
|
|
|
2020-03-17 13:38:56 -04:00
|
|
|
## Building
|
|
|
|
|
2018-03-26 14:30:34 +02:00
|
|
|
### Generic instructions
|
|
|
|
```
|
|
|
|
git clone https://github.com/trailofbits/pe-parse.git
|
|
|
|
cd pe-parse
|
|
|
|
|
|
|
|
mkdir build
|
|
|
|
cd build
|
|
|
|
|
|
|
|
cmake -DCMAKE_BUILD_TYPE=Release ..
|
2020-03-17 13:38:56 -04:00
|
|
|
cmake --build .
|
2018-03-26 14:30:34 +02:00
|
|
|
|
|
|
|
# optional
|
2020-03-17 13:38:56 -04:00
|
|
|
cmake --build . --target install
|
2018-03-26 14:30:34 +02:00
|
|
|
```
|
|
|
|
|
2020-03-17 13:38:56 -04:00
|
|
|
PE files that have a Resource section with strings for the Type are encoded in UTF-16, but that
|
|
|
|
`std::string` expects UTF-8. Some cross-platform solution is desired.
|
|
|
|
|
|
|
|
You can let `cmake` choose one it finds in your build environment or you can choose one from the
|
|
|
|
following options yourself and specify it with the `-DUNICODE_LIBRARY` argument when generating the
|
|
|
|
project files with `cmake`:
|
|
|
|
|
|
|
|
* `icu` (preferred) - "[ICU](http://site.icu-project.org/) is a mature, widely used set of C/C++
|
|
|
|
and Java libraries providing Unicode and Globalization support for software applications"
|
|
|
|
* `codecvt` - A C++ library header file
|
|
|
|
([now deprecated](http://open-std.org/JTC1/SC22/WG21/docs/papers/2017/p0618r0.html)) supported
|
|
|
|
by some C++ runtimes
|
2019-09-16 17:59:24 -07:00
|
|
|
|
2018-03-26 14:30:34 +02:00
|
|
|
### Notes about Windows
|
|
|
|
|
2020-03-17 13:38:56 -04:00
|
|
|
If you are building on Windows with Visual Studio, the generator option can be used to select the
|
|
|
|
compiler version and the output architecture:
|
2018-03-26 14:30:34 +02:00
|
|
|
|
|
|
|
```
|
|
|
|
# Compile 64-bit binaries with Visual Studio 2017
|
2020-03-17 13:38:56 -04:00
|
|
|
cmake -G "Visual Studio 15 2017 Win64" ..
|
2018-03-26 14:30:34 +02:00
|
|
|
|
|
|
|
# Compile 32-bit binaries with Visual Studio 2017
|
2020-03-17 13:38:56 -04:00
|
|
|
cmake -G "Visual Studio 15 2017" ..
|
2018-03-26 14:30:34 +02:00
|
|
|
```
|
2013-11-22 19:31:11 -05:00
|
|
|
|
2020-03-17 13:38:56 -04:00
|
|
|
Visual Studio 2015 or higher is required to use codecvt, but you also have the option of using
|
|
|
|
[ICU](http://site.icu-project.org/). The easiest way to get started with ICU in Windows is with
|
|
|
|
[vcpkg](https://vcpkg.readthedocs.io/): `vcpkg install icu`.
|
|
|
|
|
|
|
|
Then, add the `-DCMAKE_TOOLCHAIN_FILE=C:\src\vcpkg\scripts\buildsystems\vcpkg.cmake` argument when
|
|
|
|
generating the project files with cmake to add the appropriate library and include directories to
|
|
|
|
the project.
|
|
|
|
|
|
|
|
## Using the library
|
2019-09-16 17:59:24 -07:00
|
|
|
|
2017-11-25 22:01:53 +01:00
|
|
|
Once the library is installed, linking to it is easy! Add the following lines in your CMake project:
|
|
|
|
|
|
|
|
```
|
|
|
|
find_package(peparse REQUIRED)
|
|
|
|
|
|
|
|
target_link_libraries(your_target_name ${PEPARSE_LIBRARIES})
|
|
|
|
target_include_directories(your_target_name PRIVATE ${PEPARSE_INCLUDE_DIRS})
|
|
|
|
```
|
|
|
|
|
|
|
|
You can see a full example in the examples/peaddrconv folder.
|
|
|
|
|
2020-03-17 13:38:56 -04:00
|
|
|
## Authors
|
|
|
|
|
|
|
|
pe-parse was designed and implemented by Andrew Ruef (andrew@trailofbits.com), with significant
|
|
|
|
contributions from [Wesley Shields](https://github.com/wxsBSD).
|