首页
论坛
课程
招聘
[原创] 动态二进制插装平台Pin--2
2020-10-5 23:43 9133

[原创] 动态二进制插装平台Pin--2

2020-10-5 23:43
9133

Pin提供了对多线程支持,.net,和浮点例程的支持。windows下的多线程和linux下的多线程有一定的区别,linux下的c/c++库并不全是线程安全的,比如errno。所以调用时一定要注意,另外在使用线程局部储存和线程ID时,必须使用Pin提供的API,
Pin还提供了一个分析例程参数(IARG_THREAD_ID),该参数为调用线程传递特定于Pin的线程ID,当每个线程开始和结束时,Pin提供回调函数PIN_AddThreadStartFunction和PIN_AddThreadFiniFunction。
多线程下的锁也要注意,在编写多线程Pin工具的时候要注意锁的层次结构:
应用程序锁->Pin内部锁->工具锁
Pin程序的编写依旧是从main函数开始,首先必须调用PIN_Init()来进行Pin的初始化。如果要支持Pin的IMAGE功能,必须在PIN_Init之前调用PIN_InitSymbols()。
INS模式的第一个函数为:PIN_CALLBACK LEVEL_PINCLIENT::INS_AddInstrumentFunction(INS_INSTRUMENT_CALLBACK fun,void val)
INS_INSTRUMENT_CALLBACK为INS_AddInstrumentFunction的回调函数指针原型为typedef VOID(
LEVEL_PINCLIENT :: INS_INSTRUMENT_CALLBACK)(INS ins,VOID * v)为Pintool按注册回调函数INS模式的第一步都由此开始。
val为将要传给回调函数的参数
回调函数的第一个参数ins代表目标程序中指令的实体,INS模式类似单步调试,则ins代表单条指令实体。
VOID LEVEL_PINCLIENT::INS_InsertCall(INS ins,IPOINT action,AFUNPTR funptr,....)为每一条指令插入一个回调函数;
action参数指明了插入回调函数的位置IPOINT_BEFORE(在指令之前插入),IPOINT_AFTER(在指令之后插入),AFUNPTR回调函数指针,AFUNPTR回调函数的参数为可变参数,由INS_InsertCall AFUNPTR后面的参数指定,并由IARG_END结尾。IARG_ADDRINT,IARG_PTR,IARG_BOOL,IARG_UINT32,IARG_UINT64这几个变量说明提供给回调函数的参数由用户自己传入,这个变量的后面的变量指定。比如:
INS_InsertCall(ins,IPOINT_BEFORE,(AFUNPTR)funptr,IARG_UINT32,1,IARG_END);
说明要将1传给函数funptr,IARG_END表明参数结束,IARG_END之后的参数INS_InsertCall将直接无视.
而IARG_INST_PTR,IARG_REG_REFERENCE...变量表明funptr的参数由Pin传入
PIN_StartProgram()表示启动Pintool并且永不返回


[2022夏季班]《安卓高级研修班(网课)》月薪三万班招生中~

最后于 2020-10-7 14:11 被kanxue编辑 ,原因:
收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回