Как изменить данные буфера в ReadFile, NtReadFile и т.д.

Тема в разделе "WASM.WIN32", создана пользователем tornadov, 23 ноя 2010.

  1. tornadov

    tornadov New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2010
    Сообщения:
    4
    Собственно вопрос как изменить данные буфера в ReadFile, NtReadFile и т.д.
    Хукаю в программе обращения к ReadFile или NtReadFile - все работает прекрасно но подменить буфер или изменить значения в буфере который передается в функцию не получается, -если создаю свой и потом передаю его - то одни нули, если пытаюсь изменить тот который имею на входе - то ошибка доступа к памяти... вот привожу код ДЛЛ:
    Код (Text):
    1. library test1;
    2.  
    3. uses
    4.   Windows,
    5.   advApiHook,
    6.   Messages,
    7.   SysUtils,
    8.   Dialogs,
    9.   PsApi;
    10.  // ntdll in 'ntdll.pas';
    11.  
    12. const
    13.  type
    14.   TSocket=integer;
    15.   tb=packed array of byte;
    16.  
    17. var
    18.   _hinst, _h:integer;
    19.   Buf1:array{[0..10000000]} of byte;
    20.   p:pointer;
    21.   lpbuf,lpbuf1:pchar;
    22.  
    23.  _pOldSend :function(DevH:hFile;Buf:pointer;i:DWORD;wr_cnt:pointer;mm:pointer): BOOL; stdcall;
    24.  
    25.  
    26. function GetFileNameFromHandle(hFile : THandle) : string;
    27. var
    28.  FileSizeHi, FileSizeLo : cardinal;
    29.  hFileMap : THandle;
    30.  Temp : array [0..511] of char;
    31.  FileName : array [0..MAX_PATH] of char;
    32.  Name : array [0..MAX_PATH-1] of char;
    33.  Drive : array [0..2] of char;
    34.  pMem : pointer;
    35.  p : PChar;
    36.  found : boolean;
    37.  NameLen : integer;
    38. begin
    39.  FileSizeHi := 0;
    40.  FileSizeLo := GetFileSize(hFile, @FileSizeHi);
    41.  hFileMap := CreateFileMapping(hFile, 0, PAGE_READONLY, 0, FileSizeLo, 0);
    42.  if (hFileMap <> 0) then
    43.  begin
    44.    pMem := MapViewOfFile (hFileMap, FILE_MAP_READ, 0, 0, 1);
    45.    if (pMem <> nil) then
    46.    begin
    47.      if GetMappedFileName(GetCurrentProcess, pMem, FileName, MAX_PATH) <> 0 then
    48.      begin
    49.        if GetLogicalDriveStrings(SizeOf(Temp), @temp) <> 0 then
    50.        begin
    51.          Drive := ' :'#0;
    52.          found := false;
    53.          p := @Temp;
    54.          repeat
    55.            Drive[0] := p^;
    56.            if (QueryDosDevice(@Drive, Name, sizeOf(Name)) <> 0) then
    57.            begin
    58.              NameLen := Length(PChar(@Name));
    59.              found := (Pos(Name, FileName) = 1);
    60.              {if found then Result := Drive + Copy(FileName, NameLen+1,
    61.                                      Length(PChar(@FileName)) - NameLen);  }
    62.              if found then Result := Drive + Copy(FileName, NameLen+1,
    63.                                      Length(PChar(@FileName)) - NameLen);
    64.            end;
    65.            while (p^ <> #0) do inc(cardinal(p));
    66.            inc(cardinal(p));
    67.          until found or (p^ = #0);
    68.        end;
    69.      end;
    70.      UnmapViewOfFile(pMem);
    71.    end;
    72.    CloseHandle(hFileMap);
    73.  end;
    74. end;
    75.  
    76.  
    77. Procedure SendData(data:string; funcType:integer; Buff:pointer; len:integer);
    78. var
    79.  d:TCopyDataStruct;
    80. begin
    81.  case funcType of
    82.   10:
    83.    begin
    84.      d.lpData := Buff;
    85.      d.cbData := len;
    86.      d.dwData := 10;
    87.    end;
    88.   30:
    89.     begin
    90.       d.lpData := pchar(data);
    91.       d.cbData := length(data);
    92.       d.dwData := 30;
    93.     end;
    94.  end;
    95.  SendMessage(_h, WM_COPYDATA, 0, LongInt(@d));
    96. End;
    97.                 //  createfile
    98.  
    99.  
    100.  
    101.  
    102.  
    103. function GetByteFromPtr(p1:pointer; ind:dword):byte;
    104. begin
    105.  result:=Byte(pointer((dword(p1)+ind))^);
    106. end;
    107.  
    108. function SetByteToPtr(p:pointer; ind:dword; val:byte):byte;
    109. begin
    110.  Byte(pointer((dword(p)+ind))^):=val;
    111. end;
    112.  
    113.  
    114. {procedure MyCopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
    115. asm
    116.  push ecx
    117.  push esi
    118.  push edi
    119.  mov esi, Source
    120.  mov edi, Destination
    121.  mov ecx, Length
    122.  rep movsb
    123.  pop edi
    124.  pop esi
    125.  pop ecx
    126. end;}
    127.  
    128.  
    129.  
    130.  
    131.  function xSend(DevH:hFile;Buf:pointer;i:DWORD;wr_cnt:pointer;mm:pointer): BOOL; stdcall;
    132.  
    133.  
    134.  
    135.  
    136.  
    137. var Buf11:string;
    138.  
    139. i1,i2:integer;
    140. hf,DevH2:hFile;
    141.  OfStruct      : _OfStruct;
    142. //p1:pointer;
    143. p1 :PChar;
    144.  
    145.  hmem,i11,OldPageProtection:Cardinal;
    146.  wr_cnt11:Cardinal;
    147.  mm11:^OVERLAPPED;
    148.  b:byte;
    149. ff:file of byte;
    150. hHeap:dword;
    151.  
    152.  
    153.   hFileMapObj11,hFileMapObj12,hFileMapObj1,hFileMapObj2:THandle;//îïèñàòåëü FaleMapping
    154. buf12,lpBaseAddress1,lpBaseAddress2,lpBaseAddress11,lpBaseAddress12:pchar;//^arr;//"óêà
    155. begin
    156.  
    157. buf11:='';
    158.  for i1:=0 to 50 do buf11:=buf11+inttohex(GetByteFromPtr(buf,i1),2)+' ';
    159.  
    160.  
    161.  buf11:=IntToHex(integer(@buf),16);
    162.   SendData(pchar(buf11), 30, nil, 0);
    163.  buf11:=GetFileNameFromHandle(DevH);
    164.  SendData(pchar(buf11), 30, nil, 0);
    165. if pos('rm70__04.13.ppm_i',buf11)<>0 { strtoint(buf11)=4102599 }{'E:\Program Files\Nokia\Phoenix\Products\RM-70\rm70__04.13.ppm_i'} then
    166.   begin
    167.  
    168. //  hFileMapObj1:=CreateFileMapping(MAXDWORD,Nil,PAGE_READWRITE,0,4,'2.dat');
    169.     SendData(pchar('222'), 30, nil, 0);
    170.  
    171.   i11:=3563028;
    172.  
    173.  
    174.  SendData(pchar(inttostr(i11)), 30, nil, 0);
    175.  
    176.  
    177.  
    178.  
    179.  
    180. //setlength(buf12,i11);
    181. for i2:= 0 to i11-1 do SetByteToPtr(lpBaseAddress2,i2,2);
    182. for i2:= 0 to 10 do SendData(pchar(IntToHex(getbytefromptr(@lpBaseAddress2[0],i2),2)), 30, nil, 0);
    183. //p1:='123';
    184. //MoveMemory(p1, buf, i11);
    185.  
    186.  
    187.  result:=_pOldSend(DevH,@lpBaseAddress2[0]{buf},i,wr_cnt,mm);
    188.  
    189.  end else
    190.  
    191.  result:=_pOldSend(DevH,buf,i,wr_cnt,mm);
    192. end;
    193.  
    194. procedure DLLEntryPoint(dwReason: DWord);
    195. begin
    196.    case dwReason of
    197.     DLL_PROCESS_ATTACH:
    198.       begin
    199.         SendData('Áèáëèîòåêà çàãðóæåíà. Íà÷èíàåòñÿ ïîäãîòîâêà ê ïåðåõâàòó...', 30, nil, 0);
    200.         _hinst:=GetModuleHandle(nil);
    201.         StopThreads;
    202.         HookProc('kernel32.dll', 'ReadFile',@xSend,@_pOldSend);
    203.         SendData('Ïîäìåíà ôóíêöèé çàâåðøèëàñü óñïåõîì!', 30, nil, 0);
    204.         RunThreads;
    205.       end;
    206.  
    207.     DLL_PROCESS_DETACH:
    208.        begin
    209.          SendData('Ñíèìàåì ïåðåõâàò...', 30, nil, 0);
    210.          UnhookCode(@_pOldsend);
    211.       end;
    212.    end;
    213. end;
    214.  
    215.  
    216. begin
    217.   _h:=findwindow(nil,'WinSock Sniffer');
    218.   if (_h = 0) then
    219.   begin
    220.     MessageBox(0, 'Íå íàéäåíî îêíî êëèåíòñêîé ÷àñòè ïðîãðàììû!', 'Îøèáêà!', 0);
    221.     ExitThread(0);
    222.   end;
    223.   DllProc := @DLLEntryPoint;
    224.   DLLEntryPoint(DLL_PROCESS_ATTACH);
    225. end.
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Значит неправильно обращаетесь к памяти. Смотрите в отладчике.
     
  3. tornadov

    tornadov New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2010
    Сообщения:
    4
    Да я думаю, что обращаюсь я правильно, вот только наверное ReadFile получает буфер от NtReadFile и т.д. и соответсвено я немогу его изменить , как это обойти?
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Что это за синтаксис ? А если по человечески:
    result:=pByte(dword(p1)+ind)^;
    pByte(dword(p1)+ind)^:=val;
     
  5. tornadov

    tornadov New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2010
    Сообщения:
    4
    Вот убрал все лишнее:
    Код (Text):
    1. library test1;
    2.  
    3. uses
    4.   Windows,
    5.   advApiHook,
    6.   Messages,
    7.   SysUtils,
    8.   PsApi;
    9. var
    10.   _hinst, _h:integer;
    11.  
    12.  
    13.  _pOldSend :function(DevH:hFile;Buf:pointer;i:DWORD;wr_cnt:pointer;mm:pointer): BOOL; stdcall;
    14.  
    15.  
    16. function GetFileNameFromHandle(hFile : THandle) : string;
    17. var
    18.  FileSizeHi, FileSizeLo : cardinal;
    19.  hFileMap : THandle;
    20.  Temp : array [0..511] of char;
    21.  FileName : array [0..MAX_PATH] of char;
    22.  Name : array [0..MAX_PATH-1] of char;
    23.  Drive : array [0..2] of char;
    24.  pMem : pointer;
    25.  p : PChar;
    26.  found : boolean;
    27.  NameLen : integer;
    28. begin
    29.  FileSizeHi := 0;
    30.  FileSizeLo := GetFileSize(hFile, @FileSizeHi);
    31.  hFileMap := CreateFileMapping(hFile, 0, PAGE_READONLY, 0, FileSizeLo, 0);
    32.  if (hFileMap <> 0) then
    33.  begin
    34.    pMem := MapViewOfFile (hFileMap, FILE_MAP_READ, 0, 0, 1);
    35.    if (pMem <> nil) then
    36.    begin
    37.      if GetMappedFileName(GetCurrentProcess, pMem, FileName, MAX_PATH) <> 0 then
    38.      begin
    39.        if GetLogicalDriveStrings(SizeOf(Temp), @temp) <> 0 then
    40.        begin
    41.          Drive := ' :'#0;
    42.          found := false;
    43.          p := @Temp;
    44.          repeat
    45.            Drive[0] := p^;
    46.            if (QueryDosDevice(@Drive, Name, sizeOf(Name)) <> 0) then
    47.            begin
    48.              NameLen := Length(PChar(@Name));
    49.              found := (Pos(Name, FileName) = 1);
    50.              if found then Result := Drive + Copy(FileName, NameLen+1,
    51.                                      Length(PChar(@FileName)) - NameLen);
    52.            end;
    53.            while (p^ <> #0) do inc(cardinal(p));
    54.            inc(cardinal(p));
    55.          until found or (p^ = #0);
    56.        end;
    57.      end;
    58.      UnmapViewOfFile(pMem);
    59.    end;
    60.    CloseHandle(hFileMap);
    61.  end;
    62. end;
    63.  
    64.  
    65. Procedure SendData(data:string; funcType:integer; Buff:pointer; len:integer);
    66. var
    67.  d:TCopyDataStruct;
    68. begin
    69.  case funcType of
    70.   10:
    71.    begin
    72.      d.lpData := Buff;
    73.      d.cbData := len;
    74.      d.dwData := 10;
    75.    end;
    76.   30:
    77.     begin
    78.       d.lpData := pchar(data);
    79.       d.cbData := length(data);
    80.       d.dwData := 30;
    81.     end;
    82.  end;
    83.  SendMessage(_h, WM_COPYDATA, 0, LongInt(@d));
    84. End;
    85.  
    86.  
    87.  
    88. function GetByteFromPtr(p1:pointer; ind:dword):byte;
    89. begin
    90.  result:=Byte(pointer((dword(p1)+ind))^);
    91. end;
    92.  
    93. function SetByteToPtr(p:pointer; ind:dword; val:byte):byte;
    94. begin
    95.  pByte(dword(p)+ind)^:=val;
    96. end;
    97.  
    98.  
    99. function xSend(DevH:hFile;Buf:pointer;i:DWORD;wr_cnt:pointer;mm:pointer): BOOL; stdcall;
    100.  
    101. var Buf11:string;
    102. i1,i2:integer;
    103.  
    104.  
    105.  
    106.  i11:Cardinal;
    107.  wr_cnt11:Cardinal;
    108.  mm11:^OVERLAPPED;
    109.  b:byte;
    110.  
    111. Buf12:array of byte;
    112.  
    113. begin
    114.  
    115.  
    116.  buf11:=GetFileNameFromHandle(DevH);
    117.  SendData(pchar(buf11), 30, nil, 0);
    118. if pos('rm70__04.13.ppm_i',buf11)<>0  then
    119.   begin
    120.  
    121.   i11:=3563028;
    122.  SendData(pchar(inttostr(i11)), 30, nil, 0);
    123.  
    124. setlength(buf12,i11);
    125. for i2:= 0 to i11-1 do SetByteToPtr(@buf12[0],i2,2);
    126. for i2:= 0 to 10 do SendData(pchar(IntToHex(getbytefromptr(@buf12[0],i2),2)), 30, nil, 0);
    127.  
    128.  result:=_pOldSend(DevH,@buf12[0]{buf},i,wr_cnt,mm);
    129.  end else
    130.  
    131.  result:=_pOldSend(DevH,buf,i,wr_cnt,mm);
    132. end;
    133.  
    134. procedure DLLEntryPoint(dwReason: DWord);
    135. begin
    136.    case dwReason of
    137.     DLL_PROCESS_ATTACH:
    138.       begin
    139.         SendData('Áèáëèîòåêà çàãðóæåíà. Íà÷èíàåòñÿ ïîäãîòîâêà ê ïåðåõâàòó...', 30, nil, 0);
    140.         _hinst:=GetModuleHandle(nil);
    141.         StopThreads;
    142.         HookProc('kernel32.dll', 'ReadFile',@xSend,@_pOldSend);
    143.         SendData('Ïîäìåíà ôóíêöèé çàâåðøèëàñü óñïåõîì!', 30, nil, 0);
    144.         RunThreads;
    145.       end;
    146.  
    147.     DLL_PROCESS_DETACH:
    148.        begin
    149.          SendData('Ñíèìàåì ïåðåõâàò...', 30, nil, 0);
    150.          UnhookCode(@_pOldsend);
    151.       end;
    152.    end;
    153. end;
    154.  
    155.  
    156. begin
    157.   _h:=findwindow(nil,'WinSock Sniffer');
    158.   if (_h = 0) then
    159.   begin
    160.     MessageBox(0, 'Íå íàéäåíî îêíî êëèåíòñêîé ÷àñòè ïðîãðàììû!', 'Îøèáêà!', 0);
    161.     ExitThread(0);
    162.   end;
    163.   DllProc := @DLLEntryPoint;
    164.   DLLEntryPoint(DLL_PROCESS_ATTACH);
    165. end.
    Хукаю например ТоталКомандер при выполнении function xSend получаю следующий результат (См. картинку)

    я думаю, что ошибка где здесь: устанавливаю длинну buf12, что-нибудь записываю в этот массив, читаю из него - все на месте, а когда передаю в result - одни нули...
    Код (Text):
    1. setlength(buf12,i11);
    2. for i2:= 0 to i11-1 do SetByteToPtr(@buf12[0],i2,2);
    3. for i2:= 0 to 10 do SendData(pchar(IntToHex(getbytefromptr(@buf12[0],i2),2)), 30, nil, 0);
    4.  
    5.  result:=_pOldSend(DevH,@buf12[0],i,wr_cnt,mm);
     
  6. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    Зачем при обнаружении обращения к нужному файлу 'rm70__04.13.ppm_i'
    вызываете
    Код (Text):
    1. result:=_pOldSend(DevH,@buf12[0]{buf},i,wr_cnt,mm);
    ?

    Результат возвращается через буфер buf: т.е. сначала
    1)result:=_pOldSend(DevH,buf,i,wr_cnt,mm);
    2)затем изменение содержимого buf
    и все...
     
  7. tornadov

    tornadov New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2010
    Сообщения:
    4
    СПАСИБО!!!
    Сделал вот так, и все получилось!:
    Код (Text):
    1. setlength(buf12,i);
    2. for i2:= 0 to i-1 do pByte(dword(@buf12[0])+i2)^:=2;
    3.  result:=_pOldSend(DevH,buf{buf},i,wr_cnt,mm);
    4. for i2:= 0 to i-1 do pByte(dword(buf)+i2)^:=2;
    5.  MoveMemory(buf,@Buf12[0],i);