/* ### * 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. */ // Find patch points for untracer tools (e.g. afl++ utils/afl_untracer) // // Copy to ..../Ghidra/Features/Search/ghidra_scripts/ // Writes the results to ~/Desktop/patches.txt // // This is my very first Ghidra script. I am sure this could be done better. // //@category Search import ghidra.app.script.GhidraScript; import ghidra.program.model.address.*; import ghidra.program.model.block.*; import ghidra.program.model.listing.*; import ghidra.program.model.symbol.*; import ghidra.program.model.mem.*; import java.io.*; public class ghidra_get_patchpoints extends GhidraScript { @Override public void run() throws Exception { long segment_start = 0; Memory memory = currentProgram.getMemory(); MultEntSubModel model = new MultEntSubModel(currentProgram); CodeBlockIterator subIter = model.getCodeBlocks(monitor); BufferedWriter out = new BufferedWriter(new FileWriter(System.getProperty("user.home") + File.separator + "Desktop" + File.separator + "patches.txt")); while (subIter.hasNext()) { CodeBlock multiEntryBlock = subIter.next(); SimpleBlockModel basicBlockModel = new SimpleBlockModel(currentProgram); CodeBlockIterator bbIter = basicBlockModel.getCodeBlocksContaining(multiEntryBlock, monitor); while (bbIter.hasNext()) { CodeBlock basicBlock = bbIter.next(); if (segment_start == 0) { Address firstAddr = basicBlock.getFirstStartAddress(); long firstBlockAddr = firstAddr.getAddressableWordOffset(); MemoryBlock mb = memory.getBlock(firstAddr); Address startAddr = mb.getStart(); Address endAddr = mb.getEnd(); segment_start = startAddr.getAddressableWordOffset(); if ((firstBlockAddr - segment_start) >= 0x1000) segment_start += 0x1000; long segment_end = endAddr.getAddressableWordOffset(); long segment_size = segment_end - segment_start; if ((segment_size % 0x1000) > 0) segment_size = (((segment_size / 0x1000) + 1) * 0x1000); out.write(currentProgram.getName() + ":0x" + Long.toHexString(segment_size) + "\n"); //println("Start: " + Long.toHexString(segment_start)); //println("End: " + Long.toHexString(segment_end)); } if (basicBlock.getFirstStartAddress().getAddressableWordOffset() - segment_start > 0) out.write("0x" + Long.toHexString(basicBlock.getFirstStartAddress().getAddressableWordOffset() - segment_start) + "\n"); } } out.close(); } }