4#include "../utils/ntddk.h"
9#pragma comment(lib, "dbghelp")
11#define ENTROPY_TRESHOLD 3.0
42 if (!args || !args->
c || !args->
ctx) {
101 std::stringstream
ss;
110 case Ready:
return "Ready";
111 case Running:
return "Running";
112 case Standby:
return "Standby";
114 case Waiting:
return "Waiting";
120 std::stringstream
ss;
144 std::cerr <<
"[!] Cannot retrieve stack frame: timeout passed!\n";
159 bool has_shellcode =
false;
160 c.is_managed =
false;
161 std::vector<ULONGLONG>::iterator
itr;
174 std::cout << std::hex <<
next_addr <<
" <=== SHELLCODE\n";
185 std::cout << std::hex <<
next_addr <<
" <--- .NET\n";
187 if (has_shellcode)
break;
210 enumStackFrames(hProcess, hThread, &ctx, c);
232 enumStackFrames(hProcess, hThread, &ctx, c);
241 if (!
mod)
return true;
244 if (
mod->getModName().length() > 0) {
254 std::cout <<
" > " << std::hex <<
addr;
261 if (
mod->getModName() ==
"ntdll.dll" ||
mod->getModName() ==
"win32u.dll") {
264 for (
size_t i = 0;
i < 25;
i++) {
265 const peconv::ExportedFunc*
exp = exportsMap->find_export_by_va(
addr -
i);
267 std::cout <<
" : " <<
exp->toString();
276 std::cout << std::endl;
299 if (!
mem.fillInfo() || !
mem.load()) {
316 if (this->
info.is_extended) {
327#ifndef NO_ENTROPY_CHECK
355 if (!
info.is_extended) {
366 if (
info.ext.start_addr == 0) {
391 std::cerr <<
"[-] Could not OpenThread. Error: " <<
GetLastError() << std::endl;
396 std::cout << std::dec <<
"---\nTid: " <<
info.tid <<
"\n";
397 if (
info.is_extended) {
398 std::cout <<
" Start: " << std::hex <<
info.ext.start_addr << std::dec <<
" State: " <<
info.ext.state;
400 std::cout <<
" WaitReason: " <<
info.ext.wait_reason
401 <<
" WaitTime: " <<
info.ext.wait_time;
404 resolveAddr(
info.ext.start_addr);
417 const bool is_ok = fetchThreadCtx(processHandle, hThread, c);
429 std::cout <<
" b:" << c.
is64b << std::hex <<
" Rip: " << c.
rip <<
" Rsp: " << c.
rsp;
434 std::cout << std::hex <<
" Ret: " << c.
ret_addr;
A class responsible for filling in the statistics with the data from the particular buffer.
Represents a basic info about the scanned module, such as its base offset, size, and the status.
std::string getModName() const
A report from the thread scan, generated by ThreadScanner.
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, thread_ctx &c)
size_t enumStackFrames(IN HANDLE hProcess, IN HANDLE hThread, IN LPVOID ctx, IN OUT thread_ctx &c)
bool resolveAddr(ULONGLONG addr)
static bool FreeSymbols(HANDLE hProc)
bool fillAreaStats(ThreadScanReport *my_report)
bool isAddrInShellcode(ULONGLONG addr)
static bool InitSymbols(HANDLE hProc)
bool fetchThreadCtx(IN HANDLE hProcess, IN HANDLE hThread, OUT thread_ctx &c)
BOOL is_process_wow64(IN HANDLE processHandle, OUT BOOL *isProcWow64)
BOOL wow64_get_thread_context(IN HANDLE hThread, IN OUT PWOW64_CONTEXT lpContext)
size_t fill_iat(BYTE *vBuf, size_t vBufSize, IN const peconv::ExportsMapper *exportsMap, IN OUT IATBlock &iat, IN ThunkFoundCallback *callback)
std::string info()
The string with the basic information about the scanner.
const pesieve::thread_ctx * c
_t_stack_enum_params(IN HANDLE hProcess, IN HANDLE hThread, IN LPVOID ctx, IN const pesieve::thread_ctx &c)
std::vector< ULONGLONG > stack_frame
A custom structure keeping a fragment of a thread context.
bool should_scan(const util::thread_info &info)
struct _t_stack_enum_params t_stack_enum_params
bool get_page_details(HANDLE processHandle, LPVOID start_va, MEMORY_BASIC_INFORMATION &page_info)
DWORD WINAPI enum_stack_thread(LPVOID lpParam)