2014-09-06 12 views
5

Napisałem mały skrypt go i prześledziłem go przy użyciu strace chociaż ten skrypt, próbuję pobrać wiadomości audytu z jądra przy użyciu protokołu netlink, podobnie jak jak auditd.Jak rozszyfrować te informacje z wyjścia strace

Poniżej znajduje się wyjście strace na mojej podróży Script http://paste.ubuntu.com/8272760/

Próbuję znaleźć argument, że auditd dostarczyć do funkcji sendto. Kiedy biegnę strace na auditd dostaję następujący komunikat

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 

I kiedy strace mój plik odejść uzyskać następujące dane wyjściowe. szukam zdekodować drugi argument tego stwierdzenia

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 

Mówiąc konkretnie

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

Teraz chcę przekonwertować to do strun lub bajtów tablicy, czy jest jakiś sposób przekonwertować ten ciąg lub tablica bajtów?

W moim aktualnym kodzie tym argumentem jest tablica bajtów.

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

+0

Hrm: wygląda 'wb' w kodzie źródłowym jest już * * a' [] byte', więc nie rozumiem pytanie, jakie, albo dlaczego strace jest zaangażowana. (Co się dzieje, co czyni 'strace' koniecznym zamiast polegać na oprzyrządowaniu kodu Go?) – twotwotwo

+0

Osobno, [jest to typowe, aby uniknąć importowania punktów] (https://code.google.com/p/go-wiki/wiki/ CodeReviewComments # Import_Dot) podobnie jak '. "syscall". – twotwotwo

+0

Nie jestem pewien, ale może problem polega na tym, że masz do czynienia z wyjściem strace, które nie * pochodzi z kodu, i nie wiesz, jak go przeanalizować. To, co mam, prawdopodobnie nie jest najlepszym sposobem na zrobienie tego, ale myślę, że JavaScript używa wystarczająco blisko tych samych zasad cytowania, że ​​możesz po prostu upuścić ciąg znaków do skryptu: http://jsfiddle.net/2tukw37o/ – twotwotwo

Odpowiedz

5

Moje rozumienie problemu jest spróbować porównać to, co auditd wysyła do czego program wysyła porównując wyjście strace i masz problemy, aby przekształcić ciąg dostarczone przez strace do Go [] typ danych bajt .

Wyjście strace następująco reprezentację GNU C sznurka, którego dosłowne znaki można uciec się następująco:

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

Zauważ, że liczba ósemkowe lub szesnastkowe cyfr może być zmienna. Znaki mogą być również znakami escape, ale reguły są różne - patrz http://golang.org/ref/spec#Rune_literals

W szczególności, ósemkowe wartości są systematycznie wykonywane na 3 cyfrach, aby uniknąć niejednoznaczności. Aby zadeklarować [] bajt z takiej sekwencji znaków, trzeba będzie napisać coś takiego:

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

Uwaga że opcja -x w strace używać kodowania hex stałej długości dla znaków non-printable, co sprawia, że ​​bezpośrednie użycie tych ciągów jest łatwiejsze w programie Go. Opcja -xx wyprowadza kodowane szesnastkowo bajty nawet dla znaków drukowalnych, co jeszcze bardziej ułatwia IMO.

W każdym razie niekoniecznie dobrym stylem (lub dobrym pomysłem) jest użycie literałów do zainicjowania bajtu []. Łańcuchy są dla znaków UTF-8, a nie dla danych binarnych.

2

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

Są to sekwencje znaków, jak określono w ANSI X3.159-1989 (aka ANSI C89, to sprawdzić PDF file). Możesz find oficjalnych stron roboczych pod port70.net.

Oto krótki krótki znaleźć w man printf:

  • \a Napisz <bell> charakter.
  • \b Napisz <backspace> charakter.
  • \c Zignoruj ​​pozostałe znaki w tym ciągu.
  • \e Napisz <escape> charakter.
  • \f Napisz znak <form-feed>.
  • \r Napisz <carriage return> charakter.
  • \n Napisz znak <new-line>.
  • \t Napisz <tab> charakter.
  • \v Napisz znak <vertical tab>.
  • \' Napisz znak <single quote>.
  • \" Napisz <double quote> charakter.
  • \\ Napisz znak ukośnika odwrotnego.
  • \num, \0num Napisz 8-bitowy znak, którego wartość ASCII to 1-, 2- lub 3-cyfrowa liczba ósemkowa.

Aby zinterpretować te znaki jako ciąg, można użyć printf, np. polecenie w powłoce:

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

Więcej przykładów analizowania sprawdzić: How to parse strace in shell into plain text?

1

Jeśli chcesz strace drukować ciąg szesnastkowy zamiast ASCII i uciekł sekwencję, należy -x lub -xx skonsultować mężczyznę po więcej szczegółów.

Powiązane problemy