DynamoRIO插桩分析工具
1、几个概念
Ø框架:了解客户端的地位、作用;目标程序、客户端与dynamoRIO三者间的交互;看说明文档
Ø元指令:可能是不影响程序执行的指令,如仅用于观察目标程序的信息的指令。
ØClient transparency:
ØClean call:一种插入指令到目标程序中执行的方式,或者是一种程序代码调用方式
ØTrace:dr_register_trace_event();跟踪基本块;例10;看pin更清楚;
ØNudge:推进;将数据传到进程;dr_register_nudge_event();dr_nudge_process()
Ø插桩的4个阶段:2是应用分析阶段;3是插桩插入阶段
Ø基本块:从pin的说明文档中看
ØAnnotation:目标程序与客户端或dynamorio通信
ØCommunication:Dynamorio与进程通信
Ø两个时间点(transformation timeexecution time):看说明文档
2、基本功能
2.1查看dynamorio能提供的API
ØMemory allocation
ØThread_local storage
ØThread_local stack separate from the application stack
ØSimple mutexes
ØFile creation, reading, and writing
ØAddress space querying
ØApplication module iterator
ØProcessor feature identification
ØExtra thread creation
ØSymbol lookup
ØAuxiliary library loading
2.2从文档附带的sample看
Ø基本块数量统计、基本块大小统计、
Ø创建和使用DR的缓冲区?(例1)
Ø基本块的指令分析:识别基本块首指令;取得基本块的下一条指令;遍历基本块的指令
Ø互斥对象的使用
Ø条件分支分析
Ø插入指令
Ø区别线程的处理
Ø不同指令类型的分析判定(间接调用和直接调用)
Ø计算除法指令的个数
Ø指令修改inc2add,创建指令;创建操作码,操作数。
ØTrace的分析判定
Ø执行指令条数的统计
Ø收集动态指令的trace且dump出去
Ø符号信息处理
Ødump memory例15;16
Ø内存操作分析指令instr_reads_memory()、instr_num_srcs()、opnd_is_memory_reference()
Ø区别库文件和执行程序文件。例17、例18
Ø模块地址范围的分析例18
Ø创建指令
Ø监控系统调用函数。例23
3、事件分析
3.1从说明文档看
ØBasic block and trace creation or deletion( dr_register_bb_event(), dr_register_trace_event(), dr_register_delete_event())
ØProcess initialization and exit(dr_client_main(), dr_register_exit_event())
ØThread initialization and exit(dr_register_thread_init_event(), dr_register_thread_exit_event())
ØFork child initialization(Linux_only); meant to be used for re-initialization of data structures and creation of new log files(dr_register_fork_init_event())
ØApplication library load and unload(dr_register_module_load_event(), dr_register_module_unload_event())
ØApplication fault or exception( signal on linux ) (dr_register_exception_event(), dr_register_signal_event())
ØSystem call interception: pre-system call, post-system call, and system call filtering by number( dr_register_pre_syscall_event(), dr_register_post_syscall_event(), dr_register_filter_syscall_event())
ØSignalinterception(linux-only)(dr_register_signal_event())
ØNudge received – (dr_register_nudge_event())
3.2从示例看
Ø线程初始化
Ø线程退出
Ø进程退出dr_register_exit_event()
Ødrmgr_register_bb_instrumentation_event()基本块事件:针对单个基本块分析(第2阶段);针对基本块的每个指令(第3阶段)。
Ødrmgr_register_bb_app2app_event()好像是插桩的第一阶段(inc2add)
Ødr_register_bb_event()
Ødr_register_delete_event()
Ødr_register_end_trace_event()
Ødr_register_trace_event()
Ødr_register_module_load_event()
Ødr_register_module_unload_event()
Ødr_register_restore_state_event()
Ødr_register_restore_state_ex_event()
4、内存管理应用
4.1直接的缓冲区分配处理(例一p1bbbuf.c)
drx_buf_create_circular_buffer()
drx_buf_insert_load_buf_ptr()
drx_buf_insert _buf_store ()
drx_buf_insert_update_buf_ptr()
上述缓冲区使用前要调用drreg_reserve_register()
4.2全局静态区变量
4.3线程TLS用法
drmgr_get_tls_field()
drmgr_set_tls_field()
drmgr_register_tls_field()
drmgr_unregister_tls_field()
drmgr_insert_read_tls_field()
dr_raw_tls_calloc()
dr_raw_tls_cfree()
dr_raw_mem_alloc()
例12 instrace_simple.c中有多种内存使用方法
4.4线程内存分配
dr_thread_alloc()可用于tlsp12
dr_global_alloc()(inline.c)
dr_nonheap_alloc()
5、函数分析
Ø判断基本块的首指令instrlist_first_app()、drmgr_is_first_instr()
Ø取得fragment的app_pc
Ø插入元指令?(例二p3bbcount.c)
uinstrlist_meta_preinsert()
上述指令前要使用drreg_reserve_aflags()?
Ødrreg_are_aflags_dead()?什么函数?
ØClean call指令:dr_insert_clean_call()
Ø条件分支分析:instr_is_cbr();找出条件分支的状态、目标指令instr_get_branch_target_pc()、dr_insert_cbr_instrumentation_ex()、instr_is_mbr()
Ø指令类型判定:instr_is_call_direct()/ instr_is_call_indirect()/ instr_is_return
Ø取得指令的源操作数instr_get_src();取得指令的目标操作码:instr_get_opcode()
Ø模块操作指令(inscount.c)
udr_free_module_data()
udr_lookup_module()
udr_get_main_module()
udr_module_preferred_name()
udr_loopup_module_by_name()
Ødr_get_dr_segment_base()
Ødr_get_current_drcontext()
Ødr_get_mcontext()
Øinstrlist_create()
Øinstr_reads_memory()、instr_writes_memory()
Ødr_get_proc_address();
Ødrmgr_decode_sysnum_from_wrapper()
Ø系统调用函数处理
uDr_syscall_get_param()
uDr_syscall_set_param()
uDr_syscall_set_result_ex()
uDr_syscall_set_sysnum()
uDr_syscall_invoke_another()
Dr_set_mcontext()
Dr_get_mcontext()
6、状态
保持寄存器的状态?drreg_reserve_register()
保存标志寄存器状态drreg_reserve_aflags()
说明文档关于:状态的保存restore_state()restore_state_ex()dr_register_restore_state_event()dr_register_restore_state_ex_event();
状态的转换state translation
告一段落,现在要看模糊测试了。其实DynamoRIO早看了,只是没时间整理。关键是决心!!!
插桩分析就那些东东,看似平淡,还是要根据需求才能做出有价值的东西。可能这就是工程实践的魅力。不过,插桩分析还是没有找到我想要的东西,可能还是要从二进制代码静态分析来找。
几个问题:
1、二进制层面动态代码有那几类,动到什么程度?
2、应用逻辑层的信息在插桩中能找到吗?
3、函数信息、循环信息在插桩中找不到啊?
不知是否有有缘人回答?其实这些的深入讨论是很有趣的。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-1-17 16:11
被CCkicker编辑
,原因: 格式调整优化