Поиск регулярным выражением в двоичном файле

Обсуждение программ nnCron и nnCron LITE

Re: Поиск регулярным выражением в двоичном файле

Postby VoidVolker » Sun, 19 May 2013, 22:44

А что искать-то надо?
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Поиск регулярным выражением в двоичном файле

Postby Morituruz » Sun, 19 May 2013, 22:51

Как-то так:
Code: Select all
%sitename% ... %parameter1% ... %value1% ... %parameter2% ... %value2%

где ... — неведомая двоичная хрень.
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Поиск регулярным выражением в двоичном файле

Postby VoidVolker » Mon, 20 May 2013, 08:07

Code: Select all
: String2Hex   \ ( a u -- a1 u1 ) \ Коневртировать строку данных в шестнадцатеричное строковое представление
  BASE @ >R HEX
  DUP 2* DUP >R
  CELL+ ALLOCATE THROW DUP >R
  SWAP 0 DO
    OVER I + C@               \ Получаем исходный байт
    BL MAX                    \ Заменям все разделители и в осбенности нули на пробелы
    S>D <# # # #>  DROP W@        \ Коневртируем байт
    OVER I 2* + W!            \ Сохраняем байт в текстовом виде
  LOOP
  2DROP R> R>
  R> BASE !
;

: Hex2String   \ ( a1 u1 -- a u ) \ Коневртировать шестнадцатеричное строковое представление данных в строку
  BASE @ >R HEX
  DUP 2/ DUP >R
  CELL+ ALLOCATE THROW DUP >R
  SWAP 2/ 0 DO
    OVER I 2* + 2             \ Получаем строку исходнго байта
    S>NUM                     \ Конвертируем строку в байт
    OVER I + C!               \ Сохраняем байт
  LOOP
  2DROP R> R>
  R> BASE !
;

Я нашел причину, по которой регекспы не работали: нули в строке. В данном варианте все байты меньше пробела заменяются на пробел и теперь со строкой можно работать как с обычным текстом. Т.о. строка вида:
Code: Select all
%sitename% ... %parameter1% ... %value1% ... %parameter2% ... %value2%

Дамп (вместо точек - 1 2 3):
Code: Select all
3B9A89C   25 73 69 74  65 6E 61 6D  65 25 01 02  03 25 70 61 %sitename%...%pa
3B9A8AC   72 61 6D 65  74 65 72 31  25 01 02 03  25 76 61 6C rameter1%...%val
3B9A8BC   75 65 31 25  01 02 03 25  70 61 72 61  6D 65 74 65 ue1%...%paramete
3B9A8CC   72 32 25 01  02 03 25 76  61 6C 75 65  32 25 00 00 r2%...%value2%..

Будет выглядеть следующим образом:
Code: Select all
3B9AABC   32 35 37 33  36 39 37 34  36 35 36 45  36 31 36 44 25736974656E616D
3B9AACC   36 35 32 35  32 30 32 30  32 30 32 35  37 30 36 31 6525202020257061
3B9AADC   37 32 36 31  36 44 36 35  37 34 36 35  37 32 33 31 72616D6574657231
3B9AAEC   32 35 32 30  32 30 32 30  32 35 37 36  36 31 36 43 252020202576616C
3B9AAFC   37 35 36 35  33 31 32 35  32 30 32 30  32 30 32 35 7565312520202025
3B9AB0C   37 30 36 31  37 32 36 31  36 44 36 35  37 34 36 35 706172616D657465
3B9AB1C   37 32 33 32  32 35 32 30  32 30 32 30  32 35 37 36 7232252020202576
3B9AB2C   36 31 36 43  37 35 36 35  33 32 32 35  00 00 00 00 616C75653225....


P.S. Не забываем про утечки памяти - если преобразованная строк не нужна, а задача будет работать продолжительное время - то лучше строки освобождать после использования.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Поиск регулярным выражением в двоичном файле

Postby Morituruz » Mon, 20 May 2013, 10:23

Ох и любите вы всё усложнять, когда не надо :mrgreen:
Нули в строке? ОК. Вы же мне когда-то показали, как получить строку с SOH символом, нулли значит получаются так:
Code: Select all
CREATE null_zstr 0 C,  0 C,
: null null_zstr 1 ;


остальное дело техники:
Code: Select all
cookies_path COUNT FILE null S" ." StringReplace S" /ищем_что_хотим/" RE-MATCH


Проверил, работает:
Code: Select all
: iCookies
S" cookies" INI-GET-VALUE 2DUP default? NOT
IF
   2DUP NIP
   IF   \ параметры указаны непосредственно в ini-файле:
      S" --cookie " 2SWAP S+
   ELSE   \ параметры не указаны, значит нужно достать их из браузера:
      2DROP
      \ считываем файл с печеньками, заменяем нули на точки:
      cookies_path COUNT FILE null S" ." StringReplace
      S" cookies_re" INI-GET-VALUE 2DUP default?
      IF
         2DROP 2DROP
         120 4096 16 +
         " В секции|n|n%NODE@%|n|nне указано регулярное выражение для поиска печенек."
         TimeMessageBox 2DROP
         S" "
      ELSE   \ на стеке лежит строка с файлом печенек и строка с regexp выражением
         RE-MATCH
         IF
            S" cookies_re_group" INI-GET-VALUE 2DUP default?
            IF
               2DROP
               120 4096 16 +
               " В секции|n|n%NODE@%|n|nотсутствует параметр cookies_re_group"
               TimeMessageBox 2DROP
               S" "
            ELSE
               EVALUATE S" --cookie " 2SWAP S+
            THEN
         ELSE
            120 4096 16 +
            " Для секции|n|n%NODE@%|n|nне удалось найти печеньки."
            TimeMessageBox 2DROP
            S" "
         THEN
      THEN
   THEN
ELSE
   2DROP
   S" "
THEN
;


Большое спасибо!
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Поиск регулярным выражением в двоичном файле

Postby VoidVolker » Mon, 20 May 2013, 11:27

Ну дело не только в нулях, а еще и в том, что среди данных могут быть такие последовательности как перевод строки и еще что угодно и мне просто не известно как на это все будут реагировать регекспы, т.к. я не знаю что там внутри у них и как оно работает.
Можно конечно просто заменить и нули, и переводы строк - CharReplace.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Поиск регулярным выражением в двоичном файле

Postby Morituruz » Mon, 20 May 2013, 11:49

VoidVolker wrote:перевод строки

они же стандартно обрабатываются регулярными выражениями, в том числе есть параметры s и x, чтобы их не замечать, а насчёт других практика покажет =-)

VoidVolker wrote:Можно конечно просто заменить и нули, и переводы строк - CharReplace.

Спасибо, полезная штука.
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Previous

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 6 guests