Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с buf:pointer как с массивом char


Страницы:   1 2

Новичоккк ©   (2006-06-30 17:50:00) 

Функции передаётся указатель на буффер, а так же размер этого буффера. Как реализовать удобное обращение к каждому байту этого буффера как к массиву? Думаю надо каким-то образом использовать PChar... Подскажите


Новичоккк   (2006-07-01 12:15:00) [1]

Вот DLL и программа, которая её внедряет:
http://webfile.ru/1009692(21кб)
Скомпилируйте оба проекта, запустите Inject.exe, укажите заголовок окна любого сетевого приложения и нажмите кнопку Inject (если увидите сообщение "DLL Injected", значит библиотека внедрена в приложение). Функция Send будет перехвачена, но при отправке сетевым приложением пакета - произойдет критическая ошибка.
function MySend(s: TSocket; var buf; len, flags: Integer): Integer; stdcall;
var
 BufData: pchar;
begin
 Result := 0;
 GetMem(BufData, Result);
 MessageBoxA(0, 'BEFORE', 'INFO', MB_ICONEXCLAMATION);
 try
   CopyMemory(BufData, @Buf, Result);
   BufData[0]:=chr(0); //ТУТ ВОЗНИКАЕТ ОШИБКА !!!
   CopyMemory(@Buf, BufData, Result);
   MessageBoxA(0, 'AFTER', 'INFO', MB_ICONEXCLAMATION);
 finally
   FreeMem(BufData);
 end;
 Result := TrueSend(s, Buf, len, flags);
end;


Новичоккк   (2006-07-01 11:07:00) [2]


> koha   (30.06.06 22:32) [19]
> Повторюсь еще раз:

Не совсем понял как использовать...

Вставляю такой заголовок функции:
function MySend(socket: TSocket; var PChar(StrMess)^; Length(StrMess), flags: Integer): Integer; stdcall;
Получаю:
[Error] hnt_bf.dpr(96): ';', ')' or '=' expected but '(' found
--------------
var
ReadBuff  : Array [0..1024] of Char;
StrTxt: Tstrings;
StrMess: String;

Это я так понимаю глобальные переменные
Procedure CleanBuff;
Var i: integer;
begin for i:=0 to SizeOf(ReadBuff)-1 do ReadBuff[i]:=#0; end;

Это просто внешняя процедура

begin
// использование буфера на передачу
StrMess:='Передаваемое сообщение'+#13;  
function MySend(s: TSocket; var PChar(StrMess)^; Length(StrMess), flags: Integer): Integer; stdcall;

// использование буфера на приемм ReadBuff  : Array [0..1024] of Char;
 
//  ....SizeOf(ReadBuff) - указание размера буфера
StrTxt:=TstringList.Create;
StrTxt.Add(StrPas(ReadBuff)); // так добавляют сообщения из буфера StringList
StrTxt.LoadFromFile(FileName); // Запись в файл накопленных сообщений - работает в консоле.

end;

А это что такое? function MySend внутри блока begin/end?


koha   (2006-06-30 22:49:00) [3]

Мне кажется там и так нету ничего только это #0 или память
утекает когда резервируется под число 1024.


Zeqfreed   (2006-06-30 22:34:00) [4]

> [19] koha   (30.06.06 22:32)

Зачем только килобайт стека портить?

function MemoryReadWrite(var Buf; Size : Integer) : Integer;
type
 TCharArray = array[0..0] of Char;
var
 i : Integer;
begin
 Result := 0;
 for i := 0 to Size - 1 do begin
  Result := Result + Ord(TCharArray(Buf)[i]);
  TCharArray(Buf)[i] := Chr(i + 65);
 end;
end;


koha   (2006-06-30 22:32:00) [5]

Повторюсь еще раз:

var
ReadBuff  : Array [0..1024] of Char;
StrTxt: Tstrings;
StrMess: String;
{------------------------------ Clean Buffer ----------------------------------}
Procedure CleanBuff;
Var i: integer;
begin for i:=0 to SizeOf(ReadBuff)-1 do ReadBuff[i]:=#0; end;
{------------------------------------------------------------------------------}

begin

// использование буфера на передачу
StrMess:='Передаваемое сообщение'+#13;  
function MySend(s: TSocket; var PChar(StrMess)^; Length(StrMess), flags: Integer): Integer; stdcall;

// использование буфера на приемм ReadBuff  : Array [0..1024] of Char;
 
//  ....SizeOf(ReadBuff) - указание размера буфера
StrTxt:=TstringList.Create;
StrTxt.Add(StrPas(ReadBuff)); // так добавляют сообщения из буфера StringList
StrTxt.LoadFromFile(FileName); // Запись в файл накопленных сообщений - работает в консоле.

end;


Новичоккк   (2006-06-30 22:32:00) [6]


> ибо это вообще никакой логикой не обосновано

Да тут дело не в логике. Я просто пытался разными способами осуществить чтение буффера. Во всех случаях при попытке чтения и записи возникает "Access Violation"


tesseract   (2006-06-30 22:12:00) [7]


> begin for i:=0 to SizeOf(ReadBuff)-1 do ReadBuff[i]:=#0;
>  end;

ZeroMemory не побыстрее будет?


koha   (2006-06-30 22:02:00) [8]

Соррии прогнал такой метод сгодится для приема данных


koha   (2006-06-30 22:00:00) [9]

