แƒฃแƒซแƒ•แƒ”แƒšแƒ”แƒกแƒ˜ แƒงแƒแƒ•แƒแƒ แƒฏแƒ”แƒœแƒ˜ แƒซแƒ•แƒ”แƒš แƒงแƒแƒ•แƒแƒ แƒฏแƒ”แƒœแƒ–แƒ”

แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒ”แƒ‘ แƒฃแƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒแƒ“, แƒ”แƒ แƒ—แƒฎแƒ”แƒš แƒ›แƒ” แƒ›แƒฅแƒแƒœแƒ“แƒ แƒ’แƒแƒ›แƒแƒชแƒฎแƒแƒ“แƒ”แƒ‘แƒ (แƒ™แƒแƒ แƒ’แƒแƒ“ แƒ แƒแƒ› แƒ•แƒ—แƒฅแƒ•แƒ, แƒแƒ แƒช แƒ˜แƒกแƒ” แƒซแƒšแƒ˜แƒ”แƒ แƒ˜) แƒ“แƒ แƒ’แƒแƒฉแƒœแƒ“แƒ แƒ˜แƒ“แƒ”แƒ แƒ“แƒแƒ›แƒ”แƒ‘แƒ”แƒญแƒ“แƒ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒกแƒฃแƒ แƒแƒ—แƒก แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒ“แƒแƒœ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ–แƒ” แƒ’แƒแƒ“แƒแƒกแƒชแƒ”แƒ›แƒก. แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒแƒ“ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒแƒ แƒ? แƒ™แƒแƒ แƒ’แƒ˜, แƒ’แƒแƒ›แƒแƒชแƒ“แƒ˜แƒšแƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒกแƒขแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ”แƒก แƒแƒกแƒ” แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ. แƒžแƒ˜แƒ แƒแƒ‘แƒ”แƒ‘แƒ˜ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ - แƒแƒ  แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ›แƒ”แƒกแƒแƒ›แƒ” แƒ›แƒฎแƒแƒ แƒ˜แƒก แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ”แƒ‘แƒ˜. แƒžแƒ แƒ˜แƒœแƒชแƒ˜แƒžแƒจแƒ˜, แƒ”แƒก แƒชแƒแƒขแƒ แƒฃแƒคแƒ แƒ แƒ แƒ—แƒฃแƒšแƒ˜แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ˜แƒ›แƒ˜แƒก แƒ’แƒแƒ—แƒ•แƒแƒšแƒ˜แƒกแƒฌแƒ˜แƒœแƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒ› แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ”แƒ แƒ™แƒ•แƒœแƒ”แƒœ แƒ“แƒ แƒ›แƒแƒซแƒ”แƒ‘แƒœแƒแƒ— แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒ˜, แƒ™แƒแƒ แƒ’แƒ˜, แƒแƒกแƒ”แƒ—แƒ˜ แƒแƒ™แƒฃแƒžแƒแƒชแƒ˜แƒ. แƒ’แƒแƒ“แƒแƒ•แƒฌแƒงแƒ•แƒ˜แƒขแƒ”, แƒ แƒแƒ› แƒ”แƒก แƒแƒ›แƒแƒชแƒแƒœแƒ แƒฉแƒ”แƒ›แƒ–แƒ” แƒ˜แƒงแƒ. แƒ’แƒแƒ แƒ“แƒ แƒแƒ›แƒ˜แƒกแƒ, แƒกแƒแƒกแƒฃแƒ แƒ•แƒ”แƒšแƒ˜แƒ แƒ˜แƒงแƒแƒก แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒ˜ แƒ™แƒแƒ“แƒ˜, แƒ แƒแƒ—แƒ แƒ˜แƒก แƒ’แƒแƒ›แƒแƒฅแƒ•แƒ”แƒงแƒœแƒ“แƒ”แƒก แƒคแƒแƒ แƒฃแƒ›แƒ–แƒ” แƒ“แƒแƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒญแƒ˜แƒ แƒแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜. แƒฃแƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ”แƒก แƒงแƒแƒ•แƒšแƒ˜แƒกแƒ, แƒฉแƒ”แƒ›แƒ˜ แƒ—แƒ•แƒแƒšแƒ˜ แƒ“แƒแƒ”แƒชแƒ FTP-แƒ–แƒ”, แƒกแƒฎแƒ•แƒแƒ—แƒ แƒจแƒแƒ แƒ˜แƒก, OS-แƒ–แƒ”, แƒ แƒแƒ›แƒ”แƒšแƒจแƒ˜แƒช แƒ›แƒฃแƒจแƒแƒ•แƒ“แƒ”แƒ‘แƒ Windows. FTP-แƒ˜แƒก แƒฃแƒžแƒ˜แƒ แƒแƒขแƒ”แƒกแƒแƒ‘แƒ แƒ˜แƒก แƒแƒ แƒ˜แƒก, แƒ แƒแƒ› แƒ›แƒ˜แƒกแƒ˜ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ˜แƒ— แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒ“แƒแƒ˜แƒขแƒแƒœแƒแƒ— แƒแƒ แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒกแƒฃแƒ แƒแƒ—แƒ˜, แƒแƒ แƒแƒ›แƒ”แƒ“ แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒคแƒแƒ˜แƒšแƒ˜. Filezilla Server-แƒ˜แƒก แƒฉแƒแƒ›แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก, แƒ”แƒ แƒ—แƒ˜ แƒ™แƒแƒขแƒแƒšแƒแƒ’แƒ˜แƒก แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒ˜แƒก/แƒฌแƒ”แƒ แƒ˜แƒก แƒ“แƒ แƒžแƒแƒ แƒแƒšแƒ˜แƒ— แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒก แƒ’แƒแƒ–แƒ˜แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ•แƒชแƒแƒ“แƒ” Filezilla Client-แƒ˜แƒก แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ, แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ“แƒ. แƒ›แƒ” แƒจแƒ”แƒ•แƒฅแƒ›แƒ”แƒœแƒ˜ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒ™แƒแƒ“แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ C/C++-แƒจแƒ˜:

#include <iostream>
void main()
{
	FILE* fs;
	fopen_s(&fs, "1.txt", "w");
	if (fs)
	{
    fwrite("userrnpasswordrnsend D:\share.txtrnbye", 1, sizeof("userrnpasswordrnsend D:\share.txtrnbye"), fs);
    fwrite("00", 1, sizeof("00"), fs);
    fclose(fs);
	}
	system("ftp -s:1.txt 127.0.0.1");
}

แƒ—แƒฃ แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ แƒ›แƒ”แƒ›แƒกแƒแƒฎแƒฃแƒ แƒ”แƒ‘แƒ, แƒ›แƒแƒจแƒ˜แƒœ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ“แƒ แƒšแƒแƒ™แƒแƒšแƒฃแƒ  แƒฐแƒแƒกแƒขแƒ–แƒ” แƒ“แƒ แƒฅแƒกแƒ”แƒšแƒจแƒ˜ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒกแƒแƒก แƒ›แƒแƒฎแƒ“แƒ แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒฎแƒแƒ–แƒจแƒ˜. แƒแƒฅ แƒ›แƒแƒกแƒแƒฎแƒ”แƒ แƒฎแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ) แƒ›แƒแƒ™แƒšแƒ”แƒ“ แƒ‘) แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒ  แƒ’แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ— แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ, แƒแƒ แƒแƒ›แƒ”แƒ“ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— Microsoft-แƒ˜แƒก ftp-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒฃแƒ™แƒ•แƒ” แƒฉแƒแƒจแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ˜. แƒ—แƒฃแƒ›แƒชแƒ, แƒฉแƒ”แƒ›แƒ˜ แƒแƒ–แƒ แƒ˜แƒ—, แƒ˜แƒก แƒฃแƒœแƒ“แƒ แƒ’แƒแƒแƒฅแƒขแƒ˜แƒฃแƒ แƒ“แƒ”แƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ˜แƒ—. แƒ—แƒฃ แƒ’แƒแƒแƒ แƒ™แƒ•แƒ”แƒ•แƒ— แƒ แƒ แƒแƒ แƒ˜แƒก แƒแƒ› แƒ›แƒ”แƒ—แƒแƒ“แƒ˜แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ แƒ“แƒ แƒ“แƒแƒฌแƒ”แƒ แƒ”แƒ— แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ”แƒ‘แƒจแƒ˜, แƒ™แƒแƒ แƒ’แƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ.

