Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Sample code showing how to reparse unit's binary data as another format
// sample code, needs adjusting/customizing (see TODO tags)
// call reparse() with input information set in a ReparseInformation object
public class ReparseInformation {
IUnit unit;
String subUnitName;
String wantedType;
long offset;
long size;
}
// return the reparsed unit (sub-unit) or null on error
public IUnit reparse(ReparseInformation info)
IUnit unit = info.unit;
IInput subinput = null;
if(unit instanceof IBinaryUnit) {
IInput input = ((IBinaryUnit)unit).getInput();
long offset = info.getOffset();
long size = info.getSize();
long maxsize = input.getCurrentSize();
if((offset + size) > maxsize) {
// sanitize size - or we could bail, because sanitizing was done by ReparseDialog again
size = maxsize - offset;
}
if(offset >= 0 && size >= 0 && offset <= maxsize) {
try {
subinput = new SubInput(input, offset, size);
}
catch(IOException e) {
logger.catching(e);
return null;
}
}
}
IUnitProcessor processor = unit.getUnitProcessor();
IUnitIdentifier ident = processor.getUnitIdentifier(info.getWantedType());
if(ident == null) {
return null;
}
boolean successfullyIdentified = ident.canIdentify(subinput, unit);
if(!successfullyIdentified) {
// TODO: data was not identified as what it should be; can decide to bail or proceed
// return null;
}
IUnit subunit = null;
try {
subunit = ident.prepare(info.getSubUnitName(), subinput, processor, unit);
}
catch(Exception e) {
// do not throw if the unit was not identified - we knew failure was near
if(!successfullyIdentified) {
logger.catching(e);
}
else {
throw e;
}
}
if(subunit == null) {
logger.error("Failed to reparse");
return null;
}
if(subunit instanceof INativeCodeUnit) {
// TODO: may decide to provide additional info. for native code units, eg, a specific image base or endianness info for headless binary blobs
//INativeCodeUnit<?> pbcu = (INativeCodeUnit<?>)subunit;
//pbcu.setVirtualImageBase(...);
//pbcu.getProcessor().setEndianness(...);
}
unit.addChild(subunit);
logger.info("A reparsed sub-unit was created");
return subunit;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment