Натолкнулся на следующий код: Код (Text): int __stdcall LookForPattern(int SectionStartAddress, unsigned int SectionSize, int pPattern, unsigned int PatternSize_) { unsigned int PatternSize; // edx@1 unsigned int i; // eax@3 int pPattern_; // ebx@3 _BYTE *v7; // esi@4 int DataToCompare_1; // eax@7 int EndOfData; // ecx@7 int DataToCompare_2; // esi@7 _BYTE StrangeTable[256]; // [sp+14h] [bp-100h]@4 unsigned int sectionBoundary; // [sp+10h] [bp-104h]@7 PatternSize = PatternSize_; if ( PatternSize_ && SectionSize >= PatternSize_ ) { pPattern_ = pPattern; for ( i = PatternSize_ - 2; (signed int)i >= 0; --i ) { v7 = &StrangeTable[*(_BYTE *)(i + pPattern_)]; if ( *v7 == PatternSize ) *v7 = (_BYTE)PatternSize - (_BYTE)i - 1; } EndOfData = pPattern_ + PatternSize - 1; DataToCompare_1 = PatternSize + SectionStartAddress - 1; DataToCompare_2 = PatternSize + SectionStartAddress - 1; sectionBoundary = SectionStartAddress + SectionSize; do { if ( *(_BYTE *)DataToCompare_1 == *(_BYTE *)EndOfData ) { if ( EndOfData == pPattern_ ) return DataToCompare_1 - SectionStartAddress; --DataToCompare_1; --EndOfData; } else { EndOfData = pPattern_ + PatternSize - 1; DataToCompare_2 += StrangeTable[*(_BYTE *)DataToCompare_2]; DataToCompare_1 = DataToCompare_2; } } while ( DataToCompare_1 < sectionBoundary ); } return -1; } Из контекста вызова понятно, что ищет кусок кода в некоторой области памяти, я предполагаю, что данный алгоритм должен быть довольно известным, может кто-нибудь подскажет что за он такой, может ссылку какую-нибудь, выглядит прикольно, хотелось бы взять на вооружение + возможно там где он и еще чего-нибудь полезного найдется =)
Код (Text): for ( i = PatternSize_ - 2; (signed int)i >= 0; --i ) { v7 = &StrangeTable[*(_BYTE *)(i + pPattern_)]; if ( *v7 == PatternSize ) *v7 = (_BYTE)PatternSize - (_BYTE)i - 1; } Если да то всё довольно криво... Вот я например это кусок не понимаю. Он попутно проверяет элементы таблицы StrangeTable, которые между делом до этого никто не инициализировал (вроде бы). И само условие глупое. Если патерн раскручивать не с конца, а с начала, условие будет лишним, а код проще....
Proteus Сенкс, погуглю =) Сорри, он заполняет массив значением PatternSize, которое реально -- байт, как-то я просмотрел, что hex-rays не заметил =), может удобней ассемблерный листинг кому =), вот: Код (Text): ; int __stdcall LookForPattern(int SectionStartAddress, unsigned int SectionSize, int pPattern, unsigned int PatternSize_) .text:00027220 LookForPattern proc near ; CODE XREF: PatchSomeKernelFunction+6Bp .text:00027220 ; PatchSomeKernelFunction+81p .text:00027220 .text:00027220 sectionBoundary = dword ptr -104h .text:00027220 StrangeTable = dword ptr -100h .text:00027220 SectionStartAddress= dword ptr 4 .text:00027220 SectionSize = dword ptr 8 .text:00027220 pPattern = dword ptr 0Ch .text:00027220 PatternSize_ = dword ptr 10h .text:00027220 .text:00027220 mov edx, [esp+PatternSize_] .text:00027224 sub esp, 104h .text:0002722A test edx, edx .text:0002722C push ebx .text:0002722D push ebp .text:0002722E push esi .text:0002722F push edi .text:00027230 jz exit_neg .text:00027236 cmp [esp+114h+SectionSize], edx .text:0002723D jb exit_neg .text:00027243 mov al, dl .text:00027245 mov ecx, 40h .text:0002724A mov bl, al .text:0002724C lea edi, [esp+114h+StrangeTable] .text:00027250 mov bh, bl .text:00027252 mov eax, ebx .text:00027254 shl eax, 10h .text:00027257 mov ax, bx .text:0002725A mov ebx, [esp+114h+pPattern] .text:00027261 rep stosd .text:00027263 lea eax, [edx-2] .text:00027266 test eax, eax .text:00027268 jl short loc_27286 .text:0002726A .text:0002726A loop: ; CODE XREF: LookForPattern+64j .text:0002726A xor ecx, ecx .text:0002726C mov cl, [eax+ebx] .text:0002726F lea esi, [esp+ecx+114h+StrangeTable] .text:00027273 xor ecx, ecx .text:00027275 mov cl, [esi] .text:00027277 cmp ecx, edx .text:00027279 jnz short loc_27283 .text:0002727B mov cl, dl .text:0002727D sub cl, al .text:0002727F dec cl .text:00027281 mov [esi], cl .text:00027283 .text:00027283 loc_27283: ; CODE XREF: LookForPattern+59j .text:00027283 dec eax .text:00027284 jns short loop .text:00027286 .text:00027286 loc_27286: ; CODE XREF: LookForPattern+48j .text:00027286 mov ebp, [esp+114h+SectionStartAddress] .text:0002728D lea edi, [ebx+edx-1] .text:00027291 mov ecx, edi .text:00027293 lea eax, [edx+ebp-1] .text:00027297 mov edx, [esp+114h+SectionSize] .text:0002729E add edx, ebp .text:000272A0 mov esi, eax .text:000272A2 mov [esp+114h+sectionBoundary], edx .text:000272A6 .text:000272A6 loop_: ; CODE XREF: LookForPattern+AAj .text:000272A6 mov dl, [eax] .text:000272A8 cmp dl, [ecx] .text:000272AA jnz short loc_272B4 .text:000272AC cmp ecx, ebx .text:000272AE jz short exitsuccess .text:000272B0 dec eax .text:000272B1 dec ecx .text:000272B2 jmp short loc_272C4 .text:000272B4 ; --------------------------------------------------------------------------- .text:000272B4 .text:000272B4 loc_272B4: ; CODE XREF: LookForPattern+8Aj .text:000272B4 xor eax, eax .text:000272B6 xor edx, edx .text:000272B8 mov al, [esi] .text:000272BA mov ecx, edi .text:000272BC mov dl, byte ptr [esp+eax+114h+StrangeTable] .text:000272C0 add esi, edx .text:000272C2 mov eax, esi .text:000272C4 .text:000272C4 loc_272C4: ; CODE XREF: LookForPattern+92j .text:000272C4 cmp eax, [esp+114h+sectionBoundary] .text:000272C8 jnb short exit_neg .text:000272CA jmp short loop_ .text:000272CC ; --------------------------------------------------------------------------- .text:000272CC .text:000272CC exitsuccess: ; CODE XREF: LookForPattern+8Ej .text:000272CC pop edi .text:000272CD sub eax, ebp .text:000272CF pop esi .text:000272D0 pop ebp .text:000272D1 pop ebx .text:000272D2 add esp, 104h .text:000272D8 retn 10h .text:000272DB ; --------------------------------------------------------------------------- .text:000272DB .text:000272DB exit_neg: ; CODE XREF: LookForPattern+10j .text:000272DB ; LookForPattern+1Dj ... .text:000272DB pop edi .text:000272DC pop esi .text:000272DD pop ebp .text:000272DE or eax, 0FFFFFFFFh .text:000272E1 pop ebx .text:000272E2 add esp, 104h .text:000272E8 retn 10h .text:000272E8 LookForPattern endp
http://www.rsdn.ru/article/alg/textsearch.xml http://ru.wikipedia.org/wiki/Алгоритм_Бойера-Мура_поиска_строки Штука старая и на самом деле очень огромная, здесь только самая простая и полезная часть.