Страница 1 из 2

распарсить текст

Добавлено: 2008-11-09 9:39:29
paradox
кто хорошо знает регекспы?
нужно распарсить такой файл
пример

Код: Выделить всё

6,28) ie:r(252,63) sup_rates_ovrd:r(252,63) ext_rates_ovrd:r(252,63) pwr_cap:(21
9,25) WPA_auth:(4,4) bsscfg:(249,20) wme_ie:(219,65) cap_ie:(219,85) cap_ie:(219
,85) rclist:(230,2) i:r(6,28) min_pwr:(4,3) max_pwr:(4,3) i:r(6,28) wlc_authresp
_client:f(0,22) wlc:P(1,2) rxh:p(256,3) hdr:P(1,66) body:P(66,2) len:p(6,28) len
:r(6,28) auth_alg:r(4,4) auth_seq:r(4,4) auth_status:r(4,4) challenge:r(249,7) s
cb:r(246,35) pkt:r(66,2) wlc_clear_hw_association:F(0,22) wlc:P(1,2) regs:r(252,
114) rs:(246,4) wlc_join_start_ibss:f(0,1) wlc:P(1,2) ssid:P(1,16) ssid_len:P(0,
1) bi:(246,15) band:r(252,116) chspec:r(215,1) bi:(246,15) band:r(252,116) chspe
c:r(215,1) wlc_ibss_disable:F(0,22) wlc:P(1,2) wlc_ibss_enable:F(0,22) wlc:P(1,2
) wlc_tkip_countermeasures:f(0,22) wlc:P(1,2) txstatus:P(6,28) dummy:P(66,2) scb
:r(246,35) wlc_disassociate_client:F(0,1) wlc:P(1,2) send_disassociate:P(4,1) fn
:P(252,70) arg:P(66,2) scb:r(246,35) pkt:r(66,2) BSSID:(220,3) bsstype:r(6,28) s
cb:r(246,35) pkt:r(66,2) BSSID:(220,3) bsstype:r(6,28) wlc_sup_mic_error:F(4,1)
wlc:P(1,2) group:P(4,1) wlc_getrand:F(0,22) wlc:P(1,2) buf:P(249,7) buflen:P(0,1
) rand:r(0,1) wlc_pkt_callback_append:F(0,22) wlc:P(1,2) new_pkt:P(66,2) pkt:P(6
6,2) idx:r(4,3) wlc_pkt_callback_register:F(0,1) wlc:P(1,2) fn:P(252,70) arg:P(6
6,2) pkt:P(66,2) pcb:r(1,87)=*(252,73) i:r(4,3) pcb:r(1,87) i:r(4,3) wlc_pkt_cal
и того
name:f(num,num) это начало функции
name:p(num,num) это аргументы
дальше это переменные в функции
тоесть к примеру

Код: Выделить всё

... wlc_clear_hw_association:F(0,22) wlc:P(1,2) regs:r(252,114) rs:(246,4)...
надо преобразовать в

Код: Выделить всё

 wlc_clear_hw_association:F(0,22) wlc:P(1,2)
{
             regs:r(252,114)
             rs:(246,4)

}
это пока для начала

Re: распарсить текст

Добавлено: 2008-11-09 9:44:07
paradox
и другой регексп преобразовать к виду

Код: Выделить всё

wlc_clear_hw_association(wlc)
{
             regs:r(252,114)
             rs:(246,4)

}
а если аргументов много то через запятую

Код: Выделить всё

wlc_clear_hw_association(wlc, on)  по списку аргументов если он не один
{
             regs:r(252,114)
             rs:(246,4)

}

Re: распарсить текст

Добавлено: 2008-11-09 10:10:41
ProFTP

Код: Выделить всё

pcb:r(1,87)=*(252,73)
с вот этим что делать?

а как это называется? может готовое есть?

Re: распарсить текст

Добавлено: 2008-11-09 10:18:18
paradox

Код: Выделить всё

