From 0062ff424eb36228370289df1f89ced2a277f672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alvaro=20Mun=CC=83oz?= Date: Fri, 28 Apr 2017 18:19:00 +0200 Subject: [PATCH] Fox missing args and vars in graph view and theme switch --- src/html/graph/index.html | 12 +++--- src/html/graph/lib/js/disasm.js | 72 ++++++++++++++++++++++----------- src/widgets/memorywidget.cpp | 9 ++++- 3 files changed, 62 insertions(+), 31 deletions(-) diff --git a/src/html/graph/index.html b/src/html/graph/index.html index 45a4518f..e7b70bc8 100644 --- a/src/html/graph/index.html +++ b/src/html/graph/index.html @@ -20,16 +20,18 @@ diff --git a/src/html/graph/lib/js/disasm.js b/src/html/graph/lib/js/disasm.js index 5f023714..7faaf001 100644 --- a/src/html/graph/lib/js/disasm.js +++ b/src/html/graph/lib/js/disasm.js @@ -580,12 +580,16 @@ function html_for_instruction(ins) { r2.cmd(cmd, function(x){ results = x.split("\n"); }); - try { - var info = JSON.parse(results[0]); - if (info !== null && info !== undefined && info.length > 0) - idump += '
(fcn) ' + info[0].name + '
'; - } catch (err) { - console.log("Error getting instruction information from afij command: " + err); + for (var i in results) { + if (results[i] !== "") { + try { + var info = JSON.parse(results[i]); + if (info !== null && info !== undefined && info.length > 0) + idump += '
(fcn) ' + info[0].name + '
'; + } catch (err) { + console.log("Error getting instruction information from afij command: " + err); + } + } } // Get function variables @@ -594,16 +598,21 @@ function html_for_instruction(ins) { r2.cmd(cmd, function(x){ vars_reg_based = x.split("\n"); }); - try { - var vars = JSON.parse(vars_reg_based[0]); - var fvars = []; - for (var i in vars) { - idump += '
; ' + vars[i].kind + " " + vars[i].type + " " + escapeHTML(vars[i].name) + " @ " + vars[i].ref + '
'; - fvars[fvars.length] = {name: vars[i].name, id: address_canonicalize(offset) + "_" + vars[i].ref}; + for (var i in vars_reg_based) { + if (vars_reg_based[i] !== "") { + try { + var vars = JSON.parse(vars_reg_based[i]); + var fvars = []; + for (var i in vars) { + var loc = vars[i].ref.base + (vars[i].ref.offset > 0? "+":"-") + "0x" + trimChar(vars[i].ref.offset.toString(16), '-'); + idump += '
; ' + vars[i].kind + " " + vars[i].type + " " + escapeHTML(vars[i].name) + " @ " + loc + '
'; + fvars[fvars.length] = {name: vars[i].name, id: address_canonicalize(offset) + "_" + loc}; + } + r2.varMap[ins.fcn_addr] = fvars; + } catch (err) { + console.log("Error getting variable information from afvj command: " + err); + } } - r2.varMap[ins.fcn_addr] = fvars; - } catch (err) { - console.log("Error getting variable information from afvj command"); } // Get function arguments @@ -619,16 +628,21 @@ function html_for_instruction(ins) { args_sp_based = x.split("\n"); }); args_merged = args_bp_based.concat(args_sp_based); - try { - var args = JSON.parse(args_merged[0]); - var fargs = []; - for (var i in args) { - idump += '
; ' + args[i].kind + " " + args[i].type + " " + escapeHTML(args[i].name) + " @ " + args[i].ref + '
'; - fargs[fargs.length] = {name: args[i].name, id: address_canonicalize(offset) + "_" + args[i].ref}; + for (var i in args_merged) { + if (args_merged[i] !== "") { + try { + var args = JSON.parse(args_merged[i]); + var fargs = []; + for (var i in args) { + var loc = args[i].ref.base + (args[i].ref.offset > 0? "+":"-") + "0x" + trimChar(args[i].ref.offset.toString(16), '-'); + idump += '
; ' + args[i].kind + " " + args[i].type + " " + escapeHTML(args[i].name) + " @ " + loc + '
'; + fargs[fargs.length] = {name: args[i].name, id: address_canonicalize(offset) + "_" + loc}; + } + r2.argMap[ins.fcn_addr] = fargs; + } catch (err) { + console.log("Error getting argument information from afaj command: " + err); + } } - r2.argMap[ins.fcn_addr] = fargs; - } catch (err) { - console.log("Error getting argument information from afaj command"); } } if (asm_flags) { @@ -995,5 +1009,15 @@ function get_reloc_flag(reloc) { return full_name; } +function trimChar(string, charToRemove) { + while(string.charAt(0)==charToRemove) { + string = string.substring(1); + } + while(string.charAt(string.length-1)==charToRemove) { + string = string.substring(0,string.length-1); + } + + return string; +} diff --git a/src/widgets/memorywidget.cpp b/src/widgets/memorywidget.cpp index f19878d4..fbd7d00d 100644 --- a/src/widgets/memorywidget.cpp +++ b/src/widgets/memorywidget.cpp @@ -1558,7 +1558,13 @@ void MemoryWidget::create_graph(QString off) ui->graphWebView->setUrl(QUrl("qrc:/graph/html/graph/index.html#" + off)); QString port = this->main->core->config("http.port"); ui->graphWebView->page()->runJavaScript(QString("r2.root=\"http://localhost:%1\"").arg(port)); - ui->graphWebView->page()->runJavaScript(QString("init();")); + QSettings settings; + if (settings.value("dark").toBool()) + { + ui->graphWebView->page()->runJavaScript(QString("init('dark');")); + } else { + ui->graphWebView->page()->runJavaScript(QString("init('light');")); + } } QString MemoryWidget::normalize_addr(QString addr) @@ -1931,7 +1937,6 @@ void MemoryWidget::switchTheme(bool dark) ui->webSimpleGraph->page()->setBackgroundColor(QColor(255, 255, 255)); ui->graphWebView->page()->runJavaScript("r2ui.graph_panel.render('light');"); } - //ui->graphWebView->reload(); } void MemoryWidget::on_opcodeDescButton_clicked()