10 #define ALIGNED8 __declspec(align(8))
12 #define ALIGNED8 __attribute__((aligned(8)))
36 void ForceRealSymbolDownload(HANDLE
hProcess)
38 HMODULE ntdll_hndl = GetModuleHandleA(
"ntdll.dll");
39 std::cout <<
"\n[+] Try export first...\n";
40 dumpSymbolInfo((DWORD64)GetProcAddress(ntdll_hndl,
"NtLoadKeyEx"));
41 std::cout <<
"\n[+] Forcing SymFromAddr on non-export address...\n";
42 dumpSymbolInfo((DWORD64)GetModuleHandleA(
"kernel32.dll") + 0x20000);
52 SYMOPT_CASE_INSENSITIVE |
54 SYMOPT_FAIL_CRITICAL_ERRORS |
56 SYMOPT_INCLUDE_32BIT_MODULES |
59 symOptions |= SYMOPT_DEBUG;
70 while (start < input.size()) {
72 input.find(
';', start);
74 if (end == std::string::npos) {
78 std::string token = input.substr(start, end - start);
79 token.erase(0, token.find_first_not_of(
" \t"));
81 size_t last = token.find_last_not_of(
" \t");
82 if (last != std::string::npos) {
83 token.erase(last + 1);
94 const bool isSrv = (_strnicmp(token.c_str(),
"srv*", 4) == 0);
97 if (!result.empty()) {
103 size_t first = token.find(
'*');
104 size_t second = token.find(
'*', first + 1);
106 if (first != std::string::npos &&
107 second != std::string::npos &&
115 if (!
cache.empty()) {
116 if (!result.empty()) {
125 if (!result.empty()) {
137 const DWORD bufferSize = 4096;
138 char envBuffer[bufferSize] = { 0 };
141 if (GetEnvironmentVariableA(
"_NT_SYMBOL_PATH", envBuffer, bufferSize)) {
145 if (GetEnvironmentVariableA(
"_NT_ALTERNATE_SYMBOL_PATH", envBuffer, bufferSize)) {
146 const std::string filtered =
FilterSymbolPath(envBuffer, enableAutoDownload);
147 if (!filtered.empty()) {
157 bool InitSymbols(HANDLE process,
bool enableAutoDownload,
bool lazy)
159 if (!process || process == INVALID_HANDLE_VALUE) {
169 if (enableAutoDownload) {
170 options &= ~SYMOPT_DISABLE_SYMSRV_AUTODETECT;
173 options |= SYMOPT_DISABLE_SYMSRV_AUTODETECT;
177 options |= SYMOPT_DEFERRED_LOADS;
180 options &= ~SYMOPT_DEFERRED_LOADS;
194 ForceRealSymbolDownload(process);
208 _In_ DWORD MachineType,
210 _Inout_ LPSTACKFRAME64 StackFrame,
211 _Inout_ PVOID ContextRecord,
212 _In_opt_ PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine,
213 _In_opt_ PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine,
214 _In_opt_ PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine,
215 _In_opt_ PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress
227 FunctionTableAccessRoutine,
228 GetModuleBaseRoutine,
239 if (funcName.size() < 2) {
243 if (funcName[0] ==
'Z' && funcName[1] ==
'w') {
255 ALIGNED8 char buffer[
sizeof(SYMBOL_INFO) + MAX_SYM_NAME] = { 0 };
257 PSYMBOL_INFO symbol =
reinterpret_cast<PSYMBOL_INFO
>(buffer);
258 symbol->SizeOfStruct =
sizeof(SYMBOL_INFO);
259 symbol->MaxNameLen =MAX_SYM_NAME;
268 *displacement =
static_cast<size_t>(disp);
271 std::string funcName(symbol->Name);
283 ALIGNED8 char buffer[
sizeof(SYMBOL_INFO) + MAX_SYM_NAME ] = { 0 };
285 PSYMBOL_INFO symbol =
reinterpret_cast<PSYMBOL_INFO
>(buffer);
286 symbol->SizeOfStruct =
sizeof(SYMBOL_INFO);
287 symbol->MaxNameLen = MAX_SYM_NAME;
289 DWORD64 displacement = 0;
292 std::cout << std::dec <<
"[" << GetProcessId(
hProcess) <<
"] " << std::hex << va;
295 std::cout <<
" Base: " << symbol->ModBase <<
" : " << symbol->Name
296 <<
" +0x" << displacement <<
" Flags: " << symbol->Flags <<
" Tag: " << symbol->Tag << std::endl;
299 std::cout <<
" UNK" << std::endl;
301 return result == TRUE;
static bool FromAddress(HANDLE hProcess, DWORD64 address, PSYMBOL_INFO symbol, DWORD64 *displacement)
static bool CleanupProcess(HANDLE hProcess)
static bool RefreshModuleList(HANDLE hProcess)
static bool InitializeProcess(HANDLE hProcess, const std::string &symbolPath, DWORD symOptions)
static bool RunStackWalk64(_In_ DWORD MachineType, _In_ HANDLE hProcess, _In_ HANDLE hThread, _Inout_ LPSTACKFRAME64 StackFrame, _Inout_ PVOID ContextRecord, _In_opt_ PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, _In_opt_ PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, _In_opt_ PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, _In_opt_ PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress)
ProcessSymbolsManager & operator=(const ProcessSymbolsManager &)=delete
static std::string BuildSymbolPath(bool enableAutoDownload)
std::string funcNameFromAddr(ULONG_PTR addr, size_t *displacement=NULL)
static std::string FilterSymbolPath(const std::string &input, bool allowDownload)
bool dumpSymbolInfo(ULONG_PTR va)
static DWORD BuildSymOptions()
bool RunStackWalk64(_In_ DWORD MachineType, _In_ HANDLE hThread, _Inout_ LPSTACKFRAME64 StackFrame, _Inout_ PVOID ContextRecord, _In_opt_ PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, _In_opt_ PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, _In_opt_ PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, _In_opt_ PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress)
ProcessSymbolsManager(const ProcessSymbolsManager &)=delete
void NormalizeNtZwPrefix(std::string &funcName)
bool IsInitialized() const
bool InitSymbols(HANDLE process, bool enableAutoDownload, bool lazy)
pesieve::ModulesCache cache