1
0
Fork 0

GUI: AStyle

This commit is contained in:
Duncan Ogilvie 2020-07-22 20:08:29 +02:00
parent 35c6516df9
commit eeef3f698a
6 changed files with 1480 additions and 1480 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,99 +1,99 @@
#ifndef CPUREGISTERSVIEW_H
#define CPUREGISTERSVIEW_H
#include "RegistersView.h"
class CPURegistersView : public RegistersView
{
Q_OBJECT
public:
CPURegistersView(CPUWidget* parent = 0);
public slots:
void setRegister(REGISTER_NAME reg, duint value);
void updateRegistersSlot();
virtual void debugStateChangedSlot(DBGSTATE state);
virtual void mousePressEvent(QMouseEvent* event);
virtual void mouseDoubleClickEvent(QMouseEvent* event);
virtual void keyPressEvent(QKeyEvent* event);
virtual void refreshShortcutsSlot();
virtual void displayCustomContextMenuSlot(QPoint pos);
protected slots:
void onIncrementAction();
void onDecrementAction();
void onIncrementx87StackAction();
void onDecrementx87StackAction();
void onZeroAction();
void onSetToOneAction();
void onModifyAction();
void onToggleValueAction();
void onUndoAction();
void onCopyToClipboardAction();
void onCopyFloatingPointToClipboardAction();
void onCopySymbolToClipboardAction();
void onFollowInDisassembly();
void onFollowInDump();
void onFollowInDumpN();
void onFollowInStack();
void onFollowInMemoryMap();
void onIncrementPtrSize();
void onDecrementPtrSize();
void onPushAction();
void onPopAction();
void onHighlightSlot();
// switch SIMD display modes
void onSIMDMode();
void onFpuMode();
void ModifyFields(const QString & title, STRING_VALUE_TABLE_t* table, SIZE_T size);
void disasmSelectionChangedSlot(dsint va);
private:
void CreateDumpNMenu(QMenu* dumpMenu);
void displayEditDialog();
CPUWidget* mParent;
// context menu actions
QMenu* mSwitchSIMDDispMode;
QAction* mDisplaySTX;
QAction* mDisplayx87rX;
QAction* mDisplayMMX;
QAction* mFollowInDump;
QAction* wCM_Increment;
QAction* wCM_Decrement;
QAction* wCM_IncrementPtrSize;
QAction* wCM_DecrementPtrSize;
QAction* wCM_Push;
QAction* wCM_Pop;
QAction* wCM_Zero;
QAction* wCM_SetToOne;
QAction* wCM_Modify;
QAction* wCM_ToggleValue;
QAction* wCM_Undo;
QAction* wCM_CopyToClipboard;
QAction* wCM_CopyFloatingPointValueToClipboard;
QAction* wCM_CopySymbolToClipboard;
QAction* wCM_CopyAll;
QAction* wCM_FollowInDisassembly;
QAction* wCM_FollowInDump;
QAction* wCM_FollowInStack;
QAction* wCM_FollowInMemoryMap;
QAction* wCM_Incrementx87Stack;
QAction* wCM_Decrementx87Stack;
QAction* wCM_ChangeFPUView;
QAction* wCM_Highlight;
QAction* SIMDHex;
QAction* SIMDFloat;
QAction* SIMDDouble;
QAction* SIMDSWord;
QAction* SIMDUWord;
QAction* SIMDHWord;
QAction* SIMDSDWord;
QAction* SIMDUDWord;
QAction* SIMDHDWord;
QAction* SIMDSQWord;
QAction* SIMDUQWord;
QAction* SIMDHQWord;
};
#endif // CPUREGISTERSVIEW_H
#ifndef CPUREGISTERSVIEW_H
#define CPUREGISTERSVIEW_H
#include "RegistersView.h"
class CPURegistersView : public RegistersView
{
Q_OBJECT
public:
CPURegistersView(CPUWidget* parent = 0);
public slots:
void setRegister(REGISTER_NAME reg, duint value);
void updateRegistersSlot();
virtual void debugStateChangedSlot(DBGSTATE state);
virtual void mousePressEvent(QMouseEvent* event);
virtual void mouseDoubleClickEvent(QMouseEvent* event);
virtual void keyPressEvent(QKeyEvent* event);
virtual void refreshShortcutsSlot();
virtual void displayCustomContextMenuSlot(QPoint pos);
protected slots:
void onIncrementAction();
void onDecrementAction();
void onIncrementx87StackAction();
void onDecrementx87StackAction();
void onZeroAction();
void onSetToOneAction();
void onModifyAction();
void onToggleValueAction();
void onUndoAction();
void onCopyToClipboardAction();
void onCopyFloatingPointToClipboardAction();
void onCopySymbolToClipboardAction();
void onFollowInDisassembly();
void onFollowInDump();
void onFollowInDumpN();
void onFollowInStack();
void onFollowInMemoryMap();
void onIncrementPtrSize();
void onDecrementPtrSize();
void onPushAction();
void onPopAction();
void onHighlightSlot();
// switch SIMD display modes
void onSIMDMode();
void onFpuMode();
void ModifyFields(const QString & title, STRING_VALUE_TABLE_t* table, SIZE_T size);
void disasmSelectionChangedSlot(dsint va);
private:
void CreateDumpNMenu(QMenu* dumpMenu);
void displayEditDialog();
CPUWidget* mParent;
// context menu actions
QMenu* mSwitchSIMDDispMode;
QAction* mDisplaySTX;
QAction* mDisplayx87rX;
QAction* mDisplayMMX;
QAction* mFollowInDump;
QAction* wCM_Increment;
QAction* wCM_Decrement;
QAction* wCM_IncrementPtrSize;
QAction* wCM_DecrementPtrSize;
QAction* wCM_Push;
QAction* wCM_Pop;
QAction* wCM_Zero;
QAction* wCM_SetToOne;
QAction* wCM_Modify;
QAction* wCM_ToggleValue;
QAction* wCM_Undo;
QAction* wCM_CopyToClipboard;
QAction* wCM_CopyFloatingPointValueToClipboard;
QAction* wCM_CopySymbolToClipboard;
QAction* wCM_CopyAll;
QAction* wCM_FollowInDisassembly;
QAction* wCM_FollowInDump;
QAction* wCM_FollowInStack;
QAction* wCM_FollowInMemoryMap;
QAction* wCM_Incrementx87Stack;
QAction* wCM_Decrementx87Stack;
QAction* wCM_ChangeFPUView;
QAction* wCM_Highlight;
QAction* SIMDHex;
QAction* SIMDFloat;
QAction* SIMDDouble;
QAction* SIMDSWord;
QAction* SIMDUWord;
QAction* SIMDHWord;
QAction* SIMDSDWord;
QAction* SIMDUDWord;
QAction* SIMDHDWord;
QAction* SIMDSQWord;
QAction* SIMDUQWord;
QAction* SIMDHQWord;
};
#endif // CPUREGISTERSVIEW_H

