From 724247d321598a50bb9223997c3f297c444228d7 Mon Sep 17 00:00:00 2001
From: Jack Williams <jacwil014@gmail.com>
Date: Tue, 16 Oct 2018 14:37:48 -0700
Subject: [PATCH] Goodness for dump-pe utility (#80)

---
 dump-pe/main.cpp                | 60 +++++++++++++++------------------
 pe-parser-library/src/parse.cpp |  3 +-
 2 files changed, 29 insertions(+), 34 deletions(-)

diff --git a/dump-pe/main.cpp b/dump-pe/main.cpp
index 2a42851..9560089 100644
--- a/dump-pe/main.cpp
+++ b/dump-pe/main.cpp
@@ -23,6 +23,7 @@ THE SOFTWARE.
 */
 
 #include <iostream>
+#include <iomanip>
 #include <sstream>
 #include <cstring>
 
@@ -40,7 +41,7 @@ int printExps(void *N, VA funcAddr, std::string &mod, std::string &func) {
   std::cout << "!";
   std::cout << func;
   std::cout << ": 0x";
-  std::cout << to_string<decltype(address)>(address, std::hex);
+  std::cout << std::hex << address;
   std::cout << "\n";
   return 0;
 }
@@ -53,8 +54,7 @@ int printImports(void *N,
 
   auto address = static_cast<std::uint32_t>(impAddr);
 
-  std::cout << "0x" << to_string<decltype(address)>(address, std::hex);
-  std::cout << " " << modName << "!" << symName;
+  std::cout << "0x" << std::hex << address << " " << modName << "!" << symName;
   std::cout << "\n";
   return 0;
 }
@@ -93,7 +93,7 @@ int printRelocs(void *N, VA relocAddr, reloc_type type) {
       break;
   }
 
-  std::cout << " VA: 0x" << to_string<VA>(relocAddr, std::hex) << "\n";
+  std::cout << " VA: 0x" << std::hex << relocAddr << "\n";
 
   return 0;
 }
@@ -108,8 +108,7 @@ int printSymbols(void *N,
   static_cast<void>(N);
 
   std::cout << "Symbol Name: " << strName << "\n";
-  std::cout << "Symbol Value: 0x"
-            << to_string<std::uint32_t>(value, std::hex) << "\n";
+  std::cout << "Symbol Value: 0x" << std::hex << value << "\n";
 
   std::cout << "Symbol Section Number: ";
   switch (sectionNumber) {
@@ -234,22 +233,21 @@ int printRsrc(void *N, resource r) {
   if (r.type_str.length())
     std::cout << "Type (string): " << r.type_str << "\n";
   else
-    std::cout << "Type: 0x"
-              << to_string<std::uint32_t>(r.type, std::hex) << "\n";
+    std::cout << "Type: 0x" << std::hex << r.type << "\n";
+
   if (r.name_str.length())
     std::cout << "Name (string): " << r.name_str << "\n";
   else
-    std::cout << "Name: 0x"
-              << to_string<std::uint32_t>(r.name, std::hex) << "\n";
+    std::cout << "Name: 0x" << std::hex << r.name << "\n";
+
   if (r.lang_str.length())
     std::cout << "Lang (string): " << r.lang_str << "\n";
   else
-    std::cout << "Lang: 0x"
-              << to_string<std::uint32_t>(r.lang, std::hex) << "\n";
-  std::cout << "Codepage: 0x"
-            << to_string<std::uint32_t>(r.codepage, std::hex) << "\n";
-  std::cout << "RVA: " << to_string<std::uint32_t>(r.RVA, std::dec) << "\n";
-  std::cout << "Size: " << to_string<std::uint32_t>(r.size, std::dec) << "\n";
+    std::cout << "Lang: 0x" << std::hex << r.lang << "\n";
+
+  std::cout << "Codepage: 0x" << std::hex << r.codepage << "\n";
+  std::cout << "RVA: " << std::dec << r.RVA << "\n";
+  std::cout << "Size: " << std::dec << r.size << "\n";
   return 0;
 }
 
@@ -262,25 +260,21 @@ int printSecs(void *N,
   static_cast<void>(s);
 
   std::cout << "Sec Name: " << secName << "\n";
-  std::cout << "Sec Base: 0x"
-            << to_string<std::uint64_t>(secBase, std::hex) << "\n";
+  std::cout << "Sec Base: 0x" << std::hex << secBase << "\n";
   if (data)
-    std::cout << "Sec Size: "
-              << to_string<std::uint64_t>(data->bufLen, std::dec) << "\n";
+    std::cout << "Sec Size: " << std::dec << data->bufLen << "\n";
   else
     std::cout << "Sec Size: 0" << "\n";
   return 0;
 }
 
-#define DUMP_FIELD(x)                                                      \
-  std::cout << "" #x << ": 0x";                                            \
-  std::cout << to_string<std::uint32_t>(                                   \
-                   static_cast<std::uint32_t>(p->peHeader.nt.x), std::hex) \
+#define DUMP_FIELD(x)                                                   \
+  std::cout << "" #x << ": 0x";                                         \
+  std::cout << std::hex << static_cast<std::uint64_t>(p->peHeader.nt.x) \
             << "\n";
-#define DUMP_DEC_FIELD(x)                                                  \
-  std::cout << "" #x << ": ";                                              \
-  std::cout << to_string<std::uint32_t>(                                   \
-                   static_cast<std::uint32_t>(p->peHeader.nt.x), std::dec) \
+#define DUMP_DEC_FIELD(x)                                               \
+  std::cout << "" #x << ": ";                                           \
+  std::cout << std::dec << static_cast<std::uint64_t>(p->peHeader.nt.x) \
             << "\n";
 
 int main(int argc, char *argv[]) {
@@ -377,12 +371,14 @@ int main(int argc, char *argv[]) {
     if (GetEntryPoint(p, entryPoint)) {
       std::cout << "First 8 bytes from entry point (0x";
 
-      std::cout << to_string<VA>(entryPoint, std::hex);
-      std::cout << "):" << "\n";
+      std::cout << std::hex << entryPoint << "):" << "\n";
       for (std::size_t i = 0; i < 8; i++) {
         std::uint8_t b;
-        ReadByteAtVA(p, i + entryPoint, b);
-        std::cout << " 0x" << to_string<std::uint32_t>(b, std::hex);
+        if (!ReadByteAtVA(p, i + entryPoint, b)) {
+          std::cout << " ERR";
+        } else {
+          std::cout << " 0x" << std::hex << static_cast<int>(b);
+        }
       }
 
       std::cout << "\n";
diff --git a/pe-parser-library/src/parse.cpp b/pe-parser-library/src/parse.cpp
index 3210712..04b4ad2 100644
--- a/pe-parser-library/src/parse.cpp
+++ b/pe-parser-library/src/parse.cpp
@@ -356,8 +356,7 @@ bool parse_resource_table(bounded_buffer *sectionData,
           return false;
         }
       }
-    }
-    else {
+    } else {
       /* .rsrc can accomodate up to 2**31 levels, but Windows only uses 3 by convention.
        * As such, any depth above 3 indicates potentially unchecked recusion.
        * See: https://docs.microsoft.com/en-us/windows/desktop/debug/pe-format#the-rsrc-section