Java源码示例:ghidra.program.model.lang.LanguageCompilerSpecPair
示例1
@Test
public void testLanguagePickerDialog() throws Exception {
PeLoader peLoader = new PeLoader();
List<LoadSpec> loadSpecs = new ArrayList<>();
loadSpecs.add(new LoadSpec(peLoader, 0,
new LanguageCompilerSpecPair("x86:LE:32:default", "windows"), true));
loadSpecs.add(new LoadSpec(peLoader, 0,
new LanguageCompilerSpecPair("x86:LE:32:default", "gcc"), false));
loadSpecs.add(new LoadSpec(peLoader, 0,
new LanguageCompilerSpecPair("x86:LE:32:default", "borland"), false));
loadSpecs.add(new LoadSpec(peLoader, 0,
new LanguageCompilerSpecPair("x86:LE:32:System Management Mode", "default"), false));
runSwing(() -> {
ImporterLanguageDialog dialog = new ImporterLanguageDialog(loadSpecs, tool, null);
dialog.show(null);
}, false);
waitForDialogComponent(ImporterLanguageDialog.class);
captureDialog();
}
示例2
@Override
public Collection<LoadSpec> findSupportedLoadSpecs(ByteProvider provider) throws IOException {
List<LoadSpec> loadSpecs = new ArrayList<>();
boolean validClass = false;
if (checkClass(provider)) {
validClass = true;
}
if (validClass) {
loadSpecs.add(new LoadSpec(this, 0,
new LanguageCompilerSpecPair("JVM:BE:32:default", "default"), true));
}
return loadSpecs;
}
示例3
private Component buildLanguageField() {
JPanel panel = new JPanel(new BorderLayout());
languageIdField = new JTextField();
panel.add(languageIdField, BorderLayout.CENTER);
JButton browseButton = createBrowseButton();
browseButton.addActionListener(e -> {
SelectLanguageDialog selectLanguageDialog =
new SelectLanguageDialog("Select Language", "Ok");
LanguageCompilerSpecPair selectedLanguage = selectLanguageDialog.getSelectedLanguage();
if (selectedLanguage != null) {
languageIdField.setText(selectedLanguage.languageID.toString());
}
});
languageIdField.getDocument().addUndoableEditListener(e -> updateOkEnablement());
panel.add(browseButton, BorderLayout.EAST);
return panel;
}
示例4
@Override
protected List<Program> loadProgram(ByteProvider provider, String programName,
DomainFolder programFolder, LoadSpec loadSpec, List<Option> options, MessageLog log,
Object consumer, TaskMonitor monitor)
throws IOException, CancelledException
{
LanguageCompilerSpecPair pair = loadSpec.getLanguageCompilerSpec();
Language importerLanguage = getLanguageService().getLanguage(pair.languageID);
CompilerSpec importerCompilerSpec = importerLanguage.getCompilerSpecByID(pair.compilerSpecID);
Address baseAddr = importerLanguage.getAddressFactory().getDefaultAddressSpace().getAddress(0);
Program prog = createProgram(provider, programName, baseAddr, getName(), importerLanguage, importerCompilerSpec, consumer);
boolean success = false;
try
{
success = this.loadInto(provider, loadSpec, options, log, prog, monitor);
}
finally
{
if (!success)
{
prog.release(consumer);
prog = null;
}
}
List<Program> results = new ArrayList<Program>();
if (prog != null) results.add(prog);
return results;
}
示例5
@Override
public void run( ) throws Exception {
LanguageService languageService = DefaultLanguageService.getLanguageService( );
LanguageCompilerSpecPair dataBE16 = DataLanguageHelper.getLanguage( languageService, 16, true );
LanguageCompilerSpecPair dataBE32 = DataLanguageHelper.getLanguage( languageService, 32, true );
LanguageCompilerSpecPair dataBE64 = DataLanguageHelper.getLanguage( languageService, 64, true );
LanguageCompilerSpecPair dataLE16 = DataLanguageHelper.getLanguage( languageService, 16, false );
LanguageCompilerSpecPair dataLE32 = DataLanguageHelper.getLanguage( languageService, 32, false );
LanguageCompilerSpecPair dataLE64 = DataLanguageHelper.getLanguage( languageService, 64, false );
File file = askFile( "Select DATA File", "OK" );
if ( file == null ) {
printerr( "No file selected, ending script." );
return;
}
openProgram( importFileAsBinary( file, dataBE16.getLanguage( ), dataBE16.getCompilerSpec( ) ) );
openProgram( importFileAsBinary( file, dataLE16.getLanguage( ), dataLE16.getCompilerSpec( ) ) );
openProgram( importFileAsBinary( file, dataBE32.getLanguage( ), dataBE32.getCompilerSpec( ) ) );
openProgram( importFileAsBinary( file, dataLE32.getLanguage( ), dataLE32.getCompilerSpec( ) ) );
openProgram( importFileAsBinary( file, dataBE64.getLanguage( ), dataBE64.getCompilerSpec( ) ) );
openProgram( importFileAsBinary( file, dataLE64.getLanguage( ), dataLE64.getCompilerSpec( ) ) );
}
示例6
static List<LanguageCompilerSpecPair> getPairs(Collection<LoadSpec> loadSpecs) {
Set<LanguageCompilerSpecPair> pairs = new HashSet<>();
for (LoadSpec loadSpec : loadSpecs) {
LanguageCompilerSpecPair pair = loadSpec.getLanguageCompilerSpec();
if (pair != null) {
pairs.add(pair);
}
}
return CollectionUtils.asList(pairs);
}
示例7
private JComponent buildLanguagePanel() {
languageTextField = new JTextField();
languageTextField.setEditable(false);
languageTextField.setFocusable(false);
languageButton = ButtonPanelFactory.createButton(ButtonPanelFactory.BROWSE_TYPE);
languageButton.addActionListener(e -> {
Object selectedItem = loaderComboBox.getSelectedItem();
if (selectedItem instanceof Loader) {
Loader loader = (Loader) selectedItem;
ImporterLanguageDialog dialog =
new ImporterLanguageDialog(loaderMap.get(loader), tool, selectedLanguage);
dialog.show(getComponent());
LanguageCompilerSpecPair dialogResult = dialog.getSelectedLanguage();
if (dialogResult != null) {
setSelectedLanguage(dialogResult);
}
}
validateFormInput();
});
Font font = languageButton.getFont();
languageButton.setFont(new Font(font.getName(), Font.BOLD, font.getSize()));
JPanel panel = new JPanel(new BorderLayout());
panel.add(languageTextField, BorderLayout.CENTER);
panel.add(languageButton, BorderLayout.EAST);
return panel;
}
示例8
protected void setSelectedLanguage(LanguageCompilerSpecPair lcsPair) {
this.selectedLanguage = lcsPair;
if (selectedLanguage == null) {
languageTextField.setText("");
}
else {
languageTextField.setText(selectedLanguage.toString());
}
}
示例9
private LanguageCompilerSpecPair getPreferredLanguage(Loader loader) {
LanguageCompilerSpecPair preferredSpecPair = null;
for (LoadSpec loadSpec : loaderMap.get(loader)) {
if (loadSpec.isPreferred()) {
if (preferredSpecPair != null) {
return null;
}
preferredSpecPair = loadSpec.getLanguageCompilerSpec();
}
}
return preferredSpecPair;
}
示例10
public ImporterLanguageDialog(Collection<LoadSpec> loadSpecs, PluginTool tool,
LanguageCompilerSpecPair defaultSelectedLanguage) {
super("Language", true);
this.loadSpecs = loadSpecs;
this.tool = tool;
this.defaultSelectedLanguage = defaultSelectedLanguage;
setHelpLocation(new HelpLocation("ImporterPlugin", "language_picker_dialog"));
}
示例11
private void build() {
languagePanel = new NewLanguagePanel();
languagePanel.setRecommendedLcsPairsList(new ArrayList<LanguageCompilerSpecPair>());
languagePanel.setShowAllLcsPairs(false);
languagePanel.setBorder(
BorderFactory.createTitledBorder(" Select Language and Compiler Specification "));
languagePanel.addSelectionListener(new LcsSelectionListener() {
@Override
public void valueChanged(LcsSelectionEvent e) {
validateFormInput();
}
});
initialize();
addWorkPanel(languagePanel);
addOKButton();
addCancelButton();
setDefaultButton(okButton);// set default button
setOkEnabled(false);
if (defaultSelectedLanguage != null) {
languagePanel.setSelectedLcsPair(defaultSelectedLanguage);
}
validateFormInput();
}
示例12
private void initialize() {
List<LanguageCompilerSpecPair> pairs = ImporterUtilities.getPairs(loadSpecs);
languagePanel.setRecommendedLcsPairsList(pairs);
languagePanel.setShowAllLcsPairs(pairs.isEmpty());
languagePanel.setEnabled(true);
selectPreferredLanguage();
}
示例13
/**
* Constructs a {@link LoadSpec} from a manually supplied {@link LanguageCompilerSpecPair}.
*
* @param loader This {@link LoadSpec}'s {@link Loader}.
* @param imageBase The desired image base address for the load.
* @param languageCompilerSpec The language/compiler spec ID. If this is not needed or not
* known, use {@link #LoadSpec(Loader, long, boolean)}.
* @param isPreferred true if this {@link LoadSpec} is preferred; otherwise, false.
*/
public LoadSpec(Loader loader, long imageBase, LanguageCompilerSpecPair languageCompilerSpec,
boolean isPreferred) {
this.loader = loader;
this.imageBase = imageBase;
this.lcs = languageCompilerSpec;
this.isPreferred = isPreferred;
// We internally define a "preferred" language/compiler being null to mean that the
// associated Loader doesn't use a language/compiler, and we define a "non-preferred"
// language/compiler being null to mean that the Loader does indeed use a language/compiler,
// but the Loader wasn't able to figure it out on its own.
this.requiresLanguageCompilerSpec = lcs != null || !isPreferred;
}
示例14
@Override
protected List<Program> loadProgram(ByteProvider provider, String programName,
DomainFolder programFolder, LoadSpec loadSpec, List<Option> options, MessageLog log,
Object consumer, TaskMonitor monitor)
throws IOException, CancelledException {
LanguageCompilerSpecPair pair = loadSpec.getLanguageCompilerSpec();
Language importerLanguage = getLanguageService().getLanguage(pair.languageID);
CompilerSpec importerCompilerSpec = importerLanguage.getCompilerSpecByID(pair.compilerSpecID);
Address baseAddress = importerLanguage.getAddressFactory().getDefaultAddressSpace().getAddress(0);
Program program = createProgram(provider, programName, baseAddress, getName(),
importerLanguage, importerCompilerSpec, consumer);
boolean success = false;
try {
success = this.loadInto(provider, loadSpec, options, log, program, monitor);
}
finally {
if (!success) {
program.release(consumer);
program = null;
}
}
List<Program> results = new ArrayList<Program>();
if (program != null) {
results.add(program);
}
return results;
}
示例15
@Override
public Collection<LoadSpec> findSupportedLoadSpecs(ByteProvider provider) throws IOException
{
List<LoadSpec> loadSpecs = new ArrayList<>();
BinaryReader reader = new BinaryReader(provider, true);
String magic_0x0 = reader.readAsciiString(0, 4);
String magic_0x10 = reader.readAsciiString(0x10, 4);
reader.setPointerIndex(0);
if (magic_0x0.equals("KIP1"))
{
this.binaryType = BinaryType.KIP1;
}
else if (magic_0x0.equals("NSO0"))
{
this.binaryType = BinaryType.NSO0;
}
else if (magic_0x0.equals("\u00DF\u004F\u0003\u00D5"))
{
this.binaryType = BinaryType.KERNEL_800;
}
else if (magic_0x10.equals("NRO0"))
{
this.binaryType = BinaryType.NRO0;
}
else if (magic_0x10.equals("KIP1"))
{
// Note: This is kinda a bad way of determining this, but for now it gets the job done
// and I don't believe there are any clashes.
this.binaryType = BinaryType.SX_KIP1;
}
else
return loadSpecs;
var adapter = this.binaryType.createAdapter(null, provider);
if (adapter.isAarch32())
{
loadSpecs.add(new LoadSpec(this, 0, new LanguageCompilerSpecPair(AARCH32_LANGUAGE_ID, new CompilerSpecID("default")), true));
}
else
{
loadSpecs.add(new LoadSpec(this, 0, new LanguageCompilerSpecPair(AARCH64_LANGUAGE_ID, new CompilerSpecID("default")), true));
}
return loadSpecs;
}
示例16
@Override
public Program getProgram(GFile file, LanguageService languageService, TaskMonitor monitor,
Object consumer) throws Exception {
Long offset = fileToMachoOffsetMap.get(file);
if (offset == null) {
return null;
}
MachHeader machHeader =
MachHeader.createMachHeader(RethrowContinuesFactory.INSTANCE, provider, offset, true);
LanguageCompilerSpecPair lcs = MacosxLanguageHelper.getLanguageCompilerSpecPair(
languageService, machHeader.getCpuType(), machHeader.getCpuSubType());
Program program =
new ProgramDB(file.getName(), lcs.getLanguage(), lcs.getCompilerSpec(), consumer);
int id = program.startTransaction(getName());
boolean success = false;
try {
FileBytes fileBytes = MemoryBlockUtils.createFileBytes(program, provider, offset,
provider.length() - offset, monitor);
ByteProvider providerWrapper =
new ByteProviderWrapper(provider, offset, provider.length() - offset);
MachoProgramBuilder.buildProgram(program, providerWrapper, fileBytes, new MessageLog(),
monitor);
program.setExecutableFormat(MachoLoader.MACH_O_NAME);
program.setExecutablePath(file.getPath());
if (file.equals(systemKextFile)) {
processSystemKext(languageService, program, monitor);
}
success = true;
}
catch (Exception e) {
throw e;
}
finally {
program.endTransaction(id, success);
if (!success) {
program.release(consumer);
}
}
return program;
}
示例17
public LcsSelectionEvent(LanguageCompilerSpecPair selection) {
this.selection = selection;
}
示例18
LanguageCompilerSpecPair getSelectedLanguage() {
if (wasDialogCancelled) {
return null;
}
return languagePanel.getSelectedLcsPair();
}
示例19
void setSelectedLanguage(LanguageCompilerSpecPair language) {
SystemUtilities.runSwingNow(() -> languagePanel.setSelectedLcsPair(language));
}
示例20
public LanguageCompilerSpecPair getSelectedLanguage() {
SystemUtilities.runSwingNow(() -> doSelect());
return selectedLcsPair;
}
示例21
public QueryResult(LanguageCompilerSpecPair pair, boolean preferred) {
this.pair = pair;
this.preferred = preferred;
}
示例22
/**
* Gets this {@link LoadSpec}'s {@link LanguageCompilerSpecPair}.
*
* @return This {@link LoadSpec}'s {@link LanguageCompilerSpecPair}. Could be null if this
* {@link LoadSpec} doesn't need or know the language/compiler.
*/
public LanguageCompilerSpecPair getLanguageCompilerSpec() {
return lcs;
}