Skip to content

Added ByteArrayPayloadModification #31

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Sep 24, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>de.rub.nds</groupId>
<artifactId>ModifiableVariable</artifactId>
<version>2.3</version>
<version>2.4</version>
<packaging>jar</packaging>

<name>ModifiableVariable</name>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,7 @@
import de.rub.nds.modifiablevariable.biginteger.BigIntegerXorModification;
import de.rub.nds.modifiablevariable.bool.BooleanExplicitValueModification;
import de.rub.nds.modifiablevariable.bool.BooleanToogleModification;
import de.rub.nds.modifiablevariable.bytearray.ByteArrayDeleteModification;
import de.rub.nds.modifiablevariable.bytearray.ByteArrayDuplicateModification;
import de.rub.nds.modifiablevariable.bytearray.ByteArrayExplicitValueModification;
import de.rub.nds.modifiablevariable.bytearray.ByteArrayInsertModification;
import de.rub.nds.modifiablevariable.bytearray.ByteArrayShuffleModification;
import de.rub.nds.modifiablevariable.bytearray.ByteArrayXorModification;
import de.rub.nds.modifiablevariable.bytearray.*;
import de.rub.nds.modifiablevariable.filter.AccessModificationFilter;
import de.rub.nds.modifiablevariable.integer.IntegerAddModification;
import de.rub.nds.modifiablevariable.integer.IntegerExplicitValueModification;
Expand Down Expand Up @@ -52,9 +47,9 @@
IntegerExplicitValueModification.class, IntegerSubtractModification.class, IntegerXorModification.class,
IntegerShiftLeftModification.class, IntegerShiftRightModification.class, ByteArrayDeleteModification.class,
ByteArrayExplicitValueModification.class, ByteArrayInsertModification.class, ByteArrayXorModification.class,
ByteArrayDuplicateModification.class, ByteArrayShuffleModification.class, ByteAddModification.class,
ByteExplicitValueModification.class, ByteSubtractModification.class, ByteXorModification.class,
StringExplicitValueModification.class })
ByteArrayDuplicateModification.class, ByteArrayShuffleModification.class, ByteArrayPayloadModification.class,
ByteAddModification.class, ByteExplicitValueModification.class, ByteSubtractModification.class,
ByteXorModification.class, StringExplicitValueModification.class })
public abstract class VariableModification<E> {

protected static final Logger LOGGER = LogManager.getLogger(VariableModification.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,16 @@ public static VariableModification<byte[]> xor(final byte[] xor, final int start
return new ByteArrayXorModification(xor, startPosition);
}

/**
*
* @param payload
* bytes are set as value
* @return variable modification
*/
public static VariableModification<byte[]> payload(final byte[] payload) {
return new ByteArrayPayloadModification(payload);
}

/**
* *
*
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
/**
* ModifiableVariable - A Variable Concept for Runtime Modifications
*
* Copyright 2014-2017 Ruhr University Bochum / Hackmanit GmbH
*
* Licensed under Apache License 2.0
* http://www.apache.org/licenses/LICENSE-2.0
*/
package de.rub.nds.modifiablevariable.bytearray;

import de.rub.nds.modifiablevariable.VariableModification;
import de.rub.nds.modifiablevariable.util.ArrayConverter;
import de.rub.nds.modifiablevariable.util.ByteArrayAdapter;

import java.util.Arrays;
import java.util.Random;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement
@XmlType(propOrder = { "prependPayload", "payload", "appendPayload", "insert", "insertPosition", "modificationFilter",
"postModification" })
public class ByteArrayPayloadModification extends VariableModification<byte[]> {

private byte[] prependPayload = new byte[] {};

private byte[] payload = new byte[] {};

private byte[] appendPayload = new byte[] {};

private boolean insert = false;

private int insertPosition = 0;

public ByteArrayPayloadModification() {

}

public ByteArrayPayloadModification(byte[] payload) {
this.payload = payload;
}

public ByteArrayPayloadModification(byte[] payload, int insertPosition) {
this.payload = payload;
this.insert = true;
this.insertPosition = insertPosition;
}

@Override
protected byte[] modifyImplementationHook(byte[] input) {
byte[] completePayload = getCompletePayload();

if (!insert) {
return completePayload;
}

ByteArrayInsertModification insertMod = new ByteArrayInsertModification(completePayload, this.insertPosition);
return insertMod.modify(input);
}

@XmlJavaTypeAdapter(ByteArrayAdapter.class)
public byte[] getPrependPayload() {
return prependPayload;
}

public void setPrependPayload(byte[] prependPayload) {
this.prependPayload = prependPayload;
}

@XmlJavaTypeAdapter(ByteArrayAdapter.class)
public byte[] getPayload() {
return payload;
}

public void setPayload(byte[] payload) {
this.payload = payload;
}

@XmlJavaTypeAdapter(ByteArrayAdapter.class)
public byte[] getAppendPayload() {
return appendPayload;
}

public void setAppendPayload(byte[] appendPayload) {
this.appendPayload = appendPayload;
}

public boolean isInsert() {
return insert;
}

public void setInsert(boolean insert) {
this.insert = insert;
}

public int getInsertPosition() {
return insertPosition;
}

public void setInsertPosition(int insertPosition) {
this.insertPosition = insertPosition;
}

public byte[] getCompletePayload() {
return ArrayConverter.concatenate(prependPayload, payload, appendPayload);
}

@Override
public VariableModification<byte[]> getModifiedCopy() {
ByteArrayPayloadModification mod = new ByteArrayPayloadModification(payload);
mod.setAppendPayload(appendPayload);
mod.setPrependPayload(prependPayload);

if (this.insert) {
mod.setInsert(true);
mod.setInsertPosition(insertPosition);
return mod;
}

return mod;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@

@XmlRootElement
@XmlSeeAlso({ ByteArrayDeleteModification.class, ByteArrayExplicitValueModification.class,
ByteArrayInsertModification.class, ByteArrayXorModification.class, ByteArrayDuplicateModification.class })
ByteArrayInsertModification.class, ByteArrayXorModification.class, ByteArrayDuplicateModification.class,
ByteArrayPayloadModification.class })
@XmlType(propOrder = { "originalValue", "modification", "assertEquals" })
public class ModifiableByteArray extends ModifiableVariable<byte[]> implements Serializable {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,30 @@ public void testExplicitValue() {
assertArrayEquals(modification1, start.getValue());
}

/**
* Test of payload method, of class ModifiableByteArray.
*/
@Test
public void testPayload() {
LOGGER.info("testPayload");
VariableModification<byte[]> modifier = ByteArrayModificationFactory.payload(modification1);
start.setModification(modifier);
assertArrayEquals(modification1, start.getValue());
}

/**
* Test of payload method, of class ModifiableByteArray.
*/
@Test
public void testPayloadWithInsert() {
LOGGER.info("testPayload");
VariableModification<byte[]> modifier = ByteArrayModificationFactory.payload(modification1);
((ByteArrayPayloadModification) modifier).setInsert(true);
((ByteArrayPayloadModification) modifier).setInsertPosition(0);
start.setModification(modifier);
assertArrayEquals(ArrayConverter.concatenate(modification1, originalValue), start.getValue());
}

/**
* Test of setXorFirstBytes method, of class ModifiableByteArray.
*/
Expand Down