wlc_pkt_callback_register:F(0,1) wlc:P(1,2) fn:P(252,70) arg:P(6
6,2) pkt:P(66,2) pcb:r(1,87)=*(252,73) i:r(4,3) pcb:r(1,87) i:r(4,3) 

Код: Выделить всё

wlc_pkt_callback_register:F(0,1) wlc:P(1,2) fn:P(252,70) arg:P(66,2) pkt:P(66,2)
               pcb:r(1,87)=*(252,73)
               i:r(4,3)
               pcb:r(1,87)
               i:r(4,3) 
и второй вариант

Код: Выделить всё

wlc_pkt_callback_register(wlc, fn, arg, pkt)
{
               pcb:r(1,87)=*(252,73)
               i:r(4,3)
               pcb:r(1,87)
               i:r(4,3)
}
 
все что от аргументов до начала след функции между пробелом вставитть \n

Re: распарсить текст

Добавлено: 2008-11-09 10:19:53
ProFTP
:-o

Re: распарсить текст

Добавлено: 2008-11-09 10:25:28
paradox
paradox.lissyara.su/wl_apsta.o.bz2
bunzip2 wl_apsta.o.bz2
strings wl_apsta.o
вот этот текст

причем ловить парсер должен пока что то ко функции
тоесть
name:f(num, num) и то что дальше до другой

потому как там еще и другие переменные есть
структуры итд

Re: распарсить текст

Добавлено: 2008-11-09 11:52:40
zg
paradox писал(а):это пока для начала
а потом нас всех посодют за нарушение лицензии :smile: дизассемблировать не хорошо :oops:

думаю надо простенький парсер делать, простой регуляркой тут не обойтись

Re: распарсить текст

Добавлено: 2008-11-09 12:13:26
paradox
та ну это простой парсер должен уметь сделать
к томуже там до дизасма как до ньюерка ....
в СССР этого не заарещено

Re: распарсить текст

Добавлено: 2008-11-09 16:53:49
ProFTP

Код: Выделить всё

#!/usr/bin/perl

$fun=':F';
$arg=':P';

open(MYFILE, "/usr/home/ii/paradox.txt") || die "sdfsdfsdfsdf sd";             

#@contents=<MYFILE>;                                                             
#foreach $i (@contents){  

while (<MYFILE>) {

s { (\w+ $fun \W+)  } {  \n $1}iogx; 

s { (  $arg w+) } {   \n }iogx; 
print ;

}
выводит вот такое

http://wdh.suncloud.ru/perl04.htm

Код: Выделить всё

6,28) ie:r(252,63) sup_rates_ovrd:r(252,63) ext_rates_ovrd:r(252,63) pwr_cap:(21
9,25) WPA_auth:(4,4) bsscfg:(249,20) wme_ie:(219,65) cap_ie:(219,85) cap_ie:(219
,85) rclist:(230,2) i:r(6,28) min_pwr:(4,3) max_pwr:(4,3) i:r(6,28) wlc_authresp
  
 _client:f(0,22) wlc:P(1,2) rxh:p(256,3) hdr:P(1,66) body:P(66,2) len:p(6,28) len
:r(6,28) auth_alg:r(4,4) auth_seq:r(4,4) auth_status:r(4,4) challenge:r(249,7) s
cb:r(246,35) pkt:r(66,2)   
 wlc_clear_hw_association:F(0,22) wlc:P(1,2) regs:r(252,
114) rs:(246,4)   
 wlc_join_start_ibss:f(0,1) wlc:P(1,2) ssid:P(1,16) ssid_len:P(0,
1) bi:(246,15) band:r(252,116) chspec:r(215,1) bi:(246,15) band:r(252,116) chspe
c:r(215,1)   
 wlc_ibss_disable:F(0,22) wlc:P(1,2)   
 wlc_ibss_enable:F(0,22) wlc:P(1,2
)   
 wlc_tkip_countermeasures:f(0,22) wlc:P(1,2) txstatus:P(6,28) dummy:P(66,2) scb
:r(246,35)   
 wlc_disassociate_client:F(0,1) wlc:P(1,2) send_disassociate:P(4,1) fn
