Skip to content

Commit 7072c5a

Browse files
committed
add run.py
0 parents  commit 7072c5a

File tree

4 files changed

+108
-0
lines changed

4 files changed

+108
-0
lines changed

README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Extractor-java
2+
3+
Create CodeQL database directly from Java source code without compiling
4+
5+
## Usage
6+
7+
If there is only Jar package, you need to decompile to get the java source code
8+
9+
```bash
10+
unzip your.jar
11+
python3 class2java.py dir
12+
```
13+
14+
generate database for java source code
15+
16+
```bash
17+
python3 run.py dbname javaSourceDir
18+
```

class2java.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#!/usr/bin/env python3
2+
3+
import os
4+
import sys
5+
6+
def decompiler(path):
7+
curdir = os.path.dirname(os.path.realpath(__file__))
8+
cmd = f"cd {path};java -cp {curdir}/java-decompiler.jar org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -hdc=0 -dgs=1 -rsy=1 -rbr=1 -lit=1 -nls=1 -mpm=60 . ."
9+
# print(cmd)
10+
os.system(cmd)
11+
12+
13+
14+
if __name__ == "__main__":
15+
if len(sys.argv) != 2:
16+
print("[Usage:] python3 class2java.py directory")
17+
else:
18+
decompiler(sys.argv[1])

java-decompiler.jar

1.4 MB
Binary file not shown.

run.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#!/usr/bin/env python3
2+
import os
3+
import sys
4+
import subprocess
5+
import glob
6+
7+
class Extract:
8+
def __init__(self, db, srcroot):
9+
self.dbname = db
10+
self.srcroot = srcroot
11+
12+
def init_database(self):
13+
p = subprocess.run(["codeql", "database", "init", self.dbname, "-l", "java", "--source-root", self.srcroot])
14+
if p.returncode == 0:
15+
self.dbpath = os.path.realpath(self.dbname)
16+
print(f"[*extract_log*] dbpath : {self.dbpath}")
17+
else:
18+
sys.exit(1)
19+
20+
21+
def init_env(self):
22+
codeql_path = subprocess.check_output(["which", "codeql"]).decode()
23+
codeql_home = os.path.dirname(codeql_path)
24+
self.codeql_home = codeql_home
25+
print(f"[*extract_log*] codeql_home : {codeql_home}")
26+
codeql_java_home = glob.glob(f"{codeql_home}/tools/**/java")[0]
27+
self.codeql_java_home = codeql_java_home
28+
print(f"[*extract_log*] codeql_java_home : {codeql_java_home}")
29+
env = {
30+
"CODEQL_DIST": codeql_home,
31+
"CODEQL_EXTRACTOR_JAVA_LOG_DIR": f"{self.dbpath}/log",
32+
"CODEQL_EXTRACTOR_JAVA_ROOT": f"{codeql_home}/java",
33+
"CODEQL_EXTRACTOR_JAVA_SOURCE_ARCHIVE_DIR": f"{self.dbpath}/src",
34+
"CODEQL_EXTRACTOR_JAVA_TRAP_DIR": f"{self.dbpath}/trap/java",
35+
"CODEQL_EXTRACTOR_JAVA_WIP_DATABASE": self.dbpath,
36+
"CODEQL_JAVA_HOME": codeql_java_home
37+
}
38+
for key in env:
39+
print(f"{key}={env[key]}")
40+
return env
41+
42+
def generate_javacargs(self):
43+
javafiles = glob.glob(f"{self.srcroot}/**/*.java", recursive=True)
44+
print(len(javafiles))
45+
with open(f"{self.dbpath}/log/javac.args", "w") as f:
46+
f.write("-Xprefer:source" + "\n")
47+
for javafile in javafiles:
48+
#if "test" not in javafile:
49+
f.write(javafile + "\n")
50+
51+
52+
def generate_trap(self):
53+
env = self.init_env()
54+
p = subprocess.run([f"{self.codeql_java_home}/bin/java", "-Xmx1024M", "-Xms256M", "-cp", f"{self.codeql_home}/java/tools/semmle-extractor-java.jar", "com.semmle.extractor.java.JavaExtractor", "--javac-args", f"@@@{self.dbpath}/log/javac.args"], env=env)
55+
56+
def import_trap(self):
57+
p = subprocess.run(["codeql", "dataset", "import", f"{self.dbpath}/db-java", f"{self.dbpath}/trap", "-S", f"{self.codeql_home}/java/semmlecode.dbscheme"])
58+
59+
def finalize(self):
60+
p = subprocess.run(["codeql", "database", "finalize", self.dbpath])
61+
62+
def run(self):
63+
self.init_database()
64+
self.generate_javacargs()
65+
self.generate_trap()
66+
# self.import_trap()
67+
self.finalize()
68+
69+
70+
if __name__ == "__main__":
71+
extractor = Extract(sys.argv[1], sys.argv[2])
72+
extractor.run()

0 commit comments

Comments
 (0)