Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.07.16;
Скачать: [xml.tar.bz2];

Вниз

Работа с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.01 c
3-1147518323
neat
2006-05-13 15:05
2006.07.16
Копирование таблиц


1-1149103763
Phoroon~
2006-05-31 23:29
2006.07.16
Иконка чужого окна


2-1151227728
tatjana
2006-06-25 13:28
2006.07.16
pomogite plz


4-1144245366
spyrytus
2006-04-05 17:56
2006.07.16
Форма из картинки


2-1151671180
Gizza
2006-06-30 16:39
2006.07.16
База данных





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский