Hi,
the version I attached is not the correct one, it uses no_reg. Here's a version that works if someone else gets the same issue:
Mem obf_mem_op_to_asmjit(obf_op_t *op)
{
Mem mem;
if (op->type != UD_OP_MEM) {
obf_error("obf_mem_op_to_asmjit(): not a memory operand");
}
// [base_reg + index*scale + offset]
if (op->data.mem.base && op->data.mem.index) {
if (op->data.mem.size == 8) {
mem = byte_ptr(*op->data.mem.base, *op->data.mem.index, op->data.mem.scale, op->data.mem.offset);
} else if (op->data.mem.size == 16) {
mem = word_ptr(*op->data.mem.base, *op->data.mem.index, op->data.mem.scale, op->data.mem.offset);
} else if (op->data.mem.size == 32) {
mem = dword_ptr(*op->data.mem.base, *op->data.mem.index, op->data.mem.scale, op->data.mem.offset);
} else {
mem = Mem(*op->data.mem.base, *op->data.mem.index, op->data.mem.scale, op->data.mem.offset);
}
} else {
// [base_reg + offset]
if (!op->data.mem.index && op->data.mem.base) {
if (op->data.mem.size == 8) {
mem = byte_ptr(*op->data.mem.base, op->data.mem.offset);
} else if (op->data.mem.size == 16) {
mem = word_ptr(*op->data.mem.base, op->data.mem.offset);
} else if (op->data.mem.size == 32) {
mem = dword_ptr(*op->data.mem.base, op->data.mem.offset);
} else {
mem = Mem(*op->data.mem.base, op->data.mem.offset);
}
// [offset]
} else if (!op->data.mem.base && !op->data.mem.index) {
if (op->data.mem.size == 8) {
mem = byte_ptr_abs((void *) op->data.mem.offset);
} else if (op->data.mem.size == 16) {
mem = word_ptr_abs((void *) op->data.mem.offset);
} else if (op->data.mem.size == 32) {
mem = dword_ptr_abs((void *) op->data.mem.offset);
} else {
mem = ptr_abs((void *) op->data.mem.offset);
}
} else {
obf_error("obf_mem_op_to_asmjit(): unsupported memory operand");
}
}
return mem;
}
There's one more thing, I think I've asked you about this before. Please make Labels referencable in more instructions, e.g. mov, push, etc.It would be cool if you made it so conditional jumps can take in address instead of a Label only, too.