Memory and Pointers

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

ClassPath
Memory (interface)unidbg-api/.../memory/Memory.java
UnidbgPointerunidbg-api/.../pointer/UnidbgPointer.java
MemoryBlockunidbg-api/.../memory/MemoryBlock.java
Backend (interface)unidbg-api/.../arm/backend/Backend.java
RegisterContextunidbg-api/.../arm/context/RegisterContext.java