PE-sieve
Scans all running processes. Recognizes and dumps a variety of potentially malicious implants (replaced/implanted PEs, shellcodes, hooks, in-memory patches).
Toggle main menu visibility
Loading...
Searching...
No Matches
utils
artefacts_util.cpp
Go to the documentation of this file.
1
#include "
artefacts_util.h
"
2
#include <peconv.h>
3
#include "
code_patterns.h
"
4
#ifdef _DEBUG
5
#include <iostream>
6
#endif
7
8
using namespace
sig_finder;
9
10
BYTE*
pesieve::util::find_pattern
(BYTE* buffer,
size_t
buf_size, BYTE* pattern_buf,
size_t
pattern_size,
size_t
max_iter)
11
{
12
for
(
size_t
i = 0; (i + pattern_size) < buf_size; i++) {
13
if
(max_iter != 0 && i > max_iter)
break
;
14
if
(memcmp(buffer + i, pattern_buf, pattern_size) == 0) {
15
return
(buffer + i);
16
}
17
}
18
return
nullptr
;
19
}
20
21
namespace
pesieve
{
22
23
std::set<DWORD>
HardcodedPatterns
;
24
pesieve::util::Mutex
g_HardcodedPatternsMutex
;
25
26
size_t
init_32_patterns
(Node* rootN)
27
{
28
util::MutexLocker
guard(
g_HardcodedPatternsMutex
);
29
if
(!rootN)
return
0;
30
31
size_t
added = 0;
32
for
(
size_t
i = 0; i < _countof(
patterns32
); i++)
33
{
34
const
t_pattern
& pattern =
patterns32
[i];
35
std::string name =
"prolog32_"
+ std::to_string((ULONGLONG)i);
36
Signature sign(name, pattern.
ptr
, pattern.
size
);
37
if
(rootN->addPattern(sign)) {
38
HardcodedPatterns
.insert(sign.checksum());
39
added++;
40
}
41
}
42
return
added;
43
}
44
45
size_t
init_64_patterns
(Node* rootN)
46
{
47
util::MutexLocker
guard(
g_HardcodedPatternsMutex
);
48
if
(!rootN)
return
0;
49
50
size_t
added = 0;
51
for
(
size_t
i = 0; i < _countof(
patterns64
); i++)
52
{
53
const
t_pattern
&pattern =
patterns64
[i];
54
std::string name =
"prolog64_"
+ std::to_string((ULONGLONG)i);
55
Signature sign(name, pattern.
ptr
, pattern.
size
);
56
if
(rootN->addPattern(sign)) {
57
HardcodedPatterns
.insert(sign.checksum());
58
added++;
59
}
60
}
61
return
added;
62
}
63
64
inline
size_t
search_till_pattern
(sig_finder::Node& rootN,
const
BYTE* loadedData,
size_t
loadedSize)
65
{
66
Match m = sig_finder::find_first_match(rootN, loadedData, loadedSize);
67
if
(!m.sign) {
68
return
PATTERN_NOT_FOUND
;
69
}
70
return
m.offset;
71
}
72
73
};
//namespace pesieve
74
75
size_t
pesieve::util::is_32bit_code
(
const
BYTE *loadedData,
size_t
loadedSize)
76
{
77
static
sig_finder::Node rootN;
78
if
(rootN.isEnd()) {
79
init_32_patterns
(&rootN);
80
}
81
return
search_till_pattern
(rootN, loadedData, loadedSize);
82
}
83
84
size_t
pesieve::util::is_64bit_code
(
const
BYTE* loadedData,
size_t
loadedSize)
85
{
86
static
sig_finder::Node rootN;
87
if
(rootN.isEnd()) {
88
init_64_patterns
(&rootN);
89
}
90
return
search_till_pattern
(rootN, loadedData, loadedSize);
91
}
92
93
bool
pesieve::util::is_code
(
const
BYTE* loadedData,
size_t
loadedSize)
94
{
95
static
sig_finder::Node rootN;
96
if
(peconv::is_padding(loadedData, loadedSize, 0)) {
97
return
false
;
98
}
99
if
(rootN.isEnd()) {
100
init_32_patterns
(&rootN);
101
init_64_patterns
(&rootN);
102
}
103
if
((
search_till_pattern
(rootN, loadedData, loadedSize)) !=
PATTERN_NOT_FOUND
) {
104
return
true
;
105
}
106
return
false
;
107
}
108
109
bool
pesieve::util::is_executable
(
DWORD
mapping_type,
DWORD
protection)
110
{
111
const
bool
is_any_exec = (protection & PAGE_EXECUTE_READWRITE)
112
|| (protection & PAGE_EXECUTE_READ)
113
|| (protection & PAGE_EXECUTE)
114
|| (protection & PAGE_EXECUTE_WRITECOPY);
115
return
is_any_exec;
116
}
117
118
bool
pesieve::util::is_readable
(
DWORD
mapping_type,
DWORD
protection)
119
{
120
const
bool
is_read = (protection & PAGE_READWRITE)
121
|| (protection & PAGE_READONLY);
122
return
is_read;
123
}
124
125
bool
pesieve::util::is_normal_inaccessible
(
DWORD
state,
DWORD
mapping_type,
DWORD
protection)
126
{
127
if
((state & MEM_COMMIT) == 0) {
128
//not committed
129
return
false
;
130
}
131
if
(mapping_type != MEM_IMAGE && (mapping_type != MEM_MAPPED) && mapping_type != MEM_PRIVATE) {
132
// invalid mapping type
133
return
false
;
134
}
135
if
(protection & PAGE_NOACCESS) {
136
// inaccessible found
137
return
true
;
138
}
139
return
false
;
140
}
141
142
//---
143
// matcher:
144
145
bool
pesieve::PatternMatcher::isReady
()
146
{
147
util::MutexLocker
guard(
mainMatcherMutex
);
148
return
_isReady
();
149
}
150
151
size_t
pesieve::PatternMatcher::loadPatternFile
(
const
char
* filename)
152
{
153
util::MutexLocker
guard(
mainMatcherMutex
);
154
static
bool
isLoaded =
false
;
155
if
(isLoaded)
return
0;
// allow to load file only once
156
157
isLoaded =
true
;
158
std::vector<Signature*> signatures;
159
Signature::loadFromFile(filename, signatures);
160
const
size_t
added =
mainMatcher
.addPatterns(signatures);
161
// delete the loaded signatures:
162
for
(
auto
itr = signatures.begin(); itr != signatures.end(); ++itr) {
163
Signature* sign = *itr;
164
delete
sign;
165
}
166
std::cout <<
"Added patterns: "
<< std::dec << added <<
"\n"
;
167
return
added;
168
}
169
170
bool
pesieve::PatternMatcher::initShellcodePatterns
()
171
{
172
util::MutexLocker
guard(
mainMatcherMutex
);
173
static
bool
isLoaded =
false
;
174
if
(isLoaded)
return
false
;
// allow to load only once
175
176
isLoaded =
true
;
177
init_32_patterns
(&
mainMatcher
);
178
init_64_patterns
(&
mainMatcher
);
179
return
true
;
180
}
181
182
size_t
pesieve::PatternMatcher::findAllPatterns
(BYTE* loadedData,
size_t
loadedSize, std::vector<sig_finder::Match>& allMatches)
183
{
184
util::MutexLocker
guard(
mainMatcherMutex
);
185
if
(!
_isReady
()) {
186
return
0;
187
}
188
if
(peconv::is_padding(loadedData, loadedSize, 0)) {
189
return
0;
190
}
191
const
size_t
matches = sig_finder::find_all_matches(
mainMatcher
, loadedData, loadedSize, allMatches);
192
return
matches;
193
}
194
195
size_t
pesieve::PatternMatcher::filterCustom
(std::vector<sig_finder::Match>& allMatches, std::vector<sig_finder::Match>& customPatternMatches)
196
{
197
util::MutexLocker
guard(
g_HardcodedPatternsMutex
);
198
size_t
customCount = 0;
199
for
(
auto
itr = allMatches.begin(); itr != allMatches.end(); ++itr) {
200
sig_finder::Match m = *itr;
201
if
(m.sign) {
202
const
DWORD checks = m.sign->checksum();
203
if
(
HardcodedPatterns
.find(checks) !=
HardcodedPatterns
.end()) {
204
continue
;
205
}
206
customPatternMatches.push_back(m);
207
customCount++;
208
}
209
}
210
return
customCount;
211
}
artefacts_util.h
PATTERN_NOT_FOUND
#define PATTERN_NOT_FOUND
Definition
artefacts_util.h:6
pesieve::PatternMatcher::mainMatcherMutex
pesieve::util::Mutex mainMatcherMutex
Definition
artefacts_util.h:57
pesieve::PatternMatcher::mainMatcher
sig_finder::Node mainMatcher
Definition
artefacts_util.h:56
pesieve::PatternMatcher::loadPatternFile
size_t loadPatternFile(const char *filename)
Definition
artefacts_util.cpp:151
pesieve::PatternMatcher::findAllPatterns
size_t findAllPatterns(BYTE *loadedData, size_t loadedSize, ::std::vector< sig_finder::Match > &allMatches)
Definition
artefacts_util.cpp:182
pesieve::PatternMatcher::_isReady
bool _isReady()
Definition
artefacts_util.h:55
pesieve::PatternMatcher::initShellcodePatterns
bool initShellcodePatterns()
Definition
artefacts_util.cpp:170
pesieve::PatternMatcher::filterCustom
size_t filterCustom(::std::vector< sig_finder::Match > &allMatches, ::std::vector< sig_finder::Match > &customPatternMatches)
Definition
artefacts_util.cpp:195
pesieve::PatternMatcher::isReady
bool isReady()
Definition
artefacts_util.cpp:145
code_patterns.h
pesieve::util::is_code
bool is_code(const BYTE *loadedData, size_t loadedSize)
Definition
artefacts_util.cpp:93
pesieve::util::is_64bit_code
size_t is_64bit_code(const BYTE *loadedData, size_t loadedSize)
Definition
artefacts_util.cpp:84
pesieve::util::is_readable
bool is_readable(DWORD mapping_type, DWORD protection)
Definition
artefacts_util.cpp:118
pesieve::util::find_pattern
BYTE * find_pattern(BYTE *buffer, size_t buf_size, BYTE *pattern_buf, size_t pattern_size, size_t max_iter=0)
Definition
artefacts_util.cpp:10
pesieve::util::is_normal_inaccessible
bool is_normal_inaccessible(DWORD state, DWORD mapping_type, DWORD protection)
Definition
artefacts_util.cpp:125
pesieve::util::is_executable
bool is_executable(DWORD mapping_type, DWORD protection)
Definition
artefacts_util.cpp:109
pesieve::util::DWORD
DWORD(__stdcall *_PssCaptureSnapshot)(HANDLE ProcessHandle
pesieve::util::is_32bit_code
size_t is_32bit_code(const BYTE *loadedData, size_t loadedSize)
Definition
artefacts_util.cpp:75
pesieve
Definition
pesieve.py:1
pesieve::init_32_patterns
size_t init_32_patterns(Node *rootN)
Definition
artefacts_util.cpp:26
pesieve::t_pattern
struct pesieve::_t_pattern t_pattern
pesieve::patterns32
t_pattern patterns32[]
Definition
code_patterns.h:26
pesieve::search_till_pattern
size_t search_till_pattern(sig_finder::Node &rootN, const BYTE *loadedData, size_t loadedSize)
Definition
artefacts_util.cpp:64
pesieve::g_HardcodedPatternsMutex
pesieve::util::Mutex g_HardcodedPatternsMutex
Definition
artefacts_util.cpp:24
pesieve::patterns64
t_pattern patterns64[]
Definition
code_patterns.h:70
pesieve::init_64_patterns
size_t init_64_patterns(Node *rootN)
Definition
artefacts_util.cpp:45
pesieve::HardcodedPatterns
std::set< DWORD > HardcodedPatterns
Definition
artefacts_util.cpp:23
pesieve::_t_pattern::size
size_t size
Definition
code_patterns.h:8
pesieve::_t_pattern::ptr
BYTE * ptr
Definition
code_patterns.h:7
pesieve::util::Mutex
Definition
custom_mutex.h:8
pesieve::util::MutexLocker
Definition
custom_mutex.h:35
Generated by
1.17.0