mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-05-22 10:02:49 +08:00
Add support for copying bytes formatted as Python byte-string, Python list, and C/Java array
This commit is contained in:
+18
@@ -77,6 +77,9 @@ public class CodeBrowserClipboardProvider extends ByteCopier
|
||||
list.add(COMMENTS_TYPE);
|
||||
list.add(BYTE_STRING_TYPE);
|
||||
list.add(BYTE_STRING_NO_SPACE_TYPE);
|
||||
list.add(PYTHON_BYTE_STRING_TYPE);
|
||||
list.add(PYTHON_LIST_TYPE);
|
||||
list.add(CPP_BYTE_ARRAY_TYPE);
|
||||
list.add(ADDRESS_TEXT_TYPE);
|
||||
|
||||
return list;
|
||||
@@ -239,6 +242,21 @@ public class CodeBrowserClipboardProvider extends ByteCopier
|
||||
String byteString = copyBytesAsString(getSelectedAddresses(), false, monitor);
|
||||
return new ByteViewerTransferable(byteString);
|
||||
}
|
||||
else if (copyType == PYTHON_BYTE_STRING_TYPE) {
|
||||
String byteString = "b'"
|
||||
+ copyBytesAsString(currentSelection, true, monitor).replaceAll(" ", "\\x") + "'";
|
||||
return new ByteViewerTransferable(byteString);
|
||||
}
|
||||
else if (copyType == PYTHON_LIST_TYPE) {
|
||||
String byteString = "[ "
|
||||
+ copyBytesAsString(currentSelection, true, monitor).replaceAll(" ", ", 0x") + " ]";
|
||||
return new ByteViewerTransferable(byteString);
|
||||
}
|
||||
else if (copyType == CPP_BYTE_ARRAY_TYPE) {
|
||||
String byteString = "{ "
|
||||
+ copyBytesAsString(currentSelection, true, monitor).replaceAll(" ", ", 0x") + " }";
|
||||
return new ByteViewerTransferable(byteString);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -46,12 +46,23 @@ public abstract class ByteCopier {
|
||||
public static DataFlavor BYTE_STRING_FLAVOR = createByteStringLocalDataTypeFlavor();
|
||||
public static DataFlavor BYTE_STRING_NO_SPACES_FLAVOR =
|
||||
createByteStringNoSpacesLocalDataTypeFlavor();
|
||||
public static DataFlavor PYTHON_BYTE_STRING_FLAVOR =
|
||||
createPythonByteStringLocalDataTypeFlavor();
|
||||
public static DataFlavor PYTHON_LIST_FLAVOR = createPythonListLocalDataTypeFlavor();
|
||||
public static DataFlavor CPP_BYTE_ARRAY_FLAVOR =
|
||||
createCppByteArrayLocalDataTypeFlavor();
|
||||
|
||||
protected static final List<ClipboardType> EMPTY_LIST = Collections.emptyList();
|
||||
public static final ClipboardType BYTE_STRING_TYPE =
|
||||
new ClipboardType(BYTE_STRING_FLAVOR, "Byte String");
|
||||
public static final ClipboardType BYTE_STRING_NO_SPACE_TYPE =
|
||||
new ClipboardType(BYTE_STRING_NO_SPACES_FLAVOR, "Byte String (No Spaces)");
|
||||
public static final ClipboardType PYTHON_BYTE_STRING_TYPE =
|
||||
new ClipboardType(PYTHON_BYTE_STRING_FLAVOR, "Python Byte String");
|
||||
public static final ClipboardType PYTHON_LIST_TYPE =
|
||||
new ClipboardType(PYTHON_LIST_FLAVOR, "Python List");
|
||||
public static final ClipboardType CPP_BYTE_ARRAY_TYPE =
|
||||
new ClipboardType(CPP_BYTE_ARRAY_FLAVOR, "C Array");
|
||||
|
||||
private static DataFlavor createByteStringLocalDataTypeFlavor() {
|
||||
|
||||
@@ -83,6 +94,51 @@ public abstract class ByteCopier {
|
||||
return null;
|
||||
}
|
||||
|
||||
private static DataFlavor createPythonByteStringLocalDataTypeFlavor() {
|
||||
|
||||
try {
|
||||
return new GenericDataFlavor(
|
||||
DataFlavor.javaJVMLocalObjectMimeType + "; class=java.lang.String",
|
||||
"Local flavor--Python byte string");
|
||||
}
|
||||
catch (Exception e) {
|
||||
Msg.showError(ByteCopier.class, null, "Could Not Create Data Flavor",
|
||||
"Unexpected exception creating data flavor for Python byte string", e);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static DataFlavor createPythonListLocalDataTypeFlavor() {
|
||||
|
||||
try {
|
||||
return new GenericDataFlavor(
|
||||
DataFlavor.javaJVMLocalObjectMimeType + "; class=java.lang.String",
|
||||
"Local flavor--Python list");
|
||||
}
|
||||
catch (Exception e) {
|
||||
Msg.showError(ByteCopier.class, null, "Could Not Create Data Flavor",
|
||||
"Unexpected exception creating data flavor for Python list", e);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static DataFlavor createCppByteArrayLocalDataTypeFlavor() {
|
||||
|
||||
try {
|
||||
return new GenericDataFlavor(
|
||||
DataFlavor.javaJVMLocalObjectMimeType + "; class=java.lang.String",
|
||||
"Local flavor--C++ array");
|
||||
}
|
||||
catch (Exception e) {
|
||||
Msg.showError(ByteCopier.class, null, "Could Not Create Data Flavor",
|
||||
"Unexpected exception creating data flavor for C array", e);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
protected PluginTool tool;
|
||||
protected Program currentProgram;
|
||||
protected ProgramSelection currentSelection;
|
||||
@@ -392,7 +448,9 @@ public abstract class ByteCopier {
|
||||
public static class ByteViewerTransferable implements Transferable {
|
||||
|
||||
private final DataFlavor[] flavors = { BYTE_STRING_NO_SPACE_TYPE.getFlavor(),
|
||||
BYTE_STRING_TYPE.getFlavor(), DataFlavor.stringFlavor };
|
||||
BYTE_STRING_TYPE.getFlavor(), PYTHON_BYTE_STRING_TYPE.getFlavor(),
|
||||
PYTHON_LIST_TYPE.getFlavor(), CPP_BYTE_ARRAY_TYPE.getFlavor(),
|
||||
DataFlavor.stringFlavor };
|
||||
private final List<DataFlavor> flavorList = Arrays.asList(flavors);
|
||||
|
||||
private final String byteString;
|
||||
@@ -423,6 +481,15 @@ public abstract class ByteCopier {
|
||||
if (flavor.equals(BYTE_STRING_NO_SPACE_TYPE.getFlavor())) {
|
||||
return byteString;
|
||||
}
|
||||
if (flavor.equals(PYTHON_BYTE_STRING_TYPE.getFlavor())) {
|
||||
return byteString;
|
||||
}
|
||||
if (flavor.equals(PYTHON_LIST_TYPE.getFlavor())) {
|
||||
return byteString;
|
||||
}
|
||||
if (flavor.equals(CPP_BYTE_ARRAY_TYPE.getFlavor())) {
|
||||
return byteString;
|
||||
}
|
||||
throw new UnsupportedFlavorException(flavor);
|
||||
}
|
||||
|
||||
|
||||
+15
@@ -43,6 +43,9 @@ public class ByteViewerClipboardProvider extends ByteCopier
|
||||
List<ClipboardType> copyTypesList = new LinkedList<>();
|
||||
copyTypesList.add(BYTE_STRING_TYPE);
|
||||
copyTypesList.add(BYTE_STRING_NO_SPACE_TYPE);
|
||||
copyTypesList.add(PYTHON_BYTE_STRING_TYPE);
|
||||
copyTypesList.add(PYTHON_LIST_TYPE);
|
||||
copyTypesList.add(CPP_BYTE_ARRAY_TYPE);
|
||||
return copyTypesList;
|
||||
}
|
||||
|
||||
@@ -117,6 +120,18 @@ public class ByteViewerClipboardProvider extends ByteCopier
|
||||
else if (copyType == BYTE_STRING_NO_SPACE_TYPE) {
|
||||
byteString = copyBytesAsString(currentSelection, false, monitor);
|
||||
}
|
||||
else if (copyType == PYTHON_BYTE_STRING_TYPE) {
|
||||
byteString = "b'"
|
||||
+ copyBytesAsString(currentSelection, true, monitor).replaceAll(" ", "\\x") + "'";
|
||||
}
|
||||
else if (copyType == PYTHON_LIST_TYPE) {
|
||||
byteString = "[ "
|
||||
+ copyBytesAsString(currentSelection, true, monitor).replaceAll(" ", ", 0x") + " ]";
|
||||
}
|
||||
else if (copyType == CPP_BYTE_ARRAY_TYPE) {
|
||||
byteString = "{ "
|
||||
+ copyBytesAsString(currentSelection, true, monitor).replaceAll(" ", ", 0x") + " }";
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user