· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Парсим файл в поисках скан-строки ;-)

<< . 1 . 2 . 3 .

Посл.отвђт Сообщенiе


Дата: Дек 3, 2003 22:41:17 · Поправил: Asterix

Нет, volodya, просто такой код более наглядный, меньше
риска что-нибудь зрительно пропустить, возьмём хотя бы Four-F,
мало того что он использует такой синтаксис, но и этого ему показалось
мало и поэтому были дополнительно им написаны собственные макросы.


Дата: Дек 3, 2003 22:50:25

Три хи-хи четыре раза. Я тебе на С такое напишу, что и не снилось твоему HLL. А на С++ еще круче забабахать можно. Переопределить все операторы, вообще хохма, так все и делают. И все КУДА более наглядно, чем асм может показать. С асмом связываются на для наглядности.


Дата: Дек 3, 2003 23:19:11 · Поправил: Asterix

Кажется нужно всё-таки так, сразу говорю никакой оптимизации не
будет пока код не будет правильно работать:
    mov edi, OFFSET ScanString
    mov esi, OFFSET Buffer
    mov ecx, ScanStringLength
@loop:
    test ecx, ecx
    jz @find
    mov al, BYTE PTR [edi]
    test al, al
    jz @00h_find
    cmp BYTE PTR [esi], al
    je @parse
    sub edi, ScanStringLength
    add edi, ecx
    sub esi, ScanStringLength
    add esi, ecx
    inc esi
    mov ecx, ScanStringLength
    jmp @loop
@parse:
    inc edi
    inc esi
    dec ecx
    jmp @loop
@00h_find:
    inc edi
    inc esi
    dec ecx
    jmp @loop
@find:


Дата: Дек 3, 2003 23:20:01

Asterix, лучше тогда уж оформляй нормально, чтобы всё понятно было, а всякие там .IF лучше не использовать, ведб так скрывается часть кода.


Дата: Дек 4, 2003 00:10:17

Вот теперь, кажется, код правильно работает :-)
И он должен быть достаточно быстр.


Дата: Дек 4, 2003 15:58:41 · Поправил: Asterix

Ну вот вся процедура будет выглядеть так, но файл блоками по 1000h
читать и парсить каждый блок по отдельности нельзя, иначе скан-строка
может спрятаться на стыке блоков, поэтому нужно читать весь файл
сразу:
ParseBuffer proc uses ebx edx ecx edi esi lpScanString:DWORD, ScanStringLength:DWORD,\
                         lpBuffer:DWORD, BufferLength:DWORD
         mov edi, lpScanString
         mov esi, lpBuffer
         mov ecx, ScanStringLength
         mov ebx, ecx
         mov edx, esi
         add edx, BufferLength
         sub edx, ScanStringLength
         inc edx
@loop:
         cmp esi, edx
         je @not_found
         test ecx, ecx
         jz @found
         mov al, BYTE PTR [edi]
         test al, al
         jz @00h_found
         cmp BYTE PTR [esi], al
         je @parse
         sub edi, ebx
         add edi, ecx
         sub esi, ebx
         add esi, ecx
         inc esi
         mov ecx, ebx
         jmp @loop
@parse:
         inc edi
         inc esi
         dec ecx
         jmp @loop
@00h_found:
         inc edi
         inc esi
         dec ecx
         jmp @loop
@found:
         mov eax, esi
         sub eax, ebx
         ret
@not_found:
         xor eax, eax
         ret
ParseBuffer endp


Дата: Дек 4, 2003 21:03:49

Блин, а ведь работает, и замечательно так быстренько, уже применил
к своему файлу :-)
Вобщем кто хочет ещё оптимизировать то пожалуйста :-)


Дата: Дек 6, 2003 18:08:44 · Поправил: bsl_zcs

Asterix
читать и парсить каждый блок по отдельности нельзя, иначе скан-строка может спрятаться на стыке блоков, поэтому нужно читать весь файл сразу

Или блоками, перекрывающимися на длину подстроки минус один. ;)


Дата: Дек 6, 2003 19:01:09

bsl_zcs

Это понятно :-) Но сложнее реализовать, как минимум нужно немного
подумать. В моём случае файл находится под отладчиком, я просто через
GlobalAlloc выделяю буфер в памяти == ImageSize, потом ReadProcessMemory
в этот буфер и затем уже спокойно сканирую :-)

<< . 1 . 2 . 3 .


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.045