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
81bool _isFuncChar(const char c)
82{
83 if ((c >= 'a' && c <= 'z')
84 || (c >= 'A' && c <= 'Z')
85 || (c >= '0' && c <= '9')
86 || (c == '_')
87 || (c == '.')
88 || (c== '#')
89 || (c == '@')
90 || (c == '?')
91 || (c == '-')
92 )
93 {
94 return true;
95 }
96 return false;
97}
98
99bool pe_util::validateFuncName(const char* fPtr, size_t bufSize)
100{
101 if (!fPtr || !bufSize) return false;
102
103 for (char i = 0; i < bufSize; i++) {
104 const char c = fPtr[i];
105 if (c == 0) break;
106 if (!_isFuncChar(c)) {
107 return false;
108 }
109 }
110 return true;
111}
112
113size_t pe_util::forwarderNameLen(const char* fPtr, size_t bufSize)
114{
115 if (!fPtr || bufSize == 0) return 0;
116
117 // names can be also mangled, i.e. MSVCRT.??0__non_rtti_object@std@@QAE@ABV01@@Z
118 bool has_dot = false;
119 size_t len = 0;
120 while ((*fPtr == '.') || _isFuncChar(*fPtr))
121 {
122 if (*fPtr == '.') has_dot = true;
123 len++;
124 if ((--bufSize) == 0) break;
125 fPtr++;
126 }
127 if (*fPtr == '\0') {
128 if (!has_dot) {
129 return 0; //this is not a valid forwarder
130 }
131 return len;
132 }
133 return 0;
134}
135
136size_t pe_util::noWhiteCount(char *buf, size_t bufSize) {
137 size_t cntr = 0;
138 size_t i = 0;
139 for (i = 0; i < bufSize; i++) {
140 if (IS_PRINTABLE(buf[i]) && buf[i] != ' ')
141 cntr++;
142 }
143 return cntr;
144}
145
146size_t pe_util::noWhiteCount(std::string s)
147{
148 size_t bufSize = s.length();
149 size_t cntr = 0;
150 size_t i = 0;
151 for (i = 0; i < bufSize; i++) {
152 if (IS_PRINTABLE(s[i]) && s[i] != ' ')
153 cntr++;
154 }
155 return cntr;
156}
157
158bool pe_util::isSpaceClear(void* ptr, uint64_t size)
159{
160 BYTE* testblock = (BYTE*) calloc(size, sizeof(BYTE));
161 bool isClear = true;
162 if (memcmp (testblock, ptr, size)) {
163 isClear = false;
164 }
165 free(testblock);
166 return isClear;
167}
168
170{
171 if (isdigit(c)) return true;
172 if (c >= 'A' && c <= 'F') return true;
173 if (c >= 'a' && c <= 'f') return true;
174 return false;
175}
176
177void pe_util::hexdump(BYTE *buf, size_t bufSize, size_t pad)
178{
179 if (buf == NULL) return;
180 printf("\n---\n");
181 for (size_t i = 0; i < bufSize; i++) {
182 if (i % pad == 0) printf("\n");
183 printf("0x%02X ", buf[i]);
184 }
185 printf("\n---\n");
186}
187
188bool pe_util::endsWith(std::string str, std::string endStr)
189{
190 if (str.length() < endStr.length()) {
191 return false;
192 }
193 size_t pos = str.length() - endStr.length();
194 std::string str3 = str.substr(pos);
195 if ( str3 == endStr ) {
196 return true;
197 }
198 return false;
199}
#define MAX_LINE
Definition: Util.cpp:6
bool _isFuncChar(const char c)
Definition: Util.cpp:81
#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:113
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:136
bool validateFuncName(const char *fPtr, size_t bufSize)
Definition: Util.cpp:99
void hexdump(BYTE *buf, size_t bufSize, size_t pad)
Definition: Util.cpp:177
bool isSpaceClear(void *ptr, uint64_t size)
Definition: Util.cpp:158
size_t getAsciiLenW(const WORD *ptr, size_t maxCount, bool acceptNotTerminated=false)
Definition: Util.cpp:58
bool isHexChar(char c)
Definition: Util.cpp:169
bool endsWith(std::string string, std::string endStr)
Definition: Util.cpp:188