View File

@ -1,17 +1,17 @@
#include "TraceRegisters.h"
TraceRegisters::TraceRegisters(QWidget* parent) : RegistersView(parent)
{
}
void TraceRegisters::setRegisters(REGDUMP* registers)
{
this->RegistersView::setRegisters(registers);
}
void TraceRegisters::setActive(bool isActive)
{
this->isActive = isActive;
this->RegistersView::setRegisters(&this->wRegDumpStruct);
}
#include "TraceRegisters.h"
TraceRegisters::TraceRegisters(QWidget* parent) : RegistersView(parent)
{
}
void TraceRegisters::setRegisters(REGDUMP* registers)
{
this->RegistersView::setRegisters(registers);
}
void TraceRegisters::setActive(bool isActive)
{
this->isActive = isActive;
this->RegistersView::setRegisters(&this->wRegDumpStruct);
}

View File

@ -1,15 +1,15 @@
#ifndef TRACEREGISTERS_H
#define TRACEREGISTERS_H
#include "RegistersView.h"
class TraceRegisters : public RegistersView
{
Q_OBJECT
public:
TraceRegisters(QWidget* parent = 0);
void setRegisters(REGDUMP* registers);
void setActive(bool isActive);
};
#endif // TRACEREGISTERS_H
#ifndef TRACEREGISTERS_H
#define TRACEREGISTERS_H
#include "RegistersView.h"
class TraceRegisters : public RegistersView
{
Q_OBJECT
public:
TraceRegisters(QWidget* parent = 0);
void setRegisters(REGDUMP* registers);
void setActive(bool isActive);
};
#endif // TRACEREGISTERS_H

View File

