Текущий архив: 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.51 MB
Время: 0.009 c