แƒ›แƒแƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ แƒแƒช แƒ•แƒ”แƒ  แƒ•แƒ˜แƒžแƒแƒ•แƒ” แƒžแƒแƒกแƒฃแƒฎแƒ˜ แƒคแƒแƒ แƒฃแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ—แƒแƒ˜แƒ’แƒฃแƒšแƒ–แƒ”, แƒ“แƒแƒ•แƒขแƒแƒ•แƒ” แƒ”แƒก แƒ™แƒแƒ“แƒ˜ แƒ“แƒ แƒ’แƒแƒ“แƒแƒ•แƒฌแƒงแƒ•แƒ˜แƒขแƒ” แƒ’แƒแƒ›แƒแƒ›แƒ”แƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒœแƒ แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ˜ แƒกแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒฅแƒกแƒ”แƒšแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ›แƒ” แƒฃแƒ™แƒ•แƒ” แƒ›แƒฅแƒแƒœแƒ“แƒ แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒกแƒ˜แƒ•แƒ˜แƒก แƒกแƒฎแƒ•แƒ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒแƒ–แƒ” แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒแƒชแƒ“แƒ˜แƒšแƒ”แƒ‘แƒ. แƒกแƒฎแƒ•แƒแƒ—แƒ แƒจแƒแƒ แƒ˜แƒก, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒฌแƒแƒ˜แƒ™แƒ˜แƒ—แƒฎแƒแƒ— Tanenbaum-แƒ“แƒแƒœ, แƒ™แƒแƒ›แƒžแƒ˜แƒฃแƒขแƒ”แƒ แƒฃแƒšแƒ˜ แƒฅแƒกแƒ”แƒšแƒ”แƒ‘แƒ˜, แƒกแƒแƒขแƒ แƒแƒœแƒกแƒžแƒแƒ แƒขแƒ แƒคแƒ”แƒœแƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒ—แƒแƒ•แƒจแƒ˜. แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒกแƒ แƒ“แƒ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜, แƒ—แƒฃแƒ›แƒชแƒ แƒแƒ แƒ "แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜ - แƒ”แƒ แƒ—แƒ˜ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜" แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒ แƒแƒ›แƒ”แƒ“ แƒ›แƒฎแƒแƒšแƒแƒ“ "แƒ”แƒ แƒ—แƒ˜ แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜ - แƒ”แƒ แƒ—แƒ˜ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜". แƒ˜แƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒ, แƒ แƒแƒ› แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ แƒฎแƒ“แƒ”แƒ‘แƒ แƒ˜แƒœแƒขแƒ”แƒ แƒœแƒ”แƒขแƒ˜แƒ—, แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒจแƒ˜แƒคแƒ แƒแƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ แƒแƒ’แƒแƒ แƒ›แƒ”. แƒแƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒจแƒ˜แƒคแƒ แƒ˜ - Feistel แƒฅแƒกแƒ”แƒšแƒ˜. แƒžแƒšแƒฃแƒก แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ–แƒ” แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” (แƒ”แƒ แƒ—แƒ–แƒ” แƒ›แƒ”แƒขแƒ˜ แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก) แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ. แƒแƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— Threads-แƒก, แƒ’แƒแƒ“แƒแƒกแƒแƒชแƒ”แƒ›แƒ˜ แƒกแƒฃแƒ แƒแƒ—แƒ˜ แƒ’แƒแƒ“แƒแƒ˜แƒฆแƒ”แƒ‘แƒก แƒ”แƒ™แƒ แƒแƒœแƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒก แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒกแƒ’แƒแƒœ, แƒ“แƒแƒจแƒ˜แƒคแƒ แƒฃแƒšแƒ˜ แƒ“แƒ แƒ’แƒแƒ“แƒแƒ”แƒชแƒ”แƒ›แƒ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ–แƒ”, แƒกแƒแƒ“แƒแƒช แƒ˜แƒก แƒ’แƒแƒ˜แƒจแƒ˜แƒคแƒ แƒ”แƒ‘แƒ แƒ“แƒ แƒ“แƒแƒฃแƒงแƒแƒ•แƒœแƒ”แƒ‘แƒšแƒ˜แƒ• แƒ’แƒแƒ›แƒแƒฉแƒœแƒ“แƒ”แƒ‘แƒ แƒ”แƒ™แƒ แƒแƒœแƒ–แƒ” แƒ’แƒแƒฎแƒกแƒœแƒ˜แƒก แƒœแƒแƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒ”แƒ•แƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒก แƒ›แƒ”แƒจแƒ•แƒ”แƒแƒ‘แƒ˜แƒ— * .แƒขแƒ’แƒ แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜.

แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ™แƒแƒ“แƒ˜:

#include <iostream>
#include <WinSock.h>
#pragma comment (lib,"WS2_32.lib")

#include <fstream>
#include <algorithm>
#include <string>
#include <iterator>
#include <vector>
void error(const char* msg)
{
    //perror(msg);
    std::cout<<'n'<<WSAGetLastError();
    WSACleanup();
    std::cin.ignore();
    exit(1);
}
void bzero(char*buf, int l)
{
    for (int i = 0; i < l; i++)
        buf[i] = '';
}
struct arg_s
{
    unsigned char* buffer2;
    bool exit;
};
char** buffer;
struct arg_sa
{
    struct arg_s* lalk;
    int current;
};
#define type struct arg_sa
int sockfd, * newsockfd;//ัะปัƒัˆะฐัŽั‰ะธะน ะธ ะผะฐััะธะฒ ะบะปะธะตะฝั‚ัะบะธั… ัะพะบะตั‚ะพะฒ
int buflen2 = 10292000;//ะผะฐะบัะธะผะฐะปัŒะฝั‹ะน ั€ะฐะทะผะตั€ ะธะทะพะฑั€ะฐะถะตะฝะธั ะฒ ะฑะฐะนั‚ะฐั… ะดะปั RGBA*Width*Height
struct sockaddr_in *cli_addr;
int* clilen;
int currentclient,cc;//ัั-ะบะปะธะตะฝั‚ ะฟะพ ัั‡ะตั‚ัƒ(ะดะปั ะทะฐะฟะธัะธ ะธะฝะบั€ะตะผะตะฝั‚ะฐ ะธะผะตะฝะธ ั„ะฐะนะปะฐ ะบะปะธะตะฝั‚ะฐ ะธะทะพะฑั€ะฐะถะตะฝะธั)

