معمولا وقتی صحبت از هک میشود بیشتر وب سایتها مدنظر هستند و کمتر به نرم افزارهای محیط desktop توجه میشود اما در محیط desktop هم امنیت بسیار مهم است.
یکی از مواردی که در رابطه با windows formها (دات نتی و غیر دات نتی) بسیار به آن برخورد کرده ام اعمال دسترسی کاربر به قسمتهای مختلف فرم با مخفی یا غیر فعال کردن دکمهها و کنترلهای فرم است. به این صورت که در هنگام لود فرم اصلی با توجه به دسترسی کاربر بعضی منوها مخفی میشوند و در لود هر فرم هم بعضی از دکمهها و کنترلهای روی فرم مخفی یا غیر فعال میشوند. همین!
اما اگر کاربر به کمک ابزاری بتواند منوها و کنترلهای مخفی فرم را نمایش دهد و منوها و کنترلهای غیرفعال را فعال کند چی؟
کلاس زیر را در نظر بگیرید :
public class HackWindowsForms
{
struct POINTAPI
{
public int X;
public int Y;
}
[DllImport("user32.dll")]
static extern int EnumChildWindows(int hWndParent, EnumChildCallbackDelegate enumChildCallback, int lParam);
[DllImport("user32.dll")]
static extern int EnableWindow(int hwnd, int fEnable);
[DllImport("user32.dll")]
static extern int WindowFromPoint(int x, int y);
[DllImport("user32.dll")]
static unsafe extern int GetCursorPos(POINTAPI* lpPoint);
delegate int EnumChildCallbackDelegate(int hwnd, int lParam);
public static void EnableThisWindowControls()
{
unsafe
{
POINTAPI cursorPosition = new POINTAPI();
GetCursorPos(&cursorPosition);
int winWnd = WindowFromPoint(cursorPosition.X, cursorPosition.Y);
EnumChildWindows(winWnd, EnumChildCallback, 0);
}
}
static int EnumChildCallback(int hwnd, int lParam)
{
EnableWindow(hwnd, 1);
EnumChildWindows(hwnd, EnumChildCallback, 0);
return 1;
}
}
یک پروژه ویندوز فرم ایجاد کنید و دکمه ای روی فرم قرار دهید. برای MouseUp
آن کد زیر را بنویسید :
private void button1_MouseUp(object sender, MouseEventArgs e)
{
HackWindowsForms.EnableThisWindowControls();
MessageBox.Show("حالا روی دکمه مورد نظر کلیک کنید و کلید space را فشار دهید.", "", MessageBoxButtons.OK, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1, MessageBoxOptions.RtlReading);
}
حالا اگر برنامه را اجرا کنید و روی دکمه کلیک کنید و ماوس را نگهدارید سپس روی نوار عنوان پنجره مورد نظر رها کنید، تمام کنترلهای روی آن پنجره فعال خواهند شد!
نمونه کد مشابهی هم برای نمایش منوها و کنترلهای مخفی شده میتوان نوشت.
اما راه حل چیست؟
قبل از اجرای هر عملی که احتیاج به دسترسی دارد، دسترسی کاربر چک شود و فقط به غیر فعال و مخفی کردن کنترلها بسنده نشود. مثلا اگر دکمه ویرایش را غیر فعال کرده ایم در کلیک آن هم دسترسی چک شود.