BearParser
Portable Executable parsing library (from PE-bear)
Loading...
Searching...
No Matches
Util.cpp
Go to the documentation of this file.
1#include "Util.h"
2#include <stdarg.h>
3
4using namespace pe_util;
5
6#define MAX_LINE 255
7
8bool 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
38bool 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
46size_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
58size_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
70bool 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
81size_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
112size_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
122size_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
134bool 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
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
153void 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
164bool 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