7

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

以下是我的 go 脚本上的 strace 输出 - http://paste.ubuntu.com/8272760/

我试图找到 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

当我 strace 我的 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

4

3 回答 3

7

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

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 位数字以避免任何歧义。要声明具有这样一个字符序列的 []byte,您必须编写如下内容:

// 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 更容易。

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

于 2014-09-07T09:45:45.950 回答
5

如果要strace打印十六进制字符串而不是 ASCII 和转义序列,请使用-xor -xx,有关详细信息,请咨询 man。

于 2016-12-29T10:01:03.077 回答
4

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

ANSI X3.159-1989这些是在(又名ANSI C89,检查此PDF 文件)中定义的字符转义序列。您可以在port70.net找到官方草稿页面。

这是一个简短的简介man printf

  • \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"

有关更多解析示例,请查看:如何将 shell 中的 strace 解析为纯文本?

于 2016-04-11T20:51:40.577 回答