GP-2070 addressing code review comments

This commit is contained in:
James
2022-07-07 13:50:12 +00:00
parent 86db20d6b3
commit 35caabc29a

View File

@@ -17,6 +17,9 @@ package ghidra.app.plugin.core.string.variadic;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import org.junit.Test; import org.junit.Test;
import ghidra.program.database.ProgramBuilder; import ghidra.program.database.ProgramBuilder;
@@ -25,29 +28,36 @@ import ghidra.program.model.address.AddressFactory;
import ghidra.program.model.data.*; import ghidra.program.model.data.*;
import ghidra.program.model.listing.Program; import ghidra.program.model.listing.Program;
import ghidra.test.AbstractProgramBasedTest; import ghidra.test.AbstractProgramBasedTest;
import ghidra.util.Msg;
public class FormatStringFinderTest extends AbstractProgramBasedTest { public class FormatStringFinderTest extends AbstractProgramBasedTest {
private static final int BASE_ADDRESS = 0x10000; private static final int BASE_ADDRESS = 0x10000;
private static final int LENGTH = 0x1000; private static final int LENGTH = 0x1000;
private static final byte[] SIMPLE_FORMAT = private static final String SIMPLE_FORMAT_STRING = "length: %d";
new byte[] { 'l', 'e', 'n', 'g', 't', 'h', ':', ' ', '%', 'd' }; private static final byte[] SIMPLE_FORMAT_BYTES =
SIMPLE_FORMAT_STRING.getBytes(StandardCharsets.US_ASCII);
private static final int SIMPLE_NON_FORMAT_START = 0x10010; private static final int SIMPLE_NON_FORMAT_START = 0x10010;
private static final byte[] SIMPLE_NON_FORMAT = new byte[] { 'h', 'e', 'l', 'l', 'o' }; private static final String SIMPLE_NON_FORMAT_STRING = "hello";
private static final byte[] SIMPLE_NON_FORMAT_BYTES =
SIMPLE_NON_FORMAT_STRING.getBytes(StandardCharsets.US_ASCII);
private static final int WIDE_CHAR_STRING_START = 0x10020; private static final int WIDE_CHAR_STRING_START = 0x10020;
private static final byte[] WIDE_CHAR_STRING = new byte[] { '%', 0, 0, 0, 's', 0, 0, 0 }; private static final String WCHAR_EXAMPLE = "%s";
private boolean wcharEncoded = false;
private static final int SHORT_FORMAT_STRING_START = 0x10030; private static final int SHORT_FORMAT_STRING_START = 0x10030;
private static final int SHORT_NEAR_END_START = BASE_ADDRESS + LENGTH - 4; private static final int SHORT_NEAR_END_START = BASE_ADDRESS + LENGTH - 4;
private static final byte[] SHORT_FORMAT_STRING = new byte[] { '%', 'd' }; private static final String SHORT_FORMAT_STRING = "%d";
private static final byte[] SHORT_FORMAT_STRING_BYTES =
SHORT_FORMAT_STRING.getBytes(StandardCharsets.US_ASCII);
private static final int ANSI_COLOR_CODE_STRING_START = 0x10040; private static final int ANSI_COLOR_CODE_START = 0x10040;
private static final byte[] ANSI_COLOR_CODE_STRING = private static final String ANSI_COLOR_CODE_STRING = "reproduces error : %s!\n\u001b[0m";
new byte[] { 'r', 'e', 'p', 'r', 'o', 'd', 'u', 'c', 'e', 's', ' ', 'e', 'r', 'r', 'o', 'r', private static final byte[] ANSI_COLOR_CODE_BYTES =
' ', ':', ' ', '%', 's', '!', '\n', 0x1b, '[', '0', 'm' }; ANSI_COLOR_CODE_STRING.getBytes(StandardCharsets.US_ASCII);
@Test @Test
public void testNullTerminatedStringFinder() throws Exception { public void testNullTerminatedStringFinder() throws Exception {
@@ -61,27 +71,29 @@ public class FormatStringFinderTest extends AbstractProgramBasedTest {
Address base = addrFactory.getConstantAddress(BASE_ADDRESS); Address base = addrFactory.getConstantAddress(BASE_ADDRESS);
String simpleFormat = parser.findNullTerminatedString(base, charPointer); String simpleFormat = parser.findNullTerminatedString(base, charPointer);
assertEquals(new String(SIMPLE_FORMAT), simpleFormat); assertEquals(SIMPLE_FORMAT_STRING, simpleFormat);
Address simpleNonFormatAddr = addrFactory.getConstantAddress(SIMPLE_NON_FORMAT_START); Address simpleNonFormatAddr = addrFactory.getConstantAddress(SIMPLE_NON_FORMAT_START);
String simpleNonFormat = parser.findNullTerminatedString(simpleNonFormatAddr, charPointer); String simpleNonFormat = parser.findNullTerminatedString(simpleNonFormatAddr, charPointer);
assertEquals(new String(SIMPLE_NON_FORMAT), simpleNonFormat); assertEquals(SIMPLE_NON_FORMAT_STRING, simpleNonFormat);
Address wideCharStringAddr = addrFactory.getConstantAddress(WIDE_CHAR_STRING_START); if (wcharEncoded) {
String wide = parser.findNullTerminatedString(wideCharStringAddr, widePointer); Address wideCharStringAddr = addrFactory.getConstantAddress(WIDE_CHAR_STRING_START);
assertEquals("%s", wide); String wide = parser.findNullTerminatedString(wideCharStringAddr, widePointer);
assertEquals(WCHAR_EXAMPLE, wide);
}
Address shortAddr = addrFactory.getConstantAddress(SHORT_FORMAT_STRING_START); Address shortAddr = addrFactory.getConstantAddress(SHORT_FORMAT_STRING_START);
String shortString = parser.findNullTerminatedString(shortAddr, charPointer); String shortString = parser.findNullTerminatedString(shortAddr, charPointer);
assertEquals(new String(SHORT_FORMAT_STRING), shortString); assertEquals(SHORT_FORMAT_STRING, shortString);
Address shortNearEndAddr = addrFactory.getConstantAddress(SHORT_NEAR_END_START); Address shortNearEndAddr = addrFactory.getConstantAddress(SHORT_NEAR_END_START);
shortString = parser.findNullTerminatedString(shortNearEndAddr, charPointer); shortString = parser.findNullTerminatedString(shortNearEndAddr, charPointer);
assertEquals(new String(SHORT_FORMAT_STRING), shortString); assertEquals(SHORT_FORMAT_STRING, shortString);
Address ansiColorAddr = addrFactory.getConstantAddress(ANSI_COLOR_CODE_STRING_START); Address ansiColorAddr = addrFactory.getConstantAddress(ANSI_COLOR_CODE_START);
String ansiColorString = parser.findNullTerminatedString(ansiColorAddr, charPointer); String ansiColorString = parser.findNullTerminatedString(ansiColorAddr, charPointer);
assertEquals(new String(ANSI_COLOR_CODE_STRING), ansiColorString); assertEquals(ANSI_COLOR_CODE_STRING, ansiColorString);
} }
@@ -92,13 +104,20 @@ public class FormatStringFinderTest extends AbstractProgramBasedTest {
builder = new ProgramBuilder("test", ProgramBuilder._X64, "gcc", null); builder = new ProgramBuilder("test", ProgramBuilder._X64, "gcc", null);
builder.createMemory("test", Integer.toHexString(BASE_ADDRESS), LENGTH, "test", builder.createMemory("test", Integer.toHexString(BASE_ADDRESS), LENGTH, "test",
(byte) 0x0); (byte) 0x0);
builder.setBytes(Integer.toHexString(BASE_ADDRESS), SIMPLE_FORMAT); builder.setBytes(Integer.toHexString(BASE_ADDRESS), SIMPLE_FORMAT_BYTES);
builder.setBytes(Integer.toHexString(SIMPLE_NON_FORMAT_START), SIMPLE_NON_FORMAT); builder.setBytes(Integer.toHexString(SIMPLE_NON_FORMAT_START), SIMPLE_NON_FORMAT_BYTES);
builder.setBytes(Integer.toHexString(WIDE_CHAR_STRING_START), WIDE_CHAR_STRING); try {
builder.setBytes(Integer.toHexString(SHORT_FORMAT_STRING_START), SHORT_FORMAT_STRING); builder.setBytes(Integer.toHexString(WIDE_CHAR_STRING_START),
builder.setBytes(Integer.toHexString(SHORT_NEAR_END_START), SHORT_FORMAT_STRING); WCHAR_EXAMPLE.getBytes("UTF-32LE"));
builder.setBytes(Integer.toHexString(ANSI_COLOR_CODE_STRING_START), wcharEncoded = true;
ANSI_COLOR_CODE_STRING); }
catch (UnsupportedEncodingException e) {
Msg.warn(this, e.getMessage());
}
builder.setBytes(Integer.toHexString(SHORT_FORMAT_STRING_START),
SHORT_FORMAT_STRING_BYTES);
builder.setBytes(Integer.toHexString(SHORT_NEAR_END_START), SHORT_FORMAT_STRING_BYTES);
builder.setBytes(Integer.toHexString(ANSI_COLOR_CODE_START), ANSI_COLOR_CODE_BYTES);
} }
catch (Exception e) { catch (Exception e) {
fail("Exception creating testing program: " + e.getMessage()); fail("Exception creating testing program: " + e.getMessage());