Поиск по сигнатуре?

Тема в разделе "WASM.BEGINNERS", создана пользователем DIMAIN, 18 авг 2007.

  1. DIMAIN

    DIMAIN New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2007
    Сообщения:
    6
    Есть ли у кого пример (Дельфи) для бинарного поиска в файле, требуется найти в екзешнике (желательно в памяти -mappedfile) например ($55,$75,$19,$FF,$90) и получить поинтер на это место в файле.
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    пример поиска, надеюсь файл сам промаппить сможешь, пример есть у Ицзелиона

    только не пинайте, давно писалось )
    Код (Text):
    1. program Loader;
    2. uses
    3.   Windows;
    4. const
    5.       BaseOfImage = $000400000;
    6.       SizeOfImage = $0001F2000;
    7.       szFileName : PChar = 'prog.exe' + #0;
    8.       BytesToWrite : array [1..2] of byte = ($EB, $FE);
    9.       BytesToUnpatch : array [1..2] of byte = ($6A, $00);
    10.       Signature : array [1..50] of byte = ($C1, $F9, $02, $F3, $A5, $8B, $C8, $83, $E1, $03,
    11.                                            $F3, $A4, $5E, $68, $00, $80, $00, $00, $6A, $00,
    12.                                            $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    13.                                            $00, $00, $83, $C6, $08, $83, $3E, $00, $0F, $85,
    14.                                            $00, $00, $00, $00, $68, $00, $80, $00, $00, $6A);
    15. var
    16.       Buff                : array [1..2] of byte;
    17.       hMemory, AddressToWrite : Integer;
    18.       StartupInfo         : tStartupInfo;
    19.       ProcessInfo         : tProcessInformation;
    20.       pMemory             : Pointer;
    21.       lpNumberOfBytesRead : Cardinal;
    22. label _unlock, _free, _error, _close;
    23.  
    24. function WriteWord(hProcess: Integer; AddressToWrite: Pointer; lpByteToWrite: Pointer): Boolean; stdcall;
    25. var OldProtect : Integer;
    26.     lpNumberOfBytesWritten : Cardinal;
    27. begin
    28. Result := FALSE;
    29.    if VirtualProtectEx(hProcess, AddressToWrite, SizeOf(WORD),
    30.                        PAGE_EXECUTE_READWRITE, ADDR(OldProtect)) then
    31.      begin
    32.        Result := WriteProcessMemory(hProcess, AddressToWrite, lpByteToWrite, SizeOf(WORD), lpNumberOfBytesWritten);
    33.        VirtualProtectEx(hProcess, AddressToWrite, SizeOf(WORD), OldProtect, ADDR(OldProtect));
    34.      end;
    35. end;
    36.  
    37. // Функция ищет нужное место в файле по сигнатуре и возвращает смещение от начала буфера
    38. // первого найденного байта сигнатуры. При задании сигнатуры, байты, которые необходимо пропустить,
    39. // должны быть заменены нулевыми байтами.
    40. function ParseBuffer(lpScanString: Pointer; ScanStringLength: Integer; lpBuffer: Pointer; BufferLength: Integer): Pointer; stdcall;
    41. asm
    42.    push ebx
    43.    push edi
    44.    push esi
    45.    mov edi, lpScanString
    46.    mov esi, lpBuffer
    47.    mov ecx, ScanStringLength
    48.    mov ebx, ecx
    49.    mov edx, esi
    50.    add edx, BufferLength
    51.    sub edx, ScanStringLength
    52.    inc edx
    53. @loop:
    54.    cmp esi, edx
    55.    je @not_found
    56.    test ecx, ecx
    57.    jz @found
    58.    mov al, BYTE PTR [edi]
    59.    test al, al
    60.    jz @00h_found
    61.    cmp BYTE PTR [esi], al
    62.    je @parse
    63.    sub edi, ebx
    64.    add edi, ecx
    65.    sub esi, ebx
    66.    add esi, ecx
    67.    inc esi
    68.    mov ecx, ebx
    69.    jmp @loop
    70. @parse:
    71.    inc edi
    72.    inc esi
    73.    dec ecx
    74.    jmp @loop
    75. @00h_found:
    76.    inc edi
    77.    inc esi
    78.    dec ecx
    79.    jmp @loop
    80. @not_found:
    81.    xor eax, eax
    82.    jmp @return
    83. @found:
    84.    mov eax, esi
    85.    sub eax, ebx
    86.    sub eax, lpBuffer
    87. @return:
    88.    pop esi
    89.    pop edi
    90.    pop ebx
    91. end;
    92.  
    93. begin
    94.   StartupInfo.cb := SizeOf(tStartupInfo);
    95.   if CreateProcess(szFileName, nil, nil, nil, FALSE, CREATE_SUSPENDED,
    96.                                nil, nil, StartupInfo, ProcessInfo) then
    97.    begin
    98. //-------------------------------- parse image --------------------------------
    99.     hMemory := GlobalAlloc(GMEM_MOVEABLE or GMEM_ZEROINIT, SizeOfImage);
    100.     if hMemory = 0 then goto _error;
    101.         pMemory := GlobalLock(hMemory);
    102.         if pMemory = nil then goto _free;
    103.            if ReadProcessMemory(ProcessInfo.hProcess, Pointer(BaseOfImage),
    104.                                 pMemory, SizeOfImage, lpNumberOfBytesRead) = FALSE then goto _unlock;
    105.               if ParseBuffer(ADDR(Signature), 50, pMemory, SizeOfImage) = nil then goto _unlock;
    106.                  asm
    107.                    add eax, (BaseOfImage+031h)
    108.                    mov AddressToWrite, eax
    109.                  end;
    110.                  GlobalUnlock(DWORD(pMemory));
    111.                  GlobalFree(hMemory);
    112. //------------------------------ parse image end ------------------------------
    113.     if ReadProcessMemory(ProcessInfo.hProcess, Pointer(AddressToWrite), ADDR(Buff),
    114.                          SizeOf(WORD), lpNumberOfBytesRead) = FALSE then goto _error;
    115.        if WORD(Buff) <> $006A then goto _error;
    116.           if WriteWord(ProcessInfo.hProcess, Pointer(AddressToWrite),
    117.                          ADDR(BytesToWrite)) = FALSE then goto _error;
    118.               ResumeThread(ProcessInfo.hThread);
    119. // Здесь WaitForInputIdle можно заменить на циклический опрос нужного места в файле
    120. // на предмет его распакованности - файл будет запускаться быстрее.
    121. // В данном случае использован вариант с WaitForInputIdle лишь для упрощения примера.
    122.               WaitForInputIdle(ProcessInfo.hProcess, $0100);
    123.               SuspendThread(ProcessInfo.hThread);
    124.               if WriteWord(ProcessInfo.hProcess, Pointer(AddressToWrite),
    125.                            ADDR(BytesToUnpatch)) = FALSE then goto _error;
    126. //-------------------------------- patch here ---------------------------------
    127. //   Здесь, если необходимо, можно поместить код патча, в этом месте файл
    128. //   уже распаковался в памяти и его можно беспрепятственно пропатчить...
    129.  
    130. //--------------------------------- patch end ---------------------------------
    131.     ResumeThread(ProcessInfo.hThread);
    132.     goto _close;
    133. _unlock:
    134.     GlobalUnlock(DWORD(pMemory));
    135. _free:
    136.     GlobalFree(hMemory);
    137. _error:
    138.     TerminateProcess(ProcessInfo.hProcess, 0);
    139. _close:
    140.     CloseHandle(ProcessInfo.hThread);
    141.     CloseHandle(ProcessInfo.hProcess);
    142.    end;
    143. end.
     
  3. DIMAIN

    DIMAIN New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2007
    Сообщения:
    6
    Asterix
    спасиб попробую...