mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-03 17:59:46 +02:00

A large binary with lots of strings can cause the "Defined Strings" table to fight with the Listing view over database locks. This change eases some of the issues by making the defined strings table be nicer by yielding to the swing thread before starting its query loop (which allows a Listing view which is also doing its full rendering at the same time to finish before the loop starts) and making the DefinedDataIterator a bit smarter about what elements it needs to recurse into. The Listing can still be quite a bit laggy when the Defined Strings table is loading. Also fixed a logic error in StringDataInstance that caused it to return a empty string for arrays of character elements.
61 lines
1.9 KiB
Java
61 lines
1.9 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.
|
|
*/
|
|
//Example skeleton script that iterates over all strings and sets the translation value for each
|
|
//@category Strings
|
|
|
|
import ghidra.app.script.GhidraScript;
|
|
import ghidra.program.model.data.StringDataInstance;
|
|
import ghidra.program.model.data.TranslationSettingsDefinition;
|
|
import ghidra.program.model.listing.Data;
|
|
import ghidra.program.util.DefinedDataIterator;
|
|
import util.CollectionUtils;
|
|
|
|
public class TranslateStringsScript extends GhidraScript {
|
|
|
|
private String translateString(String s) {
|
|
// customize here
|
|
return "TODO " + s + " TODO";
|
|
}
|
|
|
|
@Override
|
|
public void run() throws Exception {
|
|
|
|
if (currentProgram == null) {
|
|
return;
|
|
}
|
|
|
|
int count = 0;
|
|
monitor.initialize(currentProgram.getListing().getNumDefinedData());
|
|
monitor.setMessage("Translating strings");
|
|
for (Data data : CollectionUtils.asIterable(
|
|
DefinedDataIterator.definedStrings(currentProgram, currentSelection))) {
|
|
if (monitor.isCancelled()) {
|
|
break;
|
|
}
|
|
StringDataInstance str = StringDataInstance.getStringDataInstance(data);
|
|
String s = str.getStringValue();
|
|
if (s != null) {
|
|
TranslationSettingsDefinition.TRANSLATION.setTranslatedValue(data,
|
|
translateString(s));
|
|
TranslationSettingsDefinition.TRANSLATION.setShowTranslated(data, true);
|
|
count++;
|
|
monitor.incrementProgress(1);
|
|
}
|
|
}
|
|
println("Translated " + count + " strings.");
|
|
}
|
|
|
|
}
|