Низнаю, низнаю, насчет того что начинать с Delphi, знаю несколько людей, которые очень хотяли научится прогрммировать и в итоге бросили, потому что им было все не понятно, а я зная паскаль после двух месяцев вожения с delphi, написал прогу которая вполне сошла б за коммерческий продукт. Но это наверно от преподавателя зависит (а я сам delphi выучил)
Существует ли аналог Sendmessagge/Postmessage который отправляет сообщения не окну, а на пример хэндлу или pid программы, уже подумываю о отправке через сокет на 127.0.0.1 Немножко изменю вопрос. Нужно, в принципе, обмениваться сообщениями с dll, которая инжектирована в другое приложение, только как получить/обращаться к форме приложения в которое она инжектирована из этой dll ? Главная проблема, как уже поняли, в приёме данных библиотекой .. Решил даную проблему Code: function GetFormFromHandle(Handle: HWnd): TForm; var wc: TWinControl; begin wc := FindControl(Handle); if (wc is TForm) then Result := TForm(wc) else Result := nil; end;
Может ли данная функция кушать память (не освобождать по выполнении) ? Используется и из вспомогательных потоков, и из главного потока. Code: function httpget (http : tidhttp; adr : widestring) : widestring; var str : tstringstream; begin str := tstringstream.Create(''); try http.Get (adr, str); except end; Result := str.DataString; str.Free; end; С некоторого времени многопоточные программы для работы с сетью стали кушать очень много памяти (на 50 потоков - 80 мб уже на 10-й минуте работы, чем дальше - тем больше). TrimWorkingSet, естественно, не помогает.
Вопросик: каким образом создаются билдеры ны дэлфе? Есть фэйк рабочий чтобы его перенастроить надо вего 3 переменных поменять, а как это сделать на знаю(
Фэйк ВК антиспам агент(думаю не суть), не получается нечего потому как не знаю. Как вообщем Создать билдер того самого фэйка чтобы на выходе ехе выдавался с введенными переменными??
c:=ord(char(pchar(mes[1]))); SetFilePointer(f, $2851, nil, 0); WriteFile(f, c, SizeOf©, BytesRead, nil); Но это подходит для патчинга ане билдинга, хех продвинулся и нашел CreateExe(EOutFile.Text, 14336); каким образом работает эта функция и как засунуть один exe в другой? Каким образом динамически искать байты для замены т.е. пол винхекс который найдет байт и заменит его?
Всем доброго времени суток! У меня есть вопрос: У меня есть библиотека, я хочу чтобы explorer загружал её при старте Windows, как такое можно реализовать и можно ли вообще? Заранее очень благодарен!
iGlass ты хочешь чтобы провести dll инжект?xakep.ru нужно её загрузить как приложение те через запуск длл как приложений или нужно чтобы ехрлогег цеплял его??
Да, чтоб эксплорер цепанул её, и она там висела, её цель искать определённое приложение и не дать ему запуститься.. За статью спасибо, пригодиться.
Не уверен но вроде explorer работает без длл можно инжект (up), А не проще прогу в авто загрузке или инжектить к проге из автозагрузки?? просто скрыть её и все, есть служба запуск длл как приложения не разу не пользовался но кажется она может помочь..
Ну вот смотри, есть программа, она не прописана в автозапуске, пользователь захотел запустил захотел не запустил.. Так вот, Мне до запуска программы нужно подгрузить свою библеотеку чтобы она уже висела впамяти и ждала прогу, а когда пользователь начнёт запускать программу, то ничего происходить не будет т.к в dll стоит хук. Желательно бы про эту службу по подробнее ) Вот такие пироги =)
iGlass можно если ты знаешь что эта программа есть, узнать адресс проги в реестре и инжектится в нее при запуске, тогда можно с ней делать что угодно из-нутри так сказать. Про службу погугли сам, если что найдется интересное пиши в ПМ
Если все вызовы относятся к стандартным то они по идее обязаны за собой чистить память, однако все равно тебе не помешала бы трассировка.
procedure TForm1.ReadParams; Var IniFile: TIniFile; begin IniFile:=TIniFile.Create('abc.ini'); xppanel1.Caption:=IniFile.ReadString('FORM1','Panel',xppanel1.Caption); IniFile.Free; end; procedure TForm1.WriteParams; Var IniFile: TIniFile; begin IniFile:=TIniFile.Create('abc.ini'); IniFile.WriteString('FORM1','Panel',xppanel1.Caption); IniFile.Free; end; Как сделать, чтобы в abc.ini текст хранился в шифрованном, а не в открытом виде? Метод шифрования можно самый простой. Желательно показать примерчик. Заранее спасибо всем кто ответит.
Вам изначально необходимо выбрать способ шифрования. В общем случае чтение и запись будут реализованы так: Code: procedure TForm1.WriteParams; Var IniFile: TIniFile; OpenText, CloseText: string; begin ... выполнение неободимых действий // в OpenText хранится текст для записи // Encrypt - функция шифрования, которой передаются следующие параметры: текст и ключ для шифрования CloseText := EnCrypt(OpenText, Key); IniFile:=TIniFile.Create('abc.ini'); IniFile.WriteString('Section','PName', CloseText); IniFile.Free; end; procedure TForm1.ReadParams; Var IniFile: TIniFile; OpenText, CloseText: string; begin // Decrypt - функция расшифрования, которой передаются следующие параметры: текст и ключ для шифрования IniFile:=TIniFile.Create('abc.ini'); CloseText := IniFile.ReadString('Section','PName', ''); IniFile.Free; OpenText := Decrypt(CloseText, key); end; Если нужен простейший пример шифрования, то вот класс описывающий шифрование Виженера: Code: unit VigenereCrypt; interface uses Classes; type TVigenereCrypt = class Alphabet: string; // алфавит Mask: TStrings; // маска шифрования TabulaRecta: TStrings; constructor Create; procedure CreateMask; procedure Encrypt; procedure Decrypt; end; implementation constructor TVigenereCrypt.Create; var i, j: byte; tmp: string; tmpint: byte; begin Alphabet := 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя0123456789$!.,?;*(){}+=:/[]@\^"'; // создадим строковые списки InputText := TStringList.Create; OutputText := TStringList.Create; Mask := TStringList.Create; TabulaRecta := TStringList.Create; for i := 0 to 63 do begin tmp := Alphabet; for j := 1 to 64 do begin tmpint := (j+i) mod 64; if (tmpint = 0) then tmp[j] := Alphabet[64] else tmp[j] := Alphabet[tmpint]; end; TabulaRecta.Append(tmp); end; end; procedure TVigenereCrypt.CreateMask; var // длина ключа и текущий индекс символа в ключе KeyLength: integer; index: integer; // счетчики циклов i, j: integer; // временные переменные tmp: string; begin KeyLength := Length(key); index := 1; for i := 0 to InputText.Count -1 do begin SetLength(tmp, length(InputText[i])); for j := 1 to length(InputText[i]) do begin tmp[j] := key[index]; inc(index); if (index = KeyLength +1) then index := 1; end; Mask.Append(tmp); end; end; procedure TVigenereCrypt.Encrypt; var i,j : integer; tmp : string; index, tmpint: integer; begin for i := 0 to InputText.Count - 1 do begin // установим длину временной строки SetLength(tmp,Length(InputText[i])); // посимвольно обрабатываем строку for j := 1 to Length(InputText[i]) do begin tmpint := POS(InputText[i][j], Alphabet); // если символ не из алфавита, то пропустим его if (tmpint = 0) then tmp[j] := InputText[i][j] // иначе обрабатываем else begin index := POS(Mask[i][j], Alphabet)-1; tmp[j] := TabulaRecta[index][tmpint]; end; // else end; // for j // добавим строку к обработанному тексту OutputText.Append(tmp); end; // for i end; procedure TVigenereCrypt.Decrypt; var i,j : integer; tmp : string; index, tmpint: integer; begin for i := 0 to InputText.Count - 1 do begin // установим длину временной строки SetLength(tmp,Length(InputText[i])); // посимвольно обрабатываем строку for j := 1 to Length(InputText[i]) do begin index := POS(Mask[i][j], Alphabet)-1; // если символ не из алфавита, то пропустим его if (POS(InputText[i][j], Alphabet) = 0) then tmp[j] := InputText[i][j] // иначе обрабатываем его else begin tmpint := POS(InputText[i][j], TabulaRecta[index]); tmp[j] := Alphabet[tmpint]; end; // else end; // for j // добавим строку к обработанному тексту OutputText.Append(tmp); end; // for i end; end. При использовании процедуры Encrypt этого класса будут зашифрованы все строчные символы кирилицы, цифры и некоторые символы. Всегда можешь изменить алфавит и немного доработать класс. Использовать тогда шифрование нужно так: Code: procedure TForm1.WriteParams; Var IniFile: TIniFile; CloseText: string; Crypt: TVigenereCrypt; begin Crypt:= TVigenereCrypt.Create; Crypt.key := 'ялюблюантичат'; Crypt.InputText.Clear; Crypt.InputText.Append(xppanel1.Caption); Crypt.CreateMask; Crypt.Encrypt; CloseText := Crypt.OutputText[0]; IniFile:=TIniFile.Create('abc.ini'); IniFile.WriteString('FORM1','Panel', CloseText); IniFile.Free; end; procedure TForm1.ReadParams; Var IniFile: TIniFile; tmpstr: string; Crypt: TVigenereCrypt; begin Crypt:= TVigenereCrypt.Create; Crypt.key := 'ялюблюантичат'; IniFile:=TIniFile.Create('abc.ini'); tmpstr:= IniFile.ReadString('FORM1','Panel', 'lalala'); IniFile.Free; Crept.InputText.clear; Crypt.InputText.Append(tmpstr); Crypt.CreateMask; Crypt.Decrypt; xppanel1.Caption:= Crypt.OutputText[0]; end; P.S. все кроме класса писал прямо здесь, мог где то ошибиться.
KaZ@NoVa, спасибо вам! Еще немного поковырялся с проблемой. Выяснилось, что до 30-ти потоков включительно, память программа не кушает (11-12 мб, 30 мин. тест). При запуске более 50-ти потоков - начинается веселье (80-100 мб на 8-10 мин. работы, до 500 мб на 30-й).