-
-
-
484 const DWORD tid = GetThreadId(hThread);
-
-
486 const bool is_ok = fetchThreadCtxDetails(processHandle, hThread, cDetails);
-
-
-
-
-
-
-
-
-
-
-
-
-
499 bool is_shc = isAddrInShellcode(cDetails.
rip);
-
-
501 if (reportSuspiciousAddr(my_report, cDetails.
rip)) {
-
-
-
-
-
-
-
-
509 const ULONGLONG addr = *itr;
-
510#ifdef _SHOW_THREAD_INFO
-
511 std::cout <<
"Checking shc candidate: " << std::hex << addr <<
"\n";
-
-
-
514 if (reportSuspiciousAddr(my_report, addr)) {
-
-
516#ifdef _SHOW_THREAD_INFO
-
517 std::cout <<
"Found! " << std::hex << addr <<
"\n";
-
-
-
-
-
-
-
-
-
-
-
-
529 is_shc = isAddrInShellcode(ret_addr);
-
530#ifdef _SHOW_THREAD_INFO
-
531 std::cout <<
"Return addr: " << std::hex << ret_addr <<
"\n";
-
532 printResolvedAddr(ret_addr);
-
-
534 if (is_shc && reportSuspiciousAddr(my_report, (ULONGLONG)ret_addr)) {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
549 bool isStackCorrupt =
false;
-
-
-
-
553 isStackCorrupt =
true;
-
-
-
-
-
558 && this->info.is_extended &&
info.ext.state == Waiting &&
info.ext.wait_reason == UserRequest)
-
-
560 isStackCorrupt =
true;
-
-
-
563 if (isStackCorrupt) {
-
-
-
-
-
-
-
-
+
479 const KTHREAD_STATE state = (KTHREAD_STATE)
info.ext.state;
+
480 if (state == Ready) {
+
+
+
483 if (state == Terminated) {
+
+
+
486 if (state == Waiting &&
info.ext.wait_reason <= WrQueue) {
+
+
+
+
+
+
+
494 const DWORD tid = GetThreadId(hThread);
+
+
496 const bool is_ok = fetchThreadCtxDetails(processHandle, hThread, cDetails);
+
+
+
+
+
+
+
+
+
+
+
+
+
509 bool is_shc = isAddrInShellcode(cDetails.
rip);
+
+
511 if (reportSuspiciousAddr(my_report, cDetails.
rip)) {
+
+
+
+
+
+
+
+
519 const ULONGLONG addr = *itr;
+
520#ifdef _SHOW_THREAD_INFO
+
521 std::cout <<
"Checking shc candidate: " << std::hex << addr <<
"\n";
+
+
+
524 if (reportSuspiciousAddr(my_report, addr)) {
+
+
526#ifdef _SHOW_THREAD_INFO
+
527 std::cout <<
"Found! " << std::hex << addr <<
"\n";
+
+
+
+
+
+
+
+
+
+
+
+
539 is_shc = isAddrInShellcode(ret_addr);
+
540#ifdef _SHOW_THREAD_INFO
+
541 std::cout <<
"Return addr: " << std::hex << ret_addr <<
"\n";
+
542 printResolvedAddr(ret_addr);
+
+
544 if (is_shc && reportSuspiciousAddr(my_report, (ULONGLONG)ret_addr)) {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
559 bool isStackCorrupt =
false;
+
+
+
+
563 isStackCorrupt =
true;
+
+
+
+
+
568 && this->info.is_extended &&
info.ext.state == Waiting &&
info.ext.wait_reason == UserRequest)
+
+
570 isStackCorrupt =
true;
+
-
-
-
-
-
576 if (GetCurrentThreadId() ==
info.tid) {
-
-
-
-
-
-
-
583#ifdef _SHOW_THREAD_INFO
-
584 printThreadInfo(
info);
-
-
-
587 bool is_shc = isAddrInShellcode(
info.start_addr);
-
-
589 if (reportSuspiciousAddr(my_report,
info.start_addr)) {
-
-
-
-
-
-
-
-
-
-
-
600 HANDLE hThread = OpenThread(
-
601 THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION | SYNCHRONIZE,
-
-
-
-
-
-
607 std::cerr <<
"[-] Could not OpenThread. Error: " << GetLastError() << std::endl;
-
-
-
-
-
612 scanRemoteThreadCtx(hThread, my_report);
-
613 CloseHandle(hThread);
-
-
+
573 if (isStackCorrupt) {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
586 if (GetCurrentThreadId() ==
info.tid) {
+
+
+
+
+
+
+
593#ifdef _SHOW_THREAD_INFO
+
594 printThreadInfo(
info);
+
+
+
597 bool is_shc = isAddrInShellcode(
info.start_addr);
+
+
599 if (reportSuspiciousAddr(my_report,
info.start_addr)) {
+
+
+
+
+
+
+
+
+
+
+
610 HANDLE hThread = OpenThread(
+
611 THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION | SYNCHRONIZE,
+
+
+
+
+
+
617 std::cerr <<
"[-] Could not OpenThread. Error: " << GetLastError() << std::endl;
+
+
+
+
+
622 scanRemoteThreadCtx(hThread, my_report);
+
623 CloseHandle(hThread);
+
+
A class responsible for filling in the statistics with the data from the particular buffer.
@@ -767,25 +777,26 @@
-
static std::string translate_wait_reason(DWORD thread_wait_reason)
+
static std::string translate_wait_reason(DWORD thread_wait_reason)
-
static std::string translate_thread_state(DWORD thread_state)
+
static std::string translate_thread_state(DWORD thread_state)
-
virtual ThreadScanReport * scanRemote()
-
bool reportSuspiciousAddr(ThreadScanReport *my_report, ULONGLONG susp_addr)
-
size_t fillCallStackInfo(IN HANDLE hProcess, IN HANDLE hThread, IN LPVOID ctx, IN OUT ctx_details &cDetails)
-
void printThreadInfo(const util::thread_info &threadi)
-
bool fillAreaStats(ThreadScanReport *my_report)
-
bool isAddrInShellcode(ULONGLONG addr)
-
size_t analyzeCallStack(IN const std::vector< ULONGLONG > stack_frame, IN OUT ctx_details &cDetails)
-
bool fetchThreadCtxDetails(IN HANDLE hProcess, IN HANDLE hThread, OUT ctx_details &c)
-
bool printResolvedAddr(ULONGLONG addr)
-
bool scanRemoteThreadCtx(HANDLE hThread, ThreadScanReport *my_report)
-
bool checkReturnAddrIntegrity(IN const std::vector< ULONGLONG > &callStack)
+
virtual ThreadScanReport * scanRemote()
+
bool reportSuspiciousAddr(ThreadScanReport *my_report, ULONGLONG susp_addr)
+
size_t fillCallStackInfo(IN HANDLE hProcess, IN HANDLE hThread, IN LPVOID ctx, IN OUT ctx_details &cDetails)
+
void printThreadInfo(const util::thread_info &threadi)
+
bool fillAreaStats(ThreadScanReport *my_report)
+
bool isAddrInShellcode(ULONGLONG addr)
+
size_t analyzeCallStack(IN const std::vector< ULONGLONG > stack_frame, IN OUT ctx_details &cDetails)
+
bool fetchThreadCtxDetails(IN HANDLE hProcess, IN HANDLE hThread, OUT ctx_details &c)
+
bool printResolvedAddr(ULONGLONG addr)
+
bool scanRemoteThreadCtx(HANDLE hThread, ThreadScanReport *my_report)
+
bool checkReturnAddrIntegrity(IN const std::vector< ULONGLONG > &callStack)
BOOL is_process_wow64(IN HANDLE processHandle, OUT BOOL *isProcWow64)
-
BOOL wow64_get_thread_context(IN HANDLE hThread, IN OUT PWOW64_CONTEXT lpContext)
+
+
BOOL wow64_get_thread_context(IN HANDLE hThread, IN OUT PWOW64_CONTEXT lpContext)
@@ -830,13 +841,13 @@
-
bool has_empty_gui_info(DWORD tid)
+
bool has_empty_gui_info(DWORD tid)
struct _t_stack_enum_params t_stack_enum_params
-
bool get_page_details(HANDLE processHandle, LPVOID start_va, MEMORY_BASIC_INFORMATION &page_info)
-
bool read_return_ptr(IN HANDLE hProcess, IN OUT ctx_details &cDetails)
-
DWORD WINAPI enum_stack_thread(LPVOID lpParam)
+
bool get_page_details(HANDLE processHandle, LPVOID start_va, MEMORY_BASIC_INFORMATION &page_info)
+
bool read_return_ptr(IN HANDLE hProcess, IN OUT ctx_details &cDetails)
+
DWORD WINAPI enum_stack_thread(LPVOID lpParam)
-
bool should_scan_context(const util::thread_info &info)
+
bool should_scan_context(const util::thread_info &info)
pesieve::SyscallTable g_SyscallTable
diff --git a/thread__scanner_8h_source.html b/thread__scanner_8h_source.html
index 9155499ca..bb320319c 100644
--- a/thread__scanner_8h_source.html
+++ b/thread__scanner_8h_source.html
@@ -284,32 +284,32 @@
virtual const void fieldsToJSON(std::stringstream &outs, size_t level, const pesieve::t_json_level &jdetails)
ThreadScanReport(DWORD _tid)
-
static std::string translate_wait_reason(DWORD thread_wait_reason)
+
static std::string translate_wait_reason(DWORD thread_wait_reason)
static const DWORD THREAD_STATE_UNKNOWN
static const DWORD THREAD_STATE_WAITING
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)
+
static std::string translate_thread_state(DWORD thread_state)
ThreadScanner(HANDLE hProc, bool _isReflection, const util::thread_info &_info, ModulesInfo &_modulesInfo, peconv::ExportsMapper *_exportsMap, ProcessSymbolsManager *_symbols)
-
virtual ThreadScanReport * scanRemote()
-
bool reportSuspiciousAddr(ThreadScanReport *my_report, ULONGLONG susp_addr)
-
size_t fillCallStackInfo(IN HANDLE hProcess, IN HANDLE hThread, IN LPVOID ctx, IN OUT ctx_details &cDetails)
-
void printThreadInfo(const util::thread_info &threadi)
-
bool fillAreaStats(ThreadScanReport *my_report)
-
bool isAddrInShellcode(ULONGLONG addr)
+
virtual ThreadScanReport * scanRemote()
+
bool reportSuspiciousAddr(ThreadScanReport *my_report, ULONGLONG susp_addr)
+
size_t fillCallStackInfo(IN HANDLE hProcess, IN HANDLE hThread, IN LPVOID ctx, IN OUT ctx_details &cDetails)
+
void printThreadInfo(const util::thread_info &threadi)
+
bool fillAreaStats(ThreadScanReport *my_report)
+
bool isAddrInShellcode(ULONGLONG addr)
peconv::ExportsMapper * exportsMap
const util::thread_info & info
-
size_t analyzeCallStack(IN const std::vector< ULONGLONG > stack_frame, IN OUT ctx_details &cDetails)
-
bool fetchThreadCtxDetails(IN HANDLE hProcess, IN HANDLE hThread, OUT ctx_details &c)
-
bool printResolvedAddr(ULONGLONG addr)
+
size_t analyzeCallStack(IN const std::vector< ULONGLONG > stack_frame, IN OUT ctx_details &cDetails)
+
bool fetchThreadCtxDetails(IN HANDLE hProcess, IN HANDLE hThread, OUT ctx_details &c)
+
bool printResolvedAddr(ULONGLONG addr)
ProcessSymbolsManager * symbols
-
bool scanRemoteThreadCtx(HANDLE hThread, ThreadScanReport *my_report)
+
bool scanRemoteThreadCtx(HANDLE hThread, ThreadScanReport *my_report)
ModulesInfo & modulesInfo
-
bool checkReturnAddrIntegrity(IN const std::vector< ULONGLONG > &callStack)
+
bool checkReturnAddrIntegrity(IN const std::vector< ULONGLONG > &callStack)