52 _ctx_details(
bool _is64b =
false, ULONGLONG _rip = 0, ULONGLONG _rsp = 0, ULONGLONG _rbp = 0, ULONGLONG _ret_addr = 0)
52 _ctx_details(
bool _is64b =
false, ULONGLONG _rip = 0, ULONGLONG _rsp = 0, ULONGLONG _rbp = 0, ULONGLONG _ret_addr = 0) {
…}
58 void init(
bool _is64b =
false, ULONGLONG _rip = 0, ULONGLONG _rsp = 0, ULONGLONG _rbp = 0, ULONGLONG _ret_addr = 0)
64 this->last_ret = _ret_addr;
58 void init(
bool _is64b =
false, ULONGLONG _rip = 0, ULONGLONG _rsp = 0, ULONGLONG _rbp = 0, ULONGLONG _ret_addr = 0) {
…}
92 bool printCallstack = (jdetails >=
JSON_DETAILS) ?
true :
false;
94 printCallstack =
true;
97 printCallstack =
true;
100 outs <<
"\"" << std::hex <<
stack_ptr <<
"\"";
103 OUT_PADDED(outs, level,
"\"frames_count\" : ");
104 outs << std::dec <<
cDetails.callStack.size();
105 if (printCallstack) {
108 for (
auto itr =
cDetails.callStack.rbegin(); itr !=
cDetails.callStack.rend(); ++itr) {
109 if (itr !=
cDetails.callStack.rbegin()) {
112 const ULONGLONG addr = *itr;
113 outs <<
"\"" << std::hex << addr;
116 outs <<
";" << sItr->second;
133 outs <<
"\"" << std::hex << (ULONGLONG)
module <<
"\"";
136 OUT_PADDED(outs, level,
"\"module_size\" : ");
137 outs <<
"\"" << std::hex << (ULONGLONG)
moduleSize <<
"\"";
141 outs <<
"\"" << std::hex <<
protection <<
"\"";
142 if (
stats.isFilled()) {
144 stats.toJSON(outs, level);
153 outs <<
"\"" <<
"UNKNOWN" <<
"\"";
160 OUT_PADDED(outs, level,
"\"wait_reason\" : ");
165 OUT_PADDED(outs, level,
"\"callstack\" : {\n");
170 bool showLastCall = (jdetails >=
JSON_DETAILS) ?
true :
false;
182 if (!this->
lastFunction.empty() && (this->lastFunction != this->lastSyscall)) {
194 OUT_PADDED(outs, level,
"\"indicators\" : [");
210 outs << std::dec <<
tid;
212 OUT_PADDED(outs, level,
"\"thread_info\" : {\n");
224 OUT_PADDED(outs, level,
"\"susp_return_addr\" : ");
226 outs <<
"\"" << std::hex <<
susp_addr <<
"\"";
233 OUT_PADDED(outs, level,
"\"thread_scan\" : {\n");
virtual const bool _toJSON(std::stringstream &outs, size_t level=JSON_LEVEL, const pesieve::t_json_level &jdetails=JSON_BASIC)
ModuleScanReport(HMODULE _module, size_t _moduleSize, t_scan_status _status=SCAN_NOT_SUSPICIOUS)
A container of all the process modules that were scanned.
ProcessFeatureScanner(HANDLE _processHandle)
A report from the thread scan, generated by ThreadScanner.
virtual const void callstackToJSON(std::stringstream &outs, size_t level, const pesieve::t_json_level &jdetails)
std::set< ThSusIndicator > indicators
std::map< ULONGLONG, std::string > addrToSymbol
virtual const void fieldsToJSON(std::stringstream &outs, size_t level, const pesieve::t_json_level &jdetails)
ThreadScanReport(DWORD _tid)
const bool moduleInfoToJSON(std::stringstream &outs, size_t level, const pesieve::t_json_level &jdetails)
static std::string translate_wait_reason(DWORD thread_wait_reason)
const bool threadInfoToJSON(std::stringstream &outs, size_t level, const pesieve::t_json_level &jdetails)
static const DWORD THREAD_STATE_UNKNOWN
const bool indicatorsToJSON(std::stringstream &outs, size_t level, const pesieve::t_json_level &jdetails)
static const DWORD THREAD_STATE_WAITING
std::set< ULONGLONG > shcCandidates
virtual const bool toJSON(std::stringstream &outs, size_t level, const pesieve::t_json_level &jdetails)
static std::string translate_thread_state(DWORD thread_state)
bool checkReturnAddrIntegrity(IN const std::vector< ULONGLONG > &callStack, IN OUT ThreadScanReport &my_report)
virtual ThreadScanReport * scanRemote()
size_t analyzeCallStackInfo(IN OUT ThreadScanReport &my_report)
bool reportSuspiciousAddr(ThreadScanReport *my_report, ULONGLONG susp_addr)
std::string resolveAddrToString(IN ULONGLONG addr)
std::string resolveLowLevelFuncName(IN const ULONGLONG addr, OUT OPTIONAL size_t *disp=nullptr)
size_t _analyzeCallStack(IN OUT ctx_details &cDetails, OUT IN std::set< ULONGLONG > &shcCandidates)
void printThreadInfo(const util::thread_info &threadi)
bool fillAreaStats(ThreadScanReport *my_report)
void reportResolvedCallstack(ThreadScanReport &my_report)
ThreadScanner(HANDLE hProc, bool _isReflection, bool _isManaged, const util::thread_info &_info, ModulesInfo &_modulesInfo, peconv::ExportsMapper *_exportsMap, ProcessSymbolsManager *_symbols)
bool printResolvedAddr(const ULONGLONG addr)
bool filterDotNet(ThreadScanReport &my_report)
void initReport(ThreadScanReport &my_report)
peconv::ExportsMapper * exportsMap
const util::thread_info & info
bool isAddrInNamedModule(ULONGLONG addr)
static std::string choosePreferredFunctionName(const std::string &dbgSymbol, const std::string &manualSymbol)
ProcessSymbolsManager * symbols
bool scanRemoteThreadCtx(HANDLE hThread, ThreadScanReport &my_report)
ModulesInfo & modulesInfo
bool fetchThreadCtxDetails(IN HANDLE hProcess, IN HANDLE hThread, OUT ThreadScanReport &my_report)
size_t fillCallStackInfo(IN HANDLE hProcess, IN HANDLE hThread, IN LPVOID ctx, IN OUT ThreadScanReport &my_report)
struct pesieve::util::_thread_info thread_info
struct pesieve::_ctx_details ctx_details
A custom structure keeping a fragment of a thread context.
std::string indicator_to_str(const ThSusIndicator &indicator)
enum pesieve::ThSusIndicator _ThSusIndicator
@ THI_SUS_CALLSTACK_CORRUPT
@ THI_SUS_CALLS_INTEGRITY
@ JSON_DETAILS
include the basic list patches in the main JSON report
void init(bool _is64b=false, ULONGLONG _rip=0, ULONGLONG _rsp=0, ULONGLONG _rbp=0, ULONGLONG _ret_addr=0)
std::vector< ULONGLONG > callStack
_ctx_details(bool _is64b=false, ULONGLONG _rip=0, ULONGLONG _rsp=0, ULONGLONG _rbp=0, ULONGLONG _ret_addr=0)