Вставить свой asm в дельфина)))

Тема в разделе "WASM.BEGINNERS", создана пользователем dgs, 8 окт 2009.

  1. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Здрасте, не могу понять как правильно найти искомую комбинацию в тексте, код вываливаеться на lodsb, обьясните чего не так делаю TASM подобный синтаксис вставок не очень догоняю, сам пишу обычно только на fasm... Помогите пожалуйста...

    Код (Text):
    1. function ParseFile: integer;
    2. const
    3.   find_str_mp3: string = 'operate';
    4.  
    5. var
    6.    file_size: Integer;
    7.    hfile    : integer;
    8.    mem      : pointer;
    9.    url      : pointer;
    10.  
    11. begin
    12.    hfile:=      _lopen(PChar(ApplicationPath+'data\cash.htm'), OF_READ);
    13.    file_size:=  GetFileSize(hfile, 0);
    14.    mem:=        VirtualAlloc(nil, file_size, MEM_COMMIT, PAGE_READWRITE);
    15.    url:=        VirtualAlloc(nil, 256, MEM_COMMIT, PAGE_READWRITE);
    16.    _lread(hfile, mem, file_size);
    17.  
    18.    asm
    19.         pusha
    20.         cld
    21.         mov     esi, mem
    22.         mov     edi, offset find_str_mp3
    23.         xor     ecx, ecx
    24.         jmp     @1
    25.  
    26.    @0:
    27.         sub     esi, 5
    28.         mov     edi, offset find_str_mp3
    29.  
    30.    @1:
    31.         cmp     byte ptr esi, 0
    32.         je      @5
    33.         lodsb
    34.         cmp     al, byte ptr [edi]
    35.         jne     @1
    36.         add     esi, 5
    37.         add     edi, 5
    38.         cmp     al, byte ptr [edi]
    39.         jne     @0
    40.    @2:
    41.         lodsb
    42.         cmp     al, "'"
    43.         jne     @2
    44.         mov     edi, offset url
    45.    @3:
    46.         lodsb
    47.         stosb
    48.         cmp     al, "'"
    49.         jne     @3
    50.    @4:
    51.         dec     edi
    52.         xor     eax, eax
    53.         stosb
    54.  
    55.    @5:
    56.         xor     eax, eax
    57.         dec     eax
    58.  
    59.    @6:
    60.         popa
    61.    end;
    62.  
    63.    MessageBox(GetActiveWindow, PChar(url), '', 0);
    64.    VirtualFree(url, 256, MEM_RELEASE);
    65.    VirtualFree(mem, file_size, MEM_RELEASE);
    66.    CloseHandle(hfile);
    67.    result:= 0;
    68. end;
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Код (Text):
    1. cmp byte ptr [esi],0
    2. или лучше\проще
    3. lodsb
    4. test al,al
    5. je @5
    6. cmp     al, byte ptr [edi]
    7. ...
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Да и кстати
    загружает не адрес первого символа строки, а адрес переменной find_str_mp3 (4-х байтного указателя на строку). Поэтому нужно просто без всякого offset
    Код (Text):
    1. mov edi, find_str_mp3
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    То же самое - offset не нужен. Вот видимо из-за этого и валится, т.к. у локальной переменной offset это просто отрицательное смещение относительно ebp
     
  5. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Ни уйа...

    Код (Text):
    1. function ParseFile: integer;
    2. var
    3.    file_size: Integer;
    4.    hfile    : THandle;
    5.    mem      : pointer;
    6.    url      : pointer;
    7.  
    8. begin
    9.    hfile:=      _lopen(PChar(ApplicationPath+'data\cash.htm'), OF_READ);
    10.    file_size:=  GetFileSize(hfile, 0);
    11.    mem:=        VirtualAlloc(nil, file_size, MEM_COMMIT, PAGE_READWRITE);
    12.    url:=        VirtualAlloc(nil, 256, MEM_COMMIT, PAGE_READWRITE);
    13.    _lread(hfile, mem, file_size);
    14.    CloseHandle(hfile);
    15.  
    16.    asm
    17.         pusha
    18.         int     3
    19.         cld
    20.         mov     esi, mem
    21.         mov     edi, find_str_mp3
    22.         jmp     @1
    23.  
    24.    @0:  sub     esi, 5
    25.         mov     edi, find_str_mp3
    26.  
    27.    @1:  lodsb
    28.         test    al, al
    29.         je      @5
    30.         cmp     al, byte ptr [edi]
    31.         jne     @1
    32.         add     esi, 5
    33.         add     edi, 5
    34.         cmp     al, byte ptr [edi]
    35.         jne     @0
    36.  
    37.    @2:  lodsb
    38.         cmp     al, "'"
    39.         jne     @2
    40.         mov     edi, url
    41.  
    42.    @3:  lodsb
    43.         stosb
    44.         cmp     al, "'"
    45.         jne     @3
    46.  
    47.    @4:  dec     edi
    48.         xor     eax, eax
    49.         stosb
    50.  
    51.    @5:  xor     eax, eax
    52.         dec     eax
    53.  
    54.    @6:  popa
    55.    end;
    56.    MessageBox(GetActiveWindow, PChar(url), '', 0);
    57.    VirtualFree(url, 256, MEM_RELEASE);
    58.    VirtualFree(mem, file_size, MEM_RELEASE);
    59. //   result:= 0;
    60. end;