Unicorn-CPU模拟框架数据类型及API分析与示例(四)
0x2 API分析
uc_hook_add
c
uc_err uc_hook_add(uc_engine *uc, uc_hook *hh, int type, void *callback, |
注册hook事件的回调,当hook事件被触发将会进行回调。
Code
@uc: uc_open() 返回的句柄 |
源码实现
c
uc_err uc_hook_add(uc_engine *uc, uc_hook *hh, int type, void *callback, |
使用示例:
cpp
|
输出
对每条指令都进行hook
uc_hook_del
Code
uc_err uc_hook_del(uc_engine *uc, uc_hook hh); |
删除一个已注册的hook事件
Code
@uc: uc_open() 返回的句柄 |
源码实现
c
uc_err uc_hook_del(uc_engine *uc, uc_hook hh) |
使用示例:
cpp
if ((err = uc_hook_add(uc, &sys_hook, UC_HOOK_CODE, hook_syscall, NULL, 1, 0))) { |
uc_mem_map
c
uc_err uc_mem_map(uc_engine *uc, uint64_t address, size_t size, uint32_t perms); |
为模拟映射一块内存。
Code
@uc: uc_open() 返回的句柄 |
源码实现
c
uc_err uc_mem_map(uc_engine *uc, uint64_t address, size_t size, uint32_t perms) |
使用示例同uc_hook_add。
uc_mem_map_ptr
c
uc_err uc_mem_map_ptr(uc_engine *uc, uint64_t address, size_t size, uint32_t perms, void *ptr); |
在模拟中映射现有的主机内存。
Code
@uc: uc_open() 返回的句柄 |
源码实现
c
uc_err uc_mem_map_ptr(uc_engine *uc, uint64_t address, size_t size, uint32_t perms, void *ptr) |
使用示例同uc_mem_map
uc_mem_unmap
c
uc_err uc_mem_unmap(uc_engine *uc, uint64_t address, size_t size); |
取消对模拟内存区域的映射
Code
@uc: uc_open() 返回的句柄 |
源码实现
c
uc_err uc_mem_unmap(struct uc_struct *uc, uint64_t address, size_t size) |
使用示例:
cpp
if ((err = uc_mem_map(uc, BASE, 0x1000, UC_PROT_ALL))) { |
uc_mem_protect
c
uc_err uc_mem_protect(uc_engine *uc, uint64_t address, size_t size, uint32_t perms); |
设置模拟内存的权限
Code
@uc: uc_open() 返回的句柄 |
源码实现
c
uc_err uc_mem_protect(struct uc_struct *uc, uint64_t address, size_t size, uint32_t perms) |
使用示例:
cpp
if ((err = uc_mem_protect(uc, BASE, 0x1000, UC_PROT_ALL))) { //可读可写可执行 |
uc_mem_regions
c
uc_err uc_mem_regions(uc_engine *uc, uc_mem_region **regions, uint32_t *count); |
检索由 uc_mem_map() 和 uc_mem_map_ptr() 映射的内存的信息。
这个API为@regions分配内存,用户之后必须通过free()释放这些内存来避免内存泄漏。
Code
@uc: uc_open() 返回的句柄 |
源码分析
c
uint32_t uc_mem_regions(uc_engine *uc, uc_mem_region **regions, uint32_t *count) |
使用示例:
cpp
|
输出
uc_free
c
uc_err uc_free(void *mem); |
释放由 uc_context_alloc 和 uc_mem_regions 申请的内存
Code
@mem: 由uc_context_alloc (返回 *context), 或由 uc_mem_regions (返回 *regions)申请的内存 |
源码实现
c
uc_err uc_free(void *mem) |
使用示例同uc_mem_regions
uc_context_alloc
c
uc_err uc_context_alloc(uc_engine *uc, uc_context **context); |
分配一个可以与uc_context_{save,restore}一起使用的区域来执行CPU上下文的快速保存/回滚,包括寄存器和内部元数据。上下文不能在具有不同架构或模式的引擎实例之间共享。
Code
@uc: uc_open() 返回的句柄 |
源码实现
c
uc_err uc_context_alloc(uc_engine *uc, uc_context **context) |
使用示例
cpp
|
输出
uc_context_save
c
uc_err uc_context_save(uc_engine *uc, uc_context *context); |
保存当前CPU上下文
Code
@uc: uc_open() 返回的句柄 |
源码实现
c
uc_err uc_context_save(uc_engine *uc, uc_context *context) |
使用示例同uc_context_alloc()
uc_context_restore
c
uc_err uc_context_restore(uc_engine *uc, uc_context *context); |
恢复已保存的CPU上下文
Code
@uc: uc_open() 返回的句柄 |
源码实现
c
uc_err uc_context_restore(uc_engine *uc, uc_context *context) |
使用示例同uc_context_alloc()
uc_context_size
c
size_t uc_context_size(uc_engine *uc); |
返回存储cpu上下文所需的大小。可以用来分配一个缓冲区来包含cpu上下文,并直接调用uc_context_save。
Code
@uc: uc_open() 返回的句柄 |
源码实现
c
size_t uc_context_size(uc_engine *uc) |
使用示例同uc_context_alloc()