Memory and Pointers
Access Memory interface
1Memory memory = emulator.getMemory();
2Backend backend = emulator.getBackend();
Read memory
1// Via Backend
2byte[] bytes = backend.mem_read(address, length);
3
4// Via UnidbgPointer
5UnidbgPointer ptr = UnidbgPointer.pointer(emulator, address);
6byte[] data = ptr.getByteArray(0, length);
7int intVal = ptr.getInt(0);
8long longVal = ptr.getLong(0);
9String str = ptr.getString(0);
Write memory
1// Via Backend
2backend.mem_write(address, bytes);
3
4// Via UnidbgPointer
5UnidbgPointer ptr = UnidbgPointer.pointer(emulator, address);
6ptr.write(0, bytes, 0, bytes.length);
7ptr.setInt(0, 42);
8ptr.setLong(0, 42L);
Allocate memory
1// Allocate on heap
2MemoryBlock block = emulator.getMemory().malloc(size, false);
3UnidbgPointer ptr = block.getPointer();
4long address = ptr.peer;
5
6// Allocate on stack
7UnidbgPointer stackPtr = memory.allocateStack(size);
UnidbgPointer arithmetic
1UnidbgPointer ptr = UnidbgPointer.pointer(emulator, baseAddr);
2UnidbgPointer next = ptr.share(offset); // ptr + offset
3UnidbgPointer next = ptr.share(offset, size); // with bounds
Write string to memory
1byte[] strBytes = "hello".getBytes(StandardCharsets.UTF_8);
2MemoryBlock block = emulator.getMemory().malloc(strBytes.length + 1, false);
3UnidbgPointer ptr = block.getPointer();
4ptr.write(0, strBytes, 0, strBytes.length);
5ptr.setByte(strBytes.length, (byte) 0); // null terminator
Module base and size
1long base = module.base;
2long size = module.size;
3
4// Compute absolute address from offset
5long funcAddr = module.base + 0x1234;
Register access
1RegisterContext ctx = emulator.getContext();
2
3// ARM32
4int r0 = ctx.getIntArg(0);
5int r1 = ctx.getIntArg(1);
6
7// ARM64
8long x0 = ctx.getLongArg(0);
9long x1 = ctx.getLongArg(1);
10
11// Read/write specific register
12long sp = backend.reg_read(ArmConst.UC_ARM_REG_SP);
13backend.reg_write(ArmConst.UC_ARM_REG_R0, 0L);
Key classes
| Class | Path |
|---|
Memory (interface) | unidbg-api/.../memory/Memory.java |
UnidbgPointer | unidbg-api/.../pointer/UnidbgPointer.java |
MemoryBlock | unidbg-api/.../memory/MemoryBlock.java |
Backend (interface) | unidbg-api/.../arm/backend/Backend.java |
RegisterContext | unidbg-api/.../arm/context/RegisterContext.java |