fix confusion betweet UC_MEM_xxx & UC_HOOK_MEM_xxx. fix issue #93

This commit is contained in:
Nguyen Anh Quynh 2015-09-03 01:12:49 +08:00
parent 4a2f23db60
commit be659d201d
3 changed files with 19 additions and 17 deletions

21
hook.c
View file

@ -67,17 +67,17 @@ size_t hook_add(uch handle, int type, uint64_t begin, uint64_t end, void *callba
if (begin > end) if (begin > end)
uc->hook_insn_idx = i; uc->hook_insn_idx = i;
break; break;
case UC_MEM_READ: case UC_HOOK_MEM_READ:
uc->hook_mem_read = true; uc->hook_mem_read = true;
if (begin > end) if (begin > end)
uc->hook_read_idx = i; uc->hook_read_idx = i;
break; break;
case UC_MEM_WRITE: case UC_HOOK_MEM_WRITE:
uc->hook_mem_write = true; uc->hook_mem_write = true;
if (begin > end) if (begin > end)
uc->hook_write_idx = i; uc->hook_write_idx = i;
break; break;
case UC_MEM_READ_WRITE: case UC_HOOK_MEM_READ_WRITE:
uc->hook_mem_read = true; uc->hook_mem_read = true;
uc->hook_mem_write = true; uc->hook_mem_write = true;
if (begin > end) { if (begin > end) {
@ -162,12 +162,13 @@ static struct hook_struct *_hook_find(struct uc_struct *uc, int type, uint64_t a
if (uc->hook_insn_idx) if (uc->hook_insn_idx)
return &uc->hook_callbacks[uc->hook_insn_idx]; return &uc->hook_callbacks[uc->hook_insn_idx];
break; break;
case UC_MEM_READ: case UC_HOOK_MEM_READ:
// already hooked all memory read? // already hooked all memory read?
if (uc->hook_read_idx) if (uc->hook_read_idx) {
return &uc->hook_callbacks[uc->hook_read_idx]; return &uc->hook_callbacks[uc->hook_read_idx];
}
break; break;
case UC_MEM_WRITE: case UC_HOOK_MEM_WRITE:
// already hooked all memory write? // already hooked all memory write?
if (uc->hook_write_idx) if (uc->hook_write_idx)
return &uc->hook_callbacks[uc->hook_write_idx]; return &uc->hook_callbacks[uc->hook_write_idx];
@ -185,14 +186,14 @@ static struct hook_struct *_hook_find(struct uc_struct *uc, int type, uint64_t a
return &uc->hook_callbacks[i]; return &uc->hook_callbacks[i];
} }
break; break;
case UC_MEM_READ: case UC_HOOK_MEM_READ:
if (uc->hook_callbacks[i].hook_type == UC_MEM_READ || uc->hook_callbacks[i].hook_type == UC_MEM_READ_WRITE) { if (uc->hook_callbacks[i].hook_type == UC_HOOK_MEM_READ || uc->hook_callbacks[i].hook_type == UC_HOOK_MEM_READ_WRITE) {
if (uc->hook_callbacks[i].begin <= address && address <= uc->hook_callbacks[i].end) if (uc->hook_callbacks[i].begin <= address && address <= uc->hook_callbacks[i].end)
return &uc->hook_callbacks[i]; return &uc->hook_callbacks[i];
} }
break; break;
case UC_MEM_WRITE: case UC_HOOK_MEM_WRITE:
if (uc->hook_callbacks[i].hook_type == UC_MEM_WRITE || uc->hook_callbacks[i].hook_type == UC_MEM_READ_WRITE) { if (uc->hook_callbacks[i].hook_type == UC_HOOK_MEM_WRITE || uc->hook_callbacks[i].hook_type == UC_HOOK_MEM_READ_WRITE) {
if (uc->hook_callbacks[i].begin <= address && address <= uc->hook_callbacks[i].end) if (uc->hook_callbacks[i].begin <= address && address <= uc->hook_callbacks[i].end)
return &uc->hook_callbacks[i]; return &uc->hook_callbacks[i];
} }

View file

@ -183,7 +183,7 @@ WORD_TYPE helper_le_ld_name(CPUArchState *env, target_ulong addr, int mmu_idx,
// Unicorn: callback on memory read // Unicorn: callback on memory read
if (env->uc->hook_mem_read && READ_ACCESS_TYPE == MMU_DATA_LOAD) { if (env->uc->hook_mem_read && READ_ACCESS_TYPE == MMU_DATA_LOAD) {
struct hook_struct *trace = hook_find((uch)env->uc, UC_MEM_READ, addr); struct hook_struct *trace = hook_find((uch)env->uc, UC_HOOK_MEM_READ, addr);
if (trace) { if (trace) {
((uc_cb_hookmem_t)trace->callback)((uch)env->uc, UC_MEM_READ, ((uc_cb_hookmem_t)trace->callback)((uch)env->uc, UC_MEM_READ,
(uint64_t)addr, (int)DATA_SIZE, (int64_t)0, trace->user_data); (uint64_t)addr, (int)DATA_SIZE, (int64_t)0, trace->user_data);
@ -328,7 +328,7 @@ WORD_TYPE helper_be_ld_name(CPUArchState *env, target_ulong addr, int mmu_idx,
// Unicorn: callback on memory read // Unicorn: callback on memory read
if (env->uc->hook_mem_read && READ_ACCESS_TYPE == MMU_DATA_LOAD) { if (env->uc->hook_mem_read && READ_ACCESS_TYPE == MMU_DATA_LOAD) {
struct hook_struct *trace = hook_find((uch)env->uc, UC_MEM_READ, addr); struct hook_struct *trace = hook_find((uch)env->uc, UC_HOOK_MEM_READ, addr);
if (trace) { if (trace) {
((uc_cb_hookmem_t)trace->callback)((uch)env->uc, UC_MEM_READ, ((uc_cb_hookmem_t)trace->callback)((uch)env->uc, UC_MEM_READ,
(uint64_t)addr, (int)DATA_SIZE, (int64_t)0, trace->user_data); (uint64_t)addr, (int)DATA_SIZE, (int64_t)0, trace->user_data);
@ -511,7 +511,7 @@ void helper_le_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val,
// Unicorn: callback on memory write // Unicorn: callback on memory write
if (uc->hook_mem_write) { if (uc->hook_mem_write) {
struct hook_struct *trace = hook_find((uch)uc, UC_MEM_WRITE, addr); struct hook_struct *trace = hook_find((uch)uc, UC_HOOK_MEM_WRITE, addr);
if (trace) { if (trace) {
((uc_cb_hookmem_t)trace->callback)((uch)uc, UC_MEM_WRITE, ((uc_cb_hookmem_t)trace->callback)((uch)uc, UC_MEM_WRITE,
(uint64_t)addr, (int)DATA_SIZE, (int64_t)val, trace->user_data); (uint64_t)addr, (int)DATA_SIZE, (int64_t)val, trace->user_data);
@ -649,7 +649,7 @@ void helper_be_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val,
// Unicorn: callback on memory write // Unicorn: callback on memory write
if (uc->hook_mem_write) { if (uc->hook_mem_write) {
struct hook_struct *trace = hook_find((uch)uc, UC_MEM_WRITE, addr); struct hook_struct *trace = hook_find((uch)uc, UC_HOOK_MEM_WRITE, addr);
if (trace) { if (trace) {
((uc_cb_hookmem_t)trace->callback)((uch)uc, UC_MEM_WRITE, ((uc_cb_hookmem_t)trace->callback)((uch)uc, UC_MEM_WRITE,
(uint64_t)addr, (int)DATA_SIZE, (int64_t)val, trace->user_data); (uint64_t)addr, (int)DATA_SIZE, (int64_t)val, trace->user_data);

7
uc.c
View file

@ -791,16 +791,17 @@ uc_err uc_hook_add(uch handle, uch *h2, uc_hook_t type, void *callback, void *us
case UC_HOOK_MEM_READ: case UC_HOOK_MEM_READ:
begin = va_arg(valist, uint64_t); begin = va_arg(valist, uint64_t);
end = va_arg(valist, uint64_t); end = va_arg(valist, uint64_t);
ret = _hook_mem_access(handle, UC_MEM_READ, begin, end, callback, user_data, h2); ret = _hook_mem_access(handle, UC_HOOK_MEM_READ, begin, end, callback, user_data, h2);
break; break;
case UC_HOOK_MEM_WRITE: case UC_HOOK_MEM_WRITE:
begin = va_arg(valist, uint64_t); begin = va_arg(valist, uint64_t);
end = va_arg(valist, uint64_t); end = va_arg(valist, uint64_t);
ret = _hook_mem_access(handle, UC_MEM_WRITE, begin, end, callback, user_data, h2); ret = _hook_mem_access(handle, UC_HOOK_MEM_WRITE, begin, end, callback, user_data, h2);
break;
case UC_HOOK_MEM_READ_WRITE: case UC_HOOK_MEM_READ_WRITE:
begin = va_arg(valist, uint64_t); begin = va_arg(valist, uint64_t);
end = va_arg(valist, uint64_t); end = va_arg(valist, uint64_t);
ret = _hook_mem_access(handle, UC_MEM_READ_WRITE, begin, end, callback, user_data, h2); ret = _hook_mem_access(handle, UC_HOOK_MEM_READ_WRITE, begin, end, callback, user_data, h2);
break; break;
} }