typedef unsigned long long uint64_t;
typedef unsigned int uint32_t;
#define N 8//ั€ะฐะทะผะตั€ ะฑะปะพะบะฐ
#define F32 0xFFFFFFFF
uint32_t RK[N];//ั€ะฐัƒะฝะดะพะฒั‹ะต ะบะปัŽั‡ะธ
#define size64 sizeof(uint64_t)
#define ROR(x,n,xsize)((x>>n)|(x<<(xsize-n)))
#define ROL(x,n,xsize)((x<<n)|(x>>(xsize-n)))
#define RKEY(r)((ROR(K,r*3,size64*8))&F32)
const uint64_t K = 0x96EA704CFB1CF671;//ะบะปัŽั‡ ัˆะธั„ั€ะพะฒะฐะฝะธั
struct hostent* server;
uint32_t F(uint32_t subblk, uint32_t key)
{
    return subblk + key;//ั„ัƒะฝะบั†ะธั ัˆะธั„ั€ะพะฒะฐะฝะธั
}
void createRoundKeys()
{
    for (int i = 0; i < N; i++)
        RK[i] = (ROR(K, i * 8, size64 * 8)) & F32;
}
uint64_t decrypt(uint64_t c_block)//ั€ะฐััˆะธั„ั€ะพะฒะบะฐ ะฑะปะพะบะพะฒ ัะตั‚ัŒัŽ ั„ะตะนัั‚ะตะปั
{
    //select subblocks
    uint32_t left = (c_block >> 32) & F32;
    uint32_t right = c_block & F32;
    uint32_t left_, right_;//subblock in the end of round
    for (int r = N - 1; r >= 0; r--)
    {
        uint32_t fk = F(left, RK[r]);
        left_ = left;
        right_ = right ^ fk;
        if (r > 0)//swap places to next round
        {
            left = right_;
            right = left_;
        }
        else //last round not swap
        {
            left = left_;
            right = right_;
        }
    }
    //collect subblock in block
    uint64_t block = left;
    block = (block << 32) | (right & F32);
    return block;
}
void session_(LPVOID args)//ั„ัƒะฝะบั†ะธั ะฟะพั‚ะพะบะฐ ะปั ะบะฐะถะดะพะณะพ ะบะปะธะตะฝั‚ะฐ
{
    int current = currentclient++;
    bzero((char*)&(cli_addr[current]), sizeof(&(cli_addr[current])));
    newsockfd[current] = accept(sockfd, (struct sockaddr*)&(cli_addr[current]), &(clilen[current]));
    if (newsockfd[current] < 0)
    {
        error("Error on acceptn");
    }
    char* s = new char[100];
    int n = recv(newsockfd[current], s, 100, 0);
    int buflen2 = atoi(s);//ะฟะพะปัƒั‡ะฐะตะผ ั‡ะธัะปะพ ะฑะฐะนั‚ะพะฒ ะธะทะพะฑั€ะฐะถะตะฝะธั
    FILE* f;
    std::string name = "Screen";
    cc++;
    _itoa_s(cc, s, 100, 10);
    name += s;
    name += ".tga";
    fopen_s(&f,name.c_str(), "wb");//ัะพะทะดะฐะตะผ ั„ะฐะนะป ะธะทะพะฑั€ะฐะถะตะฝะธั ั ัƒะฒะตะปะธั‡ะธะฒะฐะตั‰ะธะผัั ะฝะฐ 1 ะธะผะตะฝะตะผ, ั‡ั‚ะพะฑั‹ ะฝะต ะฟะตั€ะตะทะฐะฟะธัะฐั‚ัŒ
    if (f != NULL)
    {
        unsigned char tgaHeader[12] = { 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        unsigned char header[6];
        n = recv(newsockfd[current], buffer[current], sizeof(tgaHeader), 0);
        fwrite((unsigned char*)buffer[current], 1, sizeof(tgaHeader), f);
        bzero(buffer[current], buflen2);
        n = recv(newsockfd[current], buffer[current],sizeof(header), 0);
        fwrite((unsigned char*)buffer[current], 1, sizeof(header), f);//ะทะฐะฟะธัะฐะปะธ ั…ะธะดะตั€ั‹
        bzero(buffer[current], buflen2);
        n = recv(newsockfd[current], buffer[current], buflen2, 0);//ะฟะพะปัƒั‡ะธะปะธ ะฑะฐะนั‚ั‹ ัะฐะผะพะณะพ ะธะทะพะฑั€ะฐะถะตะฝะธั
        //
        //ั€ะฐััˆะธั„ั€ะพะฒะบะฐ ะฑะฐะนั‚ะพะฒ
        createRoundKeys();
        unsigned long long id;
        std::vector<uint64_t>* plaintext = new std::vector<uint64_t>();
        int i = 0;
        while (i<buflen2)
        {
            memcpy(&id, (buffer[current]) + i, N);
            plaintext->push_back(decrypt(id));
            i += 8;
        }
        std::cout << "i=" << i << std::endl;
        i = 0;
        char str_[N + 1];
        memset(str_, 0, N);
        str_[N] = '';
        for (std::vector<uint64_t>::iterator it = plaintext->begin(); it != plaintext->end(); ++it)
        {
            memcpy(str_, &*it, N);
            fwrite((unsigned char*)str_, sizeof(unsigned char), N/*strlen(str_)*/, f);
            i += 8;
        }
        std::cout << "i=" << i << std::endl;
        //ะบะพะฝะตั† ั€ะฐัˆะธั„ั€ะพะฒะบะธ ะฑะฐะนั‚ะพะฒ
        //fwrite((unsigned char*)buffer[current], sizeof(char), buflen2, f);
        fclose(f);
    }
    system(name.c_str());//ะพั‚ะบั€ั‹ะฒะฐะตะผ ะธะทะพะฑั€ะฐะถะตะฝะธะต *.tga ะฒัั‚ั€ะพะตะฝะฝั‹ะผ ั€ะตะดะฐะบั‚ะพั€ะพะผ
}
int main()
{
    cc = 0;
    WSADATA ws = { 0 };
    if (WSAStartup(MAKEWORD(2, 2), &ws) == 0)
    {
        currentclient = 0;
        int maxclients = 2;//ะผะฐะบัะธะผะฐะปัŒะฝะพะต ั‡ะธัะปะพ ะบะปะธะตะฝั‚ะพะฒ
        cli_addr = new struct sockaddr_in[maxclients];
        clilen = new int[maxclients];
        buffer = new char* [maxclients];
        for (int i = 0; i < maxclients; i++)
        {
            clilen[i] = sizeof(cli_addr[i]);
        }
        sockfd = socket(AF_INET, SOCK_STREAM, 0);//tcp ัะพะบะตั‚
        if (sockfd < 0)
            error("ERROR opening socket");
        struct sockaddr_in serv_addr;
        bzero((char*)&serv_addr, sizeof(serv_addr));
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_addr.s_addr = INADDR_ANY;
        int port = 30000;//ะฟะพั€ั‚
        serv_addr.sin_port = htons(port);
        if (bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0)
            error("ERROR on binding");
        if (listen(sockfd, 10) < 0)
            error("ERROR listen");
        HANDLE* thread;//ะผะฐััะธะฒ ะฟะพั‚ะพะบะพะฒ ะดะปั ะบะฐะถะดะพะณะพ ะบะปะธะตะฝั‚ะฐ ะพั‚ะดะตะปัŒะฝั‹ะน
        struct arg_sa* args;
        while (true)
        {
            newsockfd = new int[maxclients];
            thread = (HANDLE*)malloc(sizeof(HANDLE) * maxclients);
            args = new struct arg_sa[maxclients];
            for (int i = 0; i < maxclients; i++)
            {
                args[i].lalk = new struct arg_s();
                buffer[i] = new char[buflen2];
            }
            int i = -1;
            while (++i < maxclients)
            {
                Sleep(1);
                args[i].current = i;
                args[i].lalk->exit = false;
                thread[i] = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)(session_), args, 0, 0);
            }
                for (int i = 0; i < maxclients; i++)
                    WaitForSingleObject(thread[i], INFINITE);//ะถะดะตะผ ะทะฐะฒะตั€ัˆะตะฝะธั ะฒัะตั… ะฟะพั‚ะพะบะพะฒ
            i = -1;
            while (++i < maxclients)
            {
                shutdown(newsockfd[i], 0);
                TerminateThread(thread[i], 0);
            }
            //delete[] newsockfd;
            //free(thread);
            currentclient = 0;
            for (int i = 0; i < maxclients; i++)
            {
                //delete args[i].lalk;
                //delete[] args[i].lalk->buffer;
            }
            //delete[] args;
        }
        shutdown(sockfd, 0);
        WSACleanup();
        return 0;
    }
    std::cin.ignore();
}

