2014-09-06 19 views
5

Tôi đã viết một kịch bản lệnh nhỏ và truy tìm nó bằng cách sử dụng strace mặc dù tập lệnh này, tôi đang cố gắng tìm nạp thông điệp kiểm tra từ hạt nhân bằng giao thức netlink, giống như auditd.Làm thế nào để giải mã thông tin này từ đầu ra strace

Sau đây là sản lượng strace trên đường đi của tôi Script http://paste.ubuntu.com/8272760/

Tôi cố gắng để tìm ra lập luận rằng auditd cung cấp cho các chức năng sendto. Khi tôi chạy strace trên auditd tôi nhận được sau đầu ra

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 

Và khi tôi strace tập đi của tôi, tôi nhận được đầu ra sau. Tôi đang tìm kiếm để giải mã các đối số thứ hai của tuyên bố này

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 

Để cụ thể

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

Bây giờ tôi muốn chuyển đổi này để chuỗi hoặc byte mảng, có cách nào để chuyển đổi này để chuỗi hoặc mảng byte?

Trong mã thực tế của tôi, đối số này là một mảng byte.

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

+0

Hrm: có vẻ như 'wb' trong mã nguồn của bạn đã * là * một' [] byte', vì vậy tôi không hiểu câu hỏi như được đặt ra hoặc tại sao strace có liên quan. (Điều gì đang xảy ra làm cho 'strace' cần thiết hơn là dựa vào thiết bị đo mã Go?) – twotwotwo

+0

Riêng biệt, [thông thường để tránh nhập dấu chấm] (https://code.google.com/p/go-wiki/wiki/ CodeReviewComments # Import_Dot) giống như '. "syscall". – twotwotwo

+0

Tôi không chắc chắn, nhưng có lẽ vấn đề là bạn đang xử lý với đầu ra strace đó là * không * tất cả từ mã của bạn, và bạn không chắc chắn làm thế nào để phân tích nó. Những gì tôi có có lẽ không phải là cách thực hành tốt nhất để làm điều đó, nhưng tôi nghĩ rằng JavaScript sử dụng đủ gần với cùng một quy tắc trích dẫn bạn có thể chỉ cần thả chuỗi vào một kịch bản: http://jsfiddle.net/2tukw37o/ – twotwotwo

Trả lời

5

sự hiểu biết của tôi về vấn đề của bạn là bạn cố gắng để so sánh những gì auditd gửi đến những gì chương trình của bạn gửi bằng cách so sánh sản lượng strace, và bạn có vấn đề để chuyển đổi chuỗi cung cấp bởi strace thành một Go [] byte datatype .

Sản lượng strace sau đại diện GNU C của chuỗi chữ, mà nhân vật có thể được thoát như sau:

\\ 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. 

Lưu ý rằng số lượng bát phân hoặc hex chữ số có thể thay đổi. Trong Go, các ký tự cũng có thể được thoát nhưng các quy tắc khác nhau - xem http://golang.org/ref/spec#Rune_literals

Cụ thể, các giá trị bát phân có hệ thống trên 3 chữ số để tránh bất kỳ sự mơ hồ nào. Để khai báo một byte [] với một chuỗi như vậy nhân vật, bạn sẽ phải viết một cái gì đó như thế này:

// 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") 

Lưu ý rằng tùy chọn -x trong strace sẽ sử dụng mã hóa hex chiều dài cố định cho các ký tự không in được, làm cho việc sử dụng trực tiếp các chuỗi này dễ dàng hơn trong chương trình Go. Tùy chọn -xx sẽ tạo ra các byte được mã hóa hex ngay cả đối với các ký tự có thể in, điều này làm cho IMO dễ dàng hơn.

Dù sao, nó không nhất thiết phải là một phong cách tốt (hoặc thậm chí là một ý tưởng tốt) để sử dụng chuỗi ký tự để khởi tạo byte []. Chuỗi dành cho ký tự UTF-8, không dành cho dữ liệu nhị phân.

2

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

Đây là trình tự thoát nhân vật theo quy định tại ANSI X3.159-1989 (aka ANSI C89, kiểm tra này PDF file). Bạn có thể find trang dự thảo chính thức tại port70.net.

Dưới đây là một tóm tắt ngắn được tìm thấy trong man printf:

  • \a Viết một nhân vật <bell>.
  • \b Viết một ký tự <backspace>.
  • \c Bỏ qua các ký tự còn lại trong chuỗi này.
  • \e Viết ký tự <escape>.
  • \f Viết <form-feed> ký tự.
  • \r Viết ký tự <carriage return>.
  • \n Viết ký tự <new-line>.
  • \t Viết ký tự <tab>.
  • \v Viết ký tự <vertical tab>.
  • \' Viết ký tự <single quote>.
  • \" Viết ký tự <double quote>.
  • \\ Viết ký tự gạch chéo ngược.
  • \num, \0num Viết ký tự 8 bit có giá trị ASCII là số bát phân 1, 2 hoặc 3 chữ số.

Để diễn giải các ký tự này dưới dạng chuỗi, bạn có thể sử dụng printf, ví dụ: lệnh trong shell:

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

Để biết thêm ví dụ phân tích, kiểm tra: How to parse strace in shell into plain text?

1

Nếu bạn muốn strace để in chuỗi thập lục phân thay vì ASCII và trình tự thoát, sử dụng -x hay -xx, tham khảo ý kiến ​​người đàn ông để biết thêm chi tiết.

Các vấn đề liên quan