我正在尝试使用Pin或DynamoRIO之类的工具来跟踪Linux中的系统调用。从这些工具中,我可以看到执行了哪些系统调用,输入参数的值是什么以及返回值。但是某些系统调用(例如access
)具有一个整数值,该整数值可能与其他一些整数值进行按位或运算。
例如,在访问系统调用中,mode
可以是F_OK
,R_OK
,W_OK
或X_OK
或其中两个或多个的按位或。
int access(const char *pathname, int mode);
如何解码一个整数值(我知道该整数值已作为输入传递给系统调用,以查看在系统调用中启用了哪些标志?
传递给函数的内容已经被传递者(您是谁)知道了。此外,由于机器的体系结构或操作系统,它们的整数值可能因机器而异。在我的Apple机器上,unistd.h
涉及以下内容。
/* access function */
#define F_OK 0 /* test for existence of file */
#define X_OK (1<<0) /* test for execute or search permission */
#define W_OK (1<<1) /* test for write permission */
#define R_OK (1<<2) /* test for read permission */
如您所知,它们分别是0000
,0001
,0010
,0100
。现在,您可以通过咬牙来操纵它们。您需要检查头文件中是否有使用的常量。