Skip to content

Commit

Permalink
Merge remote-tracking branch 'remotes/upstream/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
viruscoding committed Dec 3, 2021
2 parents 3b7fb59 + 621ca14 commit 37ae7f1
Show file tree
Hide file tree
Showing 229 changed files with 5,493 additions and 824 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,11 @@ public void context_restore(long context) {
throw new UnsupportedOperationException();
}

@Override
public void context_free(long context) {
throw new UnsupportedOperationException();
}

@Override
public void context_save(long context) {
throw new UnsupportedOperationException();
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,11 @@ public long context_alloc() {
throw new UnsupportedOperationException();
}

@Override
public void context_free(long context) {
throw new UnsupportedOperationException();
}

@Override
public int getPageSize() {
return pageSize;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
package com.github.unidbg.arm.backend.hypervisor;

import capstone.Arm64;
import capstone.Capstone;
import capstone.api.Disassembler;
import capstone.api.DisassemblerFactory;
import capstone.api.Instruction;
import capstone.api.arm64.OpInfo;
import capstone.api.arm64.OpValue;
import capstone.api.arm64.Operand;
import com.alibaba.fastjson.util.IOUtils;
import com.github.unidbg.Emulator;
import com.github.unidbg.Family;
import com.github.unidbg.arm.ARMEmulator;
Expand All @@ -25,14 +31,14 @@ public HypervisorBackend64(Emulator<?> emulator, Hypervisor hypervisor) throws B
super(emulator, hypervisor);
}

private Capstone capstoneInst;
private Disassembler disassembler;

private synchronized Capstone createCapstone() {
if (capstoneInst == null) {
this.capstoneInst = new Capstone(Capstone.CS_ARCH_ARM64, Capstone.CS_MODE_ARM);
this.capstoneInst.setDetail(Capstone.CS_OPT_ON);
private synchronized Disassembler createDisassembler() {
if (disassembler == null) {
this.disassembler = DisassemblerFactory.createDisassembler(Capstone.CS_ARCH_ARM64, Capstone.CS_MODE_ARM);
this.disassembler.setDetail(true);
}
return capstoneInst;
return disassembler;
}

private static final long DARWIN_KERNEL_BASE = 0xffffff80001f0000L;
Expand Down Expand Up @@ -91,22 +97,23 @@ private boolean handleCommRead(long vaddr, long elr) {
Pointer pc = UnidbgPointer.pointer(emulator, elr);
assert pc != null;
byte[] code = pc.getByteArray(0, 4);
Capstone.CsInsn insn = createCapstone().disasm(code, elr, 1)[0];
Instruction insn = createDisassembler().disasm(code, elr, 1)[0];
if (log.isDebugEnabled()) {
log.debug("handleCommRead vaddr=0x" + Long.toHexString(vaddr) + ", elr=0x" + Long.toHexString(elr) + ", asm=" + insn.mnemonic + " " + insn.opStr);
log.debug("handleCommRead vaddr=0x" + Long.toHexString(vaddr) + ", elr=0x" + Long.toHexString(elr) + ", asm=" + insn);
}
Arm64.OpInfo opInfo = (Arm64.OpInfo) insn.operands;
if (opInfo.updateFlags || opInfo.writeback || !insn.mnemonic.startsWith("ldr") || vaddr < _COMM_PAGE64_BASE_ADDRESS) {
OpInfo opInfo = (OpInfo) insn.getOperands();
if (opInfo.isUpdateFlags() || opInfo.isWriteBack() || !insn.getMnemonic().startsWith("ldr") || vaddr < _COMM_PAGE64_BASE_ADDRESS) {
throw new UnsupportedOperationException();
}
Operand[] op = opInfo.getOperands();
int offset = (int) (vaddr - _COMM_PAGE64_BASE_ADDRESS);
switch (offset) {
case 0x38: // uint64_t max memory size */
case 0x40:
case 0x58: {
Arm64.Operand operand = opInfo.op[0];
Arm64.OpValue value = operand.value;
reg_write(value.reg, 0x0L);
Operand operand = op[0];
OpValue value = operand.getValue();
reg_write(value.getReg(), 0x0L);
hypervisor.reg_set_elr_el1(elr + 4);
return true;
}
Expand All @@ -116,24 +123,24 @@ private boolean handleCommRead(long vaddr, long elr) {
case 0x60:
case 0x64:
case 0x90: {
Arm64.Operand operand = opInfo.op[0];
Arm64.OpValue value = operand.value;
reg_write(value.reg, 0x0);
Operand operand = op[0];
OpValue value = operand.getValue();
reg_write(value.getReg(), 0x0);
hypervisor.reg_set_elr_el1(elr + 4);
return true;
}
case 0x22: // uint8_t number of configured CPUs
case 0x34: // uint8_t number of active CPUs (hw.activecpu)
case 0x35: // uint8_t number of physical CPUs (hw.physicalcpu_max)
case 0x36: { // uint8_t number of logical CPUs (hw.logicalcpu_max)
Arm64.Operand operand = opInfo.op[0];
Arm64.OpValue value = operand.value;
reg_write(value.reg, 1);
Operand operand = op[0];
OpValue value = operand.getValue();
reg_write(value.getReg(), 1);
hypervisor.reg_set_elr_el1(elr + 4);
return true;
}
default:
throw new UnsupportedOperationException("vaddr=0x" + Long.toHexString(vaddr));
throw new UnsupportedOperationException("vaddr=0x" + Long.toHexString(vaddr) + ", offset=0x" + Long.toHexString(offset));
}
}

Expand Down Expand Up @@ -340,9 +347,7 @@ protected byte[] addSoftBreakPoint(long address, int svcNumber, boolean thumb) {
public synchronized void destroy() throws BackendException {
super.destroy();

if (capstoneInst != null) {
capstoneInst.close();
capstoneInst = null;
}
IOUtils.close(disassembler);
disassembler = null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -285,4 +285,8 @@ public long context_alloc() {
throw new UnsupportedOperationException();
}

@Override
public void context_free(long context) {
throw new UnsupportedOperationException();
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
package com.github.unidbg.arm.backend.kvm;

import capstone.Arm64;
import capstone.Capstone;
import capstone.api.Disassembler;
import capstone.api.DisassemblerFactory;
import capstone.api.Instruction;
import capstone.api.arm64.OpInfo;
import capstone.api.arm64.OpValue;
import capstone.api.arm64.Operand;
import com.alibaba.fastjson.util.IOUtils;
import com.github.unidbg.Emulator;
import com.github.unidbg.Family;
import com.github.unidbg.arm.ARMEmulator;
Expand Down Expand Up @@ -58,14 +64,14 @@ public void onInitialize() {
ptr.write(buffer.array());
}

private Capstone capstoneInst;
private Disassembler disassembler;

private synchronized Capstone createCapstone() {
if (capstoneInst == null) {
this.capstoneInst = new Capstone(Capstone.CS_ARCH_ARM64, Capstone.CS_MODE_ARM);
this.capstoneInst.setDetail(Capstone.CS_OPT_ON);
private synchronized Disassembler createDisassembler() {
if (disassembler == null) {
this.disassembler = DisassemblerFactory.createDisassembler(Capstone.CS_ARCH_ARM64, Capstone.CS_MODE_ARM);
this.disassembler.setDetail(true);
}
return capstoneInst;
return disassembler;
}

private boolean handleCommRead(long vaddr, long elr) {
Expand All @@ -74,22 +80,23 @@ private boolean handleCommRead(long vaddr, long elr) {
Pointer pc = UnidbgPointer.pointer(emulator, elr);
assert pc != null;
byte[] code = pc.getByteArray(0, 4);
Capstone.CsInsn insn = createCapstone().disasm(code, elr, 1)[0];
Instruction insn = createDisassembler().disasm(code, elr, 1)[0];
if (log.isDebugEnabled()) {
log.debug("handleCommRead vaddr=0x" + Long.toHexString(vaddr) + ", elr=0x" + Long.toHexString(elr) + ", asm=" + insn.mnemonic + " " + insn.opStr);
log.debug("handleCommRead vaddr=0x" + Long.toHexString(vaddr) + ", elr=0x" + Long.toHexString(elr) + ", asm=" + insn);
}
Arm64.OpInfo opInfo = (Arm64.OpInfo) insn.operands;
if (opInfo.updateFlags || opInfo.writeback || !insn.mnemonic.startsWith("ldr") || vaddr < _COMM_PAGE64_BASE_ADDRESS) {
OpInfo opInfo = (OpInfo) insn.getOperands();
if (opInfo.isUpdateFlags() || opInfo.isWriteBack() || !insn.getMnemonic().startsWith("ldr") || vaddr < _COMM_PAGE64_BASE_ADDRESS) {
throw new UnsupportedOperationException();
}
Operand[] op = opInfo.getOperands();
int offset = (int) (vaddr - _COMM_PAGE64_BASE_ADDRESS);
switch (offset) {
case 0x38: // uint64_t max memory size */
case 0x40:
case 0x58: {
Arm64.Operand operand = opInfo.op[0];
Arm64.OpValue value = operand.value;
reg_write(value.reg, 0x0L);
Operand operand = op[0];
OpValue value = operand.getValue();
reg_write(value.getReg(), 0x0L);
kvm.reg_set_elr_el1(elr + 4);
return true;
}
Expand All @@ -99,19 +106,19 @@ private boolean handleCommRead(long vaddr, long elr) {
case 0x60:
case 0x64:
case 0x90: {
Arm64.Operand operand = opInfo.op[0];
Arm64.OpValue value = operand.value;
reg_write(value.reg, 0x0);
Operand operand = op[0];
OpValue value = operand.getValue();
reg_write(value.getReg(), 0x0);
kvm.reg_set_elr_el1(elr + 4);
return true;
}
case 0x22: // uint8_t number of configured CPUs
case 0x34: // uint8_t number of active CPUs (hw.activecpu)
case 0x35: // uint8_t number of physical CPUs (hw.physicalcpu_max)
case 0x36: { // uint8_t number of logical CPUs (hw.logicalcpu_max)
Arm64.Operand operand = opInfo.op[0];
Arm64.OpValue value = operand.value;
reg_write(value.reg, 1);
Operand operand = op[0];
OpValue value = operand.getValue();
reg_write(value.getReg(), 1);
kvm.reg_set_elr_el1(elr + 4);
return true;
}
Expand Down Expand Up @@ -384,9 +391,7 @@ protected byte[] addSoftBreakPoint(long address, int svcNumber, boolean thumb) {
public synchronized void destroy() throws BackendException {
super.destroy();

if (capstoneInst != null) {
capstoneInst.close();
capstoneInst = null;
}
IOUtils.close(disassembler);
disassembler = null;
}
}
8 changes: 8 additions & 0 deletions backend/unicorn2/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# [unicorn2](https:/unicorn-engine/unicorn) backend

CMake build:<br>
` 0x0: git clone https:/unicorn-engine/unicorn `<br>
` 0x1: cd unicorn && git checkout dev `<br>
` 0x2: mkdir build && cd build `<br>
` 0x3: cmake .. -DCMAKE_BUILD_TYPE=Release -DUNICORN_ARCH="arm aarch64" -DUNICORN_BUILD_SHARED=OFF `<br>
` 0x4: make -j8 `<br>
5 changes: 0 additions & 5 deletions backend/unicorn2/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,5 @@
<artifactId>unidbg-api</artifactId>
<version>0.9.6-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.github.zhkl0228</groupId>
<artifactId>unicorn2</artifactId>
<version>0.0.1-beta</version>
</dependency>
</dependencies>
</project>
Loading

0 comments on commit 37ae7f1

Please sign in to comment.