-
-
-
333 MEMORY_BASIC_INFORMATION page_info = { 0 };
-
-
-
-
337 if (page_info.State & MEM_FREE) {
-
-
-
340 ULONGLONG base = (ULONGLONG)page_info.BaseAddress;
-
341 if (this->
info.is_extended) {
-
-
-
-
-
346 my_report->
module = (HMODULE)base;
-
-
348 my_report->
protection = page_info.AllocationProtect;
-
-
-
-
352 const bool isStatFilled = fillAreaStats(my_report);
-
353#ifndef NO_ENTROPY_CHECK
-
-
-
-
-
-
+
+
+
+
+
335 MEMORY_BASIC_INFORMATION page_info = { 0 };
+
+
+
+
339 if (page_info.State & MEM_FREE) {
+
+
+
342 ULONGLONG base = (ULONGLONG)page_info.BaseAddress;
+
343 if (this->
info.is_extended) {
+
+
+
+
+
348 my_report->
module = (HMODULE)base;
+
+
350 my_report->
protection = page_info.AllocationProtect;
+
+
+
+
354 const bool isStatFilled = fillAreaStats(my_report);
+
355#ifndef NO_ENTROPY_CHECK
+
+
+
+
+
+
-
-
-
-
-
-
364 if (!
info.is_extended) {
-
-
-
367 const KTHREAD_STATE state = (KTHREAD_STATE)
info.ext.state;
-
368 if (state == Ready) {
-
-
-
371 if (state == Terminated) {
-
-
-
374 if (state == Waiting) {
-
375 if (
info.ext.sys_start_addr == 0) {
-
-
-
378 if (
info.ext.wait_reason == DelayExecution
-
379 ||
info.ext.wait_reason == Suspended
-
380 ||
info.ext.wait_reason == Executive
-
381 ||
info.ext.wait_reason == UserRequest
-
382 ||
info.ext.wait_reason == WrUserRequest
-
-
-
-
-
-
-
+
+
+
+
+
+
366 if (!
info.is_extended) {
+
+
+
369 const KTHREAD_STATE state = (KTHREAD_STATE)
info.ext.state;
+
370 if (state == Ready) {
+
+
+
373 if (state == Terminated) {
+
+
+
376 if (state == Waiting) {
+
+
+
+
-
-
-
-
-
-
394 if (!my_report)
return nullptr;
-
395#ifdef _SHOW_THREAD_INFO
-
396 printThreadInfo(
info);
-
-
398 bool is_shc = isAddrInShellcode(
info.start_addr);
-
-
400 if (reportSuspiciousAddr(my_report,
info.start_addr)) {
-
-
-
-
-
-
-
-
-
-
-
-
412 HANDLE hThread = OpenThread(
-
413 THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION | SYNCHRONIZE,
-
-
-
-
-
-
419 std::cerr <<
"[-] Could not OpenThread. Error: " << GetLastError() << std::endl;
-
-
-
-
-
-
425 const bool is_ok = fetchThreadCtxDetails(processHandle, hThread, cDetails);
-
-
-
428 GetExitCodeThread(hThread, &exit_code);
-
429 CloseHandle(hThread);
-
-
-
-
-
+
+
+
+
+
+
385 if (!my_report)
return nullptr;
+
386#ifdef _SHOW_THREAD_INFO
+
387 printThreadInfo(
info);
+
+
389 bool is_shc = isAddrInShellcode(
info.start_addr);
+
+
391 if (reportSuspiciousAddr(my_report,
info.start_addr)) {
+
+
+
+
+
+
+
+
+
+
+
+
403 HANDLE hThread = OpenThread(
+
404 THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION | SYNCHRONIZE,
+
+
+
+
+
+
410 std::cerr <<
"[-] Could not OpenThread. Error: " << GetLastError() << std::endl;
+
+
+
+
+
+
416 const bool is_ok = fetchThreadCtxDetails(processHandle, hThread, cDetails);
+
+
+
419 GetExitCodeThread(hThread, &exit_code);
+
420 CloseHandle(hThread);
+
+
+
+
+
+
+
+
428 std::string bits = cDetails.
is64b ?
"64" :
"32";
+
429 std::cout <<
"[" << bits <<
"-bit] " << std::hex <<
" Rip: " << cDetails.
rip <<
" Rsp: " << cDetails.
rsp;
+
430 if (exit_code != STILL_ACTIVE)
+
431 std::cout <<
" ExitCode: " << exit_code;
+
+
+
434 std::cout << std::hex <<
" Ret: " << cDetails.
ret_addr;
-
-
437 std::string bits = cDetails.
is64b ?
"64" :
"32";
-
438 std::cout <<
"[" << bits <<
"-bit] " << std::hex <<
" Rip: " << cDetails.
rip <<
" Rsp: " << cDetails.
rsp;
-
439 if (exit_code != STILL_ACTIVE)
-
440 std::cout <<
" ExitCode: " << exit_code;
-
-
-
443 std::cout << std::hex <<
" Ret: " << cDetails.
ret_addr;
-
-
-
-
-
448 if (exit_code != STILL_ACTIVE) {
-
-
-
-
-
-
-
-
-
-
-
-
-
461 is_shc = isAddrInShellcode(cDetails.
rip);
-
-
463 if (reportSuspiciousAddr(my_report, cDetails.
rip)) {
-
-
-
-
-
468 is_shc = isAddrInShellcode(cDetails.
ret_addr);
-
-
470 if (reportSuspiciousAddr(my_report, cDetails.
ret_addr)) {
-
-
-
-
-
-
+
+
+
+
439 if (exit_code != STILL_ACTIVE) {
+
+
+
+
+
+
+
+
+
+
+
+
+
452 is_shc = isAddrInShellcode(cDetails.
rip);
+
+
454 if (reportSuspiciousAddr(my_report, cDetails.
rip)) {
+
+
+
+
+
459 is_shc = isAddrInShellcode(cDetails.
ret_addr);
+
+
461 if (reportSuspiciousAddr(my_report, cDetails.
ret_addr)) {
+
+
+
+
+
+
A class responsible for filling in the statistics with the data from the particular buffer.
@@ -621,16 +612,16 @@
static std::string translate_wait_reason(DWORD thread_wait_reason)
-
static std::string translate_thread_state(DWORD thread_state)
-
virtual ThreadScanReport * scanRemote()
-
bool reportSuspiciousAddr(ThreadScanReport *my_report, ULONGLONG susp_addr)
-
size_t fillStackFrameInfo(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)
-
bool fetchThreadCtxDetails(IN HANDLE hProcess, IN HANDLE hThread, OUT ctx_details &c)
-
bool printResolvedAddr(ULONGLONG addr)
-
size_t analyzeStackFrames(IN const std::vector< ULONGLONG > stack_frame, IN OUT ctx_details &cDetails)
+
static std::string translate_thread_state(DWORD thread_state)
+
virtual ThreadScanReport * scanRemote()
+
bool reportSuspiciousAddr(ThreadScanReport *my_report, ULONGLONG susp_addr)
+
size_t fillStackFrameInfo(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)
+
bool fetchThreadCtxDetails(IN HANDLE hProcess, IN HANDLE hThread, OUT ctx_details &c)
+
bool printResolvedAddr(ULONGLONG addr)
+
size_t analyzeStackFrames(IN const std::vector< ULONGLONG > stack_frame, IN OUT ctx_details &cDetails)
BOOL is_process_wow64(IN HANDLE processHandle, OUT BOOL *isProcWow64)
BOOL wow64_get_thread_context(IN HANDLE hThread, IN OUT PWOW64_CONTEXT lpContext)
@@ -667,10 +658,10 @@
struct _t_stack_enum_params t_stack_enum_params
-
bool get_page_details(HANDLE processHandle, LPVOID start_va, MEMORY_BASIC_INFORMATION &page_info)
+
bool get_page_details(HANDLE processHandle, LPVOID start_va, MEMORY_BASIC_INFORMATION &page_info)
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)
diff --git a/thread__scanner_8h_source.html b/thread__scanner_8h_source.html
index d88524d2d..0e555e688 100644
--- a/thread__scanner_8h_source.html
+++ b/thread__scanner_8h_source.html
@@ -266,23 +266,23 @@
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 fillStackFrameInfo(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 fillStackFrameInfo(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
-
bool fetchThreadCtxDetails(IN HANDLE hProcess, IN HANDLE hThread, OUT ctx_details &c)
-
bool printResolvedAddr(ULONGLONG addr)
+
bool fetchThreadCtxDetails(IN HANDLE hProcess, IN HANDLE hThread, OUT ctx_details &c)
+
bool printResolvedAddr(ULONGLONG addr)
ProcessSymbolsManager * symbols
ModulesInfo & modulesInfo
-
size_t analyzeStackFrames(IN const std::vector< ULONGLONG > stack_frame, IN OUT ctx_details &cDetails)
+
size_t analyzeStackFrames(IN const std::vector< ULONGLONG > stack_frame, IN OUT ctx_details &cDetails)