DWORD FindDataInMem(LPBYTE Source,DWORD SourceSize,LPBYTE FindData,DWORD FindDataSize,DWORD StartPointer=0)
{
DWORD j=0;
__asm
{
//Главный цикл
mov ecx,StartPointer
main_cycle:
//Проверка условия главного цикла
cmp SourceSize,eцx
jl func_end
//Если Source==FindData[0]
mov al,byte ptr[Source+ecx]
cmp al,byte ptr[FindData]
//Если al==byte ptr[FindData]
je end_main_cycle
mov ebx,FindDataSize
cycle2_begin:
//if(Source[i+j]!=FindData[j])
mov eax,ecx
add eax,ebx
mov al,byte ptr[Source+eax]
cmp al,byte ptr[FindData+ebx]
jne end_main_cycle
loop cycle2_begin
push ecx;
//Инкремент главного цикла и повтор
end_main_cycle:
inc ecx
jmp main_cycle
func_end:
ret;
}
}
Поиск подстроки в строке
Как реализовать поиск подстроки в строке?Контекст такой:баннер программ(учите аглицкий-не думайте,что "баннер"-это реклама!).DLL подгружается к каждому процессу,открывает BanLst.txt,с помощью GetModuleFileName получает имя текущего процесса(знаете способ лучше?Предлагаем вам ultimate adventure!Выложи свой способ сюда,и количество ваших сообщений на форуме резко увеличится на 1).Так вот,требуется найти это имя в списке(файл отображается в память) и,если оно найдено,то прихлопнуть приложение(кстати,как это сделать?DLLMain должна вернуть 0?),а если нет,то спокойно продолжить.Тут с Insane88 решили провернуть такую вещь(а то тут,в "Ультрасервисе",у них,понимаете ли,не работают,а Асю гоняют).Он начал писать на VB,а я...ну вы же меня знаете(ну,и параллельно на VB тоже).Так как это реализовать(только простой поиск без кучи кода)?Может,апишки есть какие:)?
"Убивать чужие процессы нехорошо!" ©
Вопрос конкретен:КАК реализовать ПРОСТЕЙШИЙ ПОИСК подстроки известной длины в имеющейся строке известной длины(без всяких извращений и сложностей)?Подстрока может быть любой длины(не 1/2/4 байта) и начинаться с любого адреса(а не кратного 1/2/4)
И ещё кое-что:Insane88,"убивать чюжые процессы"-твоя идея
Если строки небольшие - тупым перебором, если очень большие (~1Mb) то лучше использовать спец. алгоритмы вроде поиска с помощью отсекающей пары. По поводу отсекающей пары ниего сказать не могу, нам это рассказывали на сборах по информатике, но я забыл все напрочь :) Код для полного перебора тяжело написть? Что-то вроде цикл в цикле с запихиванием регистра ecx в стек перед внутренним циклом. Если нужно - напишу, но это ИМХО просто уже
(Не самая быстрая, но работающая; в коде специалньо вставил пару ошибок, чтоб сам разобрался, а не идею тырил ;-))
Код: