diff --git a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/Ghidra2Cpg.scala b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/Ghidra2Cpg.scala index 94f8faf0d567..16c66f0c1b95 100644 --- a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/Ghidra2Cpg.scala +++ b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/Ghidra2Cpg.scala @@ -1,13 +1,16 @@ package io.joern.ghidra2cpg import ghidra.GhidraJarApplicationLayout +import ghidra.app.plugin.core.analysis.AutoAnalysisManager +import ghidra.app.util.importer.ProgramLoader import ghidra.base.project.GhidraProject import ghidra.framework.protocol.ghidra.Handler import ghidra.framework.{Application, HeadlessGhidraApplicationConfiguration} import ghidra.program.flatapi.FlatProgramAPI import ghidra.program.model.listing.Program -import ghidra.program.util.{DefinedDataIterator, GhidraProgramUtilities} +import ghidra.program.util.{DefinedStringIterator, GhidraProgramUtilities} import ghidra.util.exception.InvalidInputException +import ghidra.util.task.TaskMonitor import io.joern.ghidra2cpg.passes.* import io.joern.ghidra2cpg.passes.arm.ArmFunctionPass import io.joern.ghidra2cpg.passes.mips.{LoHiPass, MipsFunctionPass} @@ -48,14 +51,26 @@ class Ghidra2Cpg extends X2CpgFrontend { // The 'true' parameter indicates this is a temporary project project = GhidraProject.createProject(tempWorkingDir.absolutePathAsString, CommandLineConfig.projectName, true) - program = project.importProgram(inputFile) - addProgramToCpg(program, inputFile.getCanonicalPath, cpg) + val loadResults = ProgramLoader + .builder() + .source(inputFile) + .project(project.getProject) + .monitor(TaskMonitor.DUMMY) + .load() + program = loadResults.getPrimaryDomainObject(this) + val txId = program.startTransaction("Batch Processing") + AutoAnalysisManager.getAnalysisManager(program).initializeOptions() + try { + addProgramToCpg(program, inputFile.getCanonicalPath, cpg) + } finally { + program.endTransaction(txId, true) + program.release(this) + } } catch { case e: Exception => e.printStackTrace() } finally { // Closing deletes the project (since we created a temporary project) - // Closing also releases the program project.close() } } @@ -99,8 +114,8 @@ class Ghidra2Cpg extends X2CpgFrontend { val functionIterator = listing.getFunctions(true) val functions = functionIterator.iterator.asScala.toList - val address2Literals: Map[Long, String] = DefinedDataIterator - .definedStrings(program) + val address2Literals: Map[Long, String] = DefinedStringIterator + .forProgram(program) .iterator() .asScala .toList diff --git a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/LiteralPass.scala b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/LiteralPass.scala index 97f37248b57a..af42892937dd 100644 --- a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/LiteralPass.scala +++ b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/LiteralPass.scala @@ -1,7 +1,7 @@ package io.joern.ghidra2cpg.passes import ghidra.program.flatapi.FlatProgramAPI -import ghidra.program.util.DefinedDataIterator +import ghidra.program.util.DefinedStringIterator import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes import io.shiftleft.passes.ForkJoinParallelCpgPass @@ -12,8 +12,8 @@ import scala.language.implicitConversions class LiteralPass(cpg: Cpg, flatProgramAPI: FlatProgramAPI) extends ForkJoinParallelCpgPass[String](cpg) { override def generateParts(): Array[String] = { - val address2Literals: Map[Long, String] = DefinedDataIterator - .definedStrings(flatProgramAPI.getCurrentProgram) + val address2Literals: Map[Long, String] = DefinedStringIterator + .forProgram(flatProgramAPI.getCurrentProgram) .iterator() .asScala .toList diff --git a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/PCodePass.scala b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/PCodePass.scala index 4af1253276b6..58bdad55dc80 100644 --- a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/PCodePass.scala +++ b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/PCodePass.scala @@ -1,7 +1,7 @@ package io.joern.ghidra2cpg.passes import ghidra.program.model.listing.{Function, Program} -import ghidra.program.util.DefinedDataIterator +import ghidra.program.util.DefinedStringIterator import io.joern.ghidra2cpg.* import io.joern.ghidra2cpg.utils.Utils.* import io.joern.ghidra2cpg.utils.{Decompiler, PCodeMapper} @@ -15,8 +15,8 @@ import scala.language.implicitConversions class PCodePass(currentProgram: Program, fileName: String, functions: List[Function], cpg: Cpg, decompiler: Decompiler) extends ForkJoinParallelCpgPass[Function](cpg) { - val address2Literals: Map[Long, String] = DefinedDataIterator - .definedStrings(currentProgram) + val address2Literals: Map[Long, String] = DefinedStringIterator + .forProgram(currentProgram) .iterator() .asScala .toList diff --git a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/utils/PCodeMapper.scala b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/utils/PCodeMapper.scala index d24f15f3b5db..015f61eebbba 100644 --- a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/utils/PCodeMapper.scala +++ b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/utils/PCodeMapper.scala @@ -303,8 +303,6 @@ class PCodeMapper( handleSingleArgument(pcodeOp, ".cast", pcodeOp.getMnemonic) case CPOOLREF => handleSingleArgument(pcodeOp, ".cpoolref", pcodeOp.getMnemonic) - case EXTRACT => - handleSingleArgument(pcodeOp, ".extract", pcodeOp.getMnemonic) case FLOAT_ABS => handleSingleArgument(pcodeOp, ".abs", pcodeOp.getMnemonic) case FLOAT_CEIL => diff --git a/project/Versions.scala b/project/Versions.scala index 716d986047a1..fe3fc0c64739 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -17,7 +17,7 @@ object Versions { val eclipseCdt = "9.2.100.202507101054+1" val eclipseCore = "3.23.0" val eclipseText = "3.14.400" - val ghidra = "11.4_f331b5bbea-202504251242" + val ghidra = "12.2_744c5dee92-202605281342" val gradleTooling = "8.3" val jacksonDatabind = "2.17.0" val javaParser = "3.28.0"