mirror of
https://github.com/x64dbg/x64dbg.git
synced 2024-11-26 22:30:22 +00:00
DBG: removed internal SQLite DB
DBG: now 100% supports debug symbols + gets API names etc DBG: improved performance of _dbg_addrinfoget
This commit is contained in:
parent
da3fdf53a3
commit
e1a6b26c8e
@ -103,27 +103,9 @@ extern "C" DLL_EXPORT bool _dbg_addrinfoget(duint addr, SEGMENTREG segment, ADDR
|
||||
{
|
||||
if(labelget(addr, addrinfo->label))
|
||||
retval=true;
|
||||
else
|
||||
if(!retval) //no user labels
|
||||
{
|
||||
//TODO: auto-labels
|
||||
/*const char* apiname=(const char*)ImporterGetAPINameFromDebugee(fdProcessInfo->hProcess, addr);
|
||||
if(apiname)
|
||||
{
|
||||
strcpy(addrinfo->label, apiname);
|
||||
retval=true;
|
||||
}
|
||||
uint addr_dw=0;
|
||||
if(memread(fdProcessInfo->hProcess, (const void*)addr, &addr_dw, sizeof(uint), 0))
|
||||
{
|
||||
const char* apiname=(const char*)ImporterGetAPINameFromDebugee(fdProcessInfo->hProcess, addr_dw);
|
||||
if(apiname)
|
||||
{
|
||||
strcpy(addrinfo->label, apiname);
|
||||
retval=true;
|
||||
}
|
||||
}*/
|
||||
if(!retval)
|
||||
{
|
||||
DWORD64 displacement=0;
|
||||
char buffer[sizeof(SYMBOL_INFO) + MAX_LABEL_SIZE * sizeof(char)];
|
||||
PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)buffer;
|
||||
@ -134,6 +116,22 @@ extern "C" DLL_EXPORT bool _dbg_addrinfoget(duint addr, SEGMENTREG segment, ADDR
|
||||
strcpy(addrinfo->label, pSymbol->Name);
|
||||
retval=true;
|
||||
}
|
||||
if(!retval)
|
||||
{
|
||||
uint addr_=0;
|
||||
if(memread(fdProcessInfo->hProcess, (const void*)addr, &addr_, sizeof(uint), 0))
|
||||
{
|
||||
DWORD64 displacement=0;
|
||||
char buffer[sizeof(SYMBOL_INFO) + MAX_LABEL_SIZE * sizeof(char)];
|
||||
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)
|
||||
{
|
||||
strcpy(addrinfo->label, pSymbol->Name);
|
||||
retval=true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -142,8 +140,6 @@ extern "C" DLL_EXPORT bool _dbg_addrinfoget(duint addr, SEGMENTREG segment, ADDR
|
||||
if(commentget(addr, addrinfo->comment))
|
||||
retval=true;
|
||||
//TODO: auto-comments
|
||||
else
|
||||
{
|
||||
if(!retval)
|
||||
{
|
||||
DWORD dwDisplacement;
|
||||
@ -151,12 +147,18 @@ extern "C" DLL_EXPORT bool _dbg_addrinfoget(duint addr, SEGMENTREG segment, ADDR
|
||||
line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
|
||||
if(SymGetLineFromAddr64(fdProcessInfo->hProcess, (DWORD64)addr, &dwDisplacement, &line) and !dwDisplacement)
|
||||
{
|
||||
sprintf(addrinfo->comment, "line: %u", line.LineNumber);
|
||||
char filename[deflen]="";
|
||||
strcpy(filename, line.FileName);
|
||||
int len=strlen(filename);
|
||||
while(filename[len]!='\\' and len!=0)
|
||||
len--;
|
||||
if(len)
|
||||
len++;
|
||||
sprintf(addrinfo->comment, "%s:%u", filename+len, line.LineNumber);
|
||||
retval=true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
@ -4,7 +4,6 @@
|
||||
#include "memory.h"
|
||||
|
||||
static sqlite3* db;
|
||||
static sqlite3* internaldb;
|
||||
|
||||
///basic database functions
|
||||
void dbinit()
|
||||
@ -30,18 +29,6 @@ void dbinit()
|
||||
dprintf("SQL Error: %s\n", errorText);
|
||||
sqlite3_free(errorText);
|
||||
}
|
||||
//initialize internal database
|
||||
if(sqlite3_open(":memory:", &internaldb))
|
||||
{
|
||||
dputs("failed to open database!");
|
||||
return;
|
||||
}
|
||||
strcpy(sql, "CREATE TABLE IF NOT EXISTS exports (id INTEGER PRIMARY KEY AUTOINCREMENT, base INT64 NOT NULL, mod TEXT, name TEXT NOT NULL, addr INT64 NOT NULL)");
|
||||
if(sqlite3_exec(internaldb, sql, 0, 0, &errorText)!=SQLITE_OK) //error
|
||||
{
|
||||
dprintf("SQL Error: %s\n", errorText);
|
||||
sqlite3_free(errorText);
|
||||
}
|
||||
}
|
||||
|
||||
static int loadOrSaveDb(sqlite3* memory, const char* file, bool save)
|
||||
@ -78,9 +65,6 @@ bool dbload()
|
||||
|
||||
bool dbsave()
|
||||
{
|
||||
DeleteFileA("internal.db");
|
||||
loadOrSaveDb(internaldb, "internal.db", true);
|
||||
|
||||
CreateDirectoryA(sqlitedb_basedir, 0); //create database directory
|
||||
if(loadOrSaveDb(db, dbpath, true)!=SQLITE_OK)
|
||||
return false;
|
||||
@ -92,86 +76,29 @@ void dbclose()
|
||||
dbsave();
|
||||
sqlite3_db_release_memory(db);
|
||||
sqlite3_close(db); //close program database
|
||||
sqlite3_db_release_memory(internaldb);
|
||||
sqlite3_close(internaldb); //close internal database
|
||||
}
|
||||
|
||||
///module functions
|
||||
|
||||
static std::vector<MODINFO> modinfo;
|
||||
|
||||
bool modnamefromaddr(uint addr, char* modname)
|
||||
{
|
||||
int total=modinfo.size();
|
||||
for(int i=0; i<total; i++)
|
||||
{
|
||||
if(addr>=modinfo.at(i).start and addr<modinfo.at(i).end)
|
||||
{
|
||||
strcpy(modname, modinfo.at(i).name);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
IMAGEHLP_MODULE64 modInfo;
|
||||
memset(&modInfo, 0, sizeof(modInfo));
|
||||
modInfo.SizeOfStruct=sizeof(IMAGEHLP_MODULE64);
|
||||
if(!SymGetModuleInfo64(fdProcessInfo->hProcess, (DWORD64)addr, &modInfo))
|
||||
return false;
|
||||
_strlwr(modInfo.ModuleName);
|
||||
strcpy(modname, modInfo.ModuleName);
|
||||
return true;
|
||||
}
|
||||
|
||||
uint modbasefromaddr(uint addr)
|
||||
{
|
||||
int total=modinfo.size();
|
||||
for(int i=0; i<total; i++)
|
||||
{
|
||||
if(addr>=modinfo.at(i).start and addr<modinfo.at(i).end)
|
||||
{
|
||||
return modinfo.at(i).start;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void cbExport(uint base, const char* mod, const char* name, uint addr)
|
||||
{
|
||||
char sql[deflen]="";
|
||||
sprintf(sql, "INSERT INTO exports (base,mod,name,addr) VALUES (%"fext"d,'%s','%s',%"fext"d)", base, mod, name, addr);
|
||||
char* errorText=0;
|
||||
if(sqlite3_exec(internaldb, sql, 0, 0, &errorText)!=SQLITE_OK) //error
|
||||
{
|
||||
dprintf("SQL Error: %s\n", errorText);
|
||||
sqlite3_free(errorText);
|
||||
}
|
||||
}
|
||||
|
||||
bool modload(uint base, uint size, const char* name)
|
||||
{
|
||||
if(!base or !size or !name or strlen(name)>=31)
|
||||
IMAGEHLP_MODULE64 modInfo;
|
||||
memset(&modInfo, 0, sizeof(modInfo));
|
||||
modInfo.SizeOfStruct=sizeof(IMAGEHLP_MODULE64);
|
||||
if(!SymGetModuleInfo64(fdProcessInfo->hProcess, (DWORD64)addr, &modInfo))
|
||||
return false;
|
||||
MODINFO info;
|
||||
info.start=base;
|
||||
info.end=base+size;
|
||||
strcpy(info.name, name);
|
||||
_strlwr(info.name);
|
||||
modinfo.push_back(info);
|
||||
apienumexports(base, cbExport);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool modunload(uint base)
|
||||
{
|
||||
if(!base)
|
||||
return false;
|
||||
int total=modinfo.size();
|
||||
for(int i=0; i<total; i++)
|
||||
{
|
||||
if(modinfo.at(i).start==base)
|
||||
{
|
||||
modinfo.erase(modinfo.begin()+i);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void modclear()
|
||||
{
|
||||
modinfo.clear();
|
||||
return modInfo.BaseOfImage;
|
||||
}
|
||||
|
||||
///api functions
|
||||
|
@ -20,9 +20,6 @@ bool dbload();
|
||||
void dbclose();
|
||||
bool modnamefromaddr(uint addr, char* modname);
|
||||
uint modbasefromaddr(uint addr);
|
||||
bool modload(uint base, uint size, const char* name);
|
||||
bool modunload(uint base);
|
||||
void modclear();
|
||||
bool apienumexports(uint base, EXPORTENUMCALLBACK cbEnum);
|
||||
bool commentset(uint addr, const char* text);
|
||||
bool commentget(uint addr, char* text);
|
||||
|
@ -265,11 +265,6 @@ static void cbLoadDll(LOAD_DLL_DEBUG_INFO* LoadDll)
|
||||
DevicePathToPath(DLLDebugFileName, DLLDebugFileName, deflen);
|
||||
dprintf("DLL Loaded: "fhex" %s\n", base, DLLDebugFileName);
|
||||
SymLoadModuleEx(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))
|
||||
modload(modInfo.BaseOfImage, modInfo.ImageSize, modInfo.ModuleName);
|
||||
}
|
||||
|
||||
static void cbUnloadDll(UNLOAD_DLL_DEBUG_INFO* UnloadDll)
|
||||
@ -282,7 +277,6 @@ static void cbUnloadDll(UNLOAD_DLL_DEBUG_INFO* UnloadDll)
|
||||
DevicePathToPath(DLLDebugFileName, DLLDebugFileName, deflen);
|
||||
dprintf("DLL Unloaded: "fhex" %s\n", base, DLLDebugFileName);
|
||||
SymUnloadModule64(fdProcessInfo->hProcess, (DWORD64)base);
|
||||
modunload((uint)base);
|
||||
}
|
||||
|
||||
static void cbCreateProcess(CREATE_PROCESS_DEBUG_INFO* CreateProcessInfo)
|
||||
@ -315,12 +309,6 @@ static void cbCreateProcess(CREATE_PROCESS_DEBUG_INFO* CreateProcessInfo)
|
||||
SymInitialize(fdProcessInfo->hProcess, 0, false); //initialize symbols
|
||||
//SymRegisterCallback64(fdProcessInfo->hProcess, SymRegisterCallbackProc64, 0);
|
||||
SymLoadModuleEx(fdProcessInfo->hProcess, CreateProcessInfo->hFile, DebugFileName, 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))
|
||||
modload(modInfo.BaseOfImage, modInfo.ImageSize, modInfo.ModuleName);
|
||||
}
|
||||
|
||||
static void cbSystemBreakpoint(void* ExceptionData)
|
||||
@ -337,25 +325,6 @@ static void cbSystemBreakpoint(void* ExceptionData)
|
||||
//lock
|
||||
lock(WAITID_RUN);
|
||||
wait(WAITID_RUN);
|
||||
|
||||
/*//my code
|
||||
|
||||
//list memorymap(cbListPage)
|
||||
ReadMemory(va)
|
||||
setBP(va, type, callback)
|
||||
|
||||
//gui
|
||||
GuiChangeCIP(va, base, size)
|
||||
|
||||
|
||||
//gui
|
||||
cbClearMap
|
||||
cbAddPage(MEMORY_BASIC_INFO, modulename)
|
||||
cbEndMap
|
||||
|
||||
//dbg
|
||||
MemoryMap(cbClear, cbAddPage, cbEndMap)
|
||||
*/
|
||||
}
|
||||
|
||||
static void cbStep()
|
||||
|
Loading…
Reference in New Issue
Block a user