Собственно вопрос как изменить данные буфера в ReadFile, NtReadFile и т.д. Хукаю в программе обращения к ReadFile или NtReadFile - все работает прекрасно но подменить буфер или изменить значения в буфере который передается в функцию не получается, -если создаю свой и потом передаю его - то одни нули, если пытаюсь изменить тот который имею на входе - то ошибка доступа к памяти... вот привожу код ДЛЛ: Код (Text): library test1; uses Windows, advApiHook, Messages, SysUtils, Dialogs, PsApi; // ntdll in 'ntdll.pas'; const type TSocket=integer; tb=packed array of byte; var _hinst, _h:integer; Buf1:array{[0..10000000]} of byte; p:pointer; lpbuf,lpbuf1:pchar; _pOldSend :function(DevH:hFile;Buf:pointer;i:DWORD;wr_cnt:pointer;mm:pointer): BOOL; stdcall; function GetFileNameFromHandle(hFile : THandle) : string; var FileSizeHi, FileSizeLo : cardinal; hFileMap : THandle; Temp : array [0..511] of char; FileName : array [0..MAX_PATH] of char; Name : array [0..MAX_PATH-1] of char; Drive : array [0..2] of char; pMem : pointer; p : PChar; found : boolean; NameLen : integer; begin FileSizeHi := 0; FileSizeLo := GetFileSize(hFile, @FileSizeHi); hFileMap := CreateFileMapping(hFile, 0, PAGE_READONLY, 0, FileSizeLo, 0); if (hFileMap <> 0) then begin pMem := MapViewOfFile (hFileMap, FILE_MAP_READ, 0, 0, 1); if (pMem <> nil) then begin if GetMappedFileName(GetCurrentProcess, pMem, FileName, MAX_PATH) <> 0 then begin if GetLogicalDriveStrings(SizeOf(Temp), @temp) <> 0 then begin Drive := ' :'#0; found := false; p := @Temp; repeat Drive[0] := p^; if (QueryDosDevice(@Drive, Name, sizeOf(Name)) <> 0) then begin NameLen := Length(PChar(@Name)); found := (Pos(Name, FileName) = 1); {if found then Result := Drive + Copy(FileName, NameLen+1, Length(PChar(@FileName)) - NameLen); } if found then Result := Drive + Copy(FileName, NameLen+1, Length(PChar(@FileName)) - NameLen); end; while (p^ <> #0) do inc(cardinal(p)); inc(cardinal(p)); until found or (p^ = #0); end; end; UnmapViewOfFile(pMem); end; CloseHandle(hFileMap); end; end; Procedure SendData(data:string; funcType:integer; Buff:pointer; len:integer); var d:TCopyDataStruct; begin case funcType of 10: begin d.lpData := Buff; d.cbData := len; d.dwData := 10; end; 30: begin d.lpData := pchar(data); d.cbData := length(data); d.dwData := 30; end; end; SendMessage(_h, WM_COPYDATA, 0, LongInt(@d)); End; // createfile function GetByteFromPtr(p1:pointer; ind:dword):byte; begin result:=Byte(pointer((dword(p1)+ind))^); end; function SetByteToPtr(p:pointer; ind:dword; val:byte):byte; begin Byte(pointer((dword(p)+ind))^):=val; end; {procedure MyCopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD); asm push ecx push esi push edi mov esi, Source mov edi, Destination mov ecx, Length rep movsb pop edi pop esi pop ecx end;} function xSend(DevH:hFile;Buf:pointer;i:DWORD;wr_cnt:pointer;mm:pointer): BOOL; stdcall; var Buf11:string; i1,i2:integer; hf,DevH2:hFile; OfStruct : _OfStruct; //p1:pointer; p1 :PChar; hmem,i11,OldPageProtection:Cardinal; wr_cnt11:Cardinal; mm11:^OVERLAPPED; b:byte; ff:file of byte; hHeap:dword; hFileMapObj11,hFileMapObj12,hFileMapObj1,hFileMapObj2:THandle;//îïèñàòåëü FaleMapping buf12,lpBaseAddress1,lpBaseAddress2,lpBaseAddress11,lpBaseAddress12:pchar;//^arr;//"óêà begin buf11:=''; for i1:=0 to 50 do buf11:=buf11+inttohex(GetByteFromPtr(buf,i1),2)+' '; buf11:=IntToHex(integer(@buf),16); SendData(pchar(buf11), 30, nil, 0); buf11:=GetFileNameFromHandle(DevH); SendData(pchar(buf11), 30, nil, 0); 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 begin // hFileMapObj1:=CreateFileMapping(MAXDWORD,Nil,PAGE_READWRITE,0,4,'2.dat'); SendData(pchar('222'), 30, nil, 0); i11:=3563028; SendData(pchar(inttostr(i11)), 30, nil, 0); //setlength(buf12,i11); for i2:= 0 to i11-1 do SetByteToPtr(lpBaseAddress2,i2,2); for i2:= 0 to 10 do SendData(pchar(IntToHex(getbytefromptr(@lpBaseAddress2[0],i2),2)), 30, nil, 0); //p1:='123'; //MoveMemory(p1, buf, i11); result:=_pOldSend(DevH,@lpBaseAddress2[0]{buf},i,wr_cnt,mm); end else result:=_pOldSend(DevH,buf,i,wr_cnt,mm); end; procedure DLLEntryPoint(dwReason: DWord); begin case dwReason of DLL_PROCESS_ATTACH: begin SendData('Áèáëèîòåêà çàãðóæåíà. Íà÷èíàåòñÿ ïîäãîòîâêà ê ïåðåõâàòó...', 30, nil, 0); _hinst:=GetModuleHandle(nil); StopThreads; HookProc('kernel32.dll', 'ReadFile',@xSend,@_pOldSend); SendData('Ïîäìåíà ôóíêöèé çàâåðøèëàñü óñïåõîì!', 30, nil, 0); RunThreads; end; DLL_PROCESS_DETACH: begin SendData('Ñíèìàåì ïåðåõâàò...', 30, nil, 0); UnhookCode(@_pOldsend); end; end; end; begin _h:=findwindow(nil,'WinSock Sniffer'); if (_h = 0) then begin MessageBox(0, 'Íå íàéäåíî îêíî êëèåíòñêîé ÷àñòè ïðîãðàììû!', 'Îøèáêà!', 0); ExitThread(0); end; DllProc := @DLLEntryPoint; DLLEntryPoint(DLL_PROCESS_ATTACH); end.
Да я думаю, что обращаюсь я правильно, вот только наверное ReadFile получает буфер от NtReadFile и т.д. и соответсвено я немогу его изменить , как это обойти?
Что это за синтаксис ? А если по человечески: result:=pByte(dword(p1)+ind)^; pByte(dword(p1)+ind)^:=val;
Вот убрал все лишнее: Код (Text): library test1; uses Windows, advApiHook, Messages, SysUtils, PsApi; var _hinst, _h:integer; _pOldSend :function(DevH:hFile;Buf:pointer;i:DWORD;wr_cnt:pointer;mm:pointer): BOOL; stdcall; function GetFileNameFromHandle(hFile : THandle) : string; var FileSizeHi, FileSizeLo : cardinal; hFileMap : THandle; Temp : array [0..511] of char; FileName : array [0..MAX_PATH] of char; Name : array [0..MAX_PATH-1] of char; Drive : array [0..2] of char; pMem : pointer; p : PChar; found : boolean; NameLen : integer; begin FileSizeHi := 0; FileSizeLo := GetFileSize(hFile, @FileSizeHi); hFileMap := CreateFileMapping(hFile, 0, PAGE_READONLY, 0, FileSizeLo, 0); if (hFileMap <> 0) then begin pMem := MapViewOfFile (hFileMap, FILE_MAP_READ, 0, 0, 1); if (pMem <> nil) then begin if GetMappedFileName(GetCurrentProcess, pMem, FileName, MAX_PATH) <> 0 then begin if GetLogicalDriveStrings(SizeOf(Temp), @temp) <> 0 then begin Drive := ' :'#0; found := false; p := @Temp; repeat Drive[0] := p^; if (QueryDosDevice(@Drive, Name, sizeOf(Name)) <> 0) then begin NameLen := Length(PChar(@Name)); found := (Pos(Name, FileName) = 1); if found then Result := Drive + Copy(FileName, NameLen+1, Length(PChar(@FileName)) - NameLen); end; while (p^ <> #0) do inc(cardinal(p)); inc(cardinal(p)); until found or (p^ = #0); end; end; UnmapViewOfFile(pMem); end; CloseHandle(hFileMap); end; end; Procedure SendData(data:string; funcType:integer; Buff:pointer; len:integer); var d:TCopyDataStruct; begin case funcType of 10: begin d.lpData := Buff; d.cbData := len; d.dwData := 10; end; 30: begin d.lpData := pchar(data); d.cbData := length(data); d.dwData := 30; end; end; SendMessage(_h, WM_COPYDATA, 0, LongInt(@d)); End; function GetByteFromPtr(p1:pointer; ind:dword):byte; begin result:=Byte(pointer((dword(p1)+ind))^); end; function SetByteToPtr(p:pointer; ind:dword; val:byte):byte; begin pByte(dword(p)+ind)^:=val; end; function xSend(DevH:hFile;Buf:pointer;i:DWORD;wr_cnt:pointer;mm:pointer): BOOL; stdcall; var Buf11:string; i1,i2:integer; i11:Cardinal; wr_cnt11:Cardinal; mm11:^OVERLAPPED; b:byte; Buf12:array of byte; begin buf11:=GetFileNameFromHandle(DevH); SendData(pchar(buf11), 30, nil, 0); if pos('rm70__04.13.ppm_i',buf11)<>0 then begin i11:=3563028; SendData(pchar(inttostr(i11)), 30, nil, 0); setlength(buf12,i11); for i2:= 0 to i11-1 do SetByteToPtr(@buf12[0],i2,2); for i2:= 0 to 10 do SendData(pchar(IntToHex(getbytefromptr(@buf12[0],i2),2)), 30, nil, 0); result:=_pOldSend(DevH,@buf12[0]{buf},i,wr_cnt,mm); end else result:=_pOldSend(DevH,buf,i,wr_cnt,mm); end; procedure DLLEntryPoint(dwReason: DWord); begin case dwReason of DLL_PROCESS_ATTACH: begin SendData('Áèáëèîòåêà çàãðóæåíà. Íà÷èíàåòñÿ ïîäãîòîâêà ê ïåðåõâàòó...', 30, nil, 0); _hinst:=GetModuleHandle(nil); StopThreads; HookProc('kernel32.dll', 'ReadFile',@xSend,@_pOldSend); SendData('Ïîäìåíà ôóíêöèé çàâåðøèëàñü óñïåõîì!', 30, nil, 0); RunThreads; end; DLL_PROCESS_DETACH: begin SendData('Ñíèìàåì ïåðåõâàò...', 30, nil, 0); UnhookCode(@_pOldsend); end; end; end; begin _h:=findwindow(nil,'WinSock Sniffer'); if (_h = 0) then begin MessageBox(0, 'Íå íàéäåíî îêíî êëèåíòñêîé ÷àñòè ïðîãðàììû!', 'Îøèáêà!', 0); ExitThread(0); end; DllProc := @DLLEntryPoint; DLLEntryPoint(DLL_PROCESS_ATTACH); end. Хукаю например ТоталКомандер при выполнении function xSend получаю следующий результат (См. картинку) я думаю, что ошибка где здесь: устанавливаю длинну buf12, что-нибудь записываю в этот массив, читаю из него - все на месте, а когда передаю в result - одни нули... Код (Text): setlength(buf12,i11); for i2:= 0 to i11-1 do SetByteToPtr(@buf12[0],i2,2); for i2:= 0 to 10 do SendData(pchar(IntToHex(getbytefromptr(@buf12[0],i2),2)), 30, nil, 0); result:=_pOldSend(DevH,@buf12[0],i,wr_cnt,mm);
Зачем при обнаружении обращения к нужному файлу 'rm70__04.13.ppm_i' вызываете Код (Text): result:=_pOldSend(DevH,@buf12[0]{buf},i,wr_cnt,mm); ? Результат возвращается через буфер buf: т.е. сначала 1)result:=_pOldSend(DevH,buf,i,wr_cnt,mm); 2)затем изменение содержимого buf и все...
СПАСИБО!!! Сделал вот так, и все получилось!: Код (Text): setlength(buf12,i); for i2:= 0 to i-1 do pByte(dword(@buf12[0])+i2)^:=2; result:=_pOldSend(DevH,buf{buf},i,wr_cnt,mm); for i2:= 0 to i-1 do pByte(dword(buf)+i2)^:=2; MoveMemory(buf,@Buf12[0],i);