| java.lang.Object | |
| ↳ | com.pnfsoftware.jeb.core.units.code.asm.memory.VirtualMemoryUtil |
Utility methods for virtual memory classes.
Methods of this class do not raise MemoryException. Instead, they return a boolean value
to notify success or failure of the operation.
| Public Constructors | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| VirtualMemoryUtil() | |||||||||||
| Public Methods | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| static long |
allocate(IVirtualMemory mem, long start, int size, int protection)
Search an available range and allocate at least the requested amount of bytes.
| ||||||||||
| static int |
allocateFillGaps(IVirtualMemory mem, long address, int size, int protection)
Allocate a memory range, filling gaps in between already allocated pages if needed.
| ||||||||||
| static int | convertSegmentFlagsToVMFlags(int segmentFlags) | ||||||||||
| static IVirtualMemory |
createMemory(int spaceBits, int pageBits, Endianness standardEndianness)
Facade factory method returning a concrete, private implementation of an efficient page-based
virtual memory.
| ||||||||||
| static boolean |
deallocate(IVirtualMemory mem, long addr, int size)
Free a range previously allocated with
allocate. | ||||||||||
| static byte[] |
dump(IVirtualMemory vm, long addr, long addrEnd)
Dump a contiguous memory range of memory to a byte array.
| ||||||||||
| static void |
dump(IVirtualMemory vm, long addr, long addrEnd, byte[] dst, int dstOffset)
Dump a contiguous memory range of memory to a buffer.
| ||||||||||
| static void |
dumpToImageFiles(IVirtualMemory vm, File folder, String pfx, String sfx)
Dump a virtual memory to files in a folder.
| ||||||||||
| static void |
dumpToImageFiles(IVirtualMemory vm, File folder)
Dump a virtual memory to files in a folder.
| ||||||||||
| static long |
findAvailableRange(IVirtualMemory mem, long start, int size)
Search for an available memory range.
| ||||||||||
| static long |
findByte(IVirtualMemory mem, long address, long lastAddress, int val)
Search for a single byte of memory.
| ||||||||||
| static long |
findBytes(IVirtualMemory mem, boolean bypassProtection, long address, long lastAddress, byte[] pattern, byte[] patternMask)
Search for bytes in memory, with an optional binary mask.
| ||||||||||
| static IVirtualMemoryShim |
getCopyOnWriteShim(IVirtualMemory mem)
Create a copy-on-write shim of the provided virtual memory, if possible.
| ||||||||||
| static boolean |
isPageAllocated(IVirtualMemory mem, long address)
Verify if a page was allocated (regardless of protection rights on the page).
| ||||||||||
| static int |
read(IVirtualMemory mem, long address)
Read a single byte and perform a zero-extension.
| ||||||||||
| static Long |
readAsLongSafe(IVirtualMemory mem, long address, int size)
Read an integer (byte, short, int or long) and converts it to Long.
| ||||||||||
| static Long | readAsLongSafe(IVirtualMemory mem, Endianness endianness, long address, int size) | ||||||||||
| Long |
readAsUnsignedLongSafe(IVirtualMemory mem, long address, int size)
Read an integer (byte, short, int or long) and zero extend it to Long.
| ||||||||||
| static Long | readAsUnsignedLongSafe(IVirtualMemory mem, Endianness endianness, long address, int size) | ||||||||||
| static boolean |
readBEIntSafe(IVirtualMemory mem, long address, int[] out)
Read a big-endian 32-bit integer.
| ||||||||||
| static boolean |
readBELongSafe(IVirtualMemory mem, long address, long[] out)
Read a big-endian 64-bit integer.
| ||||||||||
| static boolean |
readBEShortSafe(IVirtualMemory mem, long address, short[] out)
Read a big-endian 16-bit integer.
| ||||||||||
| static boolean |
readBooleans(IVirtualMemory mem, long address, boolean[] array, int offset, int count)
Read an array of booleans from memory.
| ||||||||||
| static boolean |
readByteSafe(IVirtualMemory mem, long address, byte[] out)
Read a byte safely (this method does not raise
MemoryException). | ||||||||||
| static boolean |
readBytes(IVirtualMemory mem, long address, byte[] array, int offset, int count)
Read an array of bytes from memory.
| ||||||||||
| static int |
readBytesSafe(IVirtualMemory mem, long address, int size, byte[] dst, int dstOffset, boolean bypassProtection)
Safely read at most the requested amount of bytes.
| ||||||||||
| static int |
readBytesSafe(IVirtualMemory mem, long address, int size, byte[] dst, int dstOffset, int protection)
Safely read at most the requested amount of bytes.
| ||||||||||
| static boolean |
readChars(IVirtualMemory mem, long address, char[] array, int offset, int count)
Read an array of chars from memory.
| ||||||||||
| static boolean |
readDoubles(IVirtualMemory mem, long address, double[] array, int offset, int count)
Read an array of doubles from memory.
| ||||||||||
| static boolean |
readFloats(IVirtualMemory mem, long address, float[] array, int offset, int count)
Read an array of floats from memory.
| ||||||||||
| static boolean |
readIntSafe(Endianness end, IVirtualMemory mem, long address, int[] out)
Read a little-endian 32-bit integer using a specific byte ordering.
| ||||||||||
| static boolean |
readInts(IVirtualMemory mem, long address, int[] array, int offset, int count)
Read an array of ints from memory.
| ||||||||||
| static boolean |
readLEIntSafe(IVirtualMemory mem, long address, int[] out)
Read a little-endian 32-bit integer.
| ||||||||||
| static boolean |
readLELongSafe(IVirtualMemory mem, long address, long[] out)
Read a little-endian 64-bit integer.
| ||||||||||
| static boolean |
readLEShortSafe(IVirtualMemory mem, long address, short[] out)
Read a little-endian 16-bit integer.
| ||||||||||
| static boolean |
readLongSafe(Endianness end, IVirtualMemory mem, long address, long[] out)
Read a little-endian 64-bit integer using a specific byte ordering.
| ||||||||||
| static boolean |
readLongs(IVirtualMemory mem, long address, long[] array, int offset, int count)
Read an array of longs from memory.
| ||||||||||
| static String |
readNullTerminatedStringSafe(IVirtualMemory mem, long address, int maxSize)
Read from memory a series of ASCII characters, terminated by a null byte, and build the
corresponding String.
| ||||||||||
| static boolean |
readSafe(IVirtualMemory mem, long address, byte[] data)
Read an array of bytes from memory (this method does not raise
MemoryException). | ||||||||||
| static boolean |
readShortSafe(Endianness end, IVirtualMemory mem, long address, short[] out)
Read a little-endian 16-bit integer using a specific byte ordering.
| ||||||||||
| static boolean |
readShorts(IVirtualMemory mem, long address, short[] array, int offset, int count)
Read an array of shorts from memory.
| ||||||||||
| static boolean |
writeBooleans(IVirtualMemory mem, long address, boolean[] array, int offset, int count)
Write an array of booleans to memory.
| ||||||||||
| static boolean |
writeByteSafe(IVirtualMemory mem, long address, byte v)
Write an 8-bit integer.
| ||||||||||
| static boolean |
writeBytes(IVirtualMemory mem, long address, byte[] array, int offset, int count)
Write an array of bytes to memory.
| ||||||||||
| static boolean |
writeChars(IVirtualMemory mem, long address, char[] array, int offset, int count)
Write an array of chars to memory.
| ||||||||||
| static boolean |
writeDoubles(IVirtualMemory mem, long address, double[] array, int offset, int count)
Write an array of doubles to memory.
| ||||||||||
| static boolean |
writeFloats(IVirtualMemory mem, long address, float[] array, int offset, int count)
Write an array of floats to memory.
| ||||||||||
| static boolean |
writeIntSafe(Endianness end, IVirtualMemory mem, long address, int v)
Write a little-endian 32-bit integer using a specific byte ordering.
| ||||||||||
| static boolean |
writeInts(IVirtualMemory mem, long address, int[] array, int offset, int count)
Write an array of ints to memory.
| ||||||||||
| static boolean |
writeLEIntSafe(IVirtualMemory mem, long address, int v)
Write a little-endian 32-bit integer.
| ||||||||||
| static boolean |
writeLELongSafe(IVirtualMemory mem, long address, long v)
Write a little-endian 64-bit integer.
| ||||||||||
| static boolean |
writeLEShortSafe(IVirtualMemory mem, long address, short v)
Write a little-endian 16-bit integer.
| ||||||||||
| static boolean |
writeLongSafe(Endianness end, IVirtualMemory mem, long address, long v)
Write a little-endian 64-bit integer using a specific byte ordering.
| ||||||||||
| static boolean |
writeLongs(IVirtualMemory mem, long address, long[] array, int offset, int count)
Write an array of longs to memory.
| ||||||||||
| static boolean |
writeSafe(IVirtualMemory mem, long address, byte[] data)
Write an array of bytes to memory (this method does not raise
MemoryException). | ||||||||||
| static boolean |
writeShortSafe(Endianness end, IVirtualMemory mem, long address, short v)
Write a little-endian 16-bit integer using a specific byte ordering.
| ||||||||||
| static boolean |
writeShorts(IVirtualMemory mem, long address, short[] array, int offset, int count)
Write an array of shorts to memory.
| ||||||||||
|
[Expand]
Inherited Methods | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
From class
java.lang.Object
| |||||||||||
Search an available range and allocate at least the requested amount of bytes. Do not confuse
this method with allocate(long, int, int).
| start | soft start address, considered a hint by this allocator routine; if you wish to
allocate at a fixed, given address, use
allocate(long, int, int) |
|---|---|
| size | range size |
Allocate a memory range, filling gaps in between already allocated pages if needed. (The given range [address, address + size) may have already allocated pages. Those pages will not be re-allocated.) When the method returns, the range [address, address + size) is guaranteed to be allocated.
Facade factory method returning a concrete, private implementation of an efficient page-based virtual memory.
Free a range previously allocated with allocate.
| addr | range start address |
|---|---|
| size | range size |
Dump a contiguous memory range of memory to a byte array. Illegal pages (non-allocated) are dumped as empty pages (all bytes are zero).
| vm | virtual memory |
|---|---|
| addr | start address |
| addrEnd | end address |
Dump a contiguous memory range of memory to a buffer. Illegal pages (non-allocated) are dumped as empty pages (all bytes are zero).
| vm | virtual memory |
|---|---|
| addr | start address |
| addrEnd | end address |
| dst | destination buffer |
| dstOffset | offset in the destination |
Dump a virtual memory to files in a folder. The files will be named
[PREFIX][MEMORY_RANGE_START][SUFFIX].
| vm | virtual memory |
|---|---|
| folder | destination folder; if it does not exist, a new folder will be created |
| pfx | optional prefix for the filenames |
| sfx | optional suffix for the filenames |
| IOException |
|---|
Dump a virtual memory to files in a folder. The files will be named as the start of the memory range (in hex) they contain.
| vm | virtual memory |
|---|---|
| folder | destination folder; if it does not exist, a new folder will be created |
| IOException |
|---|
Search for an available memory range.
| start | soft start address, a hint |
|---|---|
| size | range size |
Search for a single byte of memory. Similar as memchr or memrchr (if
`lastAddress` is less than `address`).
Search for bytes in memory, with an optional binary mask. The search can either be forward (default), in which case the resulting found address will be either -1 or ≥ the start address, or backward, in which case the resulting found address will be either -1 or ≤ the start address.
| mem | memory to be searched |
|---|---|
| bypassProtection | if true, memory page protection is disregarded, in which case all pages, including non-readable ones, will be searched |
| address | start address for the search (this value is treated as unsigned) |
| lastAddress | end address (the value is treated as unsigned); may be less than the start address, in which case a reverse search will be performed |
| pattern | bytes to search for; the maximum allowed length is the memory's page size |
| patternMask | optional binary mask for a wildcard search; if non-null, must be the same length as the pattern's |
Create a copy-on-write shim of the provided virtual memory, if possible. The shim can be used to perform safe memory writes, that will not impact the underlying memory. Using a shim yields better performance than copying the entire source VM and working on the full copy.
| mem | a VM |
|---|
| IllegalArgumentException | if the provided VM object does not support the creation of a shim |
|---|
Verify if a page was allocated (regardless of protection rights on the page).
Read a single byte and perform a zero-extension. This method does not raise
MemoryException; on error, -1 is returned.
Read an integer (byte, short, int or long) and converts it to Long. Standard memory byte ordering is used for decoding.
| mem | the virtual memory |
|---|---|
| address | memory address of the data |
| size | any of 1, 2, 4, or 8 |
Read an integer (byte, short, int or long) and zero extend it to Long. Standard memory byte ordering is used for decoding. Note that if a signed long is read, the value may be negative (overflow should be appreciated by caller).
| mem | the virtual memory |
|---|---|
| address | memory address of the data |
| size | any of 1, 2, 4, or 8 |
Read a big-endian 32-bit integer.
| mem | virtual memory |
|---|---|
| address | memory address |
| out | single-element array that will receive the result of the read operation |
Read a big-endian 64-bit integer.
| mem | virtual memory |
|---|---|
| address | memory address |
| out | single-element array that will receive the result of the read operation |
Read a big-endian 16-bit integer.
| mem | virtual memory |
|---|---|
| address | memory address |
| out | single-element array that will receive the result of the read operation |
Read an array of booleans from memory. Each entry occupies 1 byte of memory, the lower-significant bit of the byte indicates false(0) or true(1).
| mem | virtual memory |
|---|---|
| address | memory address |
| array | array |
| offset | start offset in the array |
| count | count of elements to write |
Read a byte safely (this method does not raise MemoryException).
| mem | virtual memory |
|---|---|
| address | memory address |
| out | single-element array that will receive the result of the read operation |
Read an array of bytes from memory.
| mem | virtual memory |
|---|---|
| address | memory address |
| array | array |
| offset | start offset in the array |
| count | count of elements to write |
Safely read at most the requested amount of bytes.
| mem | the memory |
|---|---|
| address | target address |
| size | requested read size |
| dst | destination buffer |
| dstOffset | position within the destination buffer |
| bypassProtection | if true, all pages will be read, including non-resable pages; else, only readable pages will be read |
Safely read at most the requested amount of bytes.
| mem | the memory |
|---|---|
| address | target address |
| size | requested read size |
| dst | destination buffer |
| dstOffset | position within the destination buffer |
| protection | the requested protection level, must contain at least
ACCESS_READ |
Read an array of chars from memory. Each entry occupies 2 bytes of memory. Byte ordering is determined from the virtual memory endianness setting.
| mem | virtual memory |
|---|---|
| address | memory address |
| array | array |
| offset | start offset in the array |
| count | count of elements to write |
Read an array of doubles from memory. Each entry occupies 8 bytes of memory. Byte ordering is determined from the virtual memory endianness setting.
| mem | virtual memory |
|---|---|
| address | memory address |
| array | array |
| offset | start offset in the array |
| count | count of elements to write |
Read an array of floats from memory. Each entry occupies 4 bytes of memory. Byte ordering is determined from the virtual memory endianness setting.
| mem | virtual memory |
|---|---|
| address | memory address |
| array | array |
| offset | start offset in the array |
| count | count of elements to write |
Read a little-endian 32-bit integer using a specific byte ordering.
| end | wanted endianness (little or big) |
|---|---|
| mem | virtual memory |
| address | memory address |
| out | single-element array that will receive the result of the read operation |
Read an array of ints from memory. Each entry occupies 4 bytes of memory. Byte ordering is determined from the virtual memory endianness setting.
| mem | virtual memory |
|---|---|
| address | memory address |
| array | array |
| offset | start offset in the array |
| count | count of elements to write |
Read a little-endian 32-bit integer.
| mem | virtual memory |
|---|---|
| address | memory address |
| out | single-element array that will receive the result of the read operation |
Read a little-endian 64-bit integer.
| mem | virtual memory |
|---|---|
| address | memory address |
| out | single-element array that will receive the result of the read operation |
Read a little-endian 16-bit integer.
| mem | virtual memory |
|---|---|
| address | memory address |
| out | single-element array that will receive the result of the read operation |
Read a little-endian 64-bit integer using a specific byte ordering.
| end | wanted endianness (little or big) |
|---|---|
| mem | virtual memory |
| address | memory address |
| out | single-element array that will receive the result of the read operation |
Read an array of longs from memory. Each entry occupies 8 bytes of memory. Byte ordering is determined from the virtual memory endianness setting.
| mem | virtual memory |
|---|---|
| address | memory address |
| array | array |
| offset | start offset in the array |
| count | count of elements to write |
Read from memory a series of ASCII characters, terminated by a null byte, and build the corresponding String. If no null-byte is found, the search stops at the provided maxSize.
This method does not raise MemoryException.
| mem | a VM |
|---|---|
| address | memory address |
| maxSize | maximum string length in ascii characters |
Read an array of bytes from memory (this method does not raise MemoryException).
Read a little-endian 16-bit integer using a specific byte ordering.
| end | wanted endianness (little or big) |
|---|---|
| mem | virtual memory |
| address | memory address |
| out | single-element array that will receive the result of the read operation |
Read an array of shorts from memory. Each entry occupies 2 bytes of memory. Byte ordering is determined from the virtual memory endianness setting.
| mem | virtual memory |
|---|---|
| address | memory address |
| array | array |
| offset | start offset in the array |
| count | count of elements to write |
Write an array of booleans to memory. Each entry occupies 1 byte whose value will be set to 0(false) or 1(true).
| mem | virtual memory |
|---|---|
| address | memory address |
| array | array |
| offset | start offset in the array |
| count | count of elements to write |
Write an 8-bit integer.
| mem | virtual memory |
|---|---|
| address | memory address |
| v | value to be written |
Write an array of bytes to memory.
| mem | virtual memory |
|---|---|
| address | memory address |
| array | array |
| offset | start offset in the array |
| count | count of elements to write |
Write an array of chars to memory. Each entry occupies 2 bytes of memory. Byte ordering is determined from the virtual memory endianness setting.
| mem | virtual memory |
|---|---|
| address | memory address |
| array | array |
| offset | start offset in the array |
| count | count of elements to write |
Write an array of doubles to memory. Each entry occupies 8 bytes of memory. The encoding used is IEEE754. Byte ordering is determined from the virtual memory endianness setting.
| mem | virtual memory |
|---|---|
| address | memory address |
| array | array |
| offset | start offset in the array |
| count | count of elements to write |
Write an array of floats to memory. Each entry occupies 4 bytes of memory. The encoding used is IEEE754. Byte ordering is determined from the virtual memory endianness setting.
| mem | virtual memory |
|---|---|
| address | memory address |
| array | array |
| offset | start offset in the array |
| count | count of elements to write |
Write a little-endian 32-bit integer using a specific byte ordering.
| end | wanted endianness (little or big) |
|---|---|
| mem | virtual memory |
| address | memory address |
| v | value to be written |
Write an array of ints to memory. Each entry occupies 4 bytes of memory. Byte ordering is determined from the virtual memory endianness setting.
| mem | virtual memory |
|---|---|
| address | memory address |
| array | array |
| offset | start offset in the array |
| count | count of elements to write |
Write a little-endian 32-bit integer.
| mem | virtual memory |
|---|---|
| address | memory address |
| v | value to be written |
Write a little-endian 64-bit integer.
| mem | virtual memory |
|---|---|
| address | memory address |
| v | value to be written |
Write a little-endian 16-bit integer.
| mem | virtual memory |
|---|---|
| address | memory address |
| v | value to be written |
Write a little-endian 64-bit integer using a specific byte ordering.
| end | wanted endianness (little or big) |
|---|---|
| mem | virtual memory |
| address | memory address |
| v | value to be written |
Write an array of longs to memory. Each entry occupies 8 bytes of memory. Byte ordering is determined from the virtual memory endianness setting.
| mem | virtual memory |
|---|---|
| address | memory address |
| array | array |
| offset | start offset in the array |
| count | count of elements to write |
Write an array of bytes to memory (this method does not raise MemoryException).
Write a little-endian 16-bit integer using a specific byte ordering.
| end | wanted endianness (little or big) |
|---|---|
| mem | virtual memory |
| address | memory address |
| v | value to be written |
Write an array of shorts to memory. Each entry occupies 2 bytes of memory. Byte ordering is determined from the virtual memory endianness setting.
| mem | virtual memory |
|---|---|
| address | memory address |
| array | array |
| offset | start offset in the array |
| count | count of elements to write |