From 20fa55cc2b61d728e26d25f46c827db615b38ffe Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Sat, 28 Mar 2015 03:28:06 +0100 Subject: [PATCH] DBG: safe dbghelp functions --- x64_dbg_dbg/_exports.cpp | 10 +- x64_dbg_dbg/_global.h | 7 +- x64_dbg_dbg/dbghelp_safe.cpp | 158 ++++++++++++++++++++++++ x64_dbg_dbg/dbghelp_safe.h | 105 ++++++++++++++++ x64_dbg_dbg/debugger.cpp | 18 +-- x64_dbg_dbg/debugger_commands.cpp | 14 +-- x64_dbg_dbg/symbolinfo.cpp | 24 ++-- x64_dbg_dbg/threading.h | 1 + x64_dbg_dbg/x64_dbg_dbg.vcxproj | 2 + x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters | 6 + 10 files changed, 306 insertions(+), 39 deletions(-) create mode 100644 x64_dbg_dbg/dbghelp_safe.cpp create mode 100644 x64_dbg_dbg/dbghelp_safe.h diff --git a/x64_dbg_dbg/_exports.cpp b/x64_dbg_dbg/_exports.cpp index e0e89df8..d4aa29db 100644 --- a/x64_dbg_dbg/_exports.cpp +++ b/x64_dbg_dbg/_exports.cpp @@ -107,10 +107,10 @@ extern "C" DLL_EXPORT bool _dbg_addrinfoget(duint addr, SEGMENTREG segment, ADDR PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)buffer; pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO); pSymbol->MaxNameLen = MAX_LABEL_SIZE; - if(SymFromAddr(fdProcessInfo->hProcess, (DWORD64)addr, &displacement, pSymbol) and !displacement) + if(SafeSymFromAddr(fdProcessInfo->hProcess, (DWORD64)addr, &displacement, pSymbol) and !displacement) { pSymbol->Name[pSymbol->MaxNameLen - 1] = '\0'; - if(!bUndecorateSymbolNames or !UnDecorateSymbolName(pSymbol->Name, addrinfo->label, MAX_LABEL_SIZE, UNDNAME_COMPLETE)) + if(!bUndecorateSymbolNames or !SafeUnDecorateSymbolName(pSymbol->Name, addrinfo->label, MAX_LABEL_SIZE, UNDNAME_COMPLETE)) strcpy_s(addrinfo->label, pSymbol->Name); retval = true; } @@ -123,10 +123,10 @@ extern "C" DLL_EXPORT bool _dbg_addrinfoget(duint addr, SEGMENTREG segment, ADDR uint val = 0; if(memread(fdProcessInfo->hProcess, (const void*)basicinfo.memory.value, &val, sizeof(val), 0)) { - if(SymFromAddr(fdProcessInfo->hProcess, (DWORD64)val, &displacement, pSymbol) and !displacement) + if(SafeSymFromAddr(fdProcessInfo->hProcess, (DWORD64)val, &displacement, pSymbol) and !displacement) { pSymbol->Name[pSymbol->MaxNameLen - 1] = '\0'; - if(!bUndecorateSymbolNames or !UnDecorateSymbolName(pSymbol->Name, addrinfo->label, MAX_LABEL_SIZE, UNDNAME_COMPLETE)) + if(!bUndecorateSymbolNames or !SafeUnDecorateSymbolName(pSymbol->Name, addrinfo->label, MAX_LABEL_SIZE, UNDNAME_COMPLETE)) sprintf_s(addrinfo->label, "JMP.&%s", pSymbol->Name); retval = true; } @@ -160,7 +160,7 @@ extern "C" DLL_EXPORT bool _dbg_addrinfoget(duint addr, SEGMENTREG segment, ADDR DWORD dwDisplacement; IMAGEHLP_LINE64 line; line.SizeOfStruct = sizeof(IMAGEHLP_LINE64); - if(SymGetLineFromAddr64(fdProcessInfo->hProcess, (DWORD64)addr, &dwDisplacement, &line) and !dwDisplacement) + if(SafeSymGetLineFromAddr64(fdProcessInfo->hProcess, (DWORD64)addr, &dwDisplacement, &line) and !dwDisplacement) { char filename[deflen] = ""; strcpy_s(filename, line.FileName); diff --git a/x64_dbg_dbg/_global.h b/x64_dbg_dbg/_global.h index c3f6fcfd..60bf68f9 100644 --- a/x64_dbg_dbg/_global.h +++ b/x64_dbg_dbg/_global.h @@ -22,12 +22,7 @@ #include "DeviceNameResolver\DeviceNameResolver.h" #include "handle.h" #include "stringutils.h" - -#ifdef __GNUC__ -#include "dbghelp\dbghelp.h" -#else -#include -#endif //__GNUC__ +#include "dbghelp_safe.h" #ifndef __GNUC__ #define and && diff --git a/x64_dbg_dbg/dbghelp_safe.cpp b/x64_dbg_dbg/dbghelp_safe.cpp new file mode 100644 index 00000000..46bb5ffa --- /dev/null +++ b/x64_dbg_dbg/dbghelp_safe.cpp @@ -0,0 +1,158 @@ +#include "_global.h" +#include "dbghelp_safe.h" +#include "threading.h" + +DWORD + SafeUnDecorateSymbolName( + __in PCSTR name, + __out_ecount(maxStringLength) PSTR outputString, + __in DWORD maxStringLength, + __in DWORD flags + ) +{ + CriticalSectionLocker locker(LockSym); + return UnDecorateSymbolName(name, outputString, maxStringLength, flags); +} +BOOL + SafeSymUnloadModule64( + __in HANDLE hProcess, + __in DWORD64 BaseOfDll + ) +{ + CriticalSectionLocker locker(LockSym); + return SymUnloadModule64(hProcess, BaseOfDll); +} +BOOL + SafeSymSetSearchPath( + __in HANDLE hProcess, + __in_opt PCSTR SearchPath + ) +{ + CriticalSectionLocker locker(LockSym); + return SymSetSearchPath(hProcess, SearchPath); +} +DWORD + SafeSymSetOptions( + __in DWORD SymOptions + ) +{ + CriticalSectionLocker locker(LockSym); + return SymSetOptions(SymOptions); +} +BOOL + SafeSymInitialize( + __in HANDLE hProcess, + __in_opt PCSTR UserSearchPath, + __in BOOL fInvadeProcess + ) +{ + CriticalSectionLocker locker(LockSym); + return SymInitialize(hProcess, UserSearchPath, fInvadeProcess); +} +BOOL + SafeSymRegisterCallback64( + __in HANDLE hProcess, + __in PSYMBOL_REGISTERED_CALLBACK64 CallbackFunction, + __in ULONG64 UserContext + ) +{ + CriticalSectionLocker locker(LockSym); + return SymRegisterCallback64(hProcess, CallbackFunction, UserContext); +} +DWORD64 + SafeSymLoadModuleEx( + __in HANDLE hProcess, + __in_opt HANDLE hFile, + __in_opt PCSTR ImageName, + __in_opt PCSTR ModuleName, + __in DWORD64 BaseOfDll, + __in DWORD DllSize, + __in_opt PMODLOAD_DATA Data, + __in_opt DWORD Flags + ) +{ + CriticalSectionLocker locker(LockSym); + return SymLoadModuleEx(hProcess, hFile, ImageName, ModuleName, BaseOfDll, DllSize, Data, Flags); +} +BOOL + SafeSymGetModuleInfo64( + __in HANDLE hProcess, + __in DWORD64 qwAddr, + __out PIMAGEHLP_MODULE64 ModuleInfo + ) +{ + CriticalSectionLocker locker(LockSym); + return SymGetModuleInfo64(hProcess, qwAddr, ModuleInfo); +} +BOOL + SafeSymGetSearchPath( + __in HANDLE hProcess, + __out_ecount(SearchPathLength) PSTR SearchPath, + __in DWORD SearchPathLength + ) +{ + CriticalSectionLocker locker(LockSym); + return SymGetSearchPath(hProcess, SearchPath, SearchPathLength); +} +BOOL + SafeSymEnumSymbols( + __in HANDLE hProcess, + __in ULONG64 BaseOfDll, + __in_opt PCSTR Mask, + __in PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, + __in_opt PVOID UserContext + ) +{ + CriticalSectionLocker locker(LockSym); + return SymEnumSymbols(hProcess, BaseOfDll, Mask, EnumSymbolsCallback, UserContext); +} +BOOL + SafeSymEnumerateModules( + __in HANDLE hProcess, + __in PSYM_ENUMMODULES_CALLBACK EnumModulesCallback, + __in_opt PVOID UserContext + ) +{ + CriticalSectionLocker locker(LockSym); + return SymEnumerateModules(hProcess, EnumModulesCallback, UserContext); +} +BOOL + SafeSymGetLineFromAddr64( + __in HANDLE hProcess, + __in DWORD64 qwAddr, + __out PDWORD pdwDisplacement, + __out PIMAGEHLP_LINE64 Line64 + ) +{ + CriticalSectionLocker locker(LockSym); + return SymGetLineFromAddr64(hProcess, qwAddr, pdwDisplacement, Line64); +} +BOOL + SafeSymFromName( + __in HANDLE hProcess, + __in PCSTR Name, + __inout PSYMBOL_INFO Symbol + ) +{ + CriticalSectionLocker locker(LockSym); + return SymFromName(hProcess, Name, Symbol); +} +BOOL + SafeSymFromAddr( + __in HANDLE hProcess, + __in DWORD64 Address, + __out_opt PDWORD64 Displacement, + __inout PSYMBOL_INFO Symbol + ) +{ + CriticalSectionLocker locker(LockSym); + return SymFromAddr(hProcess, Address, Displacement, Symbol); +} +BOOL + SafeSymCleanup( + __in HANDLE hProcess + ) +{ + CriticalSectionLocker locker(LockSym); + return SymCleanup(hProcess); +} \ No newline at end of file diff --git a/x64_dbg_dbg/dbghelp_safe.h b/x64_dbg_dbg/dbghelp_safe.h new file mode 100644 index 00000000..b6364f33 --- /dev/null +++ b/x64_dbg_dbg/dbghelp_safe.h @@ -0,0 +1,105 @@ +#ifndef _DBGHELP_SAFE_H +#define _DBGHELP_SAFE_H + +#ifdef __GNUC__ +#include "dbghelp\dbghelp.h" +#else +#include +#endif //__GNUC__ + +DWORD + SafeUnDecorateSymbolName( + __in PCSTR name, + __out_ecount(maxStringLength) PSTR outputString, + __in DWORD maxStringLength, + __in DWORD flags + ); +BOOL + SafeSymUnloadModule64( + __in HANDLE hProcess, + __in DWORD64 BaseOfDll + ); +BOOL + SafeSymSetSearchPath( + __in HANDLE hProcess, + __in_opt PCSTR SearchPath + ); +DWORD + SafeSymSetOptions( + __in DWORD SymOptions + ); +BOOL + SafeSymInitialize( + __in HANDLE hProcess, + __in_opt PCSTR UserSearchPath, + __in BOOL fInvadeProcess + ); +BOOL + SafeSymRegisterCallback64( + __in HANDLE hProcess, + __in PSYMBOL_REGISTERED_CALLBACK64 CallbackFunction, + __in ULONG64 UserContext + ); +DWORD64 + SafeSymLoadModuleEx( + __in HANDLE hProcess, + __in_opt HANDLE hFile, + __in_opt PCSTR ImageName, + __in_opt PCSTR ModuleName, + __in DWORD64 BaseOfDll, + __in DWORD DllSize, + __in_opt PMODLOAD_DATA Data, + __in_opt DWORD Flags + ); +BOOL + SafeSymGetModuleInfo64( + __in HANDLE hProcess, + __in DWORD64 qwAddr, + __out PIMAGEHLP_MODULE64 ModuleInfo + ); +BOOL + SafeSymGetSearchPath( + __in HANDLE hProcess, + __out_ecount(SearchPathLength) PSTR SearchPath, + __in DWORD SearchPathLength + ); +BOOL + SafeSymEnumSymbols( + __in HANDLE hProcess, + __in ULONG64 BaseOfDll, + __in_opt PCSTR Mask, + __in PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, + __in_opt PVOID UserContext + ); +BOOL + SafeSymEnumerateModules( + __in HANDLE hProcess, + __in PSYM_ENUMMODULES_CALLBACK EnumModulesCallback, + __in_opt PVOID UserContext + ); +BOOL + SafeSymGetLineFromAddr64( + __in HANDLE hProcess, + __in DWORD64 qwAddr, + __out PDWORD pdwDisplacement, + __out PIMAGEHLP_LINE64 Line64 + ); +BOOL + SafeSymFromName( + __in HANDLE hProcess, + __in PCSTR Name, + __inout PSYMBOL_INFO Symbol + ); +BOOL + SafeSymFromAddr( + __in HANDLE hProcess, + __in DWORD64 Address, + __out_opt PDWORD64 Displacement, + __inout PSYMBOL_INFO Symbol + ); +BOOL + SafeSymCleanup( + __in HANDLE hProcess + ); + +#endif //_DBGHELP_SAFE_H \ No newline at end of file diff --git a/x64_dbg_dbg/debugger.cpp b/x64_dbg_dbg/debugger.cpp index 0bde1dad..f9cf4054 100644 --- a/x64_dbg_dbg/debugger.cpp +++ b/x64_dbg_dbg/debugger.cpp @@ -622,17 +622,17 @@ static void cbCreateProcess(CREATE_PROCESS_DEBUG_INFO* CreateProcessInfo) sprintf(dbpath, "%s\\%s", dbbasepath, sqlitedb); dprintf("Database file: %s\n", dbpath); dbload(); - SymSetOptions(SYMOPT_DEBUG | SYMOPT_LOAD_LINES | SYMOPT_ALLOW_ABSOLUTE_SYMBOLS | SYMOPT_FAVOR_COMPRESSED | SYMOPT_IGNORE_NT_SYMPATH); + SafeSymSetOptions(SYMOPT_DEBUG | SYMOPT_LOAD_LINES | SYMOPT_ALLOW_ABSOLUTE_SYMBOLS | SYMOPT_FAVOR_COMPRESSED | SYMOPT_IGNORE_NT_SYMPATH); GuiSymbolLogClear(); char szServerSearchPath[MAX_PATH * 2] = ""; sprintf_s(szServerSearchPath, "SRV*%s", szSymbolCachePath); - SymInitialize(fdProcessInfo->hProcess, szServerSearchPath, false); //initialize symbols - SymRegisterCallback64(fdProcessInfo->hProcess, SymRegisterCallbackProc64, 0); - SymLoadModuleEx(fdProcessInfo->hProcess, CreateProcessInfo->hFile, DebugFileName, 0, (DWORD64)base, 0, 0, 0); + SafeSymInitialize(fdProcessInfo->hProcess, szServerSearchPath, false); //initialize symbols + SafeSymRegisterCallback64(fdProcessInfo->hProcess, SymRegisterCallbackProc64, 0); + SafeSymLoadModuleEx(fdProcessInfo->hProcess, CreateProcessInfo->hFile, DebugFileName, 0, (DWORD64)base, 0, 0, 0); IMAGEHLP_MODULE64 modInfo; memset(&modInfo, 0, sizeof(modInfo)); modInfo.SizeOfStruct = sizeof(modInfo); - if(SymGetModuleInfo64(fdProcessInfo->hProcess, (DWORD64)base, &modInfo)) + if(SafeSymGetModuleInfo64(fdProcessInfo->hProcess, (DWORD64)base, &modInfo)) modload((uint)base, modInfo.ImageSize, modInfo.ImageName); dbggetprivateusage(fdProcessInfo->hProcess, true); memupdatemap(fdProcessInfo->hProcess); //update memory map @@ -697,7 +697,7 @@ static void cbExitProcess(EXIT_PROCESS_DEBUG_INFO* ExitProcess) callbackInfo.ExitProcess = ExitProcess; plugincbcall(CB_EXITPROCESS, &callbackInfo); //Cleanup - SymCleanup(fdProcessInfo->hProcess); + SafeSymCleanup(fdProcessInfo->hProcess); } static void cbCreateThread(CREATE_THREAD_DEBUG_INFO* CreateThread) @@ -808,11 +808,11 @@ static void cbLoadDll(LOAD_DLL_DEBUG_INFO* LoadDll) else strcpy_s(DLLDebugFileName, MAX_PATH, StringUtils::Utf16ToUtf8(wszFileName).c_str()); } - SymLoadModuleEx(fdProcessInfo->hProcess, LoadDll->hFile, DLLDebugFileName, 0, (DWORD64)base, 0, 0, 0); + SafeSymLoadModuleEx(fdProcessInfo->hProcess, LoadDll->hFile, DLLDebugFileName, 0, (DWORD64)base, 0, 0, 0); IMAGEHLP_MODULE64 modInfo; memset(&modInfo, 0, sizeof(modInfo)); modInfo.SizeOfStruct = sizeof(IMAGEHLP_MODULE64); - if(SymGetModuleInfo64(fdProcessInfo->hProcess, (DWORD64)base, &modInfo)) + if(SafeSymGetModuleInfo64(fdProcessInfo->hProcess, (DWORD64)base, &modInfo)) modload((uint)base, modInfo.ImageSize, modInfo.ImageName); dbggetprivateusage(fdProcessInfo->hProcess, true); memupdatemap(fdProcessInfo->hProcess); //update memory map @@ -910,7 +910,7 @@ static void cbUnloadDll(UNLOAD_DLL_DEBUG_INFO* UnloadDll) if(modnamefromaddr((uint)base, modname, true)) bpenumall(cbRemoveModuleBreakpoints, modname); GuiUpdateBreakpointsView(); - SymUnloadModule64(fdProcessInfo->hProcess, (DWORD64)base); + SafeSymUnloadModule64(fdProcessInfo->hProcess, (DWORD64)base); dprintf("DLL Unloaded: "fhex" %s\n", base, modname); if(bBreakOnNextDll || settingboolget("Events", "DllUnload")) diff --git a/x64_dbg_dbg/debugger_commands.cpp b/x64_dbg_dbg/debugger_commands.cpp index 5aa69737..6da4a30a 100644 --- a/x64_dbg_dbg/debugger_commands.cpp +++ b/x64_dbg_dbg/debugger_commands.cpp @@ -1405,7 +1405,7 @@ CMDRESULT cbDebugDownloadSymbol(int argc, char* argv[]) char szModulePath[MAX_PATH] = ""; strcpy_s(szModulePath, StringUtils::Utf16ToUtf8(wszModulePath).c_str()); char szOldSearchPath[MAX_PATH] = ""; - if(!SymGetSearchPath(fdProcessInfo->hProcess, szOldSearchPath, MAX_PATH)) //backup current search path + if(!SafeSymGetSearchPath(fdProcessInfo->hProcess, szOldSearchPath, MAX_PATH)) //backup current search path { dputs("SymGetSearchPath failed!"); return STATUS_ERROR; @@ -1414,24 +1414,24 @@ CMDRESULT cbDebugDownloadSymbol(int argc, char* argv[]) if(argc > 2) szSymbolStore = argv[2]; sprintf_s(szServerSearchPath, "SRV*%s*%s", szSymbolCachePath, szSymbolStore); - if(!SymSetSearchPath(fdProcessInfo->hProcess, szServerSearchPath)) //set new search path + if(!SafeSymSetSearchPath(fdProcessInfo->hProcess, szServerSearchPath)) //set new search path { dputs("SymSetSearchPath (1) failed!"); return STATUS_ERROR; } - if(!SymUnloadModule64(fdProcessInfo->hProcess, (DWORD64)modbase)) //unload module + if(!SafeSymUnloadModule64(fdProcessInfo->hProcess, (DWORD64)modbase)) //unload module { - SymSetSearchPath(fdProcessInfo->hProcess, szOldSearchPath); + SafeSymSetSearchPath(fdProcessInfo->hProcess, szOldSearchPath); dputs("SymUnloadModule64 failed!"); return STATUS_ERROR; } - if(!SymLoadModuleEx(fdProcessInfo->hProcess, 0, szModulePath, 0, (DWORD64)modbase, 0, 0, 0)) //load module + if(!SafeSymLoadModuleEx(fdProcessInfo->hProcess, 0, szModulePath, 0, (DWORD64)modbase, 0, 0, 0)) //load module { dputs("SymLoadModuleEx failed!"); - SymSetSearchPath(fdProcessInfo->hProcess, szOldSearchPath); + SafeSymSetSearchPath(fdProcessInfo->hProcess, szOldSearchPath); return STATUS_ERROR; } - if(!SymSetSearchPath(fdProcessInfo->hProcess, szOldSearchPath)) + if(!SafeSymSetSearchPath(fdProcessInfo->hProcess, szOldSearchPath)) { dputs("SymSetSearchPath (2) failed!"); return STATUS_ERROR; diff --git a/x64_dbg_dbg/symbolinfo.cpp b/x64_dbg_dbg/symbolinfo.cpp index 37162335..e1e05ab7 100644 --- a/x64_dbg_dbg/symbolinfo.cpp +++ b/x64_dbg_dbg/symbolinfo.cpp @@ -26,7 +26,7 @@ static BOOL CALLBACK EnumSymbols(PSYMBOL_INFO pSymInfo, ULONG SymbolSize, PVOID if(pSymInfo->Address == pSymInfo->ModBase) return TRUE; } - if(!UnDecorateSymbolName(pSymInfo->Name, curSymbol.undecoratedSymbol, MAX_SYM_NAME, UNDNAME_COMPLETE)) + if(!SafeUnDecorateSymbolName(pSymInfo->Name, curSymbol.undecoratedSymbol, MAX_SYM_NAME, UNDNAME_COMPLETE)) { BridgeFree(curSymbol.undecoratedSymbol); curSymbol.undecoratedSymbol = 0; @@ -47,7 +47,7 @@ void symenum(uint base, CBSYMBOLENUM cbSymbolEnum, void* user) symbolCbData.cbSymbolEnum = cbSymbolEnum; symbolCbData.user = user; char mask[] = "*"; - SymEnumSymbols(fdProcessInfo->hProcess, base, mask, EnumSymbols, &symbolCbData); + SafeSymEnumSymbols(fdProcessInfo->hProcess, base, mask, EnumSymbols, &symbolCbData); } #ifdef _WIN64 @@ -68,7 +68,7 @@ void symupdatemodulelist() { std::vector modList; modList.clear(); - SymEnumerateModules(fdProcessInfo->hProcess, EnumModules, &modList); + SafeSymEnumerateModules(fdProcessInfo->hProcess, EnumModules, &modList); int modcount = (int)modList.size(); SYMBOLMODULEINFO* modListBridge = (SYMBOLMODULEINFO*)BridgeAlloc(sizeof(SYMBOLMODULEINFO) * modcount); for(int i = 0; i < modcount; i++) @@ -82,19 +82,19 @@ void symdownloadallsymbols(const char* szSymbolStore) szSymbolStore = "http://msdl.microsoft.com/download/symbols"; std::vector modList; modList.clear(); - SymEnumerateModules(fdProcessInfo->hProcess, EnumModules, &modList); + SafeSymEnumerateModules(fdProcessInfo->hProcess, EnumModules, &modList); int modcount = (int)modList.size(); if(!modcount) return; char szOldSearchPath[MAX_PATH] = ""; - if(!SymGetSearchPath(fdProcessInfo->hProcess, szOldSearchPath, MAX_PATH)) //backup current path + if(!SafeSymGetSearchPath(fdProcessInfo->hProcess, szOldSearchPath, MAX_PATH)) //backup current path { dputs("SymGetSearchPath failed!"); return; } char szServerSearchPath[MAX_PATH * 2] = ""; sprintf_s(szServerSearchPath, "SRV*%s*%s", szSymbolCachePath, szSymbolStore); - if(!SymSetSearchPath(fdProcessInfo->hProcess, szServerSearchPath)) //update search path + if(!SafeSymSetSearchPath(fdProcessInfo->hProcess, szServerSearchPath)) //update search path { dputs("SymSetSearchPath (1) failed!"); return; @@ -109,18 +109,18 @@ void symdownloadallsymbols(const char* szSymbolStore) dprintf("GetModuleFileNameExW("fhex") failed!\n", modbase); continue; } - if(!SymUnloadModule64(fdProcessInfo->hProcess, (DWORD64)modbase)) + if(!SafeSymUnloadModule64(fdProcessInfo->hProcess, (DWORD64)modbase)) { dprintf("SymUnloadModule64("fhex") failed!\n", modbase); continue; } - if(!SymLoadModuleEx(fdProcessInfo->hProcess, 0, StringUtils::Utf16ToUtf8(szModulePath).c_str(), 0, (DWORD64)modbase, 0, 0, 0)) + if(!SafeSymLoadModuleEx(fdProcessInfo->hProcess, 0, StringUtils::Utf16ToUtf8(szModulePath).c_str(), 0, (DWORD64)modbase, 0, 0, 0)) { dprintf("SymLoadModuleEx("fhex") failed!\n", modbase); continue; } } - if(!SymSetSearchPath(fdProcessInfo->hProcess, szOldSearchPath)) //restore search path + if(!SafeSymSetSearchPath(fdProcessInfo->hProcess, szOldSearchPath)) //restore search path { dputs("SymSetSearchPath (2) failed!"); } @@ -134,7 +134,7 @@ bool symfromname(const char* name, uint* addr) PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)buffer; pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO); pSymbol->MaxNameLen = MAX_LABEL_SIZE; - if(!SymFromName(fdProcessInfo->hProcess, name, pSymbol)) + if(!SafeSymFromName(fdProcessInfo->hProcess, name, pSymbol)) return false; *addr = (uint)pSymbol->Address; return true; @@ -155,10 +155,10 @@ const char* symgetsymbolicname(uint addr) PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)buffer; pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO); pSymbol->MaxNameLen = MAX_LABEL_SIZE; - if(SymFromAddr(fdProcessInfo->hProcess, (DWORD64)addr, &displacement, pSymbol) and !displacement) + if(SafeSymFromAddr(fdProcessInfo->hProcess, (DWORD64)addr, &displacement, pSymbol) and !displacement) { pSymbol->Name[pSymbol->MaxNameLen - 1] = '\0'; - if(!bUndecorateSymbolNames or !UnDecorateSymbolName(pSymbol->Name, label, MAX_SYM_NAME, UNDNAME_COMPLETE)) + if(!bUndecorateSymbolNames or !SafeUnDecorateSymbolName(pSymbol->Name, label, MAX_SYM_NAME, UNDNAME_COMPLETE)) strcpy_s(label, pSymbol->Name); retval = true; } diff --git a/x64_dbg_dbg/threading.h b/x64_dbg_dbg/threading.h index 1ccb95e4..6d6800ad 100644 --- a/x64_dbg_dbg/threading.h +++ b/x64_dbg_dbg/threading.h @@ -32,6 +32,7 @@ enum CriticalSectionLock LockPatches, LockThreads, LockDprintf, + LockSym, LockLast }; diff --git a/x64_dbg_dbg/x64_dbg_dbg.vcxproj b/x64_dbg_dbg/x64_dbg_dbg.vcxproj index 0f88f150..c544ed20 100644 --- a/x64_dbg_dbg/x64_dbg_dbg.vcxproj +++ b/x64_dbg_dbg/x64_dbg_dbg.vcxproj @@ -19,6 +19,7 @@ + @@ -68,6 +69,7 @@ + diff --git a/x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters b/x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters index 2538b0a5..4974409f 100644 --- a/x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters +++ b/x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters @@ -195,6 +195,9 @@ Source Files\Utilities + + Source Files\Utilities + @@ -371,5 +374,8 @@ Header Files\Utilities + + Header Files\Utilities + \ No newline at end of file