Parsi Coders

نسخه‌ی کامل: Seek bytes and return offset
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
کد:
{


Protocol.
}

program Project2;

{$APPTYPE CONSOLE}

uses
  Windows;


function CompareMem(P1, P2: Pointer; Length: Integer): Boolean; assembler;
(* ***** BEGIN LICENSE BLOCK *****
*
* The function CompareMem is licensed under the CodeGear license terms.
*
* The initial developer of the original code is Fastcode
*
* Portions created by the initial developer are Copyright (C) 2002-2004
* the initial developer. All Rights Reserved.
*
* Contributor(s): Aleksandr Sharahov
*
* ***** END LICENSE BLOCK ***** *
*************************************************
              Ripped from sysutils
*************************************************)
asm
   add   eax, ecx
   add   edx, ecx
   xor   ecx, -1
   add   eax, -8
   add   edx, -8
   add   ecx, 9
   push  ebx
   jg    @Dword
   mov   ebx, [eax+ecx]
   cmp   ebx, [edx+ecx]
   jne   @Ret0
   lea   ebx, [eax+ecx]
   add   ecx, 4
   and   ebx, 3
   sub   ecx, ebx
   jg    @Dword
@DwordLoop:
   mov   ebx, [eax+ecx]
   cmp   ebx, [edx+ecx]
   jne   @Ret0
   mov   ebx, [eax+ecx+4]
   cmp   ebx, [edx+ecx+4]
   jne   @Ret0
   add   ecx, 8
   jg    @Dword
   mov   ebx, [eax+ecx]
   cmp   ebx, [edx+ecx]
   jne   @Ret0
   mov   ebx, [eax+ecx+4]
   cmp   ebx, [edx+ecx+4]
   jne   @Ret0
   add   ecx, 8
   jle   @DwordLoop
@Dword:
   cmp   ecx, 4
   jg    @Word
   mov   ebx, [eax+ecx]
   cmp   ebx, [edx+ecx]
   jne   @Ret0
   add   ecx, 4
@Word:
   cmp   ecx, 6
   jg    @Byte
   movzx ebx, word ptr [eax+ecx]
   cmp   bx, [edx+ecx]
   jne   @Ret0
   add   ecx, 2
@Byte:
   cmp   ecx, 7
   jg    @Ret1
   movzx ebx, byte ptr [eax+7]
   cmp   bl, [edx+7]
   jne   @Ret0
@Ret1:
   mov   eax, 1
   pop   ebx
   ret
@Ret0:
        XOR     EAX,EAX
   pop   ebx
end;


const
  HexTbl: array[0..15] of Char = ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');

function IntToHex(val: DWORD; minLen: Integer): string;
begin
  Result := '';
  while val<>0 do
  begin
    Result := HexTbl[val and $F] + Result;
    val := val shr 4;
  end;

  while Length(Result)<minLen do
    Result := '0' + Result;
end;

Function SeekBytes (lpFileName :PChar;  lpOldBytes :PByte;  dwLength  :DWORD;
                    dwOffset  :DWORD) :DWORD;
var
  dwFileSize            :DWORD;
  hFile                 :Longword;
  lpBuffer              :PByte;
  dwNumberOfBytesRead   :DWORD;
begin
Result  := 0;
if dwLength = 0 then exit;
  hFile :=  CreateFile(lpFileName,GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    if hFile <> INVALID_HANDLE_VALUE then
    begin
      SetFilePointer(hFile, 0, nil, FILE_BEGIN);
      dwFileSize  :=  GetFileSize(hFile,nil);
      lpBuffer    :=  VirtualAlloc(nil, dwLength, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
      FillChar(lpBuffer^,dwLength,0);
      if lpBuffer <>  nil then
      begin
        dwNumberOfBytesRead := 0;
        Repeat
          SetFilePointer(hFile, dwOffSet, nil, FILE_BEGIN);
          ReadFile(hFile,lpBuffer^,dwLength,dwNumberOfBytesRead,nil);
            if CompareMem(lpBuffer,lpOldBytes,dwLength) = True then
            begin
              Result := dwoffset;
              Break;
            end;
          Inc(dwOffset);
        Until dwOffset >= dwFileSize;
      end;
      VirtualFree(lpBuffer,dwLength,MEM_RELEASE);
    end;
  CloseHandle(hFile);
end;

var
  SearchFor :Array[0..2] of byte = ($00,$00,$00);
  Offset  :DWORD;
begin
  Offset  :=  SeekBytes('C:\server.txt',@(SearchFor),SizeOf(SearchFor), 0);
  Writeln('Offset : ',IntToHex(Offset ,8));
  Readln;

end.