แƒ›แƒแƒ™แƒšแƒ”แƒ“, แƒ›แƒแƒ แƒแƒ“แƒ˜แƒฃแƒš แƒ›แƒแƒ แƒงแƒฃแƒŸแƒจแƒ˜, แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ˜แƒฅแƒ›แƒœแƒ”แƒ‘แƒ แƒซแƒแƒคแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ”แƒšแƒแƒ“แƒ”แƒ‘แƒ แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒแƒก แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒแƒ›แƒ“แƒ”. แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, WaitForSingleObject แƒ”แƒšแƒแƒ“แƒ”แƒ‘แƒ แƒกแƒแƒœแƒแƒ› แƒงแƒ•แƒ”แƒšแƒ แƒ’แƒแƒ˜แƒ•แƒšแƒ˜แƒก. แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒš แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒก แƒแƒฅแƒ•แƒก แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒกแƒแƒ™แƒ”แƒขแƒ˜ แƒ“แƒ แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒ‘แƒฃแƒคแƒ”แƒ แƒ˜. แƒแƒœแƒฃ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ–แƒ” แƒแƒ แƒ˜แƒก M+1 แƒกแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜, แƒกแƒแƒ“แƒแƒช M แƒแƒ แƒ˜แƒก แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ. แƒงแƒ•แƒ”แƒšแƒ แƒขแƒ แƒแƒœแƒกแƒคแƒ”แƒ แƒ˜แƒก แƒ“แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ›แƒ”แƒแƒ แƒ“แƒ”แƒ‘แƒ.

