2017-10-02 16:18:40 +00:00
|
|
|
#include "Dashboard.h"
|
|
|
|
#include "ui_Dashboard.h"
|
2018-10-17 07:55:53 +00:00
|
|
|
#include "common/Helpers.h"
|
|
|
|
#include "common/JsonModel.h"
|
|
|
|
#include "common/JsonTreeItem.h"
|
|
|
|
#include "common/TempConfig.h"
|
2018-05-01 18:53:14 +00:00
|
|
|
#include "dialogs/VersionInfoDialog.h"
|
2017-03-29 10:18:37 +00:00
|
|
|
|
2019-02-22 16:50:45 +00:00
|
|
|
#include "core/MainWindow.h"
|
2018-11-10 09:17:52 +00:00
|
|
|
#include "CutterTreeView.h"
|
2017-03-29 10:18:37 +00:00
|
|
|
|
|
|
|
#include <QDebug>
|
|
|
|
#include <QJsonArray>
|
|
|
|
#include <QStringList>
|
|
|
|
#include <QJsonObject>
|
|
|
|
#include <QJsonDocument>
|
2017-04-13 15:14:02 +00:00
|
|
|
#include <QFile>
|
2017-04-25 23:30:36 +00:00
|
|
|
#include <QLayoutItem>
|
2018-03-17 19:26:51 +00:00
|
|
|
#include <QString>
|
|
|
|
#include <QMessageBox>
|
|
|
|
#include <QDialog>
|
|
|
|
#include <QTreeWidget>
|
2017-04-13 15:14:02 +00:00
|
|
|
|
2021-01-24 14:50:13 +00:00
|
|
|
Dashboard::Dashboard(MainWindow *main) : CutterDockWidget(main), ui(new Ui::Dashboard)
|
2017-03-29 10:18:37 +00:00
|
|
|
{
|
|
|
|
ui->setupUi(this);
|
|
|
|
|
2020-08-03 09:13:39 +00:00
|
|
|
connect(Core(), &CutterCore::refreshAll, this, &Dashboard::updateContents);
|
2017-03-29 10:18:37 +00:00
|
|
|
}
|
|
|
|
|
2017-10-02 09:41:28 +00:00
|
|
|
Dashboard::~Dashboard() {}
|
2017-03-29 10:18:37 +00:00
|
|
|
|
2017-04-09 19:55:06 +00:00
|
|
|
void Dashboard::updateContents()
|
|
|
|
{
|
Convert to rizin APIs (#2973)
`rz_core_bin_get_compile_time`, `ij`/`CutterCore::getFileInfo()`,
`aaij`, `iVj`, `iEj`, `izzj`, `iMj`, `aeim-`, `aei-`, `tc`,
`rz_core_config_variable_spaces`, `o`, `oodf`
2022-07-02 13:49:13 +00:00
|
|
|
RzCoreLocked core(Core());
|
|
|
|
int fd = rz_io_fd_get_current(core->io);
|
|
|
|
RzIODesc *desc = rz_io_desc_get(core->io, fd);
|
|
|
|
setPlainText(this->ui->modeEdit, desc ? rz_str_rwx_i(desc->perm & RZ_PERM_RWX) : "");
|
|
|
|
|
|
|
|
RzBinFile *bf = rz_bin_cur(core->bin);
|
|
|
|
if (bf) {
|
|
|
|
setPlainText(this->ui->compilationDateEdit, rz_core_bin_get_compile_time(bf));
|
|
|
|
if (bf->o) {
|
|
|
|
char *relco_buf = sdb_get(bf->o->kv, "elf.relro", 0);
|
|
|
|
if (RZ_STR_ISNOTEMPTY(relco_buf)) {
|
|
|
|
QString relro = QString(relco_buf).section(QLatin1Char(' '), 0, 0);
|
|
|
|
relro[0] = relro[0].toUpper();
|
|
|
|
setPlainText(this->ui->relroEdit, relro);
|
|
|
|
} else {
|
|
|
|
setPlainText(this->ui->relroEdit, "N/A");
|
|
|
|
}
|
|
|
|
}
|
2017-06-08 22:28:42 +00:00
|
|
|
}
|
2017-06-02 16:35:26 +00:00
|
|
|
|
2019-09-28 20:46:41 +00:00
|
|
|
// Add file hashes, analysis info and libraries
|
2022-05-30 17:34:17 +00:00
|
|
|
RzBinInfo *binInfo = rz_bin_get_info(core->bin);
|
|
|
|
|
|
|
|
setPlainText(ui->fileEdit, binInfo ? binInfo->file : "");
|
|
|
|
setPlainText(ui->formatEdit, binInfo ? binInfo->rclass : "");
|
|
|
|
setPlainText(ui->typeEdit, binInfo ? binInfo->type : "");
|
|
|
|
setPlainText(ui->archEdit, binInfo ? binInfo->arch : "");
|
|
|
|
setPlainText(ui->langEdit, binInfo ? binInfo->lang : "");
|
|
|
|
setPlainText(ui->classEdit, binInfo ? binInfo->bclass : "");
|
|
|
|
setPlainText(ui->machineEdit, binInfo ? binInfo->machine : "");
|
|
|
|
setPlainText(ui->osEdit, binInfo ? binInfo->os : "");
|
|
|
|
setPlainText(ui->subsysEdit, binInfo ? binInfo->subsystem : "");
|
|
|
|
setPlainText(ui->compilerEdit, binInfo ? binInfo->compiler : "");
|
|
|
|
setPlainText(ui->bitsEdit, binInfo ? QString::number(binInfo->bits) : "");
|
2022-06-22 18:26:54 +00:00
|
|
|
setPlainText(ui->baddrEdit, bf ? RzAddressString(rz_bin_file_get_baddr(bf)) : "");
|
|
|
|
setPlainText(ui->sizeEdit, bf ? qhelpers::formatBytecount(bf->size) : "");
|
|
|
|
setPlainText(ui->fdEdit, bf ? QString::number(bf->fd) : "");
|
2022-05-30 17:34:17 +00:00
|
|
|
|
|
|
|
// Setting the value of "Endianness"
|
|
|
|
const char *endian = binInfo ? (binInfo->big_endian ? "BE" : "LE") : "";
|
|
|
|
setPlainText(this->ui->endianEdit, endian);
|
|
|
|
|
|
|
|
// Setting boolean values
|
|
|
|
setRzBinInfo(binInfo);
|
|
|
|
|
|
|
|
// Setting the value of "static"
|
|
|
|
int static_value = rz_bin_is_static(core->bin);
|
|
|
|
setPlainText(ui->staticEdit, tr(setBoolText(static_value)));
|
|
|
|
|
2022-06-22 18:26:54 +00:00
|
|
|
RzList *hashes = bf ? rz_bin_file_compute_hashes(core->bin, bf, UT64_MAX) : nullptr;
|
2020-02-28 08:48:30 +00:00
|
|
|
|
2020-05-06 17:21:51 +00:00
|
|
|
// Delete hashesWidget if it isn't null to avoid duplicate components
|
|
|
|
if (hashesWidget) {
|
|
|
|
hashesWidget->deleteLater();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Define dynamic components to hold the hashes
|
|
|
|
hashesWidget = new QWidget();
|
|
|
|
QFormLayout *hashesLayout = new QFormLayout;
|
|
|
|
hashesWidget->setLayout(hashesLayout);
|
|
|
|
ui->hashesVerticalLayout->addWidget(hashesWidget);
|
|
|
|
|
2020-02-28 08:48:30 +00:00
|
|
|
// Add hashes as a pair of Hash Name : Hash Value.
|
2021-10-18 09:03:26 +00:00
|
|
|
RzListIter *iter;
|
|
|
|
RzBinFileHash *hash;
|
|
|
|
CutterRzListForeach (hashes, iter, RzBinFileHash, hash) {
|
2020-02-28 08:48:30 +00:00
|
|
|
// Create a bold QString with the hash name uppercased
|
2021-10-18 09:03:26 +00:00
|
|
|
QString label = QString("<b>%1:</b>").arg(QString(hash->type).toUpper());
|
2020-02-28 08:48:30 +00:00
|
|
|
|
|
|
|
// Define a Read-Only line edit to display the hash value
|
|
|
|
QLineEdit *hashLineEdit = new QLineEdit();
|
|
|
|
hashLineEdit->setReadOnly(true);
|
2021-10-18 09:03:26 +00:00
|
|
|
hashLineEdit->setText(hash->hex);
|
2020-05-06 17:21:51 +00:00
|
|
|
|
2020-02-28 08:48:30 +00:00
|
|
|
// Set cursor position to begining to avoid long hashes (e.g sha256)
|
|
|
|
// to look truncated at the begining
|
|
|
|
hashLineEdit->setCursorPosition(0);
|
|
|
|
|
|
|
|
// Add both controls to a form layout in a single row
|
2020-05-06 17:21:51 +00:00
|
|
|
hashesLayout->addRow(new QLabel(label), hashLineEdit);
|
2020-02-28 08:48:30 +00:00
|
|
|
}
|
|
|
|
|
Convert to rizin APIs (#2973)
`rz_core_bin_get_compile_time`, `ij`/`CutterCore::getFileInfo()`,
`aaij`, `iVj`, `iEj`, `izzj`, `iMj`, `aeim-`, `aei-`, `tc`,
`rz_core_config_variable_spaces`, `o`, `oodf`
2022-07-02 13:49:13 +00:00
|
|
|
st64 fcns = rz_list_length(core->analysis->fcns);
|
|
|
|
st64 strs = rz_flag_count(core->flags, "str.*");
|
|
|
|
st64 syms = rz_flag_count(core->flags, "sym.*");
|
|
|
|
st64 imps = rz_flag_count(core->flags, "sym.imp.*");
|
|
|
|
st64 code = rz_core_analysis_code_count(core);
|
|
|
|
st64 covr = rz_core_analysis_coverage_count(core);
|
|
|
|
st64 call = rz_core_analysis_calls_count(core);
|
|
|
|
ut64 xrfs = rz_analysis_xrefs_count(core->analysis);
|
|
|
|
double precentage = (code > 0) ? (covr * 100.0 / code) : 0;
|
|
|
|
|
|
|
|
setPlainText(ui->functionsLineEdit, QString::number(fcns));
|
|
|
|
setPlainText(ui->xRefsLineEdit, QString::number(xrfs));
|
|
|
|
setPlainText(ui->callsLineEdit, QString::number(call));
|
|
|
|
setPlainText(ui->stringsLineEdit, QString::number(strs));
|
|
|
|
setPlainText(ui->symbolsLineEdit, QString::number(syms));
|
|
|
|
setPlainText(ui->importsLineEdit, QString::number(imps));
|
|
|
|
setPlainText(ui->coverageLineEdit, QString::number(covr) + " bytes");
|
|
|
|
setPlainText(ui->codeSizeLineEdit, QString::number(code) + " bytes");
|
|
|
|
setPlainText(ui->percentageLineEdit, QString::number(precentage) + "%");
|
2019-09-28 20:46:41 +00:00
|
|
|
|
2017-04-25 23:30:36 +00:00
|
|
|
// dunno: why not label->setText(lines.join("\n")?
|
2018-03-21 20:32:32 +00:00
|
|
|
while (ui->verticalLayout_2->count() > 0) {
|
2017-04-25 23:30:36 +00:00
|
|
|
QLayoutItem *item = ui->verticalLayout_2->takeAt(0);
|
2018-03-21 20:32:32 +00:00
|
|
|
if (item != nullptr) {
|
2017-04-25 23:30:36 +00:00
|
|
|
QWidget *w = item->widget();
|
2018-03-21 20:32:32 +00:00
|
|
|
if (w != nullptr) {
|
2017-04-25 23:30:36 +00:00
|
|
|
w->deleteLater();
|
|
|
|
}
|
|
|
|
|
|
|
|
delete item;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-06-22 18:26:54 +00:00
|
|
|
const RzList *libs = bf ? rz_bin_object_get_libs(bf->o) : nullptr;
|
2022-06-15 23:28:43 +00:00
|
|
|
if (libs) {
|
|
|
|
for (const auto &lib : CutterRzList<char>(libs)) {
|
|
|
|
auto *label = new QLabel(this);
|
|
|
|
label->setText(lib);
|
|
|
|
label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
|
|
|
|
label->setTextInteractionFlags(Qt::TextSelectableByMouse);
|
|
|
|
ui->verticalLayout_2->addWidget(label);
|
|
|
|
}
|
2017-03-29 10:18:37 +00:00
|
|
|
}
|
2017-04-25 23:30:36 +00:00
|
|
|
|
2017-04-09 19:55:06 +00:00
|
|
|
QSpacerItem *spacer = new QSpacerItem(1, 1, QSizePolicy::Fixed, QSizePolicy::Expanding);
|
2017-03-29 10:18:37 +00:00
|
|
|
ui->verticalLayout_2->addSpacerItem(spacer);
|
|
|
|
|
2018-05-05 12:58:26 +00:00
|
|
|
// Check if signature info and version info available
|
2022-06-08 00:02:26 +00:00
|
|
|
if (Core()->getSignatureInfo().isEmpty()) {
|
2018-05-05 12:58:26 +00:00
|
|
|
ui->certificateButton->setEnabled(false);
|
|
|
|
}
|
Convert to rizin APIs (#2973)
`rz_core_bin_get_compile_time`, `ij`/`CutterCore::getFileInfo()`,
`aaij`, `iVj`, `iEj`, `izzj`, `iMj`, `aeim-`, `aei-`, `tc`,
`rz_core_config_variable_spaces`, `o`, `oodf`
2022-07-02 13:49:13 +00:00
|
|
|
ui->versioninfoButton->setEnabled(Core()->existsFileInfo());
|
2017-03-29 10:18:37 +00:00
|
|
|
}
|
2018-03-17 19:26:51 +00:00
|
|
|
|
2018-03-21 20:32:32 +00:00
|
|
|
void Dashboard::on_certificateButton_clicked()
|
|
|
|
{
|
2018-03-17 19:26:51 +00:00
|
|
|
static QDialog *viewDialog = nullptr;
|
2018-11-10 09:17:52 +00:00
|
|
|
static CutterTreeView *view = nullptr;
|
2018-03-17 19:26:51 +00:00
|
|
|
static JsonModel *model = nullptr;
|
|
|
|
static QString qstrCertificates;
|
2018-03-21 20:32:32 +00:00
|
|
|
if (!viewDialog) {
|
2018-03-17 19:26:51 +00:00
|
|
|
viewDialog = new QDialog(this);
|
2018-11-10 09:17:52 +00:00
|
|
|
view = new CutterTreeView(viewDialog);
|
2018-03-17 19:26:51 +00:00
|
|
|
model = new JsonModel();
|
2022-06-08 00:02:26 +00:00
|
|
|
qstrCertificates = Core()->getSignatureInfo();
|
2018-03-17 19:26:51 +00:00
|
|
|
}
|
2018-05-05 12:58:26 +00:00
|
|
|
if (!viewDialog->isVisible()) {
|
|
|
|
std::string strCertificates = qstrCertificates.toUtf8().constData();
|
|
|
|
model->loadJson(QByteArray::fromStdString(strCertificates));
|
|
|
|
view->setModel(model);
|
|
|
|
view->expandAll();
|
|
|
|
view->resize(900, 600);
|
|
|
|
QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
|
|
|
|
sizePolicy.setHorizontalStretch(0);
|
|
|
|
sizePolicy.setVerticalStretch(0);
|
|
|
|
sizePolicy.setHeightForWidth(view->sizePolicy().hasHeightForWidth());
|
|
|
|
viewDialog->setSizePolicy(sizePolicy);
|
|
|
|
viewDialog->setMinimumSize(QSize(900, 600));
|
|
|
|
viewDialog->setMaximumSize(QSize(900, 600));
|
|
|
|
viewDialog->setSizeGripEnabled(false);
|
|
|
|
viewDialog->setWindowTitle("Certificates");
|
|
|
|
viewDialog->show();
|
2018-03-21 20:32:32 +00:00
|
|
|
}
|
2018-04-12 06:33:30 +00:00
|
|
|
}
|
2018-05-01 18:53:14 +00:00
|
|
|
|
|
|
|
void Dashboard::on_versioninfoButton_clicked()
|
|
|
|
{
|
|
|
|
|
|
|
|
static QDialog *infoDialog = nullptr;
|
|
|
|
|
2018-09-30 20:00:53 +00:00
|
|
|
if (!infoDialog) {
|
2018-05-01 18:53:14 +00:00
|
|
|
infoDialog = new VersionInfoDialog(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!infoDialog->isVisible()) {
|
|
|
|
infoDialog->show();
|
|
|
|
}
|
|
|
|
}
|
2019-03-25 09:24:18 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Set the text of a QLineEdit. If no text, then "N/A" is set.
|
|
|
|
* @param textBox
|
|
|
|
* @param text
|
|
|
|
*/
|
|
|
|
void Dashboard::setPlainText(QLineEdit *textBox, const QString &text)
|
|
|
|
{
|
|
|
|
if (!text.isEmpty()) {
|
|
|
|
textBox->setText(text);
|
|
|
|
} else {
|
|
|
|
textBox->setText(tr("N/A"));
|
|
|
|
}
|
|
|
|
|
|
|
|
textBox->setCursorPosition(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2022-05-30 17:34:17 +00:00
|
|
|
* @brief Setting boolean values of binary information in dashboard
|
|
|
|
* @param RzBinInfo
|
2019-03-25 09:24:18 +00:00
|
|
|
*/
|
2022-05-30 17:34:17 +00:00
|
|
|
void Dashboard::setRzBinInfo(RzBinInfo *binInfo)
|
2019-03-25 09:24:18 +00:00
|
|
|
{
|
2022-05-30 17:34:17 +00:00
|
|
|
setPlainText(ui->vaEdit, binInfo ? setBoolText(binInfo->has_va) : "");
|
|
|
|
setPlainText(ui->canaryEdit, binInfo ? setBoolText(binInfo->has_canary) : "");
|
|
|
|
setPlainText(ui->cryptoEdit, binInfo ? setBoolText(binInfo->has_crypto) : "");
|
|
|
|
setPlainText(ui->nxEdit, binInfo ? setBoolText(binInfo->has_nx) : "");
|
|
|
|
setPlainText(ui->picEdit, binInfo ? setBoolText(binInfo->has_pi) : "");
|
|
|
|
setPlainText(ui->strippedEdit,
|
|
|
|
binInfo ? setBoolText(RZ_BIN_DBG_STRIPPED & binInfo->dbg_info) : "");
|
|
|
|
setPlainText(ui->relocsEdit, binInfo ? setBoolText(RZ_BIN_DBG_RELOCS & binInfo->dbg_info) : "");
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Set the text of a QLineEdit as True, False
|
|
|
|
* @param boolean value
|
|
|
|
*/
|
|
|
|
const char *Dashboard::setBoolText(bool value)
|
|
|
|
{
|
|
|
|
return value ? "True" : "False";
|
2019-03-25 09:24:18 +00:00
|
|
|
}
|