টপিকঃ স্ব অনুলিপি (self duplication)

কখনো কি ভেবে দেখেছেন একটা ভাইরাস কিভাবে নিজেকে কপি করতে পারে? ফিলোসফিকেলি ব্যাপারটা সত্যিই মজার।
ভেবে দেখুন আপনি কোড লিখলেন,

copy("somethig")
আপনার এই কমান্ড যখন কার্যকর হবে তখন শুধু সামথিং কপি হবে কিন্তু কিওয়ার্ড "কপি" কপি হবে না!

কোন একটা  জটিল সিস্টেম তারমত আরেকটা জটিল সিস্টেম আদৌ তৈরী করতে সক্ষম হবে কিনা এটা একটা পুরোনো ফিলোসফিক্যল আর্গুমেন্ট।

সৌভাগ্যের ব্যাপার হল প্রোগ্রামিংএর ক্ষেত্রে আমাদের ওভাবে না দেখলেও হবে। বরং সলুসান একদম সিম্পল
আইডিয়া হল পুরো কোডটাকে একটা স্ট্রিং এর রেখে সেটাকে ২ বার কপি করা। যেহেতু কপি কমান্ড আগেথেকেই স্ট্রিং এ আছে সেহেতু ভেতর থেকে অটোমেটিকেলি ডুপ্লিকেট হবে।

