Regex und Binärdateien

  • Hallo,
    habe mal wieder ein Problemchen mit Regex-Suche in Binärdateien. Es geht eigentlich nur um das Vorhandensein einer x-beliebigen Zeichenfolge in dieser Datei.
    In der Hilfe habe ich die Steuerzeichen \Q und \E gefunden, alles was dort dazwischen steht, wird (so wie ich das verstehe) als "normaler" String verwendet, z.B. ein im Suchstring enthaltenes [ würde NICHT als Anfang eines Sets interpretiert, sondern als ganz normales Zeichen.
    Nun habe ich zwei kleine Beispiele, in dem einen wird der Suchstring gefunden, in dem anderen nicht.

    Spoiler anzeigen
    [autoit]

    $bin_data=chr(193)&chr(1)&chr(16)&chr(65)&chr(127)
    $searchstring=chr(1)&chr(16)&chr(65)

    [/autoit] [autoit][/autoit] [autoit]

    $pos=stringregexp($bin_data,"(?-i)(\Q"&$searchstring&"\E)",1) ;findet den string
    if @error then
    msgbox (0,"error regex",@error&@crlf&@extended)
    else
    msgbox (0,"Suchstring gefunden",0)
    endif

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;chr(1) durch chr(0) ersetzt
    $bin_data=chr(193)&chr(0)&chr(16)&chr(65)&chr(127)
    $searchstring=chr(0)&chr(16)&chr(65)

    [/autoit] [autoit][/autoit] [autoit]

    $pos=stringregexp($bin_data,"(?-i)(\Q"&$searchstring&"\E)",1) ;findet string nicht
    if @error then
    msgbox (0,"error regex",@error&@crlf&@extended)
    else
    msgbox (0,"Suchstring gefunden",0)
    endif

    [/autoit]


    zzt stehe ich auf dem Schlauch....

    ciao
    Andy

  • Habe mal bissl gestöbert und rausgefunden, daß etliche Regex-Parser das NUL-Byte als End of String ansehen....
    Es liegt also nicht am Pattern, sondern am zu überprüfenden String.
    Bsp:

    Spoiler anzeigen
    [autoit]

    ;chr(8) vor der NUL, chr(9) dahinter
    $bin_data=chr(193)&chr(8)&chr(0)&chr(9)&chr(127)

    [/autoit] [autoit][/autoit] [autoit]

    $pos=stringregexp($bin_data,"\x8",1) ;findet char
    if @error then
    msgbox (0,"error regex",@error&@crlf&@extended)
    else
    msgbox (0,"Suchstring gefunden",0)
    endif

    [/autoit] [autoit][/autoit] [autoit]

    $pos=stringregexp($bin_data,"\x9",1) ;findet char nicht, da "hinter" dem nul-byte
    if @error then
    msgbox (0,"error regex",@error&@crlf&@extended)
    else
    msgbox (0,"Suchstring gefunden",0)
    endif

    [/autoit]


    Die "normalen" Stringfunktionen sind hiervon nicht betroffen, d.h. stringinstr() funktioniert in binaries einwandfrei...

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (1. September 2009 um 19:37)