mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 18:29:37 +02:00
119 lines
3.5 KiB
C++
Executable file
119 lines
3.5 KiB
C++
Executable file
/* ###
|
|
* IP: GHIDRA
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
#include "signature_ghidra.hh"
|
|
#include "signature.hh"
|
|
|
|
namespace ghidra {
|
|
|
|
// Constructing the singleton registers the capability
|
|
GhidraSignatureCapability GhidraSignatureCapability::ghidraSignatureCapability;
|
|
|
|
void GhidraSignatureCapability::initialize(void)
|
|
|
|
{
|
|
commandmap["generateSignatures"] = new SignaturesAt(false);
|
|
commandmap["debugSignatures"] = new SignaturesAt(true);
|
|
commandmap["getSignatureSettings"] = new GetSignatureSettings();
|
|
commandmap["setSignatureSettings"] = new SetSignatureSettings();
|
|
}
|
|
|
|
void SignaturesAt::loadParameters(void)
|
|
|
|
{
|
|
GhidraCommand::loadParameters();
|
|
PackedDecode decoder(ghidra);
|
|
ArchitectureGhidra::readStringStream(sin,decoder);
|
|
addr = Address::decode(decoder); // Parse XML for functions address
|
|
}
|
|
|
|
void SignaturesAt::rawAction(void)
|
|
|
|
{
|
|
Funcdata *fd = ghidra->symboltab->getGlobalScope()->queryFunction(addr);
|
|
if (fd == (Funcdata *)0) {
|
|
ostringstream s;
|
|
s << "Bad address for signatures: " << addr.getShortcut();
|
|
addr.printRaw(s);
|
|
s << '\n';
|
|
throw LowlevelError(s.str());
|
|
}
|
|
if (!fd->isProcStarted()) {
|
|
string curname = ghidra->allacts.getCurrentName();
|
|
Action *sigact;
|
|
if (curname != "normalize")
|
|
sigact = ghidra->allacts.setCurrent("normalize");
|
|
else
|
|
sigact = ghidra->allacts.getCurrent();
|
|
#ifdef __REMOTE_SOCKET__
|
|
connect_to_console(fd);
|
|
#endif
|
|
sigact->reset(*fd);
|
|
sigact->perform(*fd);
|
|
if (curname != "normalize")
|
|
ghidra->allacts.setCurrent(curname);
|
|
}
|
|
|
|
sout.write("\000\000\001\016",4);
|
|
PackedEncode encoder(sout); // Write output XML directly to outstream
|
|
if (debug)
|
|
debugSignature(fd,encoder);
|
|
else
|
|
simpleSignature(fd,encoder);
|
|
sout.write("\000\000\001\017",4);
|
|
}
|
|
|
|
void GetSignatureSettings::rawAction(void)
|
|
|
|
{
|
|
sout.write("\000\000\001\016",4); // Write output XML directly to outstream
|
|
PackedEncode encoder(sout);
|
|
encoder.openElement(ELEM_SIGSETTINGS);
|
|
encoder.openElement(ELEM_MAJOR);
|
|
encoder.writeSignedInteger(ATTRIB_CONTENT, ArchitectureCapability::getMajorVersion());
|
|
encoder.closeElement(ELEM_MAJOR);
|
|
encoder.openElement(ELEM_MINOR);
|
|
encoder.writeSignedInteger(ATTRIB_CONTENT, ArchitectureCapability::getMinorVersion());
|
|
encoder.closeElement(ELEM_MINOR);
|
|
encoder.openElement(ELEM_SETTINGS);
|
|
encoder.writeUnsignedInteger(ATTRIB_CONTENT, SigManager::getSettings());
|
|
encoder.closeElement(ELEM_SETTINGS);
|
|
encoder.closeElement(ELEM_SIGSETTINGS);
|
|
sout.write("\000\000\001\017",4);
|
|
}
|
|
|
|
void SetSignatureSettings::loadParameters(void)
|
|
|
|
{
|
|
string settingString;
|
|
GhidraCommand::loadParameters();
|
|
ArchitectureGhidra::readStringStream(sin,settingString);
|
|
istringstream s(settingString);
|
|
s.unsetf(ios::dec | ios::hex | ios::oct);
|
|
s >> settings;
|
|
}
|
|
|
|
void SetSignatureSettings::rawAction(void)
|
|
|
|
{
|
|
if (GraphSigManager::testSettings(settings)) {
|
|
SigManager::setSettings(settings);
|
|
ArchitectureGhidra::writeStringStream(sout,"t");
|
|
}
|
|
else
|
|
ArchitectureGhidra::writeStringStream(sout,"f");
|
|
}
|
|
|
|
} // End namespace ghidra
|