ghidra/Ghidra/Features/Base/ghidra_scripts/CreateFunctionAfterTerminal...

80 lines
2.7 KiB
Java

/* ###
* 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.
*/
//Create a function after terminal instruction
import ghidra.app.script.GhidraScript;
import ghidra.program.model.address.Address;
import ghidra.program.model.block.CodeBlock;
import ghidra.program.model.block.PartitionCodeSubModel;
import ghidra.program.model.listing.*;
import ghidra.program.model.symbol.RefType;
public class CreateFunctionAfterTerminals extends GhidraScript {
private int numTried;
private int numCreated;
@Override
public void run() throws Exception {
InstructionIterator instIter = currentProgram.getListing().getInstructions(true);
while (instIter.hasNext() && !monitor.isCancelled()) {
Instruction instruction = instIter.next();
if (instruction.getFlowType() == RefType.TERMINATOR) {
Address funcAddr = instruction.getMaxAddress().next();
Function func = currentProgram.getFunctionManager().getFunctionContaining(funcAddr);
if (func == null) {
numTried++;
Instruction funcBeginInstr =
currentProgram.getListing().getInstructionAt(funcAddr);
if (funcBeginInstr != null) {
createFunctionNear(funcAddr);
}
}
}
}
// Log what we did
Address histAddr = currentProgram.getMemory().getMinAddress();
String tmpString = "\nScript: CreateFunctionAfterTerminals()";
tmpString = " Found " + numTried + " locations. Created " + numCreated + " functions.";
}
protected Function createFunctionNear(Address addr) throws Exception {
PartitionCodeSubModel partitionBlockModel = new PartitionCodeSubModel(currentProgram);
CodeBlock[] blocks = partitionBlockModel.getCodeBlocksContaining(addr, monitor);
if (blocks.length != 1) {
println("*************************** Couldn't handle it at " + addr.toString());
return null;
}
Address address = blocks[0].getFirstStartAddress();
Function func = null;
try {
func = createFunction(address, null);
}
catch (Exception e) {
println("Exception thrown creating function:\n" + e.getMessage());
}
if (func == null) {
println("Tried to create Function At " + addr.toString() + " unsuccessfully");
}
else {
println("Created Function At " + address.toString());
numCreated++;
}
return func;
}
}