如何从strace输出中解码此信息

时间:2014-09-06 22:07:24

标签: c go audit strace netlink

我写了一个小的go脚本并使用strace跟踪它 虽然这个脚本,我试图使用netlink协议从内核获取审计消息,就像auditd一样。

以下是我的go-script http://paste.ubuntu.com/8272760/

上的strace输出

我试图找到auditd提供给sendto函数的参数。 当我在auditd上运行strace时,我得到以下输出

sendto(3, "\20\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0", 16, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 16

当我操作go文件时,我得到以下输出。 我想解码这个陈述的第二个参数

sendto(3, "\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t", 17, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 17

具体

"\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t" 

现在我想将其转换为字符串或字节数组,有没有办法将其转换为字符串或字节数组?

在我的实际go代码中,这个参数是一个字节数组。

https://github.com/mozilla/Audit-Go/blob/testing/netlink_old.go#L58

3 个答案:

答案 0 :(得分:5)

我对您的问题的理解是您尝试通过比较strace输出来比较auditd发送到程序发送的内容,并且您有将strace提供的字符串转换为Go []字节数据类型的问题。

strace输出遵循字符串文字的GNU C表示,其字符可以按如下方式进行转义:

\\ Backslash character. 
\? Question mark character.
\' Single quotation mark. 
\" Double quotation mark. 
\a Audible alert. 
\b Backspace character. 
\e <ESC> character. (This is a GNU extension.) 
\f Form feed. 
\n Newline character. 
\r Carriage return. 
\t Horizontal tab. 
\v Vertical tab.
\o, \oo, \ooo Octal number.
\xh, \xhh, \xhhh, ... Hexadecimal number.

请注意,八进制或十六进制数字的数量可以是变量。在Go中,字符也可以转义但规则不同 - 请参阅http://golang.org/ref/spec#Rune_literals

特别是,八进制值系统地在3位数上,以避免任何歧义。要使用这样的字符序列声明[]字节,您必须编写如下内容:

// In strace, it was "\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t"
wb := []byte("\021\000\000\000\350\003\005\000\001\000\000\000\000\000\000\000\t")

请注意,strace中的-x选项将对不可打印的字符使用固定长度十六进制编码,这使得在Go程序中直接使用这些字符串更容易。 -xx选项将输出十六进制编码的字节,即使是可打印的字符,这使IMO更容易。

无论如何,使用文字字符串来初始化[]字节不一定是好的风格(甚至是好主意)。字符串用于UTF-8字符,而不是二进制数据。

答案 1 :(得分:3)

  

\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t

这些是ANSI X3.159-1989(又名ANSI C89中定义的字符转义序列,请检查此PDF file)。您可以find port70.net正式草稿页面man printf。{/ p>

以下是How to parse strace in shell into plain text?中的简短摘要:

  • \a写一个<bell>字符。
  • \b写一个<backspace>字符。
  • \c忽略此字符串中的剩余字符。
  • \e写一个<escape>字符。
  • \f写一个<form-feed>字符。
  • \r写一个<carriage return>字符。
  • \n写一个<new-line>字符。
  • \t写一个<tab>字符。
  • \v写一个<vertical tab>字符。
  • \'写一个<single quote>字符。
  • \"写一个<double quote>字符。
  • \\写一个反斜杠字符。
  • \num\0num写一个8位字符,其ASCII值为1位,2位或3位八进制数。

要将这些字符解释为字符串,您可以使用printf,例如shell中的命令:

printf "%b" "\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t"

有关更多解析示例,请查看:https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio

答案 2 :(得分:2)

如果您希望strace打印十六进制字符串而不是ASCII和转义序列,请使用-x-xx,请咨询man以获取更多详细信息。