@ -1,295 +1,295 @@
#include "TraceWidget.h"
#include "ui_TraceWidget.h"
#include "TraceBrowser.h"
#include "TraceFileReader.h"
#include "TraceRegisters.h"
#include "StdTable.h"
TraceWidget::TraceWidget(QWidget* parent) :
QWidget(parent),
ui(new Ui::TraceWidget)
{
ui->setupUi(this);
mTraceWidget = new TraceBrowser(this);
mOverview = new StdTable(this);
mInfo = new StdTable(this);
mGeneralRegs = new TraceRegisters(this);
//disasm
ui->mTopLeftUpperRightFrameLayout->addWidget(mTraceWidget);
//registers
mGeneralRegs->setFixedWidth(1000);
mGeneralRegs->ShowFPU(true);
QScrollArea* upperScrollArea = new QScrollArea(this);
upperScrollArea->setFrameShape(QFrame::NoFrame);
upperScrollArea->setWidget(mGeneralRegs);
upperScrollArea->horizontalScrollBar()->setStyleSheet(ConfigHScrollBarStyle());
upperScrollArea->verticalScrollBar()->setStyleSheet(ConfigVScrollBarStyle());
QPushButton* button_changeview = new QPushButton("", this);
button_changeview->setStyleSheet("Text-align:left;padding: 4px;padding-left: 10px;");
connect(button_changeview, SIGNAL(clicked()), mGeneralRegs, SLOT(onChangeFPUViewAction()));
connect(mTraceWidget, SIGNAL(selectionChanged(unsigned long long)), this, SLOT(traceSelectionChanged(unsigned long long)));
connect(Bridge::getBridge(), SIGNAL(updateTraceBrowser()), this, SLOT(updateSlot()));
mGeneralRegs->SetChangeButton(button_changeview);
ui->mTopRightUpperFrameLayout->addWidget(button_changeview);
ui->mTopRightUpperFrameLayout->addWidget(upperScrollArea);
//info
ui->mTopLeftLowerFrameLayout->addWidget(mInfo);
int height = (mInfo->getRowHeight() + 1) * 4;
ui->mTopLeftLowerFrame->setMinimumHeight(height + 2);
ui->mTopHSplitter->setSizes(QList<int>({1000, 1}));
ui->mTopLeftVSplitter->setSizes(QList<int>({1000, 1}));
mInfo->addColumnAt(0, "", true);
mInfo->setShowHeader(false);
mInfo->setRowCount(4);
mInfo->setCellContent(0, 0, QString());
mInfo->setCellContent(1, 0, QString());
mInfo->setCellContent(2, 0, QString());
mInfo->setCellContent(3, 0, QString());
//overview
ui->mTopRightLowerFrameLayout->addWidget(mOverview);
//set up overview
mOverview->addColumnAt(0, "", true);
mOverview->setShowHeader(false);
mOverview->setRowCount(4);
mOverview->setCellContent(0, 0, "hello");
mOverview->setCellContent(1, 0, "world");
mOverview->setCellContent(2, 0, "00000000");
mOverview->setCellContent(3, 0, "here we will list all control flow transfers");
mOverview->hide();
}
TraceWidget::~TraceWidget()
{
delete ui;
}
void TraceWidget::traceSelectionChanged(unsigned long long selection)
{
REGDUMP registers;
TraceFileReader* traceFile;
traceFile = mTraceWidget->getTraceFile();
if(traceFile != nullptr && traceFile->Progress() == 100)
{
if(selection < traceFile->Length())
{
registers = traceFile->Registers(selection);
updateInfobox(selection, traceFile, registers);
}
else
memset(&registers, 0, sizeof(registers));
}
mGeneralRegs->setRegisters(&registers);
}
void TraceWidget::updateSlot()
{
mGeneralRegs->setActive(mTraceWidget->isFileOpened());
}
TraceBrowser* TraceWidget::getTraceBrowser()
{
return mTraceWidget;
}
void TraceWidget::updateInfobox(unsigned long long selection, TraceFileReader* traceFile, const REGDUMP & registers)
{
int infoline = 0;
Zydis zydis;
unsigned char opcode[16];
QString line;
int opsize;
traceFile->OpCode(selection, opcode, &opsize);
mInfo->setRowCount(4);
mInfo->setCellContent(0, 0, QString());
mInfo->setCellContent(1, 0, QString());
mInfo->setCellContent(2, 0, QString());
mInfo->setCellContent(3, 0, QString());
auto resolveRegValue = [registers](ZydisRegister regname)
{
switch(regname)
{
#ifdef _WIN64
case ZYDIS_REGISTER_RAX:
return registers.regcontext.cax;
case ZYDIS_REGISTER_RCX:
return registers.regcontext.ccx;
case ZYDIS_REGISTER_RDX:
return registers.regcontext.cdx;
case ZYDIS_REGISTER_RBX:
return registers.regcontext.cbx;
case ZYDIS_REGISTER_RSP:
return registers.regcontext.csp;
case ZYDIS_REGISTER_RBP:
return registers.regcontext.cbp;
case ZYDIS_REGISTER_RSI:
return registers.regcontext.csi;
case ZYDIS_REGISTER_RDI:
return registers.regcontext.cdi;
case ZYDIS_REGISTER_R8:
return registers.regcontext.r8;
case ZYDIS_REGISTER_R9:
return registers.regcontext.r9;
case ZYDIS_REGISTER_R10:
return registers.regcontext.r10;
case ZYDIS_REGISTER_R11:
return registers.regcontext.r11;
case ZYDIS_REGISTER_R12:
return registers.regcontext.r12;
case ZYDIS_REGISTER_R13:
return registers.regcontext.r13;
case ZYDIS_REGISTER_R14:
return registers.regcontext.r14;
case ZYDIS_REGISTER_R15:
return registers.regcontext.r15;
case ZYDIS_REGISTER_R8D:
return registers.regcontext.r8 & 0xFFFFFFFF;
case ZYDIS_REGISTER_R9D:
return registers.regcontext.r9 & 0xFFFFFFFF;
case ZYDIS_REGISTER_R10D:
return registers.regcontext.r10 & 0xFFFFFFFF;
case ZYDIS_REGISTER_R11D:
return registers.regcontext.r11 & 0xFFFFFFFF;
case ZYDIS_REGISTER_R12D:
return registers.regcontext.r12 & 0xFFFFFFFF;
case ZYDIS_REGISTER_R13D:
return registers.regcontext.r13 & 0xFFFFFFFF;
case ZYDIS_REGISTER_R15D:
return registers.regcontext.r15 & 0xFFFFFFFF;
case ZYDIS_REGISTER_R8W:
return registers.regcontext.r8 & 0xFFFF;
case ZYDIS_REGISTER_R9W:
return registers.regcontext.r9 & 0xFFFF;
case ZYDIS_REGISTER_R10W:
return registers.regcontext.r10 & 0xFFFF;
case ZYDIS_REGISTER_R11W:
return registers.regcontext.r11 & 0xFFFF;
case ZYDIS_REGISTER_R12W:
return registers.regcontext.r12 & 0xFFFF;
case ZYDIS_REGISTER_R13W:
return registers.regcontext.r13 & 0xFFFF;
case ZYDIS_REGISTER_R15W:
return registers.regcontext.r15 & 0xFFFF;
case ZYDIS_REGISTER_R8B:
return registers.regcontext.r8 & 0xFF;
case ZYDIS_REGISTER_R9B:
return registers.regcontext.r9 & 0xFF;
case ZYDIS_REGISTER_R10B:
return registers.regcontext.r10 & 0xFF;
case ZYDIS_REGISTER_R11B:
return registers.regcontext.r11 & 0xFF;
case ZYDIS_REGISTER_R12B:
return registers.regcontext.r12 & 0xFF;
case ZYDIS_REGISTER_R13B:
return registers.regcontext.r13 & 0xFF;
case ZYDIS_REGISTER_R15B:
return registers.regcontext.r15 & 0xFF;
#endif //_WIN64
case ZYDIS_REGISTER_EAX:
return registers.regcontext.cax & 0xFFFFFFFF;
case ZYDIS_REGISTER_ECX:
return registers.regcontext.ccx & 0xFFFFFFFF;
case ZYDIS_REGISTER_EDX:
return registers.regcontext.cdx & 0xFFFFFFFF;
case ZYDIS_REGISTER_EBX:
return registers.regcontext.cbx & 0xFFFFFFFF;
case ZYDIS_REGISTER_ESP:
return registers.regcontext.csp & 0xFFFFFFFF;
case ZYDIS_REGISTER_EBP:
return registers.regcontext.cbp & 0xFFFFFFFF;
case ZYDIS_REGISTER_ESI:
return registers.regcontext.csi & 0xFFFFFFFF;
case ZYDIS_REGISTER_EDI:
return registers.regcontext.cdi & 0xFFFFFFFF;
case ZYDIS_REGISTER_AX:
return registers.regcontext.cax & 0xFFFF;
case ZYDIS_REGISTER_CX:
return registers.regcontext.ccx & 0xFFFF;
case ZYDIS_REGISTER_DX:
return registers.regcontext.cdx & 0xFFFF;
case ZYDIS_REGISTER_BX:
return registers.regcontext.cbx & 0xFFFF;
case ZYDIS_REGISTER_SP:
return registers.regcontext.csp & 0xFFFF;
case ZYDIS_REGISTER_BP:
return registers.regcontext.cbp & 0xFFFF;
case ZYDIS_REGISTER_SI:
return registers.regcontext.csi & 0xFFFF;
case ZYDIS_REGISTER_DI:
return registers.regcontext.cdi & 0xFFFF;
case ZYDIS_REGISTER_AL:
return registers.regcontext.cax & 0xFF;
case ZYDIS_REGISTER_CL:
return registers.regcontext.ccx & 0xFF;
case ZYDIS_REGISTER_DL:
return registers.regcontext.cdx & 0xFF;
case ZYDIS_REGISTER_BL:
return registers.regcontext.cbx & 0xFF;
case ZYDIS_REGISTER_AH:
return (registers.regcontext.cax & 0xFF00) >> 8;
case ZYDIS_REGISTER_CH:
return (registers.regcontext.ccx & 0xFF00) >> 8;
case ZYDIS_REGISTER_DH:
return (registers.regcontext.cdx & 0xFF00) >> 8;
case ZYDIS_REGISTER_BH:
return (registers.regcontext.cbx & 0xFF00) >> 8;
default:
return static_cast<size_t>(0);
}
};
if(zydis.Disassemble(registers.regcontext.cip, opcode, opsize))
{
int opindex;
//Jumps
if(zydis.IsBranchType(Zydis::BTCondJmp))
{
if(zydis.IsBranchGoingToExecute(registers.regcontext.eflags, registers.regcontext.ccx))
{
line = tr("Jump is taken");
}
else
{
line = tr("Jump is not taken");
}
mInfo->setCellContent(infoline, 0, line);
infoline++;
}
//Operands
for(opindex = 0; opindex < zydis.OpCount(); opindex++)
{
line.clear();
size_t value = zydis.ResolveOpValue(opindex, resolveRegValue);
if(zydis[opindex].type == ZYDIS_OPERAND_TYPE_MEMORY)
{
const char* memsize = zydis.MemSizeName(zydis[opindex].size / 8);
if(memsize != nullptr)
{
line += memsize;
}
line += " ptr ";
line += zydis.RegName(zydis[opindex].mem.segment);
line += ":[";
line += ToPtrString(value);
line += "]";
mInfo->setCellContent(infoline, 0, line);
infoline++;
}
else if(zydis[opindex].type == ZYDIS_OPERAND_TYPE_REGISTER)
{
line += zydis.RegName(zydis[opindex].reg.value);
line += " = ";
line += ToPtrString(value);
mInfo->setCellContent(infoline, 0, line);
infoline++;
}
}
}
mInfo->reloadData();
}
#include "TraceWidget.h"
#include "ui_TraceWidget.h"
#include "TraceBrowser.h"
#include "TraceFileReader.h"
#include "TraceRegisters.h"
#include "StdTable.h"
TraceWidget::TraceWidget(QWidget* parent) :
QWidget(parent),
ui(new Ui::TraceWidget)
{
ui->setupUi(this);
mTraceWidget = new TraceBrowser(this);
mOverview = new StdTable(this);
mInfo = new StdTable(this);
mGeneralRegs = new TraceRegisters(this);
//disasm
ui->mTopLeftUpperRightFrameLayout->addWidget(mTraceWidget);
//registers
mGeneralRegs->setFixedWidth(1000);
mGeneralRegs->ShowFPU(true);
QScrollArea* upperScrollArea = new QScrollArea(this);
upperScrollArea->setFrameShape(QFrame::NoFrame);
upperScrollArea->setWidget(mGeneralRegs);
upperScrollArea->horizontalScrollBar()->setStyleSheet(ConfigHScrollBarStyle());
upperScrollArea->verticalScrollBar()->setStyleSheet(ConfigVScrollBarStyle());
QPushButton* button_changeview = new QPushButton("", this);
button_changeview->setStyleSheet("Text-align:left;padding: 4px;padding-left: 10px;");
connect(button_changeview, SIGNAL(clicked()), mGeneralRegs, SLOT(onChangeFPUViewAction()));
connect(mTraceWidget, SIGNAL(selectionChanged(unsigned long long)), this, SLOT(traceSelectionChanged(unsigned long long)));
connect(Bridge::getBridge(), SIGNAL(updateTraceBrowser()), this, SLOT(updateSlot()));
mGeneralRegs->SetChangeButton(button_changeview);
ui->mTopRightUpperFrameLayout->addWidget(button_changeview);
ui->mTopRightUpperFrameLayout->addWidget(upperScrollArea);
//info
ui->mTopLeftLowerFrameLayout->addWidget(mInfo);
int height = (mInfo->getRowHeight() + 1) * 4;
ui->mTopLeftLowerFrame->setMinimumHeight(height + 2);
ui->mTopHSplitter->setSizes(QList<int>({1000, 1}));
ui->mTopLeftVSplitter->setSizes(QList<int>({1000, 1}));
mInfo->addColumnAt(0, "", true);
mInfo->setShowHeader(false);
mInfo->setRowCount(4);
mInfo->setCellContent(0, 0, QString());
mInfo->setCellContent(1, 0, QString());
mInfo->setCellContent(2, 0, QString());
mInfo->setCellContent(3, 0, QString());
//overview
ui->mTopRightLowerFrameLayout->addWidget(mOverview);
//set up overview
mOverview->addColumnAt(0, "", true);
mOverview->setShowHeader(false);
mOverview->setRowCount(4);
mOverview->setCellContent(0, 0, "hello");
mOverview->setCellContent(1, 0, "world");
mOverview->setCellContent(2, 0, "00000000");
mOverview->setCellContent(3, 0, "here we will list all control flow transfers");
mOverview->hide();
}
TraceWidget::~TraceWidget()
{
delete ui;
}
void TraceWidget::traceSelectionChanged(unsigned long long selection)
{
REGDUMP registers;
TraceFileReader* traceFile;
traceFile = mTraceWidget->getTraceFile();
if(traceFile != nullptr && traceFile->Progress() == 100)
{
if(selection < traceFile->Length())
{
registers = traceFile->Registers(selection);
updateInfobox(selection, traceFile, registers);
}
else
memset(&registers, 0, sizeof(registers));
}
mGeneralRegs->setRegisters(&registers);
}
void TraceWidget::updateSlot()
{
mGeneralRegs->setActive(mTraceWidget->isFileOpened());
}
TraceBrowser* TraceWidget::getTraceBrowser()
{
return mTraceWidget;
}
void TraceWidget::updateInfobox(unsigned long long selection, TraceFileReader* traceFile, const REGDUMP & registers)
{
int infoline = 0;
Zydis zydis;
unsigned char opcode[16];
QString line;
int opsize;
traceFile->OpCode(selection, opcode, &opsize);
mInfo->setRowCount(4);
mInfo->setCellContent(0, 0, QString());
mInfo->setCellContent(1, 0, QString());
mInfo->setCellContent(2, 0, QString());
mInfo->setCellContent(3, 0, QString());
auto resolveRegValue = [registers](ZydisRegister regname)
{
switch(regname)
{
#ifdef _WIN64
case ZYDIS_REGISTER_RAX:
return registers.regcontext.cax;
case ZYDIS_REGISTER_RCX:
return registers.regcontext.ccx;
case ZYDIS_REGISTER_RDX:
return registers.regcontext.cdx;
case ZYDIS_REGISTER_RBX:
return registers.regcontext.cbx;
case ZYDIS_REGISTER_RSP:
return registers.regcontext.csp;
case ZYDIS_REGISTER_RBP:
return registers.regcontext.cbp;
case ZYDIS_REGISTER_RSI:
return registers.regcontext.csi;
case ZYDIS_REGISTER_RDI:
return registers.regcontext.cdi;
case ZYDIS_REGISTER_R8:
return registers.regcontext.r8;
case ZYDIS_REGISTER_R9:
return registers.regcontext.r9;
case ZYDIS_REGISTER_R10:
return registers.regcontext.r10;
case ZYDIS_REGISTER_R11:
return registers.regcontext.r11;
case ZYDIS_REGISTER_R12:
return registers.regcontext.r12;
case ZYDIS_REGISTER_R13:
return registers.regcontext.r13;
case ZYDIS_REGISTER_R14:
return registers.regcontext.r14;
case ZYDIS_REGISTER_R15:
return registers.regcontext.r15;
case ZYDIS_REGISTER_R8D:
return registers.regcontext.r8 & 0xFFFFFFFF;
case ZYDIS_REGISTER_R9D:
return registers.regcontext.r9 & 0xFFFFFFFF;
case ZYDIS_REGISTER_R10D:
return registers.regcontext.r10 & 0xFFFFFFFF;
case ZYDIS_REGISTER_R11D:
return registers.regcontext.r11 & 0xFFFFFFFF;
case ZYDIS_REGISTER_R12D:
return registers.regcontext.r12 & 0xFFFFFFFF;
case ZYDIS_REGISTER_R13D:
return registers.regcontext.r13 & 0xFFFFFFFF;
case ZYDIS_REGISTER_R15D:
return registers.regcontext.r15 & 0xFFFFFFFF;
case ZYDIS_REGISTER_R8W:
return registers.regcontext.r8 & 0xFFFF;
case ZYDIS_REGISTER_R9W:
return registers.regcontext.r9 & 0xFFFF;
case ZYDIS_REGISTER_R10W:
return registers.regcontext.r10 & 0xFFFF;
case ZYDIS_REGISTER_R11W:
return registers.regcontext.r11 & 0xFFFF;
case ZYDIS_REGISTER_R12W:
return registers.regcontext.r12 & 0xFFFF;
case ZYDIS_REGISTER_R13W:
return registers.regcontext.r13 & 0xFFFF;
case ZYDIS_REGISTER_R15W:
return registers.regcontext.r15 & 0xFFFF;
case ZYDIS_REGISTER_R8B:
return registers.regcontext.r8 & 0xFF;
case ZYDIS_REGISTER_R9B:
return registers.regcontext.r9 & 0xFF;
case ZYDIS_REGISTER_R10B:
return registers.regcontext.r10 & 0xFF;
case ZYDIS_REGISTER_R11B:
return registers.regcontext.r11 & 0xFF;
case ZYDIS_REGISTER_R12B:
return registers.regcontext.r12 & 0xFF;
case ZYDIS_REGISTER_R13B:
return registers.regcontext.r13 & 0xFF;
case ZYDIS_REGISTER_R15B:
return registers.regcontext.r15 & 0xFF;
#endif //_WIN64
case ZYDIS_REGISTER_EAX:
return registers.regcontext.cax & 0xFFFFFFFF;
case ZYDIS_REGISTER_ECX:
return registers.regcontext.ccx & 0xFFFFFFFF;
case ZYDIS_REGISTER_EDX:
return registers.regcontext.cdx & 0xFFFFFFFF;
case ZYDIS_REGISTER_EBX:
return registers.regcontext.cbx & 0xFFFFFFFF;
case ZYDIS_REGISTER_ESP:
return registers.regcontext.csp & 0xFFFFFFFF;
case ZYDIS_REGISTER_EBP:
return registers.regcontext.cbp & 0xFFFFFFFF;
case ZYDIS_REGISTER_ESI:
return registers.regcontext.csi & 0xFFFFFFFF;
case ZYDIS_REGISTER_EDI:
return registers.regcontext.cdi & 0xFFFFFFFF;
case ZYDIS_REGISTER_AX:
return registers.regcontext.cax & 0xFFFF;
case ZYDIS_REGISTER_CX:
return registers.regcontext.ccx & 0xFFFF;
case ZYDIS_REGISTER_DX:
return registers.regcontext.cdx & 0xFFFF;
case ZYDIS_REGISTER_BX:
return registers.regcontext.cbx & 0xFFFF;
case ZYDIS_REGISTER_SP:
return registers.regcontext.csp & 0xFFFF;
case ZYDIS_REGISTER_BP:
return registers.regcontext.cbp & 0xFFFF;
case ZYDIS_REGISTER_SI:
return registers.regcontext.csi & 0xFFFF;
case ZYDIS_REGISTER_DI:
return registers.regcontext.cdi & 0xFFFF;
case ZYDIS_REGISTER_AL:
return registers.regcontext.cax & 0xFF;
case ZYDIS_REGISTER_CL:
return registers.regcontext.ccx & 0xFF;
case ZYDIS_REGISTER_DL:
return registers.regcontext.cdx & 0xFF;
case ZYDIS_REGISTER_BL:
return registers.regcontext.cbx & 0xFF;
case ZYDIS_REGISTER_AH:
return (registers.regcontext.cax & 0xFF00) >> 8;
case ZYDIS_REGISTER_CH:
return (registers.regcontext.ccx & 0xFF00) >> 8;
case ZYDIS_REGISTER_DH:
return (registers.regcontext.cdx & 0xFF00) >> 8;
case ZYDIS_REGISTER_BH:
return (registers.regcontext.cbx & 0xFF00) >> 8;
default:
return static_cast<size_t>(0);
}
};
if(zydis.Disassemble(registers.regcontext.cip, opcode, opsize))
{
int opindex;
//Jumps
if(zydis.IsBranchType(Zydis::BTCondJmp))
{
if(zydis.IsBranchGoingToExecute(registers.regcontext.eflags, registers.regcontext.ccx))
{
line = tr("Jump is taken");
}
else
{
line = tr("Jump is not taken");
}
mInfo->setCellContent(infoline, 0, line);
infoline++;
}
//Operands
for(opindex = 0; opindex < zydis.OpCount(); opindex++)
{
line.clear();
size_t value = zydis.ResolveOpValue(opindex, resolveRegValue);
if(zydis[opindex].type == ZYDIS_OPERAND_TYPE_MEMORY)
{
const char* memsize = zydis.MemSizeName(zydis[opindex].size / 8);
if(memsize != nullptr)
{
line += memsize;
}
line += " ptr ";
line += zydis.RegName(zydis[opindex].mem.segment);
line += ":[";
line += ToPtrString(value);
line += "]";
mInfo->setCellContent(infoline, 0, line);
infoline++;
}
else if(zydis[opindex].type == ZYDIS_OPERAND_TYPE_REGISTER)
{
line += zydis.RegName(zydis[opindex].reg.value);
line += " = ";
line += ToPtrString(value);
mInfo->setCellContent(infoline, 0, line);
infoline++;
}
}
}
mInfo->reloadData();
}

