-
Notifications
You must be signed in to change notification settings - Fork 0
/
Exporter.java
122 lines (108 loc) · 3.19 KB
/
Exporter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*****************************************************************************
* Name : Mike
* Date : 21 Aug 2022
* File : Exporter.java
*****************************************************************************/
import ghidra.app.decompiler.DecompInterface;
import ghidra.app.decompiler.DecompileOptions;
import ghidra.app.decompiler.DecompileResults;
import ghidra.app.util.headless.HeadlessScript;
import ghidra.program.model.listing.Function;
import ghidra.program.model.listing.FunctionIterator;
import ghidra.program.model.listing.Program;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class Exporter extends HeadlessScript
{
@Override
public void run()
{
if (!isRunningHeadless())
{
printerr("This script must be run in headless mode !");
return;
}
String[] strArgumentsArray = getScriptArgs();
if (strArgumentsArray.length == 0)
{
printerr("No output filepath was provided !");
return;
}
String strOutputFilepath = strArgumentsArray[0];
File file = new File(strOutputFilepath);
try
{
if (file.exists())
{
printerr("The file or directory '" + strOutputFilepath + "' already exists !");
return;
}
}
catch (SecurityException securityException)
{
printerr("Failed to access the file or directory '" + strOutputFilepath + "', permission denied !");
return;
}
Program program = this.getCurrentProgram();
DecompInterface decompInterface = new DecompInterface();
if (!decompInterface.openProgram(program))
{
printerr("Failed to initialize a decompiler process !");
return;
}
DecompileOptions decompileOptions = new DecompileOptions();
decompileOptions.setWARNCommentIncluded(false);
if (!decompInterface.setOptions(decompileOptions))
{
printerr("Failed to set the decompiler options !");
decompInterface.closeProgram();
return;
}
FileWriter fileWriter;
try
{
fileWriter = new FileWriter(file);
}
catch (IOException ioException)
{
printerr("Failed to construct a 'FileWriter' object !");
decompInterface.closeProgram();
return;
}
FunctionIterator functionIterator = program.getListing().getFunctions(true);
while (functionIterator.hasNext())
{
Function function = functionIterator.next();
String strFunctionName = function.getName();
if (!strFunctionName.startsWith("FUN_"))
continue;
DecompileResults decompileResults = decompInterface.decompileFunction(function, 30, null);
if (!decompileResults.decompileCompleted())
{
printerr("Failed to decompile the function '" + strFunctionName + "', skipping !");
continue;
}
try
{
fileWriter.write(decompileResults.getDecompiledFunction().getC());
}
catch (IOException ioException)
{
printerr("Failed to write the decompiled version of the function '" + strFunctionName + "' " +
"to the file '" + strOutputFilepath + "', skipping !");
continue;
}
printf("Successfully saved the decompiled version of the function '%s' to the file '%s' !\n", strFunctionName, strOutputFilepath);
}
decompInterface.closeProgram();
try
{
fileWriter.close();
}
catch (IOException ioException)
{
printerr("Failed to close the 'FileWriter' object !");
}
}
}