parent
a59d7cbc36
commit
549a08c6bd
|
@ -22,11 +22,9 @@ x64_dbg_*/x64/*
|
||||||
!bin/*/test.dll
|
!bin/*/test.dll
|
||||||
!bin/*/test.exe
|
!bin/*/test.exe
|
||||||
!bin/*/dbghelp.dll
|
!bin/*/dbghelp.dll
|
||||||
!bin/*/symsrv.dll
|
|
||||||
!bin/*/sqlite.dll
|
!bin/*/sqlite.dll
|
||||||
!bin/*/BeaEngine.dll
|
!bin/*/BeaEngine.dll
|
||||||
!bin/*/Scylla.dll
|
!bin/*/Scylla.dll
|
||||||
!bin/*/nasm.exe
|
|
||||||
|
|
||||||
#files to ignore
|
#files to ignore
|
||||||
todo_bridge.txt
|
todo_bridge.txt
|
||||||
|
|
BIN
bin/x32/nasm.exe
BIN
bin/x32/nasm.exe
Binary file not shown.
Binary file not shown.
BIN
bin/x64/nasm.exe
BIN
bin/x64/nasm.exe
Binary file not shown.
Binary file not shown.
|
@ -523,6 +523,15 @@ BRIDGE_IMPEXP void DbgScriptSetIp(int line)
|
||||||
_dbg_sendmessage(DBG_SCRIPT_SETIP, (void*)(duint)line, 0);
|
_dbg_sendmessage(DBG_SCRIPT_SETIP, (void*)(duint)line, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BRIDGE_IMPEXP void DbgSymbolEnum(duint base, CBSYMBOLENUM cbSymbolEnum, void* user)
|
||||||
|
{
|
||||||
|
SYMBOLCBINFO cbInfo;
|
||||||
|
cbInfo.base=base;
|
||||||
|
cbInfo.cbSymbolEnum=cbSymbolEnum;
|
||||||
|
cbInfo.user=user;
|
||||||
|
_dbg_sendmessage(DBG_SYMBOL_ENUM, &cbInfo, 0);
|
||||||
|
}
|
||||||
|
|
||||||
//GUI
|
//GUI
|
||||||
BRIDGE_IMPEXP void GuiDisasmAt(duint addr, duint cip)
|
BRIDGE_IMPEXP void GuiDisasmAt(duint addr, duint cip)
|
||||||
{
|
{
|
||||||
|
|
|
@ -286,6 +286,8 @@ BRIDGE_IMPEXP void DbgScriptAbort();
|
||||||
BRIDGE_IMPEXP SCRIPTLINETYPE DbgScriptGetLineType(int line);
|
BRIDGE_IMPEXP SCRIPTLINETYPE DbgScriptGetLineType(int line);
|
||||||
BRIDGE_IMPEXP void DbgScriptSetIp(int line);
|
BRIDGE_IMPEXP void DbgScriptSetIp(int line);
|
||||||
|
|
||||||
|
BRIDGE_IMPEXP void DbgSymbolEnum(duint base, CBSYMBOLENUM cbSymbolEnum, void* user);
|
||||||
|
|
||||||
//Gui enums
|
//Gui enums
|
||||||
enum GUIMSG
|
enum GUIMSG
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,8 +1,44 @@
|
||||||
#include "symbolinfo.h"
|
#include "symbolinfo.h"
|
||||||
#include "debugger.h"
|
#include "debugger.h"
|
||||||
|
#include "addrinfo.h"
|
||||||
|
|
||||||
|
static struct SYMBOLCBDATA
|
||||||
|
{
|
||||||
|
CBSYMBOLENUM cbSymbolEnum;
|
||||||
|
void* user;
|
||||||
|
};
|
||||||
|
|
||||||
|
static BOOL CALLBACK EnumSymbols(PSYMBOL_INFO pSymInfo, ULONG SymbolSize, PVOID UserContext)
|
||||||
|
{
|
||||||
|
int len=strlen(pSymInfo->Name);
|
||||||
|
SYMBOLINFO curSymbol;
|
||||||
|
memset(&curSymbol, 0, sizeof(SYMBOLINFO));
|
||||||
|
curSymbol.addr=pSymInfo->Address;
|
||||||
|
curSymbol.decoratedSymbol=(char*)BridgeAlloc(len+1);
|
||||||
|
strcpy(curSymbol.decoratedSymbol, pSymInfo->Name);
|
||||||
|
curSymbol.undecoratedSymbol=(char*)BridgeAlloc(MAX_SYM_NAME);
|
||||||
|
if(!UnDecorateSymbolName(pSymInfo->Name, curSymbol.undecoratedSymbol, MAX_SYM_NAME, UNDNAME_COMPLETE))
|
||||||
|
{
|
||||||
|
BridgeFree(curSymbol.undecoratedSymbol);
|
||||||
|
curSymbol.undecoratedSymbol=0;
|
||||||
|
}
|
||||||
|
else if(!strcmp(curSymbol.decoratedSymbol, curSymbol.undecoratedSymbol))
|
||||||
|
{
|
||||||
|
BridgeFree(curSymbol.undecoratedSymbol);
|
||||||
|
curSymbol.undecoratedSymbol=0;
|
||||||
|
}
|
||||||
|
SYMBOLCBDATA* cbData=(SYMBOLCBDATA*)UserContext;
|
||||||
|
cbData->cbSymbolEnum(&curSymbol, cbData->user);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
void symbolenum(uint base, CBSYMBOLENUM cbSymbolEnum, void* user)
|
void symbolenum(uint base, CBSYMBOLENUM cbSymbolEnum, void* user)
|
||||||
{
|
{
|
||||||
|
SYMBOLCBDATA symbolCbData;
|
||||||
|
symbolCbData.cbSymbolEnum=cbSymbolEnum;
|
||||||
|
symbolCbData.user=user;
|
||||||
|
char mask[]="*";
|
||||||
|
SymEnumSymbols(fdProcessInfo->hProcess, base, mask, EnumSymbols, &symbolCbData);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
|
@ -14,7 +50,7 @@ static BOOL CALLBACK EnumModules(PCTSTR ModuleName, ULONG BaseOfDll, PVOID UserC
|
||||||
SYMBOLMODULEINFO curModule;
|
SYMBOLMODULEINFO curModule;
|
||||||
memset(&curModule, 0, sizeof(SYMBOLMODULEINFO));
|
memset(&curModule, 0, sizeof(SYMBOLMODULEINFO));
|
||||||
curModule.base=BaseOfDll;
|
curModule.base=BaseOfDll;
|
||||||
strcpy(curModule.name, ModuleName);
|
modnamefromaddr(BaseOfDll, curModule.name, true);
|
||||||
((std::vector<SYMBOLMODULEINFO>*)UserContext)->push_back(curModule);
|
((std::vector<SYMBOLMODULEINFO>*)UserContext)->push_back(curModule);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -23,7 +59,7 @@ void symbolupdatemodulelist()
|
||||||
{
|
{
|
||||||
std::vector<SYMBOLMODULEINFO> modList;
|
std::vector<SYMBOLMODULEINFO> modList;
|
||||||
modList.clear();
|
modList.clear();
|
||||||
//SymEnumerateModules(fdProcessInfo->hProcess, EnumModules, &modList);
|
SymEnumerateModules(fdProcessInfo->hProcess, EnumModules, &modList);
|
||||||
int modcount=modList.size();
|
int modcount=modList.size();
|
||||||
SYMBOLMODULEINFO* modListBridge=(SYMBOLMODULEINFO*)BridgeAlloc(sizeof(SYMBOLMODULEINFO)*modcount);
|
SYMBOLMODULEINFO* modListBridge=(SYMBOLMODULEINFO*)BridgeAlloc(sizeof(SYMBOLMODULEINFO)*modcount);
|
||||||
for(int i=0; i<modcount; i++)
|
for(int i=0; i<modcount; i++)
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include "resource.h"
|
#include "resource.h"
|
||||||
#include "..\x64_dbg_bridge\bridgemain.h"
|
#include "..\x64_dbg_bridge\bridgemain.h"
|
||||||
#include "..\x64_dbg_crash\x64_dbg_crash.h"
|
|
||||||
|
|
||||||
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
|
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
|
||||||
{
|
{
|
||||||
|
|
|
@ -53,7 +53,6 @@ SymbolView::SymbolView(QWidget *parent) :
|
||||||
connect(mModuleList, SIGNAL(selectionChangedSignal(int)), this, SLOT(moduleSelectionChanged(int)));
|
connect(mModuleList, SIGNAL(selectionChangedSignal(int)), this, SLOT(moduleSelectionChanged(int)));
|
||||||
connect(Bridge::getBridge(), SIGNAL(updateSymbolList(int,SYMBOLMODULEINFO*)), this, SLOT(updateSymbolList(int,SYMBOLMODULEINFO*)));
|
connect(Bridge::getBridge(), SIGNAL(updateSymbolList(int,SYMBOLMODULEINFO*)), this, SLOT(updateSymbolList(int,SYMBOLMODULEINFO*)));
|
||||||
connect(Bridge::getBridge(), SIGNAL(setSymbolProgress(int)), ui->symbolProgress, SLOT(setValue(int)));
|
connect(Bridge::getBridge(), SIGNAL(setSymbolProgress(int)), ui->symbolProgress, SLOT(setValue(int)));
|
||||||
emit mModuleList->selectionChangedSignal(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SymbolView::~SymbolView()
|
SymbolView::~SymbolView()
|
||||||
|
@ -72,20 +71,44 @@ void SymbolView::clearSymbolLogSlot()
|
||||||
ui->symbolLogEdit->clear();
|
ui->symbolLogEdit->clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SymbolView::cbSymbolEnum(SYMBOLINFO* symbol, void* user)
|
||||||
|
{
|
||||||
|
StdTable* symbolList=(StdTable*)user;
|
||||||
|
int_t index=symbolList->getRowCount();
|
||||||
|
symbolList->setRowCount(index+1);
|
||||||
|
symbolList->setCellContent(index, 0, QString("%1").arg(symbol->addr, sizeof(int_t)*2, 16, QChar('0')).toUpper());
|
||||||
|
if(symbol->decoratedSymbol)
|
||||||
|
{
|
||||||
|
symbolList->setCellContent(index, 1, symbol->decoratedSymbol);
|
||||||
|
BridgeFree(symbol->decoratedSymbol);
|
||||||
|
}
|
||||||
|
if(symbol->undecoratedSymbol)
|
||||||
|
{
|
||||||
|
symbolList->setCellContent(index, 2, symbol->undecoratedSymbol);
|
||||||
|
BridgeFree(symbol->undecoratedSymbol);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SymbolView::moduleSelectionChanged(int index)
|
void SymbolView::moduleSelectionChanged(int index)
|
||||||
{
|
{
|
||||||
|
mSymbolList->setRowCount(0);
|
||||||
|
DbgSymbolEnum(moduleBaseList.at(index), cbSymbolEnum, mSymbolList);
|
||||||
|
mSymbolList->reloadData();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SymbolView::updateSymbolList(int module_count, SYMBOLMODULEINFO* modules)
|
void SymbolView::updateSymbolList(int module_count, SYMBOLMODULEINFO* modules)
|
||||||
{
|
{
|
||||||
mModuleList->setRowCount(module_count);
|
mModuleList->setRowCount(module_count);
|
||||||
|
QList<uint_t> empty;
|
||||||
|
empty.clear();
|
||||||
|
empty.swap(moduleBaseList);
|
||||||
for(int i=0; i<module_count; i++)
|
for(int i=0; i<module_count; i++)
|
||||||
{
|
{
|
||||||
|
moduleBaseList.push_back(modules[i].base);
|
||||||
mModuleList->setCellContent(i, 0, QString("%1").arg(modules[i].base, sizeof(int_t)*2, 16, QChar('0')).toUpper());
|
mModuleList->setCellContent(i, 0, QString("%1").arg(modules[i].base, sizeof(int_t)*2, 16, QChar('0')).toUpper());
|
||||||
mModuleList->setCellContent(i, 1, modules[i].name);
|
mModuleList->setCellContent(i, 1, modules[i].name);
|
||||||
}
|
}
|
||||||
mModuleList->reloadData();
|
mModuleList->reloadData();
|
||||||
if(modules)
|
if(modules)
|
||||||
BridgeFree(modules);
|
BridgeFree(modules);
|
||||||
this->moduleSelectionChanged(0);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,22 +32,9 @@ private:
|
||||||
StdTable* mModuleList;
|
StdTable* mModuleList;
|
||||||
StdTable* mSymbolList;
|
StdTable* mSymbolList;
|
||||||
|
|
||||||
struct SymbolInfo_t
|
QList<uint_t> moduleBaseList;
|
||||||
{
|
|
||||||
uint_t addr;
|
|
||||||
QString decoratedSymbol;
|
|
||||||
QString undecoratedSymbol;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ModuleInfo_t
|
|
||||||
{
|
|
||||||
uint_t base;
|
|
||||||
QString name;
|
|
||||||
QList<SymbolInfo_t> symbols;
|
|
||||||
};
|
|
||||||
|
|
||||||
QList<ModuleInfo_t> moduleList;
|
|
||||||
|
|
||||||
|
static void cbSymbolEnum(SYMBOLINFO* symbol, void* user);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SYMBOLVIEW_H
|
#endif // SYMBOLVIEW_H
|
||||||
|
|
Loading…
Reference in New Issue