mirror of
https://github.com/rizinorg/cutter.git
synced 2024-12-20 20:06:12 +00:00
JSON parsing optimization: use static QLatin1String as keys (#947)
This commit is contained in:
parent
5dd15f821c
commit
30e6498a2c
388
src/Cutter.cpp
388
src/Cutter.cpp
@ -13,6 +13,88 @@
|
|||||||
|
|
||||||
Q_GLOBAL_STATIC(ccClass, uniqueInstance)
|
Q_GLOBAL_STATIC(ccClass, uniqueInstance)
|
||||||
|
|
||||||
|
#define R_JSON_KEY(name) static const QLatin1String name = QLatin1Literal(#name)
|
||||||
|
|
||||||
|
namespace RJsonKey {
|
||||||
|
R_JSON_KEY(addr);
|
||||||
|
R_JSON_KEY(addr_end);
|
||||||
|
R_JSON_KEY(baddr);
|
||||||
|
R_JSON_KEY(bind);
|
||||||
|
R_JSON_KEY(blocks);
|
||||||
|
R_JSON_KEY(blocksize);
|
||||||
|
R_JSON_KEY(bytes);
|
||||||
|
R_JSON_KEY(calltype);
|
||||||
|
R_JSON_KEY(cc);
|
||||||
|
R_JSON_KEY(classname);
|
||||||
|
R_JSON_KEY(code);
|
||||||
|
R_JSON_KEY(comment);
|
||||||
|
R_JSON_KEY(comments);
|
||||||
|
R_JSON_KEY(cost);
|
||||||
|
R_JSON_KEY(data);
|
||||||
|
R_JSON_KEY(description);
|
||||||
|
R_JSON_KEY(ebbs);
|
||||||
|
R_JSON_KEY(edges);
|
||||||
|
R_JSON_KEY(enabled);
|
||||||
|
R_JSON_KEY(entropy);
|
||||||
|
R_JSON_KEY(fcn_addr);
|
||||||
|
R_JSON_KEY(fcn_name);
|
||||||
|
R_JSON_KEY(fields);
|
||||||
|
R_JSON_KEY(file);
|
||||||
|
R_JSON_KEY(flags);
|
||||||
|
R_JSON_KEY(flagname);
|
||||||
|
R_JSON_KEY(format);
|
||||||
|
R_JSON_KEY(from);
|
||||||
|
R_JSON_KEY(functions);
|
||||||
|
R_JSON_KEY(graph);
|
||||||
|
R_JSON_KEY(haddr);
|
||||||
|
R_JSON_KEY(hw);
|
||||||
|
R_JSON_KEY(in_functions);
|
||||||
|
R_JSON_KEY(index);
|
||||||
|
R_JSON_KEY(laddr);
|
||||||
|
R_JSON_KEY(lang);
|
||||||
|
R_JSON_KEY(len);
|
||||||
|
R_JSON_KEY(length);
|
||||||
|
R_JSON_KEY(license);
|
||||||
|
R_JSON_KEY(methods);
|
||||||
|
R_JSON_KEY(name);
|
||||||
|
R_JSON_KEY(nargs);
|
||||||
|
R_JSON_KEY(nbbs);
|
||||||
|
R_JSON_KEY(nlocals);
|
||||||
|
R_JSON_KEY(offset);
|
||||||
|
R_JSON_KEY(opcode);
|
||||||
|
R_JSON_KEY(opcodes);
|
||||||
|
R_JSON_KEY(ordinal);
|
||||||
|
R_JSON_KEY(outdegree);
|
||||||
|
R_JSON_KEY(paddr);
|
||||||
|
R_JSON_KEY(path);
|
||||||
|
R_JSON_KEY(perm);
|
||||||
|
R_JSON_KEY(pid);
|
||||||
|
R_JSON_KEY(plt);
|
||||||
|
R_JSON_KEY(prot);
|
||||||
|
R_JSON_KEY(ref);
|
||||||
|
R_JSON_KEY(refs);
|
||||||
|
R_JSON_KEY(reg);
|
||||||
|
R_JSON_KEY(rwx);
|
||||||
|
R_JSON_KEY(section);
|
||||||
|
R_JSON_KEY(sections);
|
||||||
|
R_JSON_KEY(size);
|
||||||
|
R_JSON_KEY(stackframe);
|
||||||
|
R_JSON_KEY(status);
|
||||||
|
R_JSON_KEY(string);
|
||||||
|
R_JSON_KEY(strings);
|
||||||
|
R_JSON_KEY(symbols);
|
||||||
|
R_JSON_KEY(text);
|
||||||
|
R_JSON_KEY(to);
|
||||||
|
R_JSON_KEY(trace);
|
||||||
|
R_JSON_KEY(type);
|
||||||
|
R_JSON_KEY(uid);
|
||||||
|
R_JSON_KEY(vaddr);
|
||||||
|
R_JSON_KEY(value);
|
||||||
|
R_JSON_KEY(vsize);
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef R_JSON_KEY
|
||||||
|
|
||||||
RCoreLocked::RCoreLocked(RCore *core)
|
RCoreLocked::RCoreLocked(RCore *core)
|
||||||
: core(core)
|
: core(core)
|
||||||
{
|
{
|
||||||
@ -355,12 +437,12 @@ void CutterCore::delFlag(const QString &name)
|
|||||||
|
|
||||||
QString CutterCore::getInstructionBytes(RVA addr)
|
QString CutterCore::getInstructionBytes(RVA addr)
|
||||||
{
|
{
|
||||||
return cmdj("aoj @ " + RAddressString(addr)).array().first().toObject()["bytes"].toString();
|
return cmdj("aoj @ " + RAddressString(addr)).array().first().toObject()[RJsonKey::bytes].toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
QString CutterCore::getInstructionOpcode(RVA addr)
|
QString CutterCore::getInstructionOpcode(RVA addr)
|
||||||
{
|
{
|
||||||
return cmdj("aoj @ " + RAddressString(addr)).array().first().toObject()["opcode"].toString();
|
return cmdj("aoj @ " + RAddressString(addr)).array().first().toObject()[RJsonKey::opcode].toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CutterCore::editInstruction(RVA addr, const QString &inst)
|
void CutterCore::editInstruction(RVA addr, const QString &inst)
|
||||||
@ -516,7 +598,7 @@ RVA CutterCore::nextOpAddr(RVA startAddr, int count)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool ok;
|
bool ok;
|
||||||
RVA offset = instValue.toObject()["offset"].toVariant().toULongLong(&ok);
|
RVA offset = instValue.toObject()[RJsonKey::offset].toVariant().toULongLong(&ok);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
return startAddr + 1;
|
return startAddr + 1;
|
||||||
}
|
}
|
||||||
@ -766,9 +848,9 @@ QList<RegisterRefDescription> CutterCore::getRegisterRefs()
|
|||||||
|
|
||||||
RegisterRefDescription regRef;
|
RegisterRefDescription regRef;
|
||||||
|
|
||||||
regRef.reg = regRefObject["reg"].toString();
|
regRef.reg = regRefObject[RJsonKey::reg].toString();
|
||||||
regRef.value = regRefObject["value"].toString();
|
regRef.value = regRefObject[RJsonKey::value].toString();
|
||||||
regRef.ref = regRefObject["ref"].toString();
|
regRef.ref = regRefObject[RJsonKey::ref].toString();
|
||||||
|
|
||||||
ret << regRef;
|
ret << regRef;
|
||||||
}
|
}
|
||||||
@ -784,9 +866,9 @@ QJsonObject CutterCore::getRegisterJson()
|
|||||||
QJsonObject regRefObject = value.toObject();
|
QJsonObject regRefObject = value.toObject();
|
||||||
|
|
||||||
QJsonObject registers;
|
QJsonObject registers;
|
||||||
registers.insert("value", regRefObject["value"]);
|
registers.insert(RJsonKey::value, regRefObject[RJsonKey::value]);
|
||||||
registers.insert("ref", regRefObject["ref"]);
|
registers.insert(RJsonKey::ref, regRefObject[RJsonKey::ref]);
|
||||||
registerJson.insert(regRefObject["reg"].toString(), registers);
|
registerJson.insert(regRefObject[RJsonKey::reg].toString(), registers);
|
||||||
}
|
}
|
||||||
return registerJson;
|
return registerJson;
|
||||||
}
|
}
|
||||||
@ -987,7 +1069,7 @@ QStringList CutterCore::getDebugPlugins()
|
|||||||
|
|
||||||
for (QJsonValue value : pluginArray) {
|
for (QJsonValue value : pluginArray) {
|
||||||
QJsonObject pluginObject = value.toObject();
|
QJsonObject pluginObject = value.toObject();
|
||||||
QString plugin = pluginObject["name"].toString();
|
QString plugin = pluginObject[RJsonKey::name].toString();
|
||||||
plugins << plugin;
|
plugins << plugin;
|
||||||
}
|
}
|
||||||
return plugins;
|
return plugins;
|
||||||
@ -1054,12 +1136,12 @@ QList<BreakpointDescription> CutterCore::getBreakpoints()
|
|||||||
|
|
||||||
BreakpointDescription bp;
|
BreakpointDescription bp;
|
||||||
|
|
||||||
bp.addr = bpObject["addr"].toVariant().toULongLong();
|
bp.addr = bpObject[RJsonKey::addr].toVariant().toULongLong();
|
||||||
bp.size = bpObject["size"].toVariant().toInt();
|
bp.size = bpObject[RJsonKey::size].toVariant().toInt();
|
||||||
bp.permission = bpObject["prot"].toString();
|
bp.permission = bpObject[RJsonKey::prot].toString();
|
||||||
bp.hw = bpObject["hw"].toBool();
|
bp.hw = bpObject[RJsonKey::hw].toBool();
|
||||||
bp.trace = bpObject["trace"].toBool();
|
bp.trace = bpObject[RJsonKey::trace].toBool();
|
||||||
bp.enabled = bpObject["enabled"].toBool();
|
bp.enabled = bpObject[RJsonKey::enabled].toBool();
|
||||||
|
|
||||||
ret << bp;
|
ret << bp;
|
||||||
}
|
}
|
||||||
@ -1100,10 +1182,10 @@ QList<ProcessDescription> CutterCore::getAllProcesses()
|
|||||||
|
|
||||||
ProcessDescription proc;
|
ProcessDescription proc;
|
||||||
|
|
||||||
proc.pid = procObject["pid"].toVariant().toInt();
|
proc.pid = procObject[RJsonKey::pid].toVariant().toInt();
|
||||||
proc.uid = procObject["uid"].toVariant().toInt();
|
proc.uid = procObject[RJsonKey::uid].toVariant().toInt();
|
||||||
proc.status = procObject["status"].toString();
|
proc.status = procObject[RJsonKey::status].toString();
|
||||||
proc.path = procObject["path"].toString();
|
proc.path = procObject[RJsonKey::path].toString();
|
||||||
|
|
||||||
ret << proc;
|
ret << proc;
|
||||||
}
|
}
|
||||||
@ -1121,12 +1203,12 @@ QList<MemoryMapDescription> CutterCore::getMemoryMap()
|
|||||||
|
|
||||||
MemoryMapDescription memMap;
|
MemoryMapDescription memMap;
|
||||||
|
|
||||||
memMap.name = memMapObject["name"].toString();
|
memMap.name = memMapObject[RJsonKey::name].toString();
|
||||||
memMap.fileName = memMapObject["file"].toString();
|
memMap.fileName = memMapObject[RJsonKey::file].toString();
|
||||||
memMap.addrStart = memMapObject["addr"].toVariant().toULongLong();
|
memMap.addrStart = memMapObject[RJsonKey::addr].toVariant().toULongLong();
|
||||||
memMap.addrEnd = memMapObject["addr_end"].toVariant().toULongLong();
|
memMap.addrEnd = memMapObject[RJsonKey::addr_end].toVariant().toULongLong();
|
||||||
memMap.type = memMapObject["type"].toString();
|
memMap.type = memMapObject[RJsonKey::type].toString();
|
||||||
memMap.permission = memMapObject["perm"].toString();
|
memMap.permission = memMapObject[RJsonKey::perm].toString();
|
||||||
|
|
||||||
ret << memMap;
|
ret << memMap;
|
||||||
}
|
}
|
||||||
@ -1267,9 +1349,9 @@ QList<RBinPluginDescription> CutterCore::getRBinPluginDescriptions(const QString
|
|||||||
for (const auto &pluginValue : pluginArray) {
|
for (const auto &pluginValue : pluginArray) {
|
||||||
QJsonObject pluginObject = pluginValue.toObject();
|
QJsonObject pluginObject = pluginValue.toObject();
|
||||||
RBinPluginDescription desc;
|
RBinPluginDescription desc;
|
||||||
desc.name = pluginObject["name"].toString();
|
desc.name = pluginObject[RJsonKey::name].toString();
|
||||||
desc.description = pluginObject["description"].toString();
|
desc.description = pluginObject[RJsonKey::description].toString();
|
||||||
desc.license = pluginObject["license"].toString();
|
desc.license = pluginObject[RJsonKey::license].toString();
|
||||||
desc.type = key;
|
desc.type = key;
|
||||||
ret.append(desc);
|
ret.append(desc);
|
||||||
}
|
}
|
||||||
@ -1357,11 +1439,11 @@ QList<ImportDescription> CutterCore::getAllImports()
|
|||||||
|
|
||||||
ImportDescription import;
|
ImportDescription import;
|
||||||
|
|
||||||
import.plt = importObject["plt"].toVariant().toULongLong();
|
import.plt = importObject[RJsonKey::plt].toVariant().toULongLong();
|
||||||
import.ordinal = importObject["ordinal"].toInt();
|
import.ordinal = importObject[RJsonKey::ordinal].toInt();
|
||||||
import.bind = importObject["bind"].toString();
|
import.bind = importObject[RJsonKey::bind].toString();
|
||||||
import.type = importObject["type"].toString();
|
import.type = importObject[RJsonKey::type].toString();
|
||||||
import.name = importObject["name"].toString();
|
import.name = importObject[RJsonKey::name].toString();
|
||||||
|
|
||||||
ret << import;
|
ret << import;
|
||||||
}
|
}
|
||||||
@ -1381,12 +1463,12 @@ QList<ExportDescription> CutterCore::getAllExports()
|
|||||||
|
|
||||||
ExportDescription exp;
|
ExportDescription exp;
|
||||||
|
|
||||||
exp.vaddr = importObject["vaddr"].toVariant().toULongLong();
|
exp.vaddr = importObject[RJsonKey::vaddr].toVariant().toULongLong();
|
||||||
exp.paddr = importObject["paddr"].toVariant().toULongLong();
|
exp.paddr = importObject[RJsonKey::paddr].toVariant().toULongLong();
|
||||||
exp.size = importObject["size"].toVariant().toULongLong();
|
exp.size = importObject[RJsonKey::size].toVariant().toULongLong();
|
||||||
exp.type = importObject["type"].toString();
|
exp.type = importObject[RJsonKey::type].toString();
|
||||||
exp.name = importObject["name"].toString();
|
exp.name = importObject[RJsonKey::name].toString();
|
||||||
exp.flag_name = importObject["flagname"].toString();
|
exp.flag_name = importObject[RJsonKey::flagname].toString();
|
||||||
|
|
||||||
ret << exp;
|
ret << exp;
|
||||||
}
|
}
|
||||||
@ -1441,10 +1523,10 @@ QList<HeaderDescription> CutterCore::getAllHeaders()
|
|||||||
|
|
||||||
HeaderDescription header;
|
HeaderDescription header;
|
||||||
|
|
||||||
header.vaddr = headerObject["vaddr"].toVariant().toULongLong();
|
header.vaddr = headerObject[RJsonKey::vaddr].toVariant().toULongLong();
|
||||||
header.paddr = headerObject["paddr"].toVariant().toULongLong();
|
header.paddr = headerObject[RJsonKey::paddr].toVariant().toULongLong();
|
||||||
header.value = headerObject["comment"].toString();
|
header.value = headerObject[RJsonKey::comment].toString();
|
||||||
header.name = headerObject["name"].toString();
|
header.name = headerObject[RJsonKey::name].toString();
|
||||||
|
|
||||||
ret << header;
|
ret << header;
|
||||||
}
|
}
|
||||||
@ -1464,18 +1546,18 @@ QList<ZignatureDescription> CutterCore::getAllZignatures()
|
|||||||
|
|
||||||
ZignatureDescription zignature;
|
ZignatureDescription zignature;
|
||||||
|
|
||||||
zignature.name = zignatureObject["name"].toString();
|
zignature.name = zignatureObject[RJsonKey::name].toString();
|
||||||
zignature.bytes = zignatureObject["bytes"].toString();
|
zignature.bytes = zignatureObject[RJsonKey::bytes].toString();
|
||||||
zignature.offset = zignatureObject["offset"].toVariant().toULongLong();
|
zignature.offset = zignatureObject[RJsonKey::offset].toVariant().toULongLong();
|
||||||
for (QJsonValue ref : zignatureObject["refs"].toArray()) {
|
for (QJsonValue ref : zignatureObject[RJsonKey::refs].toArray()) {
|
||||||
zignature.refs << ref.toString();
|
zignature.refs << ref.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
QJsonObject graphObject = zignatureObject["graph"].toObject();
|
QJsonObject graphObject = zignatureObject[RJsonKey::graph].toObject();
|
||||||
zignature.cc = graphObject["cc"].toVariant().toULongLong();
|
zignature.cc = graphObject[RJsonKey::cc].toVariant().toULongLong();
|
||||||
zignature.nbbs = graphObject["nbbs"].toVariant().toULongLong();
|
zignature.nbbs = graphObject[RJsonKey::nbbs].toVariant().toULongLong();
|
||||||
zignature.edges = graphObject["edges"].toVariant().toULongLong();
|
zignature.edges = graphObject[RJsonKey::edges].toVariant().toULongLong();
|
||||||
zignature.ebbs = graphObject["ebbs"].toVariant().toULongLong();
|
zignature.ebbs = graphObject[RJsonKey::ebbs].toVariant().toULongLong();
|
||||||
|
|
||||||
ret << zignature;
|
ret << zignature;
|
||||||
}
|
}
|
||||||
@ -1492,13 +1574,13 @@ QList<CommentDescription> CutterCore::getAllComments(const QString &filterType)
|
|||||||
for (QJsonValue value : commentsArray) {
|
for (QJsonValue value : commentsArray) {
|
||||||
QJsonObject commentObject = value.toObject();
|
QJsonObject commentObject = value.toObject();
|
||||||
|
|
||||||
QString type = commentObject["type"].toString();
|
QString type = commentObject[RJsonKey::type].toString();
|
||||||
if (type != filterType)
|
if (type != filterType)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
CommentDescription comment;
|
CommentDescription comment;
|
||||||
comment.offset = commentObject["offset"].toVariant().toULongLong();
|
comment.offset = commentObject[RJsonKey::offset].toVariant().toULongLong();
|
||||||
comment.name = commentObject["name"].toString();
|
comment.name = commentObject[RJsonKey::name].toString();
|
||||||
|
|
||||||
ret << comment;
|
ret << comment;
|
||||||
}
|
}
|
||||||
@ -1546,12 +1628,12 @@ QList<StringDescription> CutterCore::parseStringsJson(const QJsonDocument &doc)
|
|||||||
QJsonObject stringObject = value.toObject();
|
QJsonObject stringObject = value.toObject();
|
||||||
|
|
||||||
StringDescription string;
|
StringDescription string;
|
||||||
string.string = QString(QByteArray::fromBase64(stringObject["string"].toVariant().toByteArray()));
|
string.string = QString(QByteArray::fromBase64(stringObject[RJsonKey::string].toVariant().toByteArray()));
|
||||||
string.vaddr = stringObject["vaddr"].toVariant().toULongLong();
|
string.vaddr = stringObject[RJsonKey::vaddr].toVariant().toULongLong();
|
||||||
string.type = stringObject["type"].toString();
|
string.type = stringObject[RJsonKey::type].toString();
|
||||||
string.size = stringObject["size"].toVariant().toUInt();
|
string.size = stringObject[RJsonKey::size].toVariant().toUInt();
|
||||||
string.length = stringObject["length"].toVariant().toUInt();
|
string.length = stringObject[RJsonKey::length].toVariant().toUInt();
|
||||||
string.section = stringObject["section"].toString();
|
string.section = stringObject[RJsonKey::section].toString();
|
||||||
|
|
||||||
ret << string;
|
ret << string;
|
||||||
}
|
}
|
||||||
@ -1569,18 +1651,18 @@ QList<FunctionDescription> CutterCore::parseFunctionsJson(const QJsonDocument &d
|
|||||||
|
|
||||||
FunctionDescription function;
|
FunctionDescription function;
|
||||||
|
|
||||||
function.offset = (RVA)jsonObject["offset"].toVariant().toULongLong();
|
function.offset = (RVA)jsonObject[RJsonKey::offset].toVariant().toULongLong();
|
||||||
function.size = (RVA)jsonObject["size"].toVariant().toULongLong();
|
function.size = (RVA)jsonObject[RJsonKey::size].toVariant().toULongLong();
|
||||||
function.nargs = (RVA)jsonObject["nargs"].toVariant().toULongLong();
|
function.nargs = (RVA)jsonObject[RJsonKey::nargs].toVariant().toULongLong();
|
||||||
function.nbbs = (RVA)jsonObject["nbbs"].toVariant().toULongLong();
|
function.nbbs = (RVA)jsonObject[RJsonKey::nbbs].toVariant().toULongLong();
|
||||||
function.nlocals = (RVA)jsonObject["nlocals"].toVariant().toULongLong();
|
function.nlocals = (RVA)jsonObject[RJsonKey::nlocals].toVariant().toULongLong();
|
||||||
function.cc = (RVA)jsonObject["cc"].toVariant().toULongLong();
|
function.cc = (RVA)jsonObject[RJsonKey::cc].toVariant().toULongLong();
|
||||||
function.calltype = jsonObject["calltype"].toString();
|
function.calltype = jsonObject[RJsonKey::calltype].toString();
|
||||||
function.name = jsonObject["name"].toString();
|
function.name = jsonObject[RJsonKey::name].toString();
|
||||||
function.edges = (RVA)jsonObject["edges"].toVariant().toULongLong();
|
function.edges = (RVA)jsonObject[RJsonKey::edges].toVariant().toULongLong();
|
||||||
function.cost = (RVA)jsonObject["cost"].toVariant().toULongLong();
|
function.cost = (RVA)jsonObject[RJsonKey::cost].toVariant().toULongLong();
|
||||||
function.calls = (RVA)jsonObject["outdegree"].toVariant().toULongLong();
|
function.calls = (RVA)jsonObject[RJsonKey::outdegree].toVariant().toULongLong();
|
||||||
function.stackframe = (RVA)jsonObject["stackframe"].toVariant().toULongLong();
|
function.stackframe = (RVA)jsonObject[RJsonKey::stackframe].toVariant().toULongLong();
|
||||||
|
|
||||||
ret << function;
|
ret << function;
|
||||||
}
|
}
|
||||||
@ -1598,7 +1680,7 @@ QList<FlagspaceDescription> CutterCore::getAllFlagspaces()
|
|||||||
QJsonObject flagspaceObject = value.toObject();
|
QJsonObject flagspaceObject = value.toObject();
|
||||||
|
|
||||||
FlagspaceDescription flagspace;
|
FlagspaceDescription flagspace;
|
||||||
flagspace.name = flagspaceObject["name"].toString();
|
flagspace.name = flagspaceObject[RJsonKey::name].toString();
|
||||||
|
|
||||||
ret << flagspace;
|
ret << flagspace;
|
||||||
}
|
}
|
||||||
@ -1620,9 +1702,9 @@ QList<FlagDescription> CutterCore::getAllFlags(QString flagspace)
|
|||||||
QJsonObject flagObject = value.toObject();
|
QJsonObject flagObject = value.toObject();
|
||||||
|
|
||||||
FlagDescription flag;
|
FlagDescription flag;
|
||||||
flag.offset = flagObject["offset"].toVariant().toULongLong();
|
flag.offset = flagObject[RJsonKey::offset].toVariant().toULongLong();
|
||||||
flag.size = flagObject["size"].toVariant().toULongLong();
|
flag.size = flagObject[RJsonKey::size].toVariant().toULongLong();
|
||||||
flag.name = flagObject["name"].toString();
|
flag.name = flagObject[RJsonKey::name].toString();
|
||||||
|
|
||||||
ret << flag;
|
ret << flag;
|
||||||
}
|
}
|
||||||
@ -1636,23 +1718,23 @@ QList<SectionDescription> CutterCore::getAllSections()
|
|||||||
|
|
||||||
QJsonDocument sectionsDoc = cmdj("iSj entropy");
|
QJsonDocument sectionsDoc = cmdj("iSj entropy");
|
||||||
QJsonObject sectionsObj = sectionsDoc.object();
|
QJsonObject sectionsObj = sectionsDoc.object();
|
||||||
QJsonArray sectionsArray = sectionsObj["sections"].toArray();
|
QJsonArray sectionsArray = sectionsObj[RJsonKey::sections].toArray();
|
||||||
|
|
||||||
for (QJsonValue value : sectionsArray) {
|
for (QJsonValue value : sectionsArray) {
|
||||||
QJsonObject sectionObject = value.toObject();
|
QJsonObject sectionObject = value.toObject();
|
||||||
|
|
||||||
QString name = sectionObject["name"].toString();
|
QString name = sectionObject[RJsonKey::name].toString();
|
||||||
if (name.isEmpty())
|
if (name.isEmpty())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
SectionDescription section;
|
SectionDescription section;
|
||||||
section.name = name;
|
section.name = name;
|
||||||
section.vaddr = sectionObject["vaddr"].toVariant().toULongLong();
|
section.vaddr = sectionObject[RJsonKey::vaddr].toVariant().toULongLong();
|
||||||
section.vsize = sectionObject["vsize"].toVariant().toULongLong();
|
section.vsize = sectionObject[RJsonKey::vsize].toVariant().toULongLong();
|
||||||
section.paddr = sectionObject["paddr"].toVariant().toULongLong();
|
section.paddr = sectionObject[RJsonKey::paddr].toVariant().toULongLong();
|
||||||
section.size = sectionObject["size"].toVariant().toULongLong();
|
section.size = sectionObject[RJsonKey::size].toVariant().toULongLong();
|
||||||
section.flags = sectionObject["flags"].toString();
|
section.flags = sectionObject[RJsonKey::flags].toString();
|
||||||
section.entropy = sectionObject["entropy"].toString();
|
section.entropy = sectionObject[RJsonKey::entropy].toString();
|
||||||
|
|
||||||
ret << section;
|
ret << section;
|
||||||
}
|
}
|
||||||
@ -1666,7 +1748,7 @@ QStringList CutterCore::getSectionList()
|
|||||||
|
|
||||||
QJsonArray sectionsArray = cmdj("iSj").array();
|
QJsonArray sectionsArray = cmdj("iSj").array();
|
||||||
for (QJsonValue value : sectionsArray) {
|
for (QJsonValue value : sectionsArray) {
|
||||||
ret << value.toObject()["name"].toString();
|
ret << value.toObject()[RJsonKey::name].toString();
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -1681,17 +1763,17 @@ QList<SegmentDescription> CutterCore::getAllSegments()
|
|||||||
for (QJsonValue value : segments) {
|
for (QJsonValue value : segments) {
|
||||||
QJsonObject segmentObject = value.toObject();
|
QJsonObject segmentObject = value.toObject();
|
||||||
|
|
||||||
QString name = segmentObject["name"].toString();
|
QString name = segmentObject[RJsonKey::name].toString();
|
||||||
if (name.isEmpty())
|
if (name.isEmpty())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
SegmentDescription segment;
|
SegmentDescription segment;
|
||||||
segment.name = name;
|
segment.name = name;
|
||||||
segment.vaddr = segmentObject["vaddr"].toVariant().toULongLong();
|
segment.vaddr = segmentObject[RJsonKey::vaddr].toVariant().toULongLong();
|
||||||
segment.paddr = segmentObject["paddr"].toVariant().toULongLong();
|
segment.paddr = segmentObject[RJsonKey::paddr].toVariant().toULongLong();
|
||||||
segment.size = segmentObject["size"].toVariant().toULongLong();
|
segment.size = segmentObject[RJsonKey::size].toVariant().toULongLong();
|
||||||
segment.vsize = segmentObject["vsize"].toVariant().toULongLong();
|
segment.vsize = segmentObject[RJsonKey::vsize].toVariant().toULongLong();
|
||||||
segment.perm = segmentObject["perm"].toString();
|
segment.perm = segmentObject[RJsonKey::perm].toString();
|
||||||
|
|
||||||
ret << segment;
|
ret << segment;
|
||||||
}
|
}
|
||||||
@ -1708,12 +1790,12 @@ QList<EntrypointDescription> CutterCore::getAllEntrypoint()
|
|||||||
QJsonObject entrypointObject = value.toObject();
|
QJsonObject entrypointObject = value.toObject();
|
||||||
|
|
||||||
EntrypointDescription entrypoint;
|
EntrypointDescription entrypoint;
|
||||||
entrypoint.vaddr = entrypointObject["vaddr"].toVariant().toULongLong();
|
entrypoint.vaddr = entrypointObject[RJsonKey::vaddr].toVariant().toULongLong();
|
||||||
entrypoint.paddr = entrypointObject["paddr"].toVariant().toULongLong();
|
entrypoint.paddr = entrypointObject[RJsonKey::paddr].toVariant().toULongLong();
|
||||||
entrypoint.baddr = entrypointObject["baddr"].toVariant().toULongLong();
|
entrypoint.baddr = entrypointObject[RJsonKey::baddr].toVariant().toULongLong();
|
||||||
entrypoint.laddr = entrypointObject["laddr"].toVariant().toULongLong();
|
entrypoint.laddr = entrypointObject[RJsonKey::laddr].toVariant().toULongLong();
|
||||||
entrypoint.haddr = entrypointObject["haddr"].toVariant().toULongLong();
|
entrypoint.haddr = entrypointObject[RJsonKey::haddr].toVariant().toULongLong();
|
||||||
entrypoint.type = entrypointObject["type"].toString();
|
entrypoint.type = entrypointObject[RJsonKey::type].toString();
|
||||||
|
|
||||||
ret << entrypoint;
|
ret << entrypoint;
|
||||||
}
|
}
|
||||||
@ -1730,25 +1812,25 @@ QList<ClassDescription> CutterCore::getAllClassesFromBin()
|
|||||||
QJsonObject classObject = value.toObject();
|
QJsonObject classObject = value.toObject();
|
||||||
|
|
||||||
ClassDescription cls;
|
ClassDescription cls;
|
||||||
cls.name = classObject["classname"].toString();
|
cls.name = classObject[RJsonKey::classname].toString();
|
||||||
cls.addr = classObject["addr"].toVariant().toULongLong();
|
cls.addr = classObject[RJsonKey::addr].toVariant().toULongLong();
|
||||||
cls.index = classObject["index"].toVariant().toULongLong();
|
cls.index = classObject[RJsonKey::index].toVariant().toULongLong();
|
||||||
|
|
||||||
for (QJsonValueRef value2 : classObject["methods"].toArray()) {
|
for (QJsonValueRef value2 : classObject[RJsonKey::methods].toArray()) {
|
||||||
QJsonObject methObject = value2.toObject();
|
QJsonObject methObject = value2.toObject();
|
||||||
|
|
||||||
ClassMethodDescription meth;
|
ClassMethodDescription meth;
|
||||||
meth.name = methObject["name"].toString();
|
meth.name = methObject[RJsonKey::name].toString();
|
||||||
meth.addr = methObject["addr"].toVariant().toULongLong();
|
meth.addr = methObject[RJsonKey::addr].toVariant().toULongLong();
|
||||||
cls.methods << meth;
|
cls.methods << meth;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (QJsonValueRef value2 : classObject["fields"].toArray()) {
|
for (QJsonValueRef value2 : classObject[RJsonKey::fields].toArray()) {
|
||||||
QJsonObject fieldObject = value2.toObject();
|
QJsonObject fieldObject = value2.toObject();
|
||||||
|
|
||||||
ClassFieldDescription field;
|
ClassFieldDescription field;
|
||||||
field.name = fieldObject["name"].toString();
|
field.name = fieldObject[RJsonKey::name].toString();
|
||||||
field.addr = fieldObject["addr"].toVariant().toULongLong();
|
field.addr = fieldObject[RJsonKey::addr].toVariant().toULongLong();
|
||||||
cls.fields << field;
|
cls.fields << field;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1771,7 +1853,7 @@ QList<ClassDescription> CutterCore::getAllClassesFromFlags()
|
|||||||
QJsonArray flagsArray = cmdj("fj@F:classes").array();
|
QJsonArray flagsArray = cmdj("fj@F:classes").array();
|
||||||
for (QJsonValueRef value : flagsArray) {
|
for (QJsonValueRef value : flagsArray) {
|
||||||
QJsonObject flagObject = value.toObject();
|
QJsonObject flagObject = value.toObject();
|
||||||
QString flagName = flagObject["name"].toString();
|
QString flagName = flagObject[RJsonKey::name].toString();
|
||||||
|
|
||||||
QRegularExpressionMatch match = classFlagRegExp.match(flagName);
|
QRegularExpressionMatch match = classFlagRegExp.match(flagName);
|
||||||
if (match.hasMatch()) {
|
if (match.hasMatch()) {
|
||||||
@ -1787,7 +1869,7 @@ QList<ClassDescription> CutterCore::getAllClassesFromFlags()
|
|||||||
desc = it.value();
|
desc = it.value();
|
||||||
}
|
}
|
||||||
desc->name = match.captured(1);
|
desc->name = match.captured(1);
|
||||||
desc->addr = flagObject["offset"].toVariant().toULongLong();
|
desc->addr = flagObject[RJsonKey::offset].toVariant().toULongLong();
|
||||||
desc->index = 0;
|
desc->index = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1812,7 +1894,7 @@ QList<ClassDescription> CutterCore::getAllClassesFromFlags()
|
|||||||
|
|
||||||
ClassMethodDescription meth;
|
ClassMethodDescription meth;
|
||||||
meth.name = match.captured(2);
|
meth.name = match.captured(2);
|
||||||
meth.addr = flagObject["offset"].toVariant().toULongLong();
|
meth.addr = flagObject[RJsonKey::offset].toVariant().toULongLong();
|
||||||
classDesc->methods << meth;
|
classDesc->methods << meth;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1830,12 +1912,12 @@ QList<ResourcesDescription> CutterCore::getAllResources()
|
|||||||
QJsonObject resourceObject = value.toObject();
|
QJsonObject resourceObject = value.toObject();
|
||||||
|
|
||||||
ResourcesDescription res;
|
ResourcesDescription res;
|
||||||
res.name = resourceObject["name"].toInt();
|
res.name = resourceObject[RJsonKey::name].toInt();
|
||||||
res.vaddr = resourceObject["vaddr"].toVariant().toULongLong();
|
res.vaddr = resourceObject[RJsonKey::vaddr].toVariant().toULongLong();
|
||||||
res.index = resourceObject["index"].toVariant().toULongLong();
|
res.index = resourceObject[RJsonKey::index].toVariant().toULongLong();
|
||||||
res.type = resourceObject["type"].toString();
|
res.type = resourceObject[RJsonKey::type].toString();
|
||||||
res.size = resourceObject["size"].toVariant().toULongLong();
|
res.size = resourceObject[RJsonKey::size].toVariant().toULongLong();
|
||||||
res.lang = resourceObject["lang"].toString();
|
res.lang = resourceObject[RJsonKey::lang].toString();
|
||||||
|
|
||||||
ret << res;
|
ret << res;
|
||||||
}
|
}
|
||||||
@ -1852,15 +1934,15 @@ QList<VTableDescription> CutterCore::getAllVTables()
|
|||||||
QJsonObject vTableObject = vTableValue.toObject();
|
QJsonObject vTableObject = vTableValue.toObject();
|
||||||
|
|
||||||
VTableDescription res;
|
VTableDescription res;
|
||||||
res.addr = vTableObject["offset"].toVariant().toULongLong();
|
res.addr = vTableObject[RJsonKey::offset].toVariant().toULongLong();
|
||||||
QJsonArray methodArray = vTableObject["methods"].toArray();
|
QJsonArray methodArray = vTableObject[RJsonKey::methods].toArray();
|
||||||
|
|
||||||
for (QJsonValueRef methodValue : methodArray) {
|
for (QJsonValueRef methodValue : methodArray) {
|
||||||
QJsonObject methodObject = methodValue.toObject();
|
QJsonObject methodObject = methodValue.toObject();
|
||||||
|
|
||||||
ClassMethodDescription method;
|
ClassMethodDescription method;
|
||||||
method.addr = methodObject["offset"].toVariant().toULongLong();
|
method.addr = methodObject[RJsonKey::offset].toVariant().toULongLong();
|
||||||
method.name = methodObject["name"].toString();
|
method.name = methodObject[RJsonKey::name].toString();
|
||||||
|
|
||||||
res.methods << method;
|
res.methods << method;
|
||||||
}
|
}
|
||||||
@ -1882,9 +1964,9 @@ QList<TypeDescription> CutterCore::getAllTypes()
|
|||||||
|
|
||||||
TypeDescription exp;
|
TypeDescription exp;
|
||||||
|
|
||||||
exp.type = typeObject["type"].toString();
|
exp.type = typeObject[RJsonKey::type].toString();
|
||||||
exp.size = typeObject["size"].toVariant().toULongLong();
|
exp.size = typeObject[RJsonKey::size].toVariant().toULongLong();
|
||||||
exp.format = typeObject["format"].toString();
|
exp.format = typeObject[RJsonKey::format].toString();
|
||||||
|
|
||||||
ret << exp;
|
ret << exp;
|
||||||
}
|
}
|
||||||
@ -1904,14 +1986,14 @@ QList<SearchDescription> CutterCore::getAllSearch(QString search_for, QString sp
|
|||||||
QJsonObject searchObject = value.toObject();
|
QJsonObject searchObject = value.toObject();
|
||||||
SearchDescription exp;
|
SearchDescription exp;
|
||||||
exp.code = QString("");
|
exp.code = QString("");
|
||||||
for (QJsonValue value2 : searchObject["opcodes"].toArray()) {
|
for (QJsonValue value2 : searchObject[RJsonKey::opcodes].toArray()) {
|
||||||
QJsonObject gadget = value2.toObject();
|
QJsonObject gadget = value2.toObject();
|
||||||
exp.code += gadget["opcode"].toString() + "; ";
|
exp.code += gadget[RJsonKey::opcode].toString() + "; ";
|
||||||
}
|
}
|
||||||
|
|
||||||
exp.offset =
|
exp.offset =
|
||||||
searchObject["opcodes"].toArray().first().toObject()["offset"].toVariant().toULongLong();
|
searchObject[RJsonKey::opcodes].toArray().first().toObject()[RJsonKey::offset].toVariant().toULongLong();
|
||||||
exp.size = searchObject["size"].toVariant().toULongLong();
|
exp.size = searchObject[RJsonKey::size].toVariant().toULongLong();
|
||||||
|
|
||||||
ret << exp;
|
ret << exp;
|
||||||
}
|
}
|
||||||
@ -1920,10 +2002,10 @@ QList<SearchDescription> CutterCore::getAllSearch(QString search_for, QString sp
|
|||||||
QJsonObject searchObject = value.toObject();
|
QJsonObject searchObject = value.toObject();
|
||||||
SearchDescription exp;
|
SearchDescription exp;
|
||||||
|
|
||||||
exp.offset = searchObject["offset"].toVariant().toULongLong();
|
exp.offset = searchObject[RJsonKey::offset].toVariant().toULongLong();
|
||||||
exp.size = searchObject["len"].toVariant().toULongLong();
|
exp.size = searchObject[RJsonKey::len].toVariant().toULongLong();
|
||||||
exp.code = searchObject["code"].toString();
|
exp.code = searchObject[RJsonKey::code].toString();
|
||||||
exp.data = searchObject["data"].toString();
|
exp.data = searchObject[RJsonKey::data].toString();
|
||||||
|
|
||||||
ret << exp;
|
ret << exp;
|
||||||
}
|
}
|
||||||
@ -1941,26 +2023,26 @@ BlockStatistics CutterCore::getBlockStatistics(unsigned int blocksCount)
|
|||||||
QJsonObject statsObj = cmdj("p-j " + QString::number(blocksCount)).object();
|
QJsonObject statsObj = cmdj("p-j " + QString::number(blocksCount)).object();
|
||||||
|
|
||||||
BlockStatistics ret;
|
BlockStatistics ret;
|
||||||
ret.from = statsObj["from"].toVariant().toULongLong();
|
ret.from = statsObj[RJsonKey::from].toVariant().toULongLong();
|
||||||
ret.to = statsObj["to"].toVariant().toULongLong();
|
ret.to = statsObj[RJsonKey::to].toVariant().toULongLong();
|
||||||
ret.blocksize = statsObj["blocksize"].toVariant().toULongLong();
|
ret.blocksize = statsObj[RJsonKey::blocksize].toVariant().toULongLong();
|
||||||
|
|
||||||
QJsonArray blocksArray = statsObj["blocks"].toArray();
|
QJsonArray blocksArray = statsObj[RJsonKey::blocks].toArray();
|
||||||
|
|
||||||
for (const QJsonValue &value : blocksArray) {
|
for (const QJsonValue &value : blocksArray) {
|
||||||
QJsonObject blockObj = value.toObject();
|
QJsonObject blockObj = value.toObject();
|
||||||
BlockDescription block;
|
BlockDescription block;
|
||||||
block.addr = blockObj["offset"].toVariant().toULongLong();
|
block.addr = blockObj[RJsonKey::offset].toVariant().toULongLong();
|
||||||
block.size = blockObj["size"].toVariant().toULongLong();
|
block.size = blockObj[RJsonKey::size].toVariant().toULongLong();
|
||||||
block.flags = blockObj["flags"].toInt(0);
|
block.flags = blockObj[RJsonKey::flags].toInt(0);
|
||||||
block.functions = blockObj["functions"].toInt(0);
|
block.functions = blockObj[RJsonKey::functions].toInt(0);
|
||||||
block.inFunctions = blockObj["in_functions"].toInt(0);
|
block.inFunctions = blockObj[RJsonKey::in_functions].toInt(0);
|
||||||
block.comments = blockObj["comments"].toInt(0);
|
block.comments = blockObj[RJsonKey::comments].toInt(0);
|
||||||
block.symbols = blockObj["symbols"].toInt(0);
|
block.symbols = blockObj[RJsonKey::symbols].toInt(0);
|
||||||
block.strings = blockObj["strings"].toInt(0);
|
block.strings = blockObj[RJsonKey::strings].toInt(0);
|
||||||
|
|
||||||
block.rwx = 0;
|
block.rwx = 0;
|
||||||
QString rwxStr = blockObj["rwx"].toString();
|
QString rwxStr = blockObj[RJsonKey::rwx].toString();
|
||||||
if (rwxStr.length() == 3) {
|
if (rwxStr.length() == 3) {
|
||||||
if (rwxStr[0] == 'r') {
|
if (rwxStr[0] == 'r') {
|
||||||
block.rwx |= (1 << 0);
|
block.rwx |= (1 << 0);
|
||||||
@ -1996,18 +2078,18 @@ QList<XrefDescription> CutterCore::getXRefs(RVA addr, bool to, bool whole_functi
|
|||||||
QJsonObject xrefObject = value.toObject();
|
QJsonObject xrefObject = value.toObject();
|
||||||
|
|
||||||
XrefDescription xref;
|
XrefDescription xref;
|
||||||
xref.type = xrefObject["type"].toString();
|
xref.type = xrefObject[RJsonKey::type].toString();
|
||||||
|
|
||||||
if (!filterType.isNull() && filterType != xref.type)
|
if (!filterType.isNull() && filterType != xref.type)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
xref.from = xrefObject["from"].toVariant().toULongLong();
|
xref.from = xrefObject[RJsonKey::from].toVariant().toULongLong();
|
||||||
if (!to) {
|
if (!to) {
|
||||||
xref.from_str = RAddressString(xref.from);
|
xref.from_str = RAddressString(xref.from);
|
||||||
} else {
|
} else {
|
||||||
QString fcn = xrefObject["fcn_name"].toString();
|
QString fcn = xrefObject[RJsonKey::fcn_name].toString();
|
||||||
if (!fcn.isEmpty()) {
|
if (!fcn.isEmpty()) {
|
||||||
RVA fcnAddr = xrefObject["fcn_addr"].toVariant().toULongLong();
|
RVA fcnAddr = xrefObject[RJsonKey::fcn_addr].toVariant().toULongLong();
|
||||||
xref.from_str = fcn + " + 0x" + QString::number(xref.from - fcnAddr, 16);
|
xref.from_str = fcn + " + 0x" + QString::number(xref.from - fcnAddr, 16);
|
||||||
} else {
|
} else {
|
||||||
xref.from_str = RAddressString(xref.from);
|
xref.from_str = RAddressString(xref.from);
|
||||||
@ -2018,10 +2100,10 @@ QList<XrefDescription> CutterCore::getXRefs(RVA addr, bool to, bool whole_functi
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (to && !xrefObject.contains("to")) {
|
if (to && !xrefObject.contains(RJsonKey::to)) {
|
||||||
xref.to = addr;
|
xref.to = addr;
|
||||||
} else {
|
} else {
|
||||||
xref.to = xrefObject["to"].toVariant().toULongLong();
|
xref.to = xrefObject[RJsonKey::to].toVariant().toULongLong();
|
||||||
}
|
}
|
||||||
xref.to_str = Core()->cmd("fd " + QString::number(xref.to)).trimmed();
|
xref.to_str = Core()->cmd("fd " + QString::number(xref.to)).trimmed();
|
||||||
|
|
||||||
@ -2095,8 +2177,8 @@ QList<DisassemblyLine> CutterCore::disassembleLines(RVA offset, int lines)
|
|||||||
QJsonObject object = value.toObject();
|
QJsonObject object = value.toObject();
|
||||||
|
|
||||||
DisassemblyLine line;
|
DisassemblyLine line;
|
||||||
line.offset = object["offset"].toVariant().toULongLong();
|
line.offset = object[RJsonKey::offset].toVariant().toULongLong();
|
||||||
line.text = object["text"].toString();
|
line.text = object[RJsonKey::text].toString();
|
||||||
|
|
||||||
r << line;
|
r << line;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user