mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-10-19 18:12:14 -09:00
Merge remote-tracking branch 'origin/Ghidra_11.3'
This commit is contained in:
@@ -4,9 +4,9 @@
|
||||
* 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.
|
||||
@@ -16,6 +16,8 @@
|
||||
package ghidra.app.util.bin.format.pe.debug;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import ghidra.app.util.bin.BinaryReader;
|
||||
import ghidra.app.util.bin.format.pe.NTHeader;
|
||||
@@ -24,37 +26,34 @@ import ghidra.app.util.bin.format.pe.NTHeader;
|
||||
* A class to represent the COFF Symbol Table.
|
||||
*/
|
||||
public class DebugCOFFSymbolTable {
|
||||
private int ptrToSymbolTable;
|
||||
private int symbolCount;
|
||||
private int ptrToSymbolTable;
|
||||
private int symbolCount;
|
||||
|
||||
private DebugCOFFSymbol [] symbols;
|
||||
private List<DebugCOFFSymbol> symbols = new ArrayList<>();
|
||||
|
||||
public DebugCOFFSymbolTable(BinaryReader reader, DebugCOFFSymbolsHeader coffHeader, int offset)
|
||||
throws IOException {
|
||||
this.ptrToSymbolTable = coffHeader.getFirstSymbolLVA() + offset;
|
||||
this.symbolCount = coffHeader.getNumberOfSymbols();
|
||||
this.ptrToSymbolTable = coffHeader.getFirstSymbolLVA() + offset;
|
||||
this.symbolCount = coffHeader.getNumberOfSymbols();
|
||||
|
||||
//TODO:
|
||||
//should symbol table info in NT Header agree with info in COFF Header?
|
||||
//TODO: should symbol table info in NT Header agree with info in COFF Header?
|
||||
|
||||
if (symbolCount > 0 && symbolCount < NTHeader.MAX_SANE_COUNT) {
|
||||
symbols = new DebugCOFFSymbol[symbolCount];
|
||||
for (int i = 0 ; i < symbolCount ; ++i) {
|
||||
symbols[i] = new DebugCOFFSymbol(reader,
|
||||
ptrToSymbolTable + (i * DebugCOFFSymbol.IMAGE_SIZEOF_SYMBOL), this);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (symbolCount < NTHeader.MAX_SANE_COUNT) {
|
||||
for (int i = 0; i < symbolCount; ++i) {
|
||||
symbols.add(new DebugCOFFSymbol(reader,
|
||||
ptrToSymbolTable + (i * DebugCOFFSymbol.IMAGE_SIZEOF_SYMBOL), this));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int getStringTableIndex() {
|
||||
return ptrToSymbolTable + (symbolCount * DebugCOFFSymbol.IMAGE_SIZEOF_SYMBOL);
|
||||
}
|
||||
int getStringTableIndex() {
|
||||
return ptrToSymbolTable + (symbolCount * DebugCOFFSymbol.IMAGE_SIZEOF_SYMBOL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the COFF symbols defined in this COFF symbol table.
|
||||
* @return the COFF symbols defined in this COFF symbol table
|
||||
* {@return the COFF symbols defined in this COFF symbol table}
|
||||
*/
|
||||
public DebugCOFFSymbol [] getSymbols() {
|
||||
return symbols;
|
||||
}
|
||||
public List<DebugCOFFSymbol> getSymbols() {
|
||||
return symbols;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -345,9 +345,8 @@ abstract class AbstractPeDebugLoader extends AbstractOrdinalSupportLoader {
|
||||
if (dcst == null) {
|
||||
return;
|
||||
}
|
||||
DebugCOFFSymbol[] symbols = dcst.getSymbols();
|
||||
int errorCount = 0;
|
||||
for (DebugCOFFSymbol symbol : symbols) {
|
||||
for (DebugCOFFSymbol symbol : dcst.getSymbols()) {
|
||||
if (monitor.isCancelled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -109,6 +109,17 @@ class _PyGhidraImportLoader:
|
||||
def exec_module(self, fullname):
|
||||
pass
|
||||
|
||||
class _GhidraBundleFinder(importlib.machinery.PathFinder):
|
||||
""" (internal) Used to find modules in Ghidra bundle locations """
|
||||
|
||||
def find_spec(self, fullname, path=None, target=None):
|
||||
from ghidra.app.script import GhidraScriptUtil
|
||||
GhidraScriptUtil.acquireBundleHostReference()
|
||||
for directory in GhidraScriptUtil.getEnabledScriptSourceDirectories():
|
||||
spec = super().find_spec(fullname, [directory.absolutePath], target)
|
||||
if spec is not None:
|
||||
return spec
|
||||
return None
|
||||
|
||||
@contextlib.contextmanager
|
||||
def _plugin_lock():
|
||||
@@ -394,8 +405,9 @@ class PyGhidraLauncher:
|
||||
**jpype_kwargs
|
||||
)
|
||||
|
||||
# Install hook into python importlib
|
||||
# Install hooks into python importlib
|
||||
sys.meta_path.append(_PyGhidraImportLoader())
|
||||
sys.meta_path.append(_GhidraBundleFinder())
|
||||
|
||||
imports.registerDomain("ghidra")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user