了解tracecap.so文件的源文件对深入分析temu,精简trace文件有很大的益处。

1、tracecap.c 中包含着trace命令中的trace开始函数trcaing_starting。获取日志文件和需要监控程序的ID。更具程序ID或者程序的CR3值,cr3是内核表中保存的每个线程的唯一值。将cr3值赋予temu_plugin->monitored_cr3。初始化完成后,最后调用getrusage函数获取进程的资源信息。

2、commands.c包含着do_traceing_stop,do_tracing,do_tracing_by_name,do_save_state.do_guest_module等函数,是追踪指令的开端。

3、do_tracing对应命令trace,调用tracing_start执行追踪操作。do_tracing_by_name,对应tracebyname根据程序名称获取程序ID,如果进程存在,调用do_tracing,开始追踪,否则等待程序启动。

4、taint_sendkey也在commands.c中被定义。调用do_send_key(TEMU_main.h)将获取的字符串发送出去。do_send_key函数在monitor.c中实现。处理完毕,调用kbd_put_keycode(console.h中定义,vl.c中实现)函数。再调用qemu_put_kbd_enent函数处理,vl.c函数中存在键盘和鼠标定义函数。

5、利用tracepid判断当前是否有跟踪?用taint_sendkey_id来判断对哪一个值进行跟踪?tracing_send_keystroke函数是处理键盘输入的事件处理函数。

6、tracing_insn_begin与tracing_insn_end是监控每条指令开始与结束的关键函数。在tracing_insn_begin函数中可以判断当前指令是否是操作系统级的指令还是用户级别的指令,可以根据指令的当前状态(eip)执行分解二进制指令的操作。在tracing_insn_end级别将trace写入日志文件。将汇编好的代码写入trace文件的函数是write_trace函数(写入日志名称、eh记录),wirte_trace函数在tracecap的trace.c中实现,是实现trace记录的关键函数。

7、eh.也就是EnterHeader结构,是保存指令trace信息的关键数据结构,被定义在tracecap/trace.h之中。而存储函数名与模块名的结构体names_t则被定义在shared/hooks/function_map.h之中。

8、temu采用conf_log_external_calls这一个定义在tracecap/conf.c中的全局变量,表示是否输出系统调用函数,默认不输出。

9、temu采用定义在tracecap.h中的trace_do_not_write变量标记是否记录trcae,默认值为0,即是记录文件执行trace。

 10、开始记录trace文件时,检查是否记录系统调用函数,如果记录,则不记录文件执行trace。

 11、系统检测指令时,采用query_name指令寻找ip地址对应的函数。该函数定义在shared/hooks/function_map.cpp之中。但是在目前的记录中没有成功的记录,不知是和原因?

12、temu的日志文件采用.log文件来定义,默认情况下,不开启此文件的记录。在tracecap.c中采用infolog标记。默认情况下omniscope/tracing.c文件不开启对日志文件的编译