BearParser
Portable Executable parsing library (from PE-bear)
Util.cpp
Go to the documentation of this file.
1 #include "Util.h"
2 #include <stdarg.h>
3 
4 using namespace pe_util;
5 
6 #define MAX_LINE 255
7 
8 bool Logger::append(dbg_level lvl, const char* format, ...)
9 {
10  if (lvl > DBG_LVL) {
11  return false;
12  }
13  if (format == NULL) {
14  return false;
15  }
16  va_list argptr;
17  // Initializing arguments to store all values after format
18  va_start(argptr, format);
19 
20  char line[MAX_LINE+1];
21  memset(line, 0, MAX_LINE+1);
22 
23  int printed = vsnprintf(line, MAX_LINE, format, argptr);
24 
25  //cleaning up the list:
26  va_end(argptr);
27  if (printed <= 0) return false;
28 
29  const char *prefixes[D_LVL_COUNT] = {"ERROR", "WARNING", "INFO"};
30  if (static_cast<unsigned>(lvl) > static_cast<unsigned>(D_LVL_COUNT)) {
31  lvl = Logger::D_ERROR;
32  }
33 
34  fprintf(stderr, "[%s] %s\n", prefixes[lvl], line);
35  return true;
36 }
37 
38 bool pe_util::isStrLonger(const char *inp, size_t maxLen)
39 {
40  for (size_t i = 0; i < maxLen; i++ ) {
41  if (inp[i] == '\0') return false;
42  }
43  return true;
44 }
45 
46 size_t pe_util::getAsciiLen(const char *inp, size_t maxInp, bool acceptNotTerminated)
47 {
48  size_t i = 0;
49  for (; i < maxInp; i++) {
50  const char c = inp[i];
51  if (c == '\0') return i; //end of string
52  if (!IS_PRINTABLE(c) && !IS_ENDLINE(c)) return 0;
53  }
54  if (acceptNotTerminated) return i;
55  return 0;
56 }
57 
58 size_t pe_util::getAsciiLenW(const WORD *inp, size_t maxInp, bool acceptNotTerminated)
59 {
60  size_t i = 0;
61  for (; i < maxInp; i++) {
62  const WORD w = inp[i];
63  if (w == 0) return i; //end of string
64  if (!IS_PRINTABLE(w) && !IS_ENDLINE(w)) return 0;
65  }
66  if (acceptNotTerminated) return i;
67  return 0;
68 }
69 
70 bool pe_util::hasNonPrintable(const char *inp, size_t maxInp)
71 {
72  unsigned int i = 0;
73  for ( i = 0; i < maxInp; i++) {
74  char c = inp[i];
75  if (c == '\0') break; //end of string
76  if (!IS_PRINTABLE(c)) return true;
77  }
78  return false;
79 }
80 
81 size_t pe_util::forwarderNameLen(const char* fPtr, size_t bufSize)
82 {
83  if (!fPtr || bufSize == 0) return 0;
84 
85  // names can be also mangled, i.e. MSVCRT.??0__non_rtti_object@std@@QAE@ABV01@@Z
86  bool has_dot = false;
87  size_t len = 0;
88  while ((*fPtr >= 'a' && *fPtr <= 'z')
89  || (*fPtr >= 'A' && *fPtr <= 'Z')
90  || (*fPtr >= '0' && *fPtr <= '9')
91  || (*fPtr == '.')
92  || (*fPtr == '_')
93  || (*fPtr == '#')
94  || (*fPtr == '@')
95  || (*fPtr == '?')
96  || (*fPtr == '-'))
97  {
98  if (*fPtr == '.') has_dot = true;
99  len++;
100  if ((--bufSize) == 0) break;
101  fPtr++;
102  }
103  if (*fPtr == '\0') {
104  if (!has_dot) {
105  return 0; //this is not a valid forwarder
106  }
107  return len;
108  }
109  return 0;
110 }
111 
112 size_t pe_util::noWhiteCount(char *buf, size_t bufSize) {
113  size_t cntr = 0;
114  size_t i = 0;
115  for (i = 0; i < bufSize; i++) {
116  if (IS_PRINTABLE(buf[i]) && buf[i] != ' ')
117  cntr++;
118  }
119  return cntr;
120 }
121 
122 size_t pe_util::noWhiteCount(std::string s)
123 {
124  size_t bufSize = s.length();
125  size_t cntr = 0;
126  size_t i = 0;
127  for (i = 0; i < bufSize; i++) {
128  if (IS_PRINTABLE(s[i]) && s[i] != ' ')
129  cntr++;
130  }
131  return cntr;
132 }
133 
134 bool pe_util::isSpaceClear(void* ptr, uint64_t size)
135 {
136  BYTE* testblock = (BYTE*) calloc(size, sizeof(BYTE));
137  bool isClear = true;
138  if (memcmp (testblock, ptr, size)) {
139  isClear = false;
140  }
141  free(testblock);
142  return isClear;
143 }
144 
145 bool pe_util::isHexChar(char c)
146 {
147  if (isdigit(c)) return true;
148  if (c >= 'A' && c <= 'F') return true;
149  if (c >= 'a' && c <= 'f') return true;
150  return false;
151 }
152 
153 void pe_util::hexdump(BYTE *buf, size_t bufSize, size_t pad)
154 {
155  if (buf == NULL) return;
156  printf("\n---\n");
157  for (size_t i = 0; i < bufSize; i++) {
158  if (i % pad == 0) printf("\n");
159  printf("0x%02X ", buf[i]);
160  }
161  printf("\n---\n");
162 }
163 
164 bool pe_util::endsWith(std::string str, std::string endStr)
165 {
166  if (str.length() < endStr.length()) {
167  return false;
168  }
169  size_t pos = str.length() - endStr.length();
170  std::string str3 = str.substr(pos);
171  if ( str3 == endStr ) {
172  return true;
173  }
174  return false;
175 }
#define MAX_LINE
Definition: Util.cpp:6
#define IS_ENDLINE(c)
Definition: Util.h:12
#define IS_PRINTABLE(c)
Definition: Util.h:11
#define DBG_LVL
Definition: Util.h:18
bool append(dbg_level lvl, const char *format,...)
Definition: Util.cpp:8
dbg_level
Definition: Util.h:25
@ D_LVL_COUNT
Definition: Util.h:26
@ D_ERROR
Definition: Util.h:26
Definition: Util.h:31
bool hasNonPrintable(const char *ptr, size_t maxInp)
Definition: Util.cpp:70
size_t forwarderNameLen(const char *ptr, size_t max_len)
Definition: Util.cpp:81
size_t getAsciiLen(const char *ptr, size_t maxCount, bool acceptNotTerminated=false)
Definition: Util.cpp:46
bool isStrLonger(const char *inp, size_t maxLen)
Definition: Util.cpp:38
size_t noWhiteCount(char *buf, size_t bufSize)
Definition: Util.cpp:112
void hexdump(BYTE *buf, size_t bufSize, size_t pad)
Definition: Util.cpp:153
bool isSpaceClear(void *ptr, uint64_t size)
Definition: Util.cpp:134
size_t getAsciiLenW(const WORD *ptr, size_t maxCount, bool acceptNotTerminated=false)
Definition: Util.cpp:58
bool isHexChar(char c)
Definition: Util.cpp:145
bool endsWith(std::string string, std::string endStr)
Definition: Util.cpp:164