|
|
c158fab |
From cedec2c8790b3df093e08e3a7bf41a9c992a8af9 Mon Sep 17 00:00:00 2001
|
|
|
c158fab |
From: =?UTF-8?q?Florian=20M=C3=A4rkl?= <info@florianmaerkl.de>
|
|
|
c158fab |
Date: Fri, 29 Mar 2019 18:11:41 +0100
|
|
|
c158fab |
Subject: [PATCH 2/4] Update radare2 and adapt Cutter (#1406)
|
|
|
c158fab |
|
|
|
c158fab |
* Update radare2 and adapt Cutter
|
|
|
c158fab |
|
|
|
c158fab |
* Fix QByteArray creation in CutterCore::assemble()
|
|
|
c158fab |
|
|
|
c158fab |
(cherry picked from commit 41af189312eaa1621db7a4acff57b123cc8dd423)
|
|
|
c158fab |
---
|
|
|
c158fab |
radare2 | 2 +-
|
|
|
c158fab |
src/core/Cutter.cpp | 36 ++++++++++++++++++++++-----
|
|
|
c158fab |
src/core/Cutter.h | 8 ++++--
|
|
|
c158fab |
src/dialogs/EditInstructionDialog.cpp | 6 +++--
|
|
|
c158fab |
4 files changed, 41 insertions(+), 11 deletions(-)
|
|
|
c158fab |
|
|
|
c158fab |
diff --git a/src/core/Cutter.cpp b/src/core/Cutter.cpp
|
|
|
c158fab |
index 51c8c82..5958a3f 100644
|
|
|
c158fab |
--- a/src/core/Cutter.cpp
|
|
|
c158fab |
+++ b/src/core/Cutter.cpp
|
|
|
c158fab |
@@ -773,20 +773,26 @@ void CutterCore::setBBSize(int size)
|
|
|
c158fab |
setConfig("anal.bb.maxsize", size);
|
|
|
c158fab |
}
|
|
|
c158fab |
|
|
|
c158fab |
-QString CutterCore::assemble(const QString &code)
|
|
|
c158fab |
+QByteArray CutterCore::assemble(const QString &code)
|
|
|
c158fab |
{
|
|
|
c158fab |
CORE_LOCK();
|
|
|
c158fab |
RAsmCode *ac = r_asm_massemble(core_->assembler, code.toUtf8().constData());
|
|
|
c158fab |
- QString hex(ac != nullptr ? ac->buf_hex : "");
|
|
|
c158fab |
+ QByteArray res;
|
|
|
c158fab |
+ if (ac && ac->bytes) {
|
|
|
c158fab |
+ res = QByteArray(reinterpret_cast<const char *>(ac->bytes), ac->len);
|
|
|
c158fab |
+ }
|
|
|
c158fab |
r_asm_code_free(ac);
|
|
|
c158fab |
- return hex;
|
|
|
c158fab |
+ return res;
|
|
|
c158fab |
}
|
|
|
c158fab |
|
|
|
c158fab |
-QString CutterCore::disassemble(const QString &hex)
|
|
|
c158fab |
+QString CutterCore::disassemble(const QByteArray &data)
|
|
|
c158fab |
{
|
|
|
c158fab |
CORE_LOCK();
|
|
|
c158fab |
- RAsmCode *ac = r_asm_mdisassemble_hexstr(core_->assembler, NULL, hex.toUtf8().constData());
|
|
|
c158fab |
- QString code = QString(ac != nullptr ? ac->buf_asm : "");
|
|
|
c158fab |
+ RAsmCode *ac = r_asm_mdisassemble(core_->assembler, reinterpret_cast<const ut8 *>(data.constData()), data.length());
|
|
|
c158fab |
+ QString code;
|
|
|
c158fab |
+ if (ac && ac->assembly) {
|
|
|
c158fab |
+ code = QString::fromUtf8(ac->assembly);
|
|
|
c158fab |
+ }
|
|
|
c158fab |
r_asm_code_free(ac);
|
|
|
c158fab |
return code;
|
|
|
c158fab |
}
|
|
|
c158fab |
@@ -2575,6 +2581,24 @@ QList<DisassemblyLine> CutterCore::disassembleLines(RVA offset, int lines)
|
|
|
c158fab |
return r;
|
|
|
c158fab |
}
|
|
|
c158fab |
|
|
|
c158fab |
+QByteArray CutterCore::hexStringToBytes(const QString &hex)
|
|
|
c158fab |
+{
|
|
|
c158fab |
+ QByteArray hexChars = hex.toUtf8();
|
|
|
c158fab |
+ QByteArray bytes;
|
|
|
c158fab |
+ bytes.reserve(hexChars.length() / 2);
|
|
|
c158fab |
+ int size = r_hex_str2bin(hexChars.constData(), reinterpret_cast<ut8 *>(bytes.data()));
|
|
|
c158fab |
+ bytes.resize(size);
|
|
|
c158fab |
+ return bytes;
|
|
|
c158fab |
+}
|
|
|
c158fab |
+
|
|
|
c158fab |
+QString CutterCore::bytesToHexString(const QByteArray &bytes)
|
|
|
c158fab |
+{
|
|
|
c158fab |
+ QByteArray hex;
|
|
|
c158fab |
+ hex.resize(bytes.length() * 2);
|
|
|
c158fab |
+ r_hex_bin2str(reinterpret_cast<const ut8 *>(bytes.constData()), bytes.size(), hex.data());
|
|
|
c158fab |
+ return QString::fromUtf8(hex);
|
|
|
c158fab |
+}
|
|
|
c158fab |
+
|
|
|
c158fab |
void CutterCore::loadScript(const QString &scriptname)
|
|
|
c158fab |
{
|
|
|
c158fab |
r_core_task_sync_begin(core_);
|
|
|
c158fab |
diff --git a/src/core/Cutter.h b/src/core/Cutter.h
|
|
|
c158fab |
index c886cf0..da84152 100644
|
|
|
c158fab |
--- a/src/core/Cutter.h
|
|
|
c158fab |
+++ b/src/core/Cutter.h
|
|
|
c158fab |
@@ -185,10 +185,14 @@ public:
|
|
|
c158fab |
QList<QString> getColorThemes();
|
|
|
c158fab |
|
|
|
c158fab |
/* Assembly related methods */
|
|
|
c158fab |
- QString assemble(const QString &code);
|
|
|
c158fab |
- QString disassemble(const QString &hex;;
|
|
|
c158fab |
+ QByteArray assemble(const QString &code);
|
|
|
c158fab |
+ QString disassemble(const QByteArray &data);
|
|
|
c158fab |
QString disassembleSingleInstruction(RVA addr);
|
|
|
c158fab |
QList<DisassemblyLine> disassembleLines(RVA offset, int lines);
|
|
|
c158fab |
+
|
|
|
c158fab |
+ static QByteArray hexStringToBytes(const QString &hex;;
|
|
|
c158fab |
+ static QString bytesToHexString(const QByteArray &bytes);
|
|
|
c158fab |
+
|
|
|
c158fab |
void setCPU(QString arch, QString cpu, int bits);
|
|
|
c158fab |
void setEndianness(bool big);
|
|
|
c158fab |
void setBBSize(int size);
|
|
|
c158fab |
diff --git a/src/dialogs/EditInstructionDialog.cpp b/src/dialogs/EditInstructionDialog.cpp
|
|
|
c158fab |
index 2dfe8be..5993696 100644
|
|
|
c158fab |
--- a/src/dialogs/EditInstructionDialog.cpp
|
|
|
c158fab |
+++ b/src/dialogs/EditInstructionDialog.cpp
|
|
|
c158fab |
@@ -45,9 +45,11 @@ void EditInstructionDialog::updatePreview(const QString &input)
|
|
|
c158fab |
ui->instructionLabel->setText("");
|
|
|
c158fab |
return;
|
|
|
c158fab |
} else if (editMode == EDIT_BYTES) {
|
|
|
c158fab |
- result = Core()->disassemble(input).trimmed();
|
|
|
c158fab |
+ QByteArray data = CutterCore::hexStringToBytes(input);
|
|
|
c158fab |
+ result = Core()->disassemble(data).trimmed();
|
|
|
c158fab |
} else if (editMode == EDIT_TEXT) {
|
|
|
c158fab |
- result = Core()->assemble(input).trimmed();
|
|
|
c158fab |
+ QByteArray data = Core()->assemble(input);
|
|
|
c158fab |
+ result = CutterCore::bytesToHexString(data).trimmed();
|
|
|
c158fab |
}
|
|
|
c158fab |
|
|
|
c158fab |
if (result.isEmpty() || result.contains("\n")) {
|
|
|
c158fab |
--
|
|
|
c158fab |
2.21.0
|
|
|
c158fab |
|