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