:P(252,70) arg:P(66,2) scb:r(246,35) pkt:r(66,2) BSSID:(220,3) bsstype:r(6,28) s
cb:r(246,35) pkt:r(66,2) BSSID:(220,3) bsstype:r(6,28)   
 wlc_sup_mic_error:F(4,1)
wlc:P(1,2) group:P(4,1)   
 wlc_getrand:F(0,22) wlc:P(1,2) buf:P(249,7) buflen:P(0,1
) rand:r(0,1)   
 wlc_pkt_callback_append:F(0,22) wlc:P(1,2) new_pkt:P(66,2) pkt:P(6
6,2) idx:r(4,3)   
 wlc_pkt_callback_register:F(0,1) wlc:P(1,2) fn:P(252,70) arg:P(6
6,2) pkt:P(66,2) pcb:r(1,87)=*(252,73) i:r(4,3) pcb:r(1,87) i:r(4,3) wlc_pkt_cal

дальше не знаю... не получилось

Re: распарсить текст

Добавлено: 2008-11-09 21:59:48
Yam
Вот, попробуй.

Код: Выделить всё

#!/bin/sh

in_file=./test.in
out_file=./test.out

cat $in_file \
| sed -E 's/([a-z_0-9]+:[Ff]+\([0-9,]+\) ?)(([a-zA-Z_0-9]+:[Pp]+\([0-9,]+\) ?)+)(([A-Za-z_0-9]+:?[^FfPp]?\([0-9,]+\)[=\*]*\(?[0-9,]*\)? ?)*)/\
\/* begin of function: \1 \/*\
\
\1 \2\
{\
    \4\
}\
\
/g' > $out_file

На входе (test.in):

Код: Выделить всё

wlc_authresp_client:f(0,22) wlc:P(1,2) rxh:p(256,3) hdr:P(1,66) body:P(66,2) len:p(6,28) len:r(6,28) auth_alg:r(4,4) auth_seq:r(4,4) auth_status:r(4,4) challenge:r(249,7) scb:r(246,35) pkt:r(66,2) wlc_clear_hw_association:F(0,22) wlc:P(1,2) regs:r(252,114) rs:(246,4) wlc_join_start_ibss:f(0,1) wlc:P(1,2) ssid:P(1,16) ssid_len:P(0,1) bi:(246,15) band:r(252,116) chspec:r(215,1) bi:(246,15) band:r(252,116) chspec:r(215,1) wlc_ibss_disable:F(0,22) wlc:P(1,2) wlc_ibss_enable:F(0,22) wlc:P(1,2) wlc_tkip_countermeasures:f(0,22) wlc:P(1,2) txstatus:P(6,28) dummy:P(66,2) scb:r(246,35) wlc_disassociate_client:F(0,1) wlc:P(1,2) send_disassociate:P(4,1) fn:P(252,70) arg:P(66,2) scb:r(246,35) pkt:r(66,2) BSSID:(220,3) bsstype:r(6,28) scb:r(246,35) pkt:r(66,2) BSSID:(220,3) bsstype:r(6,28) wlc_sup_mic_error:F(4,1)wlc:P(1,2) group:P(4,1) wlc_getrand:F(0,22) wlc:P(1,2) buf:P(249,7) buflen:P(0,1) rand:r(0,1) wlc_pkt_callback_append:F(0,22) wlc:P(1,2) new_pkt:P(66,2) pkt:P(66,2) idx:r(4,3) wlc_pkt_callback_register:F(0,1) wlc:P(1,2) fn:P(252,70) arg:P(66,2) pkt:P(66,2) pcb:r(1,87)=*(252,73) i:r(4,3) pcb:r(1,87) i:r(4,3) 
На выходе (test.out):

Код: Выделить всё

