Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.16;
Скачать: CL | DM;

Вниз

Работа с buf:pointer как с массивом char   Найти похожие ветки 

 
Новичоккк   (2006-06-30 17:50) [0]

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


 
begin...end ©   (2006-06-30 17:51) [1]

Приведение к типу PByteArray (или собственному типу-аналогу).


 
Новичоккк   (2006-06-30 18:08) [2]

А сделать просто
var
a:PChar;
begin
buf:=a
...
a[0]:="a";
end;

Нельзя?


 
Vlad ©   (2006-06-30 18:13) [3]


> Новичоккк   (30.06.06 18:08) [2]

как к массиву нельзя, но можно последовательно (в цикле напр.)
Inc(а) переход к след. байту


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

Что-то не выходит...
Перехватывается функция 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;


 
Vlad ©   (2006-06-30 18:47) [5]


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


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

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

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

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


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

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;


 
Palladin ©   (2006-06-30 19:16) [7]

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

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;


и тд и тп


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

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


 
Palladin ©   (2006-06-30 21:18) [9]

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

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


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

Это 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 IOResult<>0 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:34) [11]


> Новичоккк  

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


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


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

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


 
Palladin ©   (2006-06-30 21:57) [13]


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

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


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

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


 
Palladin ©   (2006-06-30 21:59) [14]

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


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


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


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

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

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;


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

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


 
tesseract ©   (2006-06-30 22:12) [17]


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

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


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


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

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


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

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

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;


 
Zeqfreed ©   (2006-06-30 22:34) [20]

> [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:49) [21]

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


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


> 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?


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

Вот 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;



Страницы: 1 вся ветка

Текущий архив: 2006.07.16;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.045 c
3-1147782897
Karburator
2006-05-16 16:34
2006.07.16
Программное удаление индекса из dbf


2-1151290523
learner
2006-06-26 06:55
2006.07.16
Передача функции класса как параметра в др. функцию


10-1121847387
serjufa
2005-07-20 12:16
2006.07.16
в листе excel нарисовать стрелки


15-1149789877
kaif
2006-06-08 22:04
2006.07.16
ODBC драйвер для FoxPro2.6


15-1149863069
Alien1769
2006-06-09 18:24
2006.07.16
Robotron-1715