แƒแƒฎแƒšแƒ แƒ’แƒแƒœแƒ˜แƒฎแƒ˜แƒšแƒ”แƒ— แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜:

#include <iostream>
#include <WinSock.h>
#include <vector>
#pragma comment (lib,"WS2_32.lib")
void error(const char* msg)
{
    //perror(msg);
    std::cout << 'n' << WSAGetLastError();
    WSACleanup();
    std::cin.ignore();
    exit(1);
}
void bzero(char* buf, int l)
{
    for (int i = 0; i < l; i++)
        buf[i] = '';
}
typedef unsigned long long uint64_t;
typedef unsigned int uint32_t;
#define N 8
#define F32 0xFFFFFFFF
uint32_t RK[N];//ั€ะฐัƒะฝะดะพะฒั‹ะต ะบะปัŽั‡ะธ
#define size64 sizeof(uint64_t)
#define ROR(x,n,xsize)((x>>n)|(x<<(xsize-n)))
#define ROL(x,n,xsize)((x<<n)|(x>>(xsize-n)))
#define RKEY(r)((ROR(K,r*3,size64*8))&F32)
const uint64_t K = 0x96EA704CFB1CF671;//ะบะปัŽั‡ ัˆะธั„ั€ะพะฒะฐะฝะธั
void createRoundKeys()
{
    for (int i = 0; i < N; i++)
        RK[i] = (ROR(K, i * 8, size64 * 8)) & F32;
}
uint32_t F(uint32_t subblk, uint32_t key)
{
    return subblk + key;//ั„ัƒะฝะบั†ะธั ัˆะธั„ั€ะพะฒะฐะฝะธั
}
uint64_t encrypt(uint64_t block)//ะทะฐัˆะธั„ั€ะพะฒะบะฐ ะฑะปะพะบะพะฒ ัะตั‚ัŒัŽ ะคะตะนัั‚ะตะปั
{
    //select subblocks
    uint32_t left = (block >> 32) & F32;
    uint32_t right = block & F32;
    uint32_t left_, right_;//subblock in the end of round
    for (int r = 0; r < N; r++)
    {
        uint32_t fk = F(left, RK[r]);
        left_ = left;
        right_ = right ^ fk;
        if (r < N - 1)//swap places to next round
        {
            left = right_;
            right = left_;
        }
        else//last round not swap
        {
            left = left_;
            right = right_;
        }
    }
    //collect subblock in block
    uint64_t c_block = left;
    c_block = (c_block << 32) | (right & F32);
    return c_block;
}
int main()
{
    keybd_event(VK_LWIN, 0, 0, 0);
    keybd_event('M', 0, 0, 0);
    keybd_event('M', 0, KEYEVENTF_KEYUP, 0);
    keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);//ัั‚ะธ ัั‚ั€ะพะบะธ ัะฒะพั€ะฐั‡ะธะฒะฐัŽั‚ ะฒัะต ะฟั€ะธะปะพะถะตะฝะธั
    Sleep(1000);//ั‡ั‚ะพะฑั‹ ัะดะตะปะฐั‚ัŒ ัะบั€ะธะฝัˆะพั‚ ั€ะฐะฑะพั‡ะตะณะพ ัั‚ะพะปะฐ
    WSADATA ws = { 0 };
    if (WSAStartup(MAKEWORD(2, 2), &ws) == 0)
    {
        int sockfd;
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        struct sockaddr_in serv_addr, cli_addr;
        bzero((char*)&serv_addr, sizeof(serv_addr));
        bzero((char*)&cli_addr, sizeof(cli_addr));
        serv_addr.sin_family = AF_INET;

        const char* add = "127.0.0.1";//ะฐะดั€ะตั ัะตั€ะฒะตั€ะฐ
        serv_addr.sin_addr.s_addr = inet_addr(add);
        int port = 30000;//ะฟะพั€ั‚
        serv_addr.sin_port = htons(port);
        int servlen = sizeof(serv_addr);
        int n = connect(sockfd, (struct sockaddr*)&serv_addr, servlen);
        
        //ะฝะธะถะต ะบะพะด ะดะตะปะฐะตั‚ ัะบั€ะธะฝัˆะพั‚
        HDC ScreenDC = GetDC(0);
        HDC MemoryDC = CreateCompatibleDC(ScreenDC);
        int ScreenHeight = GetSystemMetrics(SM_CYSCREEN);
        int ScreenWidth = GetSystemMetrics(SM_CXSCREEN);
        ScreenWidth = ((ScreenWidth - 1) / 4 + 1) * 4;
        BITMAPINFO BMI;
        BMI.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
        BMI.bmiHeader.biWidth = ScreenWidth;
        BMI.bmiHeader.biHeight = ScreenHeight;
        BMI.bmiHeader.biSizeImage = ScreenWidth * ScreenHeight * 3;
        BMI.bmiHeader.biCompression = BI_RGB;
        BMI.bmiHeader.biBitCount = 24;
        BMI.bmiHeader.biPlanes = 1;
        DWORD ScreenshotSize;
        ScreenshotSize = BMI.bmiHeader.biSizeImage;
        unsigned char* ImageBuffer;
        HBITMAP hBitmap = CreateDIBSection(ScreenDC, &BMI, DIB_RGB_COLORS, (void**)&ImageBuffer, 0, 0);
        SelectObject(MemoryDC, hBitmap);
        BitBlt(MemoryDC, 0, 0, ScreenWidth, ScreenHeight, ScreenDC, 0, 0, SRCCOPY);
        DeleteDC(MemoryDC);
        ReleaseDC(NULL, ScreenDC);
        FILE* sFile = 0;
        unsigned char tgaHeader[12] = { 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        unsigned char header[6];
        unsigned char tempColors = 0;
        fopen_s(&sFile, "S.tga", "wb");
        if (!sFile) {
            exit(1);
        }
        header[0] = ScreenWidth % 256;
        header[1] = ScreenWidth / 256;
        header[2] = ScreenHeight % 256;
        header[3] = ScreenHeight / 256;
        header[4] = BMI.bmiHeader.biBitCount;
        header[5] = 0;
        fwrite(tgaHeader, 1, sizeof(tgaHeader), sFile);
        fwrite(header, sizeof(header), 1, sFile);
        //ะบะพะฝะตั† ะทะฐะฟะธัะฐะปะธ ะธะทะพะฑั€ะฐะถะตะฝะธะต ะฒ ั„ะฐะนะป
        
        //ัˆะธั„ั€ัƒะตะผ ะฑะปะพะบะฐะผะธ ะฟะพะปะตะทะฝัƒัŽ ะฝะฐะณั€ัƒะทะบัƒ ะธะทะพะฑั€ะฐะถะตะฝะธั ะบั€ะพะผะต ั…ะธะดะตั€ะพะฒ
        createRoundKeys();
        std::vector<uint64_t>* msg = new std::vector<uint64_t>(),*crpt = new std::vector<uint64_t>();
        unsigned long long id;
        int i = 0;
        while (i < BMI.bmiHeader.biSizeImage)
        {
            memcpy(&id, (ImageBuffer + i), N);
            msg->push_back(id);
            i += 8;
        }
        std::cout << "i=" << i << std::endl; 
        uint64_t cipher;
        i = 0;
        char str_[N + 1];
        memset(str_, 0, N);
        str_[N] = '';
        for (std::vector<uint64_t>::iterator it = msg->begin(); it != msg->end(); ++it)
        {
            cipher = encrypt(*it);
            memcpy(str_, &cipher, N);
            fwrite((unsigned char*)str_, sizeof(unsigned char), N, sFile);
            i += 8;
        }
        std::cout << "i=" << i << std::endl;
        //
        //fwrite(ImageBuffer, BMI.bmiHeader.biSizeImage, 1, sFile);
        std::cout << BMI.bmiHeader.biSizeImage << std::endl;
        fclose(sFile);
        DeleteObject(hBitmap);
        FILE* f;
        fopen_s(&f, "S.tga", "rb");
        int count = 0;
        if (f != NULL)
        {
            while (getc(f) != EOF)
                count++;//ัั‡ะธั‚ะฐะตะผ ะฑะฐะนั‚ั‹ ะธะทะพะฑั€ะฐะถะตะฝะธั ะฒ ัั‡ะตั‚ั‡ะธะบ ั‡ั‚ะพะฑั‹ ะฟะพั‚ะพะผ ะฟะตั€ะตะดะฐั‚ัŒ
            fclose(f);
        }
        count -= 18;
        std::cout << count<< std::endl;
        char* s = new char[100];
        _itoa_s(count, s, 100, 10);
        n = send(sockfd, s, 100, 0);//ะฟะตั€ะตะดะฐะตะผ ัั‡ะตั‚ั‡ะธะบ
        char* buffer = new char[count];
        fopen_s(&f, "S.tga", "rb");
        size_t bytes;
        if (f != NULL)
        {
            memcpy(buffer, tgaHeader, sizeof(tgaHeader));
            n = send(sockfd, buffer, sizeof(tgaHeader), 0);
            bzero(buffer, count);
            memcpy(buffer, header, sizeof(header));
            n = send(sockfd, buffer, sizeof(header), 0);
            bzero(buffer, count);//ะฟะตั€ะตะดะฐะตะผ ั…ะธะดะตั€ั‹
            for(int i=0;i<18;i++)
                fgetc(f);
            bzero(buffer, count);
            bytes = fread(buffer, sizeof(unsigned char), count, f);
            n = send(sockfd,buffer, count, 0);//ะฟะตั€ะตะดะฐะตะผ ัˆะธั„ั€ะพะฒะฐะฝะฝั‹ะต ะฑะฐะนั‚ั‹ ะธะทะพะฑั€ะฐะถะตะฝะธั
            fclose(f);
        }
        Sleep(1000);
        shutdown(sockfd, 0);
        WSACleanup();
        //system("del S.tga");
        delete[] buffer,s;
        return 0;
    }
    //std::cin.ignore();
}

