יום שבת, 24 במאי 2014

Remote Control Application - Keyboard



במאמר הראשון ראינו כיצד ניתן לדמות תנועה של עכבר בעזרת תוכנה בלבד, השלב הבא הוא להשתלט על המקלדת וכך להשלים את מנגנוני השליטה של הלקוח על השרת, נבנה מחלקה יעודית שדרכה נזריק את המידע כאירועים של לחיצה במקלדת,נתחבר לפונקציה חיצונית נוספת בקובץ  user32.dll ונעביר בה את המצבים של המקשים.


keyboardControl.cs

  public class keyboardControl
    {
        //key event signature
        [DllImport("user32.dll")]
        public static extern void keybd_event(byte bVk, byte bScan,
            uint dwFlags, uint dwExtraInfo);

        //keys:up, down, left, right
        //for more keys visit
        //http://msdn.microsoft.com/en-us/library/dd375731%28v=vs.85%29.aspx
        //const int VK_UP = 0x26; 
        //const int VK_DOWN = 0x28;
        //const int VK_LEFT = 0x25;
        //const int VK_RIGHT = 0x27;
        //...

        //set key status
        const uint KEYEVENTF_KEYUP = 0x0002;
        const uint KEYEVENTF_EXTENDEDKEY = 0x0001;
      

        /// <summary>
        /// set the key as press
        /// </summary>
        /// <param name="key">the number as ascii</param>
        public void press(int key)
        {
            //make key press
            keybd_event((byte)key, 0, 
                KEYEVENTF_EXTENDEDKEY | 0, 0);

        }

        /// <summary>
        /// release the press key
        /// </summary>
        /// <param name="key">the number as ascii</param>
        public  void release(int key)
        {
            //make the key release
            keybd_event((byte)key, 0, 
                KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
        }
    }

תלחצו על Send וישר תעברו ל Notepad


תוכנית הבדיקה עבור המנגנון מכילה תיבת טקסט וכפתור כאשר נלחץ עליו היו לנו 5 שניות למצוא את הטופס שאליו אנחנו רוצים להזריק את המחרוזת, בדומה לבקשה שמגיעה מהלקוח לשרת, חשוב מאוד להשים לב שאנחנו מחקים את המקלדת לחלוטין כלומר במקרה שנרצה לרשום את האות a נצטרך להעביר את הערך 0x41 שהוא הערך לאות A בטבלת  Ascii במקרה שנרצה להעביר את האות  A  נצטרך ללחוץ על Shift לרשום את הערך 0x41 ואח"כ לשחרר את ה Shift כפי שניתן לראות בדוגמה:

KeyboardForm.cs

 public partial class keyboardForm : Form
    {
        public keyboardForm()
        {
            InitializeComponent();
        }

        keyboardControl d;
        private void keyboardForm_Load(object sender, EventArgs e)
        {
            d = new keyboardControl();
        }

        /// <summary>
        /// start inject the message to keyboard
        /// </summary>
        private void btn_send_Click(object sender, EventArgs e)
        {

            if (txb_message.Text != "")
            {
                //wait 5 second this is enougth time to find application and inject it
                Thread.Sleep(5000);
                send();

                txb_message.Text = "";
            }
        }

        /// <summary>
        /// send the message as key press
        /// </summary>
        private void send()
        {
            string message = txb_message.Text;

            for (int i = 0; i < message.Length; i++)
            {
                //set shift key on
                if (char.IsUpper(message[i]))
                    d.press(0x10);

                //set the keys
                d.press(char.ToUpper(message[i]));
                d.release(char.ToUpper(message[i]));

                //release shift key
                if (char.IsUpper(message[i]))
                    d.release(0x10);

            }
        }
    }


סיכום

עד עכשיו טיפלנו בשליטה של הלקוח על החומרה, השלב הבא הוא לבצע לכידה של המסך בשרת ולהעביר למשתמש מרוחק.

קצת שליטה לא תזיק...

אין תגובות:

הוסף רשומת תגובה