Merge pull request #152021 from roblabla/build-ghidra

ghidra: init at 10.1.1

authored by Robert Scott and committed by GitHub 37d3f756 2da332aa

+309
+130
pkgs/tools/security/ghidra/0001-Use-protobuf-gradle-plugin.patch
··· 1 + From 913e74b8682f77da94ed7b7d459482b9b23a5d88 Mon Sep 17 00:00:00 2001 2 + From: roblabla <unfiltered@roblab.la> 3 + Date: Tue, 28 Dec 2021 14:20:30 +0100 4 + Subject: [PATCH] Use protobuf gradle plugin 5 + 6 + --- 7 + Ghidra/Debug/Debugger-gadp/build.gradle | 76 +++---------------------- 8 + build.gradle | 6 ++ 9 + 2 files changed, 15 insertions(+), 67 deletions(-) 10 + 11 + diff --git a/Ghidra/Debug/Debugger-gadp/build.gradle b/Ghidra/Debug/Debugger-gadp/build.gradle 12 + index 1b4922f66..3d2ef8856 100644 13 + --- a/Ghidra/Debug/Debugger-gadp/build.gradle 14 + +++ b/Ghidra/Debug/Debugger-gadp/build.gradle 15 + @@ -23,42 +23,19 @@ apply from: "${rootProject.projectDir}/gradle/javaTestProject.gradle" 16 + apply from: "${rootProject.projectDir}/gradle/distributableGhidraModule.gradle" 17 + 18 + apply plugin: 'eclipse' 19 + -eclipse.project.name = 'Debug Debugger-gadp' 20 + +apply plugin: 'com.google.protobuf' 21 + 22 + -configurations { 23 + - allProtocArtifacts 24 + - protocArtifact 25 + -} 26 + +eclipse.project.name = 'Debug Debugger-gadp' 27 + 28 + def platform = getCurrentPlatformName() 29 + 30 + -dependencies { 31 + - allProtocArtifacts 'com.google.protobuf:protoc:3.17.3:windows-x86_64@exe' 32 + - allProtocArtifacts 'com.google.protobuf:protoc:3.17.3:linux-x86_64@exe' 33 + - allProtocArtifacts 'com.google.protobuf:protoc:3.17.3:linux-aarch_64@exe' 34 + - allProtocArtifacts 'com.google.protobuf:protoc:3.17.3:osx-x86_64@exe' 35 + - allProtocArtifacts 'com.google.protobuf:protoc:3.17.3:osx-aarch_64@exe' 36 + - 37 + - if (isCurrentWindows()) { 38 + - protocArtifact 'com.google.protobuf:protoc:3.17.3:windows-x86_64@exe' 39 + - } 40 + - if (isCurrentLinux()) { 41 + - if (platform.endsWith("x86_64")) { 42 + - protocArtifact 'com.google.protobuf:protoc:3.17.3:linux-x86_64@exe' 43 + - } 44 + - else { 45 + - protocArtifact 'com.google.protobuf:protoc:3.17.3:linux-aarch_64@exe' 46 + - } 47 + - } 48 + - if (isCurrentMac()) { 49 + - if (platform.endsWith("x86_64")) { 50 + - protocArtifact 'com.google.protobuf:protoc:3.17.3:osx-x86_64@exe' 51 + - } 52 + - else { 53 + - protocArtifact 'com.google.protobuf:protoc:3.17.3:osx-aarch_64@exe' 54 + - } 55 + - } 56 + +buildscript { 57 + + dependencies { 58 + + classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.18' 59 + + } 60 + +} 61 + 62 + +dependencies { 63 + api 'com.google.protobuf:protobuf-java:3.17.3' 64 + api project(':Framework-AsyncComm') 65 + api project(':Framework-Debugging') 66 + @@ -68,43 +45,8 @@ dependencies { 67 + testImplementation project(path: ':Framework-Debugging', configuration: 'testArtifacts') 68 + } 69 + 70 + -/*protobuf { 71 + +protobuf { 72 + protoc { 73 + artifact = 'com.google.protobuf:protoc:3.17.3' 74 + } 75 + -}*/ 76 + - 77 + -task generateProto { 78 + - ext.srcdir = file("src/main/proto") 79 + - ext.src = fileTree(srcdir) { 80 + - include "**/*.proto" 81 + - } 82 + - ext.outdir = file("build/generated/source/proto/main/java") 83 + - outputs.dir(outdir) 84 + - inputs.files(src) 85 + - dependsOn(configurations.protocArtifact) 86 + - doLast { 87 + - def exe = configurations.protocArtifact.first() 88 + - if (!isCurrentWindows()) { 89 + - exe.setExecutable(true) 90 + - } 91 + - exec { 92 + - commandLine exe, "--java_out=$outdir", "-I$srcdir" 93 + - args src 94 + - } 95 + - } 96 + } 97 + - 98 + -tasks.compileJava.dependsOn(tasks.generateProto) 99 + -tasks.eclipse.dependsOn(tasks.generateProto) 100 + -rootProject.tasks.prepDev.dependsOn(tasks.generateProto) 101 + - 102 + -sourceSets { 103 + - main { 104 + - java { 105 + - srcDir tasks.generateProto.outdir 106 + - } 107 + - } 108 + -} 109 + -zipSourceSubproject.dependsOn generateProto 110 + - 111 + diff --git a/build.gradle b/build.gradle 112 + index dce3a5149..7a2e637ce 100644 113 + --- a/build.gradle 114 + +++ b/build.gradle 115 + @@ -76,6 +76,12 @@ if (flatRepo.isDirectory()) { 116 + jcenter() 117 + flatDir name: "flat", dirs:["$flatRepo"] 118 + } 119 + + buildscript { 120 + + repositories { 121 + + mavenLocal() 122 + + mavenCentral() 123 + + } 124 + + } 125 + } 126 + } 127 + else { 128 + -- 129 + 2.33.1 130 +
+177
pkgs/tools/security/ghidra/build.nix
··· 1 + { stdenv 2 + , fetchzip 3 + , fetchurl 4 + , fetchFromGitHub 5 + , lib 6 + , gradle 7 + , perl 8 + , makeWrapper 9 + , openjdk11 10 + , unzip 11 + , makeDesktopItem 12 + , autoPatchelfHook 13 + , icoutils 14 + , xcbuild 15 + , protobuf3_17 16 + , libredirect 17 + }: 18 + 19 + let 20 + pkg_path = "$out/lib/ghidra"; 21 + pname = "ghidra"; 22 + version = "10.1.1"; 23 + 24 + src = fetchFromGitHub { 25 + owner = "NationalSecurityAgency"; 26 + repo = "Ghidra"; 27 + rev = "Ghidra_${version}_build"; 28 + sha256 = "sha256-0hj9IVvTxgStCbfnTzqeKD+Q5GnGowDsIkMvk2GqJqY="; 29 + }; 30 + 31 + desktopItem = makeDesktopItem { 32 + name = "ghidra"; 33 + exec = "ghidra"; 34 + icon = "ghidra"; 35 + desktopName = "Ghidra"; 36 + genericName = "Ghidra Software Reverse Engineering Suite"; 37 + categories = "Development;"; 38 + }; 39 + 40 + # postPatch scripts. 41 + # Tells ghidra to use our own protoc binary instead of the prebuilt one. 42 + fixProtoc = '' 43 + cat >>Ghidra/Debug/Debugger-gadp/build.gradle <<HERE 44 + protobuf { 45 + protoc { 46 + path = '${protobuf3_17}/bin/protoc' 47 + } 48 + } 49 + HERE 50 + ''; 51 + 52 + # Adds a gradle step that downloads all the dependencies to the gradle cache. 53 + addResolveStep = '' 54 + cat >>build.gradle <<HERE 55 + task resolveDependencies { 56 + doLast { 57 + project.rootProject.allprojects.each { subProject -> 58 + subProject.buildscript.configurations.each { configuration -> 59 + resolveConfiguration(subProject, configuration, "buildscript config \''${configuration.name}") 60 + } 61 + subProject.configurations.each { configuration -> 62 + resolveConfiguration(subProject, configuration, "config \''${configuration.name}") 63 + } 64 + } 65 + } 66 + } 67 + void resolveConfiguration(subProject, configuration, name) { 68 + if (configuration.canBeResolved) { 69 + logger.info("Resolving project {} {}", subProject.name, name) 70 + configuration.resolve() 71 + } 72 + } 73 + HERE 74 + ''; 75 + 76 + # fake build to pre-download deps into fixed-output derivation 77 + # Taken from mindustry derivation. 78 + deps = stdenv.mkDerivation { 79 + pname = "${pname}-deps"; 80 + inherit version src; 81 + 82 + patches = [ ./0001-Use-protobuf-gradle-plugin.patch ]; 83 + postPatch = fixProtoc + addResolveStep; 84 + 85 + nativeBuildInputs = [ gradle perl ] ++ lib.optional stdenv.isDarwin xcbuild; 86 + buildPhase = '' 87 + export GRADLE_USER_HOME=$(mktemp -d) 88 + 89 + # First, fetch the static dependencies. 90 + gradle --no-daemon --info -Dorg.gradle.java.home=${openjdk11} -I gradle/support/fetchDependencies.gradle init 91 + 92 + # Then, fetch the maven dependencies. 93 + gradle --no-daemon --info -Dorg.gradle.java.home=${openjdk11} resolveDependencies 94 + ''; 95 + # perl code mavenizes pathes (com.squareup.okio/okio/1.13.0/a9283170b7305c8d92d25aff02a6ab7e45d06cbe/okio-1.13.0.jar -> com/squareup/okio/okio/1.13.0/okio-1.13.0.jar) 96 + installPhase = '' 97 + find $GRADLE_USER_HOME/caches/modules-2 -type f -regex '.*\.\(jar\|pom\)' \ 98 + | perl -pe 's#(.*/([^/]+)/([^/]+)/([^/]+)/[0-9a-f]{30,40}/([^/\s]+))$# ($x = $2) =~ tr|\.|/|; "install -Dm444 $1 \$out/maven/$x/$3/$4/$5" #e' \ 99 + | sh 100 + cp -r dependencies $out/dependencies 101 + ''; 102 + outputHashAlgo = "sha256"; 103 + outputHashMode = "recursive"; 104 + outputHash = "sha256-Yxf6g908+fRRUh40PrwNUCTvxzlvSmwzE8R+3ZkRIvs="; 105 + }; 106 + 107 + in stdenv.mkDerivation rec { 108 + inherit pname version src; 109 + 110 + nativeBuildInputs = [ 111 + gradle unzip makeWrapper icoutils 112 + ] ++ lib.optional stdenv.isDarwin xcbuild; 113 + 114 + dontStrip = true; 115 + 116 + patches = [ ./0001-Use-protobuf-gradle-plugin.patch ]; 117 + postPatch = fixProtoc; 118 + 119 + buildPhase = (lib.optionalString stdenv.isDarwin '' 120 + export HOME=$(mktemp -d) 121 + 122 + # construct a dummy /etc/passwd file - something attempts to determine 123 + # the user's "real" home using this 124 + DUMMY_PASSWD=$(realpath ../dummy-passwd) 125 + cat > $DUMMY_PASSWD <<EOF 126 + $(whoami)::$(id -u):$(id -g)::$HOME:$SHELL 127 + EOF 128 + 129 + export NIX_REDIRECTS=/etc/passwd=$DUMMY_PASSWD 130 + export DYLD_INSERT_LIBRARIES=${libredirect}/lib/libredirect.dylib 131 + '') + '' 132 + 133 + export GRADLE_USER_HOME=$(mktemp -d) 134 + 135 + ln -s ${deps}/dependencies dependencies 136 + 137 + sed -i "s#mavenLocal()#mavenLocal(); maven { url '${deps}/maven' }#g" build.gradle 138 + 139 + gradle --offline --no-daemon --info -Dorg.gradle.java.home=${openjdk11} buildGhidra 140 + ''; 141 + 142 + installPhase = '' 143 + mkdir -p "${pkg_path}" "$out/share/applications" 144 + 145 + ZIP=build/dist/$(ls build/dist) 146 + echo $ZIP 147 + unzip $ZIP -d ${pkg_path} 148 + f=("${pkg_path}"/*) 149 + mv "${pkg_path}"/*/* "${pkg_path}" 150 + rmdir "''${f[@]}" 151 + 152 + ln -s ${desktopItem}/share/applications/* $out/share/applications 153 + 154 + icotool -x "Ghidra/RuntimeScripts/Windows/support/ghidra.ico" 155 + rm ghidra_4_40x40x32.png 156 + for f in ghidra_*.png; do 157 + res=$(basename "$f" ".png" | cut -d"_" -f3 | cut -d"x" -f1-2) 158 + mkdir -pv "$out/share/icons/hicolor/$res/apps" 159 + mv "$f" "$out/share/icons/hicolor/$res/apps/ghidra.png" 160 + done; 161 + ''; 162 + 163 + postFixup = '' 164 + mkdir -p "$out/bin" 165 + ln -s "${pkg_path}/ghidraRun" "$out/bin/ghidra" 166 + wrapProgram "${pkg_path}/support/launch.sh" \ 167 + --prefix PATH : ${lib.makeBinPath [ openjdk11 ]} 168 + ''; 169 + 170 + meta = with lib; { 171 + description = "A software reverse engineering (SRE) suite of tools developed by NSA's Research Directorate in support of the Cybersecurity mission"; 172 + homepage = "https://ghidra-sre.org/"; 173 + platforms = [ "x86_64-linux" "x86_64-darwin" ]; 174 + license = licenses.asl20; 175 + }; 176 + 177 + }
+2
pkgs/top-level/all-packages.nix
··· 3106 3106 3107 3107 ghdorker = callPackage ../tools/security/ghdorker { }; 3108 3108 3109 + ghidra = callPackage ../tools/security/ghidra/build.nix { }; 3110 + 3109 3111 ghidra-bin = callPackage ../tools/security/ghidra { }; 3110 3112 3111 3113 gif-for-cli = callPackage ../tools/misc/gif-for-cli { };