PE-sieve
Scans all running processes. Recognizes and dumps a variety of potentially malicious implants (replaced/implanted PEs, shellcodes, hooks, in-memory patches).
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
patch_analyzer.h
Go to the documentation of this file.
1#pragma once
2
3#include "module_data.h"
4#include "patch_list.h"
5#include <set>
6
7namespace pesieve {
8
11 {
12 public:
13 typedef enum {
15 OP_JMP = 0xE9,
21
22 PatchAnalyzer(ModuleData &_moduleData, DWORD _sectionRVA, PBYTE patched_code, size_t code_size)
23 : moduleData(_moduleData), sectionRVA(_sectionRVA), patchedCode(patched_code), codeSize(code_size)
24 {
25 isModule64bit = moduleData.is64bit();
26 moduleData.loadRelocatedFields(relocs);
27 }
28
29 size_t analyzeHook(PatchList::Patch &patch);
30
31 size_t analyzeOther(PatchList::Patch& patch);
32
33 protected:
34 size_t _analyzeHook(PatchList::Patch &patch, BYTE* patch_ptr, ULONGLONG patch_va);
35 size_t _analyzeRelocated(PatchList::Patch &patch, BYTE* patch_ptr);
36
37 size_t parseJmpViaAddr(PatchList::Patch &patch, BYTE* patch_ptr, ULONGLONG patch_va);
38 size_t parseShortJmp(PatchList::Patch &patch, BYTE* patch_ptr, ULONGLONG patch_va);
39 size_t parseJmp(PatchList::Patch &patch, BYTE* patch_ptr, ULONGLONG patch_va);
40 size_t parseMovJmp(PatchList::Patch &patch, BYTE* patch_ptr, bool is_long);
41 size_t parsePushRet(PatchList::Patch &patch, BYTE* patch_ptr);
42
43 template <typename DELTA_T>
44 ULONGLONG getJmpDestAddr(ULONGLONG currVA, int instrLen, DELTA_T lVal);
45
46 bool is64Modifier(BYTE op);
47 bool isLongModifier(BYTE op);
48
50
54 size_t codeSize;
55
56 std::set<DWORD> relocs;
57 };
58
59}; //namespace pesieve
60
Loads a module from the disk, corresponding to the module in the scanned process' memory.
Definition module_data.h:15
size_t parsePushRet(PatchList::Patch &patch, BYTE *patch_ptr)
size_t _analyzeRelocated(PatchList::Patch &patch, BYTE *patch_ptr)
PatchAnalyzer(ModuleData &_moduleData, DWORD _sectionRVA, PBYTE patched_code, size_t code_size)
size_t parseJmp(PatchList::Patch &patch, BYTE *patch_ptr, ULONGLONG patch_va)
std::set< DWORD > relocs
size_t analyzeOther(PatchList::Patch &patch)
size_t parseMovJmp(PatchList::Patch &patch, BYTE *patch_ptr, bool is_long)
ULONGLONG getJmpDestAddr(ULONGLONG currVA, int instrLen, DELTA_T lVal)
size_t _analyzeHook(PatchList::Patch &patch, BYTE *patch_ptr, ULONGLONG patch_va)
size_t parseJmpViaAddr(PatchList::Patch &patch, BYTE *patch_ptr, ULONGLONG patch_va)
size_t parseShortJmp(PatchList::Patch &patch, BYTE *patch_ptr, ULONGLONG patch_va)
size_t analyzeHook(PatchList::Patch &patch)