/** * Returns the address of the given procedure within the given library. Procedures present within * the analyzed modules are given precedence over stub functions. * * @param library * @param procedure * @return the virtual address of the procedure */ public AbsoluteAddress getProcAddress(String library, String procedure) { ExportedSymbol expSymbol = exportedSymbols.get(procedure); if (expSymbol != null) { return expSymbol.getAddress(); } else { return stubLibrary.resolveSymbol(library, procedure); } }
/** For all unresolved symbols, install simple stubs. */ public void installStubs() { if (mainModule instanceof AbstractCOFFModule) { stubLibrary = new Win32StubLibrary(arch); } else if (mainModule instanceof ELFModule) { stubLibrary = new LinuxStubLibrary(arch); } Iterator<UnresolvedSymbol> sIter = unresolvedSymbols.iterator(); while (sIter.hasNext()) { UnresolvedSymbol unresolvedSymbol = sIter.next(); AbsoluteAddress address = stubLibrary.resolveSymbol(unresolvedSymbol.getFromLibrary(), unresolvedSymbol.getName()); if (address != null) { // logger.debug("Installing stack height stub for " + unresolvedSymbol.getName()); unresolvedSymbol.resolve(address); sIter.remove(); } } if (!unresolvedSymbols.isEmpty()) logger.warn("Unresolved symbols remaining: " + unresolvedSymbols); }
private SymbolFinder symbolFinder(AbsoluteAddress addr) { if (isStub(addr)) return stubLibrary.getSymbolFinder(); ExecutableImage module = getModule(addr); return (module == null) ? DummySymbolFinder.getInstance() : module.getSymbolFinder(); }