יום שישי, 28 בינואר 2011

Keystroke - Between Application C#

עלתה לי מחשבה מעניינת האם ניתן לשלוח מחרוזות (Strings) לתוכניות אחרות שרצות ברקע על המחשב, כלומר לחקות את המקלדת ובעצם לשתול מחרוזות שנשלחות מאחורי הקלעים ללא התערבות המשתמש, זה בעצם כלי Brute Force קלאסי לכל מי שרוצה לבדוק אם המערכת שלו פגיעה נגד Brute Force, לצורך העניין נניח שיש לנו טופס Login בתוכנה, בעזרת הטכניקה הזו אני יכול לנסות לשלוח את השם משתמש והסיסמא ישירות לתוכנה באופן אוטומטי ובעצם להשתמש ברשימה רצה ששולפת שמות ומנסה להיכנס לתוכנה.

הרעיון שעומד מאחורי זה בעצם ה Focus של החלון, איזה חלון פעיל באותו רגע ע"י המשתמש, אם נשתמש בתוכנה שברקע עובדות תוכנות אחרות,המקלדת תגיב רק לתוכנה שאנחנו עובדים עליה, הנושא מחולק ל 2 שלבים:

  • קבלת החלונות הקיימים.
  • שליחת ה Stroke לחלון שבחרנו.

User32.dll
הספרייה שמנהלת את כל ה Interface של Windows , ובעצם אחראית על ה Desktop שלנו, דרכה נתקשר עם חלונות שברקע.

(GetWindow(int hwnd,int wcmz
אפשרות של קבלת Handler של החלונות שרצים ברקע, על מנת שנוכל לקבל את כולם, קודם נמצא את ה Handler של התוכנה שלנו בעזרת הפונקציה GetDesktopWindow ואח"כ נשתמש בקבוצה של integers שיחזירו לנו את ה Handler של החלון שאחרי ה Handler של החלון שלנו, בעצם יש לנו מערך של Handlers שמייצג את החלונות שיש לנו ב Desktop, על מנת שנוכל להינעל על החלון שאליו אנו רוצים לשלוח את ה Stroke שלנו.

GW_HWNDFIRST = 0
יחזיר לנו את ה Handler של החלון הראשון ב Desktop.

GW_HWNDLAST = 1
יחזיר לנו את ה Handler החלון האחרון ב Desktop.

GW_HWDNEXT = 2
יחזיר לנו את ה Handler הבא בתור מהחלון שלנו.

GW_HWNDPREV = 3
יחזיר לנו את ה Handler של החלון שלפני החלון שלנו.

GW_OWNER = 4
יחזיר את ה Handler של הבעלים של החלון שלנו, כלומר אם זאת תוכנה בריבוי חלונות נוכל לדעת מי החלון הראשי.

GW_CHILD = 5
יחזיר את ה Handler של הילדים בתוכנה מרובת חלונות.



()GetDesktopWindow
יחזיר לנו את ה Handler של החלון הראשי.

GetParent(int hwnd)
מחזיר חלון האב של החלון שב Handler

FindWindow(string lpClassName,string lpWindowName)
מוצא את החלון לפי ה Title שלו
 
SetForegroundWindow(int hwnd)
החלון שנבחר ע" ה Handler שלו נהיה ב Focus
   
IsWindowsVisible(int hwnd)
האם החלון ניתן לתצוגה.




שליחת ה Stroke שלנו מתבצעת דרך המחלקה System.Windows.Forms.SendKeys.

Send(string abc)
פונקציה לשליחת ה String לחלון שנמצא ב Focus לכן מתבצע התהליך למציאת החלון ולהפוך אותו לפעיל.

 SendWait(string abc)
שולח את ה String וממתין לתשובה מהחלון הפעיל.
Flush()
מחכה שהחלון שמקבל את ה String שיעבד אותו לפני ששולחים את הבא אחריו.


יש בעיה לשלוח את זה באופן רציף במיוחד ב IE שלא ממש מגיב טוב לזה, לכן יש מספר פתרונות על מנת שזה יעבוד על דפדפנים, הנקודה הראשונה היא לדאוג שירוץ Thread.Sleep בין שליחה לשליחה יש אפשרות נוספת להישתמש ב VBScript שיפעל ישירות דרך התוכנית שלנו,ניצור לנו קובץ vbs ,ונכניס לתוכו את הקוד הבא:

set WshShell = WScript.CreateObject("WScript.Shell")
WScript.Sleep 4000
WshShell.SendKeys "My first Text"
WshShell.SendKeys "{TAB}"
WshShell.SendKeys "My Second Text"

נפעיל את ה Script בעזרת System.Diagnostics
System.Diagnostics.Process.Start("C:\\sendstroke.vbs");




עכשיו נשאלת השאלה איך אני שולח מקשים מיוחדים כמו Shift ו Ctrl?
יש 2 קבוצות של מקשים, הקבוצה הראשונה היא Space,Alt,Shift,Control:
Space = ' '
Shift = '+'
Alt = '!'
Control = '#'
יש להוריד את הגרשיים כששולחים את ה Stroke.

שאר המקשים המיוחדים במקלדת מחוייבים להיות מסומנים בסוגריים מסולסלים {Enter} אחרת הם יעברו כ String רגיל כחלק מה String ששלחנו, ולא יגיבו כמקש.

רשימת מקשים:

{BS}                 {BREAK}               {CAPSLOCK}
{DEL}              {DOWN}                {END}
{ENTER}         {ESC}                     {HELP}
{HOME}          {INSERT}               {LEFT}
{NUMLOCK} {PGDW}                 {PGUP}
{PRTSC}         {RIGHT}                 {SCROLLLOCK}
{UP}                {F1} - {F12}
 
הדגמה:



אין תגובות:

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