/* begin of function: wlc_authresp_client:f(0,22)  /*

wlc_authresp_client:f(0,22)  wlc:P(1,2) rxh:p(256,3) hdr:P(1,66) body:P(66,2) len:p(6,28)
{
    len:r(6,28) auth_alg:r(4,4) auth_seq:r(4,4) auth_status:r(4,4) challenge:r(249,7) scb:r(246,35) pkt:r(66,2)
}


/* begin of function: wlc_clear_hw_association:F(0,22)  /*

wlc_clear_hw_association:F(0,22)  wlc:P(1,2)
{
    regs:r(252,114) rs:(246,4)
}


/* begin of function: wlc_join_start_ibss:f(0,1)  /*

wlc_join_start_ibss:f(0,1)  wlc:P(1,2) ssid:P(1,16) ssid_len:P(0,1)
{
    bi:(246,15) band:r(252,116) chspec:r(215,1) bi:(246,15) band:r(252,116) chspec:r(215,1)
}


/* begin of function: wlc_ibss_disable:F(0,22)  /*

wlc_ibss_disable:F(0,22)  wlc:P(1,2)
{

}


/* begin of function: wlc_ibss_enable:F(0,22)  /*

wlc_ibss_enable:F(0,22)  wlc:P(1,2)
{

}


/* begin of function: wlc_tkip_countermeasures:f(0,22)  /*

wlc_tkip_countermeasures:f(0,22)  wlc:P(1,2) txstatus:P(6,28) dummy:P(66,2)
{
    scb:r(246,35)
}


/* begin of function: wlc_disassociate_client:F(0,1)  /*

wlc_disassociate_client:F(0,1)  wlc:P(1,2) send_disassociate:P(4,1) fn:P(252,70) arg:P(66,2)
{
    scb:r(246,35) pkt:r(66,2) BSSID:(220,3) bsstype:r(6,28) scb:r(246,35) pkt:r(66,2) BSSID:(220,3) bsstype:r(6,28)
}


/* begin of function: wlc_sup_mic_error:F(4,1) /*

wlc_sup_mic_error:F(4,1) wlc:P(1,2) group:P(4,1)
{

}


/* begin of function: wlc_getrand:F(0,22)  /*

wlc_getrand:F(0,22)  wlc:P(1,2) buf:P(249,7) buflen:P(0,1)
{
    rand:r(0,1)
}


/* begin of function: wlc_pkt_callback_append:F(0,22)  /*

wlc_pkt_callback_append:F(0,22)  wlc:P(1,2) new_pkt:P(66,2) pkt:P(66,2)
{
    idx:r(4,3)
}


/* begin of function: wlc_pkt_callback_register:F(0,1)  /*

wlc_pkt_callback_register:F(0,1)  wlc:P(1,2) fn:P(252,70) arg:P(66,2) pkt:P(66,2)
{
    pcb:r(1,87)=*(252,73) i:r(4,3) pcb:r(1,87) i:r(4,3)
}
Если не секрет, что ковыряешь?

Re: распарсить текст

Добавлено: 2008-11-09 22:08:47
paradox
а второй парсер для того чтобы более Cшные функции были?

дрова для wifi броадкома

тема в железе есть

Re: распарсить текст

Добавлено: 2008-11-09 23:01:35
paradox

Код: Выделить всё

/* begin of function: wlc_pkt_callback_register:F(0,1)  /*

wlc_pkt_callback_register:F(0,1)  wlc:P(1,2) fn:P(252,70) arg:P(66,2) pkt:P(66,2)
{
    pcb:r(1,87)=*(252,73) i:r(4,3) pcb:r(1,87) i:r(4,3)
}
лучще если будет так

Код: Выделить всё

wlc_pkt_callback_register:F(0,1)  wlc:P(1,2) fn:P(252,70) arg:P(66,2) pkt:P(66,2)
{
    pcb:r(1,87)=*(252,73)
    i:r(4,3)
    pcb:r(1,87)
    i:r(4,3)
}
и второй вариант
лучще если будет так

Код: Выделить всё

wlc_pkt_callback_register(wlc, fn, arg, pkt)
{
    pcb:r(1,87)=*(252,73)
    i:r(4,3)
    pcb:r(1,87)
    i:r(4,3)
}

Re: распарсить текст

Добавлено: 2008-11-10 1:33:36
Yam
Скрипт:

Код: Выделить всё

#!/bin/sh

in_file=./test.in
out_file=./test.out
out_c=./test.c

cat $in_file \
| sed -E 's/([a-z_0-9]+:[Ff]+\([0-9,]+\) ?)(([a-zA-Z_0-9]+:[Pp]+\([0-9,]+\) ?)+)(([A-Za-z_0-9]+:?[^FfPp]?\([0-9,]+\)[=\*]*\(?[0-9,]*\)? ?)*)/\
\/* begin of function: \1 *\/\
\
\1\2\
{\
    \4\
}\
\
/g' > $out_file

cat $out_file \
| awk '{ FS = " ";
    if ( match($1,"^[a-z_0-9]+:[Ff]") > 0) {
        split($1,arr,":")
        str = arr[1]"("
        for (i=2;i<NF;i++){
        split($i,arr,":")
            str = str arr[1]","
        }
        split($NF,arr,":")
        str = str arr[1]")"
        print str
    }
    if ( match($0,"^[{]+") > 0) {
        print $0
    }
    if ( match($0,"^[}|/]+") > 0) {
        print $0 "\n"
    }
    if ( match($0,"^[^a-z_0-9{}/]+") > 0) {
        for (i=1;i<=NF;i++){
            print "\t" $i
        }
    }
  }' > $out_c
Input:

Код: Выделить всё

wlc_authresp_client:f(0,22) wlc:P(1,2) rxh:p(256,3) hdr:P(1,66) body:P(66,2) len:p(6,28) len:r(6,28) auth_alg:r(4,4) auth_seq:r(4,4) auth_status:r(4,4) challenge:r(249,7) scb:r(246,35) pkt:r(66,2) 
Output (raw):

Код: Выделить всё

/* begin of function: wlc_authresp_client:f(0,22)  */