Я думаю такой метод использования буфера подойдет у меня работает точно!

var
ReadBuff  : Array [0..1024] of Char;
begin

{------------------------------ Clean Buffer ----------------------------------}
Procedure CleanBuff;
Var i: integer;
begin for i:=0 to SizeOf(ReadBuff)-1 do ReadBuff[i]:=#0; end;
{------------------------------------------------------------------------------}

CleanBuff; // не забывай очищать буфер перед каждым использованием
 
function MySend(s: TSocket; var ReadBuff; SizeOf(ReadBuff), flags: Integer): Integer; stdcall;
mmInf.Lines.Add(StrPas(ReadBuff)); // так добавляют сообщения из буфера

end;


Palladin   (2006-06-30 21:59:00) [10]

тем, уж, более без всяких


>  str:=s[0]; //Вот тут возникает критическая ошибка


ибо это вообще никакой логикой не обосновано


Palladin   (2006-06-30 21:57:00) [11]


> Я в вызов ничего не передаю - передаёт приложение которое
> использует Socket.

:) то есть оно за тебя придумывает что передает?


> Так S - это PChar (s:PChar)

ну так, а какого хера у тебя str:Stringтогда? делай PChar


Новичоккк   (2006-06-30 21:43:00) [12]


> 1 String начинается не с [0], а с [1]2 не передавай String
> в вызов если не используется ShareMem

Так S - это PChar (s:PChar)
Я в вызов ничего не передаю - передаёт приложение которое использует Socket.


Palladin   (2006-06-30 21:34:00) [13]


> Новичоккк  

1 String начинается не с [0], а с [1]
2 не передавай String в вызов если не используется ShareMem


Новичоккк   (2006-06-30 21:28:00) [14]

Это DLL, которая внедряется а АП приложения. Она устанавливает Hook'и на Send и Recv библиотеки wsock23.dll. В моих функциях Send и Recv вызываются оригинальные функции библиотеки. В случае Send - необходимо сделать XOR буффера перед отправкой пакета.

Частично взято отсюда:
http://forum.vingrad.ru/index.php?showtopic=53806&hl=hook&st=0

Критическая ошибка возникает непосредственно при обращении к buf (чтение/запись). Если buf не трогать - то всё работает правильно (функции перехватываются, работа приложения не нарушается)

function MySend(socket: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
var
F:TextFile;
str:string;
i:integer;
s:PChar;
begin
 if Action then
     begin
      MessageBoxA(0, 'До кодирования', 'INFO', MB_ICONEXCLAMATION);
      str:='';
      s:=pchar(buf);
      str:=s[0];//Вот тут возникает критическая ошибка
      MessageBoxA(0, 'TEST', 'INFO', MB_ICONEXCLAMATION);
      EncryptGP(str);
      {for i:=0 to len-1 do
         begin
          p^:=str[i+1];
          inc(p);
         end;}
      MessageBoxA(0, 'Пакет закодирован', 'INFO', MB_ICONEXCLAMATION);
     end;
 AssignFile(F,'C:\log.txt');
 {$I-}
 Reset(F);
 {$I+}
 if IOResult0 then Rewrite(F);
 Append(F);
 WriteLn(F,'send: '+IntToStr(len));
 CloseFile(F);
 Result := TrueSend(socket, Buf, len, flags);
end;

Сообщение TEST уже не выводится. Если Action=false, то Log ведётся, приложение работает без ошибок.


Palladin   (2006-06-30 21:18:00) [15]

только в программе...

с тебя требуется
1. объявление передаваемых переменных
2. вызов функции
3. секция uses
4. если dll, то какая и метод обращения
5. ну и наверное строка где эта критическая ошибка возникает


Новичоккк   (2006-06-30 20:58:00) [16]

Странно... при попытке изменить буффер каким-либо образом выскакивает критическая ошибка (в том числе через absolute). В чем же может быть дело...


Palladin   (2006-06-30 19:16:00) [17]

а еще интересней

function MySend(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
Var
s:string absolute buf;
i: integer;
begin
for I := 1 to len do s[i] := Chr(Random(255));
end;

если конечно именно переменную типа String передаешь, если не String, а PChar, то соотвессно

function MySend(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
Var
s:PChar absolute buf;
i: integer;
begin
for I :=0 to len-1 do s[i] := Chr(Random(255));
end;


и тд и тп


Loginov Dmitry   (2006-06-30 18:53:00) [18]

function MySend(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
str:string;
p:Pchar;
i: integer;
begin
 p:=@buf; // про @ - не уверен, проверь, может нужно p := Pointer(Buf)
 for I := 0 to len - 1 do
   p[i] := Chr(Random(255));
...
end;


Vlad   (2006-06-30 18:47:00) [19]


> Новичоккк   (30.06.06 18:27) [4]


> Buf - какого типа? =)

см. справку Untyped parameters

var
p: pchar;// (или pbytearray)
begin
p:=pchar(buf); {или pbytearray(buf)}

а строка тебе зачем?


Новичоккк   (2006-06-30 18:27:00) [20]

Что-то не выходит...
Перехватывается функция Send. Вот заголовок:
function MySend(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
Buf - какого типа? =)

Уже на этих строках приложение "вылетает":
function MySend(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
str:string;
p:^char;
begin
p:=pointer(buf);
str:=p^;

...
end;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо