Помогите, плз, идентифицировать алгоритм

Тема в разделе "WASM.A&O", создана пользователем Velheart, 22 авг 2008.

  1. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Натолкнулся на следующий код:
    Код (Text):
    1. int __stdcall LookForPattern(int SectionStartAddress, unsigned int SectionSize, int pPattern, unsigned int PatternSize_)
    2. {
    3.   unsigned int PatternSize; // edx@1
    4.   unsigned int i; // eax@3
    5.   int pPattern_; // ebx@3
    6.   _BYTE *v7; // esi@4
    7.   int DataToCompare_1; // eax@7
    8.   int EndOfData; // ecx@7
    9.   int DataToCompare_2; // esi@7
    10.   _BYTE StrangeTable[256]; // [sp+14h] [bp-100h]@4
    11.   unsigned int sectionBoundary; // [sp+10h] [bp-104h]@7
    12.  
    13.   PatternSize = PatternSize_;
    14.   if ( PatternSize_ && SectionSize >= PatternSize_ )
    15.   {
    16.     pPattern_ = pPattern;
    17.     for ( i = PatternSize_ - 2; (signed int)i >= 0; --i )
    18.     {
    19.       v7 = &StrangeTable[*(_BYTE *)(i + pPattern_)];
    20.       if ( *v7 == PatternSize )
    21.         *v7 = (_BYTE)PatternSize - (_BYTE)i - 1;
    22.     }
    23.     EndOfData = pPattern_ + PatternSize - 1;
    24.     DataToCompare_1 = PatternSize + SectionStartAddress - 1;
    25.     DataToCompare_2 = PatternSize + SectionStartAddress - 1;
    26.     sectionBoundary = SectionStartAddress + SectionSize;
    27.     do
    28.     {
    29.       if ( *(_BYTE *)DataToCompare_1 == *(_BYTE *)EndOfData )
    30.       {
    31.         if ( EndOfData == pPattern_ )
    32.           return DataToCompare_1 - SectionStartAddress;
    33.         --DataToCompare_1;
    34.         --EndOfData;
    35.       }
    36.       else
    37.       {
    38.         EndOfData = pPattern_ + PatternSize - 1;
    39.         DataToCompare_2 += StrangeTable[*(_BYTE *)DataToCompare_2];
    40.         DataToCompare_1 = DataToCompare_2;
    41.       }
    42.     }
    43.     while ( DataToCompare_1 < sectionBoundary );
    44.   }
    45.   return -1;
    46. }
    Из контекста вызова понятно, что ищет кусок кода в некоторой области памяти, я предполагаю, что данный алгоритм должен быть довольно известным, может кто-нибудь подскажет что за он такой, может ссылку какую-нибудь, выглядит прикольно, хотелось бы взять на вооружение + возможно там где он и еще чего-нибудь полезного найдется =)
     
  2. Proteus

    Proteus Member

    Публикаций:
    0
    Регистрация:
    19 июн 2004
    Сообщения:
    344
    Адрес:
    Russia
    Сильно не разглядывал. Но очень похоже на поиск Боера-Мура...
     
  3. Proteus

    Proteus Member

    Публикаций:
    0
    Регистрация:
    19 июн 2004
    Сообщения:
    344
    Адрес:
    Russia
    Код (Text):
    1.     for ( i = PatternSize_ - 2; (signed int)i >= 0; --i )
    2.     {
    3.       v7 = &StrangeTable[*(_BYTE *)(i + pPattern_)];
    4.       if ( *v7 == PatternSize )
    5.         *v7 = (_BYTE)PatternSize - (_BYTE)i - 1;
    6.     }
    Если да то всё довольно криво...

    Вот я например это кусок не понимаю. Он попутно проверяет элементы таблицы StrangeTable, которые между делом до этого никто не инициализировал (вроде бы). И само условие глупое. Если патерн раскручивать не с конца, а с начала, условие будет лишним, а код проще....
     
  4. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Proteus
    Сенкс, погуглю =)
    Сорри, он заполняет массив значением PatternSize, которое реально -- байт, как-то я просмотрел, что hex-rays не заметил =), может удобней ассемблерный листинг кому =), вот:

    Код (Text):
    1.  ; int __stdcall LookForPattern(int SectionStartAddress, unsigned int SectionSize, int pPattern, unsigned int PatternSize_)
    2. .text:00027220 LookForPattern  proc near               ; CODE XREF: PatchSomeKernelFunction+6Bp
    3. .text:00027220                                         ; PatchSomeKernelFunction+81p
    4. .text:00027220
    5. .text:00027220 sectionBoundary = dword ptr -104h
    6. .text:00027220 StrangeTable    = dword ptr -100h
    7. .text:00027220 SectionStartAddress= dword ptr  4
    8. .text:00027220 SectionSize     = dword ptr  8
    9. .text:00027220 pPattern        = dword ptr  0Ch
    10. .text:00027220 PatternSize_    = dword ptr  10h
    11. .text:00027220
    12. .text:00027220                 mov     edx, [esp+PatternSize_]
    13. .text:00027224                 sub     esp, 104h
    14. .text:0002722A                 test    edx, edx
    15. .text:0002722C                 push    ebx
    16. .text:0002722D                 push    ebp
    17. .text:0002722E                 push    esi
    18. .text:0002722F                 push    edi
    19. .text:00027230                 jz      exit_neg
    20. .text:00027236                 cmp     [esp+114h+SectionSize], edx
    21. .text:0002723D                 jb      exit_neg
    22. .text:00027243                 mov     al, dl
    23. .text:00027245                 mov     ecx, 40h
    24. .text:0002724A                 mov     bl, al
    25. .text:0002724C                 lea     edi, [esp+114h+StrangeTable]
    26. .text:00027250                 mov     bh, bl
    27. .text:00027252                 mov     eax, ebx
    28. .text:00027254                 shl     eax, 10h
    29. .text:00027257                 mov     ax, bx
    30. .text:0002725A                 mov     ebx, [esp+114h+pPattern]
    31. .text:00027261                 rep stosd
    32. .text:00027263                 lea     eax, [edx-2]
    33. .text:00027266                 test    eax, eax
    34. .text:00027268                 jl      short loc_27286
    35. .text:0002726A
    36. .text:0002726A loop:                                   ; CODE XREF: LookForPattern+64j
    37. .text:0002726A                 xor     ecx, ecx
    38. .text:0002726C                 mov     cl, [eax+ebx]
    39. .text:0002726F                 lea     esi, [esp+ecx+114h+StrangeTable]
    40. .text:00027273                 xor     ecx, ecx
    41. .text:00027275                 mov     cl, [esi]
    42. .text:00027277                 cmp     ecx, edx
    43. .text:00027279                 jnz     short loc_27283
    44. .text:0002727B                 mov     cl, dl
    45. .text:0002727D                 sub     cl, al
    46. .text:0002727F                 dec     cl
    47. .text:00027281                 mov     [esi], cl
    48. .text:00027283
    49. .text:00027283 loc_27283:                              ; CODE XREF: LookForPattern+59j
    50. .text:00027283                 dec     eax
    51. .text:00027284                 jns     short loop
    52. .text:00027286
    53. .text:00027286 loc_27286:                              ; CODE XREF: LookForPattern+48j
    54. .text:00027286                 mov     ebp, [esp+114h+SectionStartAddress]
    55. .text:0002728D                 lea     edi, [ebx+edx-1]
    56. .text:00027291                 mov     ecx, edi
    57. .text:00027293                 lea     eax, [edx+ebp-1]
    58. .text:00027297                 mov     edx, [esp+114h+SectionSize]
    59. .text:0002729E                 add     edx, ebp
    60. .text:000272A0                 mov     esi, eax
    61. .text:000272A2                 mov     [esp+114h+sectionBoundary], edx
    62. .text:000272A6
    63. .text:000272A6 loop_:                                  ; CODE XREF: LookForPattern+AAj
    64. .text:000272A6                 mov     dl, [eax]
    65. .text:000272A8                 cmp     dl, [ecx]
    66. .text:000272AA                 jnz     short loc_272B4
    67. .text:000272AC                 cmp     ecx, ebx
    68. .text:000272AE                 jz      short exitsuccess
    69. .text:000272B0                 dec     eax
    70. .text:000272B1                 dec     ecx
    71. .text:000272B2                 jmp     short loc_272C4
    72. .text:000272B4 ; ---------------------------------------------------------------------------
    73. .text:000272B4
    74. .text:000272B4 loc_272B4:                              ; CODE XREF: LookForPattern+8Aj
    75. .text:000272B4                 xor     eax, eax
    76. .text:000272B6                 xor     edx, edx
    77. .text:000272B8                 mov     al, [esi]
    78. .text:000272BA                 mov     ecx, edi
    79. .text:000272BC                 mov     dl, byte ptr [esp+eax+114h+StrangeTable]
    80. .text:000272C0                 add     esi, edx
    81. .text:000272C2                 mov     eax, esi
    82. .text:000272C4
    83. .text:000272C4 loc_272C4:                              ; CODE XREF: LookForPattern+92j
    84. .text:000272C4                 cmp     eax, [esp+114h+sectionBoundary]
    85. .text:000272C8                 jnb     short exit_neg
    86. .text:000272CA                 jmp     short loop_
    87. .text:000272CC ; ---------------------------------------------------------------------------
    88. .text:000272CC
    89. .text:000272CC exitsuccess:                            ; CODE XREF: LookForPattern+8Ej
    90. .text:000272CC                 pop     edi
    91. .text:000272CD                 sub     eax, ebp
    92. .text:000272CF                 pop     esi
    93. .text:000272D0                 pop     ebp
    94. .text:000272D1                 pop     ebx
    95. .text:000272D2                 add     esp, 104h
    96. .text:000272D8                 retn    10h
    97. .text:000272DB ; ---------------------------------------------------------------------------
    98. .text:000272DB
    99. .text:000272DB exit_neg:                               ; CODE XREF: LookForPattern+10j
    100. .text:000272DB                                         ; LookForPattern+1Dj ...
    101. .text:000272DB                 pop     edi
    102. .text:000272DC                 pop     esi
    103. .text:000272DD                 pop     ebp
    104. .text:000272DE                 or      eax, 0FFFFFFFFh
    105. .text:000272E1                 pop     ebx
    106. .text:000272E2                 add     esp, 104h
    107. .text:000272E8                 retn    10h
    108. .text:000272E8 LookForPattern  endp
     
  5. Proteus

    Proteus Member

    Публикаций:
    0
    Регистрация:
    19 июн 2004
    Сообщения:
    344
    Адрес:
    Russia
    http://www.rsdn.ru/article/alg/textsearch.xml
    http://ru.wikipedia.org/wiki/Алгоритм_Бойера-Мура_поиска_строки

    Штука старая и на самом деле очень огромная, здесь только самая простая и полезная часть.
     
  6. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Proteus
    Клево, сенкс =)