View File

@ -1,45 +1,45 @@
#ifndef TRACEWIDGET_H
#define TRACEWIDGET_H
#include <QWidget>
#include "Bridge.h"
class QVBoxLayout;
class CPUWidget;
class TraceRegisters;
class TraceBrowser;
class TraceFileReader;
class StdTable;
namespace Ui
{
class TraceWidget;
}
class TraceWidget : public QWidget
{
Q_OBJECT
public:
explicit TraceWidget(QWidget* parent);
~TraceWidget();
TraceBrowser* getTraceBrowser();
protected slots:
void traceSelectionChanged(unsigned long long selection);
void updateSlot();
protected:
TraceBrowser* mTraceWidget;
TraceRegisters* mGeneralRegs;
StdTable* mInfo;
StdTable* mOverview;
void updateInfobox(unsigned long long selection, TraceFileReader* traceFile, const REGDUMP & registers);
private:
Ui::TraceWidget* ui;
};
#endif // TRACEWIDGET_H
#ifndef TRACEWIDGET_H
#define TRACEWIDGET_H
#include <QWidget>
#include "Bridge.h"
class QVBoxLayout;
class CPUWidget;
class TraceRegisters;
class TraceBrowser;
class TraceFileReader;
class StdTable;
namespace Ui
{
class TraceWidget;
}
class TraceWidget : public QWidget
{
Q_OBJECT
public:
explicit TraceWidget(QWidget* parent);
~TraceWidget();
TraceBrowser* getTraceBrowser();
protected slots:
void traceSelectionChanged(unsigned long long selection);
void updateSlot();
protected:
TraceBrowser* mTraceWidget;
TraceRegisters* mGeneralRegs;
StdTable* mInfo;
StdTable* mOverview;
void updateInfobox(unsigned long long selection, TraceFileReader* traceFile, const REGDUMP & registers);
private:
Ui::TraceWidget* ui;
};
#endif // TRACEWIDGET_H