แƒแƒฅ แƒแƒ แƒ˜แƒก แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜, S.tga แƒ”แƒ™แƒ แƒแƒœแƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ˜, แƒ“แƒแƒจแƒ˜แƒคแƒ แƒฃแƒšแƒ˜

แƒฃแƒซแƒ•แƒ”แƒšแƒ”แƒกแƒ˜ แƒงแƒแƒ•แƒแƒ แƒฏแƒ”แƒœแƒ˜ แƒซแƒ•แƒ”แƒš แƒงแƒแƒ•แƒแƒ แƒฏแƒ”แƒœแƒ–แƒ”

แƒ แƒแƒ’แƒแƒ แƒช แƒฉแƒแƒœแƒก, แƒ”แƒก แƒแƒ แƒ˜แƒก แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒ›แƒแƒ’แƒ˜แƒ“แƒ.

แƒ“แƒ แƒแƒ˜ แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒ“แƒแƒ•แƒ˜แƒ“แƒ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ–แƒ” แƒ“แƒ แƒ’แƒแƒจแƒ˜แƒคแƒ แƒ Screen.tga-แƒ›

แƒฃแƒซแƒ•แƒ”แƒšแƒ”แƒกแƒ˜ แƒงแƒแƒ•แƒแƒ แƒฏแƒ”แƒœแƒ˜ แƒซแƒ•แƒ”แƒš แƒงแƒแƒ•แƒแƒ แƒฏแƒ”แƒœแƒ–แƒ”

แƒ แƒแƒ’แƒแƒ แƒช แƒฎแƒ”แƒ“แƒแƒ•แƒ—, แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ•แƒ˜ Feistel แƒฅแƒกแƒ”แƒšแƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก แƒจแƒ”แƒกแƒแƒคแƒ”แƒ แƒ˜แƒกแƒ˜ แƒ“แƒแƒจแƒ˜แƒคแƒ•แƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— CBC แƒ“แƒ CFB แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ˜, แƒแƒšแƒ‘แƒแƒ— แƒฃแƒ™แƒ”แƒ—แƒ”แƒกแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ“แƒแƒจแƒ˜แƒคแƒ แƒฃแƒšแƒ˜, แƒกแƒ˜แƒ›แƒแƒ แƒ—แƒšแƒ” แƒ’แƒ˜แƒ—แƒฎแƒ แƒแƒ—, แƒแƒ  แƒ’แƒแƒ“แƒแƒ•แƒแƒ›แƒแƒฌแƒ›แƒ”.

แƒ“แƒ˜แƒ“แƒ˜ แƒ›แƒแƒ“แƒšแƒแƒ‘แƒ!

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