wlc_authresp_client:f(0,22) wlc:P(1,2) rxh:p(256,3) hdr:P(1,66) body:P(66,2) len:p(6,28)
{
    len:r(6,28) auth_alg:r(4,4) auth_seq:r(4,4) auth_status:r(4,4) challenge:r(249,7) scb:r(246,35) pkt:r(66,2)
}
Output C-style:

Код: Выделить всё

/* begin of function: wlc_authresp_client:f(0,22)  */

wlc_authresp_client(wlc,rxh,hdr,body,len)
{
        len:r(6,28)
        auth_alg:r(4,4)
        auth_seq:r(4,4)
        auth_status:r(4,4)
        challenge:r(249,7)
        scb:r(246,35)
        pkt:r(66,2)
}
Конечно не верх изящества, но работает.

Re: распарсить текст

Добавлено: 2008-11-10 1:43:09
paradox
покатит
ночью потестирую))


просто если буду делать в ручную
то клаву убью нах
а ноутбучная клава дороже обычной))

Re: распарсить текст

Добавлено: 2008-11-10 9:06:56
paradox
что то не срабатвает парсер
валиться(((
я уже как ему файл не подсовывал....
даже тупо такой же форматный... нехотит

а можно сделать так ?
strings wl_apsta.o | парсер > результат

Re: распарсить текст

Добавлено: 2008-11-10 13:03:39
Alex Keda
к асусу фирмварь ковыряешь, судя по названию? =)

Re: распарсить текст

Добавлено: 2008-11-10 13:27:30
paradox
у них у всех одинаковые название
это от линксиса последний

Re: распарсить текст

Добавлено: 2008-11-10 18:28:35
Yam
Скрипт работает и честно парсит то, что ему было предложено в первом посте. И естесвенно лажает на strings wl_apsta.o, там куча мусора, да и конструкции встречаются посложней. В итоге родился такой монстрик:
cat script.sh:

Код: Выделить всё

#!/bin/sh

cat $1 \
| grep -E '([a-zA-Z_0-9]+:[a-zA-Z0-9]+\([0-9,]+\)[=\*]*\(?[0-9,]*\)?[=\*k]*\(?[0-9,]*\)? ?)' \
| sed  -E 's/;-?[0-9]*//g' \
| tr "\n" " " \
| sed  -E 's/([A-Za-z_0-9]+:[Ff]+\([0-9,]+\) ?)(([a-zA-Z_0-9]+:[Pp]+\([0-9,]+\)[=\*]*\(?[0-9,]*\)?[=\*a-zA-Z]{0,5}\(?[0-9,]*\)? ?)+)(([A-Za-z_0-9]+:?[^FfPp]?\([0-9,]+\)[=\*]*\(?[0-9,]*\)?[=\*a-zA-Z]{0,5}\(?[0-9,]*\)? ?)*)/\
XxX\/* begin of function: \1 *\/\
XxX\
XxX\1\2\
XxX{\
XxX     \4\
XxX}\
YyY/g' \
| grep ^XxX \
| sed -E 's/^XxX//' \
| awk '{ FS = " ";
    if ( match($1,"^[a-z_0-9]+:[Ff]") > 0) {
        split($1,arr,":")
        str = arr[1]"("
        for (i=2;i<NF;i++){
        split($i,arr,":")
            str = str arr[1]","
        }
        split($NF,arr,":")
        str = str arr[1]")"
        print str
    }
    if ( match($0,"^[{]+") > 0) {
        print $0
    }
    if ( match($0,"^[}|/]+") > 0) {
        print $0 "\n"
    }
    if ( match($0,"^[^a-z_0-9{}/]+") > 0) {
        for (i=1;i<=NF;i++){
            print "\t" $i
        }
    }
  }' > $1.c
юзается так:

Код: Выделить всё

strings wl_apsta.o > out.raw && ./script.sh out.raw
на выходе будет файл out.raw.c

Пример: http://pastebin.ca/1250344

Надеюсь поможет.

Re: распарсить текст

Добавлено: 2008-11-10 18:32:57
paradox
будем проверять...

Re: распарсить текст

Добавлено: 2008-11-10 18:44:47
paradox
не срабатывает
ошибка

ты на какой ос делаешь?
или может исмволы какие пропадают при копировании

скнинь скрипт в аплоад на фтп

Re: распарсить текст

Добавлено: 2008-11-10 18:52:07
paradox
где то сдесь валиться

Код: Выделить всё

| sed  -E 's/([A-Za-z_0-9]+:[Ff]+\([0-9,]+\) ?)(([a-zA-Z_0-9]+:[Pp]+\([0-9,]+\)[=\*]*\(?[0-9,]*\)?[=\*a-zA-Z]{0,5}\(?[0-9,]*\)? ?)+)(([A-Za-z_0-9]+:?[^FfPp]?\([0-9,]+\)[=\*]*\(?[0-9,]*\)?[=\*a-zA-Z]{0,5}\(?[0-9,]*\)? ?)*)/\
XxX\/* begin of function: \1 *\/\
XxX\
XxX\1\2\
XxX{\
XxX     \4\
XxX}\
YyY/g' \

Re: распарсить текст

Добавлено: 2008-11-10 19:04:27
Yam
upload/parse_raw2c.sh
upload/parse_sample_out.c

FreeBSD 7.0R

Re: распарсить текст

Добавлено: 2008-11-10 19:18:31
paradox
отработало
токо не все
обрати внимание
функции
PRF
fPRF
SHA1Reset
SHa1Result
init_F
do_F
не взяло

ну просто функцию F ясное дело оно не возьмет

и еще нет функций в капсе
примеру READ_GPHY_TABLE_ENT:f(4,4)
и еше

Re: распарсить текст

Добавлено: 2008-11-10 19:25:00
Yam
они там есть, только оформлены не верно, в алгоритме на awk был недочет, там только мелкие матчились в качестве имени, ну и опечатка в этом же алгоритме вместо <=NF написано <NF в самом конце.

Re: распарсить текст

Добавлено: 2008-11-10 19:27:13
paradox
кстати а какие символы форум скушал?
вроде

Код: Выделить всё

 должен выдавать все как есть
без искажений