অনেকটা এরকম
str = "copy(\"somethig\")";
copy(str+"str="'+str)

কিছুদিন আগে একটা প্রজেক্টে রিলেটে একটা ফিচার যোগ করার জন্য ব্যাপারটা একটু ঘেটেছিলাম। আপনাদের জন্য সিমপ্লিফাইড করে হ্যালো ওয়ার্ল্ড টাইপ একটা প্রোগ্রাম বানালাম।
সি সার্প কোড নিচে দিলাম। নোডপ্যাডে কপি করে সিএসসি কম্পাইলারে কম্পাইল করলেই হবে।
পিসিতে  সি সার্প কম্পাইলার না থাকলে বা নিজে কম্পাইল করতে না চাইলে এখান থেকে ইএক্সসি ডাউনলোড করতে পারেনে।
আগেই বলে রাখি এভাস্ট এটাকে ভাইরাস হিসেবে আইডেন্টফাই করে!!  lol lol

প্রোগ্রামটার কাজ সিম্পল। রান করার পর আপনার নাম জিজ্ঞাসা করবে। যেকোন নাম লিখে এন্টার করলে হ্যালো বলবে। আবার এন্টার করলে প্রোগ্রাম বন্ধ হবে।
শুধু নাম projanmo এন্টার করলে হ্যালো বস বলবে এবং ইএক্সসি ফাইলের একটা ডুপ্লিকেট কপি সেম ডাইরেক্টরিতে তৈরী করবে। ডুপ্লিকেট ইএক্সই ফাইলও একই কাজ করতে সক্ষম হবে।

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.CodeDom.Compiler;
using System.Diagnostics;

namespace sayHello
{
    class SayHello
    {
        

        public static void Main()
        {
            Greeting();
        }


        public static void compilefile(string input, string Output)
        {
            CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp");
            System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
            
            
            parameters.GenerateExecutable = true;
            parameters.ReferencedAssemblies.Add("System.dll");
            parameters.ReferencedAssemblies.Add("System.Core.dll");
            parameters.ReferencedAssemblies.Add("System.Data.DataSetExtensions.dll");
            parameters.ReferencedAssemblies.Add("System.Xml.dll");
            parameters.ReferencedAssemblies.Add("System.Xml.Linq.dll");

            parameters.OutputAssembly = Output;

            StreamReader streamReader = new StreamReader(input);
            string text = streamReader.ReadToEnd();
            streamReader.Close();

            CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, text);

            if (results.Errors.Count > 0)
            {
                foreach (CompilerError CompErr in results.Errors)
                {
                    Console.Write("Error: " +
                        "Line number " + CompErr.Line +
                                    ", Error Number: " + CompErr.ErrorNumber +
                                    ", '" + CompErr.ErrorText
                                    );
                }
            }
            
        }
        public static void Greeting()
        {
            Random rnd = new Random();
            string srand = rnd.Next(10, 99).ToString();

            Console.WriteLine("What's your name?");
            string name = Console.ReadLine();
            if (name.Equals("projanmo"))
            {
                Console.WriteLine("Hello BOSS!");
                File.WriteAllText(@"C:\Windows\Temp\duplicate.cs", backtext + "\npublic static string backtext = @\"" + backtext.Replace("\"", "\"\"") + "\";\n}\n}");
                compilefile(@"C:\Windows\Temp\duplicate.cs", "sayHello"+srand+".exe");
               
            }
            else
            {
                Console.WriteLine("Hello " + name);
                
            }
            Console.Read();
            
        }
        
        public static string backtext = @"using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.CodeDom.Compiler;
using System.Diagnostics;

namespace sayHello
{
    class SayHello
    {
        

        public static void Main()
        {
            Greeting();
        }


        public static void compilefile(string input, string Output)
        {
            CodeDomProvider codeProvider = CodeDomProvider.CreateProvider(""CSharp"");
            System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
            
            
            parameters.GenerateExecutable = true;
            parameters.ReferencedAssemblies.Add(""System.dll"");
            parameters.ReferencedAssemblies.Add(""System.Core.dll"");
            parameters.ReferencedAssemblies.Add(""System.Data.DataSetExtensions.dll"");
            parameters.ReferencedAssemblies.Add(""System.Xml.dll"");
            parameters.ReferencedAssemblies.Add(""System.Xml.Linq.dll"");

            parameters.OutputAssembly = Output;

            StreamReader streamReader = new StreamReader(input);
            string text = streamReader.ReadToEnd();
            streamReader.Close();

            CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, text);

            if (results.Errors.Count > 0)
            {
                Console.Write(""Error"");
            }
            
        }
        public static void Greeting()
        {
            Random rnd = new Random();
            string srand = rnd.Next(10, 99).ToString();

            Console.WriteLine(""What's your name?"");
            string name = Console.ReadLine();
            if (name.Equals(""projanmo""))
            {
                Console.WriteLine(""Hello BOSS!"");
                File.WriteAllText(@""C:\Windows\Temp\duplicate.cs"", backtext + ""\npublic static string backtext = @\"""" + backtext.Replace(""\"""",""\""\"""")+""\"";\n}\n}"");
                compilefile(@""C:\Windows\Temp\duplicate.cs"", ""sayHello""+srand+"".exe"");
                
            }
            else
            {
                Console.WriteLine(""Hello "" + name);
            }
            Console.Read();
        }
";
             
    }
}

Re: স্ব অনুলিপি (self duplication)

প্রোগ্রামটা সেল্ফ কোড কপি করেই কিন্তু কাজটা করতে পারে। কম্পাইলার হলে তো আর স্ট্রিং কপি করার ঝামেলা নেই। কিন্তু ইন্টারপ্রিটার হলে যা কপি করা হয় তা আসলে নিজের সোর্স।

নিচের php প্রোগ্রামটা ভাইরাসের মত অসংখ্য কপি করতে পারে!

<?php
$contents = file_get_contents($argv[0]);
for($i=0;$i<10;$i++){file_put_contents("copy-".time().".php", $contents); sleep(1);}
$files = glob("./copy-*.php");
foreach($files as $file){
    include $file;
}
?>
এটাকে চাইলেই ওয়ার্ম বানানো যায়।

আমার মনে হয় নিজের কপিকে RAM থেকে মুছে ফেলা অসম্ভব একটা ব্যাপার। কোন প্রোগ্রামের পক্ষে এটা সম্ভব কি না তা বলতে পারছি না।

Feed থেকে ফোরাম সিগনেচার, imgsign.com
ব্লগ: shiplu.mokadd.im
মুখে তুলে কেউ খাইয়ে দেবে না। নিজের হাতেই সেটা করতে হবে।

শিপলু'এর ওয়েবসাইট

লেখাটি GPL v3 এর অধীনে প্রকাশিত

Re: স্ব অনুলিপি (self duplication)

শিপলু লিখেছেন:

প্রোগ্রামটা সেল্ফ কোড কপি করেই কিন্তু কাজটা করতে পারে। কম্পাইলার হলে তো আর স্ট্রিং কপি করার ঝামেলা নেই। কিন্তু ইন্টারপ্রিটার হলে যা কপি করা হয় তা আসলে নিজের সোর্স।

ঠিক তাই! কারনটা হল ইন্টারপ্রেটেডের ক্ষেত্রে এক্সিকিউটেবল ফাইলটাই সোর্স কোড! আর কম্পাইলারে ক্ষেতে সোর্সটা এর ভেতরে এড করতে হবে যেহেতু আলাদা ভাবে সোর্স কোডটা সাপ্লাই করছেননা। শুধু বাইনারী ইএক্সই সাপ্লাই করছেন! অবশ্য কম্পাইলারও একই কাজ করা যাবে সে ক্ষেত্রে বাইনারী নিয়ে ঘাটতে হবে  hmm


শিপলু লিখেছেন:

আমার মনে হয় নিজের কপিকে RAM থেকে মুছে ফেলা অসম্ভব একটা ব্যাপার। কোন প্রোগ্রামের পক্ষে এটা সম্ভব কি না তা বলতে পারছি না।

ইন্টারেস্টিং! এটা কখনো ভেবে দেখিনি। ব্যাপারটা নিজেকে নিজে খেয়ে ফেলার মত! সুপারন্যাচারালে লাবায়থন নামে এক ক্রিয়েচার আছে যে এই কাজটা করতে পারে  tongue

কাজ সম্ভবত প্রোগ্রাম স্কোপের বাইরে করতে হবে। যেমন একটা টাস্ক সিডিউল করে দিয়ে প্রোগ্রাম ক্লোজ করে ফেললেন। ঐ টাস্কের কাজ হল নির্দিষ্ট ম্যামোরী মুছে ফেলা। মানে চুরান্ত কাজটা নিজে না করে ওএসকে দিয়ে করাতে হবে।