وبلاگ تخصصي برنامه نويسي با VB

تشخیص فشرده شدن کليدهای کيبرد


یکی از دوستان سوال کرده بودند که چگونه می توان کلیدهای کیبرد را حتی وقتی فوکوس روی برنامه ما نیست تشخیص داد مانند دیکشنری ها که مثلاً با CTRL+F12 فعال می شوند و یا Keylogger ها که کلیدهای فشرده شده را ثبت می کنند .
من دو روش زیر را برای اینکار پيشنهاد می کنم :

۱ - استفاده از یک تابع کتابخانه ای به اسم  GetAsyncKeyState موجود در کتابخانه user32.dll . این تابع ، فشرده شدن یا رها شدن یک کلید را تشخیص می دهد . نحوه declare کردن این تابع بصورت زیر است :

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

حال در برنامه تان یک timer قرار داده و در event آن کد زیر را قرار دهید :

    For i = 1 To 255
        results = 0
        results = GetAsyncKeyState(i)
        If results <> 0 Then
           Msgbox(Chr(i))
        End If
    Next

برای مشاهده یک برنامه نمونه به این آدرس مراجعه کنید .

۲ - استفاده از قلاب یا Hook : قلاب ، یک ابزار در مکانیزم مدیریت پیغام سیستم ویندوز است که توسط آن برنامه ها می توانند یک روتین را برای مدیریت و پردازش پیغامهای خاصی قبل از اینکه آن پیغامها به برنامه مقصد برسند نصب نمایند . قلابها باعث کندی سیستم می شوند زیرا حجم پردازشی سیستم روی هر پیغام را افزایش می دهند بنابراین بایستی زمانیکه واقعاً به قلاب نیاز دارید آنرا نصب نموده و هر چه زودتر آنرا حذف نمایید . سیستم ویندوز از انواع زیادی از قلابها پشتیبانی می کند که هر کدام امکان دستیابی به پیغامهای خاصی را مهیا می نمایند برای مثال یک برنامه کاربردی می تواند با استفاده از قلاب کیبرد برای مدیریت و پردازش پیغامهای مربوط به آن ( مثل فشرده شدن یک کلید خاص یا رها شدن آن ) استفاده کند .
برای نصب یک قلاب در برنامه از یک تابع کتابخانه ای به اسم SetWindowsHookEx استفاده می شود . این تابع یک قلاب را به زنجیره قلابهای سیستم اضافه می کند . نحوه declare کردن این تابع بصورت زیر است :

Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long

همچنین برای آزاد کردن یک قلاب و حذف آن از زنجیره قلابها از تابع کتابخانه ای UnhookWindowsHookEx استفاده می گردد . نحوه declare کردن این تابع بصورت زیر است :

Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long

برای ایجاد قلاب کیبرد همچنین نیاز به تعریف یک ثابت است که شماره قلاب کیبرد در آن قرار دارد :

Public Const WH_KEYBOARD = 2

حال بایستی یک تابع پس زمینه یا Callback Function نوشت که به ازای فشرده شدن کیبرد اجرا شود و آدرس آنرا ( با استفاده از کلمه کلیدی Address Of ) بهمراه ثابت فوق به تابع SetWindowsHookEx فرستاد .

برای اطلاعات بیشتر و مشاهده یک نمونه برنامه به این آدرس مراجعه کنید .

 

+ حامد شیدائیان ; ۱:٢۸ ‎ب.ظ ; دوشنبه ۱۸ خرداد ،۱۳۸۳
comment نظرات ()

استخراج مشخصات سخت افزاری یک سیستم در وی بی


در این بخش یک کنترل Ocx معرفی می شود که بوسیله آن می توانید مشخصات سخت افزاری سیستم خود را استحراج کنید .
این کنترل را که Hardware Info نام دارد می توانید از اینجا دانلود نمایید .

پس از باز نمودن فایل zip دانلود شده مشاهده خواهید کرد که دو فایل dll و یک فایل ocx در آن وجود دارد . همچنین یگ فایل راهنما نیز بهمراه آنها وجود دارد که طریقه استفاده از کنترل را نشان می دهد . برای استفاده از کنترل فوق وارد محیط ویژال بیسیک شده و سپس وارد منوی Components شوید .  در آنجا روی دکمه Browse کلیک کنید . وارد پوشه ای که فایل zip را در آنجا باز کرده اید شده و فایل HWInfo.ocx را انتخاب کنید تا این کنترل به لیست کنترلهای نوار ابزار شما اضافه شود . حال می توانید از کنترل را روی فرم خود قرار دهید و از امکانات آن استفاده کنید .
این کنترل دارای خصوصیات زیر است :
BaseBoardManufacturer : مشخصات سازنده مادربورد
BaseBoardProduct : نوع چیپ ست مادربورد
BiosVendor : سازنده بایوس
BiosReleaseDate : تاریخ انتشار بایوس
BiosVersion : ورژن بایوس
BiosROMSize : سایز حافظه رام بایوس
SocketDesignation : نوع سوکت پردازنده
ProcessorType : نوع پردازنده
ProcessorManufactor : سازنده پردازنده
ProcessorID : شماره ID پردازنده
ProcessorSerialNumber : شماره سریال پردازنده
با استفاده از این کنترل همچنین می توان اطلاعات هر چهار هارد دیسک IDE سیستم را استخراج نمود برای مثال اگر بخواهید اطلاعات Primary Hard ( شماره یک ) را بدست آورید از خصوصیات زیر استفاده کنید :
HardDisk1ModelNumber : شماره مدل هارددیسک
HardDisk1SerialNumber : شماره سریال هارد دیسک ( شماره سریال کارخانه )
خصوصیات دیگری نیز در این کنترل وجود دارد که برای اطلاعات بیشتر به راهنمای آن مراجعه کنید .

 

+ حامد شیدائیان ; ٢:٥٩ ‎ب.ظ ; دوشنبه ۱۱ خرداد ،۱۳۸۳
comment نظرات ()

پاسخ به سوالات-۱۴

+ قبل از مطرح کردن سوال خود ابتدا پرسش و پاسخهای قبلی را بخوانید . ممکن است به سوال شما و یا مشابه آن قبلاً پاسخ داده شده باشم .

+ به سوالات تکراری پاسخ داده نخواهد شد .

+ سوالات خود را یا فارسی و یا انگلیسی بفرستید و از نوشتن پینگلیش خودداری کنید .


1 – من چند تا جدول SQL دارم که باید با علامت خوردن هر دکمه رادیویی یکی از جدولها به فرم من متصل شود . در حقیقت نیاز به سوئیچ کردن میان کانتنت ها دارم . از نظر تئوری کار انجام شده و در هنگام اجرا نیز خطایی گرفته نمی شود اما در عمل هیچ داده ای وارد نمی شود مشکل کجاست ؟
پاسخ : در مورد روند برنامه خود بیشتر توضیح دهید و در صورت امکان سورس برنامه تان را برای من بفرستید .

2 – برنامه هایی مثل WinRar را چگونه فارسی می کنند ؟ چگونه می توان برنامه هایی نوشت که مستقل از ویندوز فارسی باشند ؟
پاسخ : برنامه هایی  وجود دارند که اجازه می دهند با ایجاد یکسری فایل Setting برای آنها بتوان یک زبان جدید را به آن اضافه کرد . بعنوان مثال شما معادل هر یک از منوها یا دکمه های برنامه را به زبان مورد نظرتان در یک فایل تنظیمی قرار می دهید و آنگاه در بخش تنظیمات می توانید زبان مورد نظر را انتخاب کنید . در مورد ساخت برنامه های فارسی مستقل از سیستم عامل قبلاً مطالبی نوشته ام . به آرشیو موضوعی مراجعه کنید .

3 – آیا می توان در بانک های اطلاعاتی اکسس توسط ویژوال بیسیک عکس اضافه کرد ؟
پاسخ : بله این امکان وجود دارد . در این مورد در بخش پرسش و پاسخهای قبلی توضیح داده ام .

4 – از دو قسمتی که در مورد WinSock نوشته بودید برای نوشتن یک شبه پراکسی استفاده کردم اما در اولین قدم که اتصال IE به سرور بود ناموفق ماندم . آیا می توان با این کنترل یک پراکسی سرور درست کرد که در یک شبکه اطلاعات را از یک IP بگیرد و به یک IP دیگر رد کند ؟
پاسخ : بله این امکان وجود دارد . شما ابتدا بایستی با دستورات پروتکل HTTP آشنا باشید زیرا IE در خواست های خود را به پروکسی سرورها توسط این پروتکل می فرستد . شما بایستی برنامه ای بنویسید که روی یک پورت خاص به تقاضاهای HTTP گوش داده و پاسخ دهد . از طرف دیگر بایستی در IE آدرس IP و شماره پورت پروکسی را بدهید تا IE درخواست های خود را به آن بفرستد .
در این آدرس یک نمونه برنامه پروکسی سرور که به زبان وی بی نوشته شده وجود دارد .

5 – من می خواهم یک گزارش ایجاد کنم که اطلاعات آن از دو جدول بایستی استخراج شود . چگونه این کار را انجام دهم ؟
پاسخ : بایستی یک Query برای Select کردن اطلاعات مربوطه بنویسید که این Query را برای تولید گزارش استفاده کنید .

6 – چگونه می توان در وی بی یک متغیر را از یک فرم به فرم دیگر فرستاد ؟
پاسخ : منظورتان از فرستادن متغیر چیست ؟ شما با تعریف متغیرها بصورت Public ، در هر فرمی می توانید به آنها دسترسی داشته بشید برای مثال اگر متغیر Test را در فرمی به اسم Form1 تعریف کرده باشید با دستور Form1.Test در هر فرمی به آن دسترسی دارید .

7 – چگونه می توان توسط وی بی ایمیلی فرستاد که به آن عکس نیز اضافه شده باشد ؟
پاسخ : شما بایستی از کامپوننت هایی که برای اینکار طراحی شده اند استفاده کنید . یک نمونه از این کامپوننت ها را می توانید از اینجا دریافت کنید .

8 – چگونه می توان در VB.Net با استفاده از XML یک فرم را بصورت Runtime ایجاد کرد ؟
پاسخ : برای اینکار شما ابتدا بایستی اطلاعات فرم را در یک فایل XML قرار دهید . سپس اطلاعات چگونگی نمایش فرم را در یک فایل XSL قرار دهید . حال با استفاده از شی XML که در نوار ابزار IDE وجود دارد می توناید با دادن این دو فایل ، فرم مورد نظرتان را ایجاد نمایید . همچنین می توانید کدی بنویسید که بتوانید با آن اطلاعات فایل XML مربوطه را کم و زیاد کنید .

9 – چگونه می توان آیکون یک فایل EXE را با استفاده از برنامه نويسی عوض کرد ؟
پاسخ : باید با استفاده از برنامه نویسی رجیستری اینکار را انجام دهید . برای اطلاعات بیشتر به اینجا مراجعه کنید .

10 – من با استفاده از یک برنامه ساخت فایل Help ، یک فایل chm ساخته ام . با توجه به اینکه با تابع Shell در برنامه وی بی این فایل راهنما باز نمی شود چگونه می توانم آنرا با منوی help ای که در برنامه ام ایجاد کردم ام باز کنم ؟
پاسخ : قبل از پاسخ دادن به این سوال باید بگویم که فایلهای help را می توانید با برنامه ای مثل Microsoft Help Workshop ایجاد کنید . پس از آن برای نظیر کردن یک برنامه به یک فایل راهنما می توانید از خاصیت HelpFile شی App بصورت زیر استفاده کنید :

App.HelpFile = App.Path & "\test.chm"

در آنصورت در زمان اجرای برنامه کاربر با زدن دکمه F1 می تواند فایل help شما را ببیند .
برای اختصاص دادن یک فایل راهنما به منویتان بایستی از خاصیت HelpContextID استفاده نمائید . برای مثال برای اختصاص دادن یک فایل راهنما که ContextID آن برابر 23456 است به منویی به اسم MenuHelp از دستور زیر استفاده کنید :

MenuHelp.HelpContextID = 23456

برای اطلاعات بیشتر به اینجا مراجعه کنید .

 

+ حامد شیدائیان ; ۱۱:٤٩ ‎ق.ظ ; یکشنبه ۱٠ خرداد ،۱۳۸۳
comment نظرات ()

پاسخ به سوالات-۱۳

1 -  چگونه می توان برنامه ای نوشت که وقتی روی یکی از سیستمهای یک شبکه محلی LAN اجرا شد عملیات زیر را انجام دهد : - Domain فعال شبکه و کامپیوترهای آنرا پیدا کند ؟ - یک برنامه را در تمام کامپیوترهای شبکه کپی کند – فایلهای کپی شده را اجرا کند و اینکار بدون استفاده از winsock انجام شود ؟
پاسخ : بخش دوم و سوم مربوط بیشتر به بحث Hacking و exploit کردن سیستم ها بطوریکه بتوان فایلی را روی آنها اجرا کرد مربوط می شود . این زمینه بهتر است به سایت www.tur2.com مراجعه کنید . اما در مورد قسمت اول سوال برای بدست آوردن domain شبکه و کامپیوترهای موجود در آن از توابع یک کتابخانه به اسم mpr.dll استفاده می شود . توابع مورد استفاده از این کتابخانه عبارتند از WNetOpenEnum ، WNetEnumResource و WNetCloseEnum . برای اطلاعات بیشتر و دریافت یک نمونه برنامه به این آدرس مراجعه کنید .

2 – چگونه می توان با کارت ویدیوی یا همان Capture توسط وی بی ارتباط برقرار کرد ؟ چگونه می توان با webCam توسط وی بی ارتباط برقرار کرد ؟
پاسخ : یکی از راهها استفاده از کنترلی به اسم ezVidCap می باشد . این کنترل را می توانید از این آدرس دریافت کنید .

در اینجا می توانید راهنمای استفاده از این کنترل را بخوانید .

در اینجا و اینجا نیز برنامه هایی نمونه برای کار با Video Capture وجود دارد .

در این آدرس نیز روش دیگری برای ارتباط با کارت ویدیویی بیان شده است .

3 – چگونه می توان درایو ( یا درایوهای ) سی دی را توسط وی بی تشخیص داد ؟
پاسخ : برای اینکار از دو تابع از کتابخانه kernel32 به نامهای GetLogicalDriveStrings و GetDriveType استفاده می شود . این دو تابع را بصورت زیر declare کنید :

Private Declare Function GetLogicalDriveStrings Lib "kernel32" Alias "GetLogicalDriveStringsA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long

Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long

سپس ابتدا متغیر allDrives را که رشته ای 64 کاراکتری از space است بصورت زیر تعریف کنید :

allDrives$ = Space$(64)

حال با استفاده از تابع GetLogicalDriveStrings لیست کلیه درایوهای سیستم  را استخراج می کنیم :

ret& = GetLogicalDriveStrings(Len(allDrives$), allDrives$)
allDrives$ = Left$(allDrives$, ret&)

حال با استفاده از یک حلقه و چک کردن درایوها با استفاده از تابع GetDriveType می توانیم تشخیص دهیم این درایو مربوط به سی دی است یا نه . برای اینکار اگر مقدار بازگشتی تابع به ازای یک درایو برابر عدد 5 باشد آن درایو سی دی است .

Do
   pos% = InStr(allDrives$, Chr$(0))
     If pos% Then
     JustOneDrive$ = Left$(allDrives$, pos% - 1)

     allDrives$ = Mid$(allDrives$, pos% + 1, Len(allDrives$))

     DriveType& = GetDriveType(JustOneDrive$)
             If DriveType& = 5 Then
                MsgBox UCase$(JustOneDrive$) & " is a CD Drive"
             End If
     End If
Loop Until allDrives$ = ""

4 – بجای استفاده از winsock32.ocx از چه روش دیگری می توان در برنامه نویسی شبکه استفاده کرد ؟
پاسخ : شما می توانيد از کتابخانه Winsock.dll استفاده کنید و در اینصورت نیاز به فایل کمکی خاصی نیز ندارید . قبلاً در بخش پرسش و پاسخها ، لینکهایی در مورد این کتابخانه معرفی کرده ام و در صورتیکه فرصت کردم در مورد این کتابخانه توضیحاتی خواهم داد .

5 – چگونه می توان مانند تروجان های معمول ، username و password یک اکانت را بدست آورید  ؟
پاسخ : من تست نکردم اما به احتمال زیاد با استفاده از توابع کتابخانه RasApi قادر به اینکار خواهید بود . برای آشنایی با توابع این کتابخانه به این آدرس مراجعه کنید .

6 – منظور از درایور دیتا بیس چیست ؟ آیا همان برنامه ای است که دیتابیس را با آن می نویسیم ( مثلاً اکسس ) ؟ چگونه می توان از یک فایل Text بجای بانک اطلاعاتی استفاده کرد ؟
پاسخ : درایور یک دیتابییس شامل یکسری توابع واسط برای اتصال و کار با آن دیتابیس است برای مثال با استفاده از داریور JET OLE DB می توان به دیتابیسهای اکسس متصل شد . زمانیکه شما یک برنامه در وی بی می سازید که به یک دیتابیس متصل می شود برای اینکه بتوانید آنرا در کامپیوتر دیگری نیز اجرا کنید بایستی فایلهای درایور مربوطه نیز بهمراه آن کپی شوند . با استفاده از ابزار Package and Deployment Wizard می توانید فایلهای مورد نیاز برنامه را پیدا کنید و همچنين یک فایل Setup برای برنامه تان بسازید . در مورد فایلهای text نیز بله می توان اطلاعات جدول خود را در آن قرار دهید اما باید فرمت قرارگیری را خودتان تعریف کنید .

7 – فایلهای اجرایی من حتی اگر بدون یک اکتیو ایکس هم باشد در کامپیوتری که فاقد ویژال بیسيک است اجرا نمی شود . چرا ؟
پاسخ : ساده ترین برنامه های وی بی نیز برای اجرا شدن احتیاج به کتابخانه VB Runtime and OLE Automation دارند . همانطور که در سوال قبل نیز توضیح داده ام می توانید با استفاده از  برنامه های ساخت Setup مشکل خود را حل کنید .

8 - من در حال نوشتن برنامه اي هستم كه در آن امكان شماره گيري نيز مي باشد. مي خواستم بپرسم چگونه مي توان اشغال بودن خط را تشخيص داد تا بتواند به طور اتوماتيك قطع و دوباره شماره گيري بنمايد.؟
پاسخ : برای نوشتن برنامه تان از Ras Api استفاده کنید . این کتابخانه توابعی که مشکل شما را حل کند در خود دارد .

9 – چگونه می توان برنامه ای نوشت که بتوان با آن سورس یک صفحه وب را با دادن آدرس آن صفحه مشاهده کرد ؟
پاسخ : برای اینکار component ای در وی بی به اسم Internet Transfer که قبلاً در مورد آن مطالبی نوشته ام وجود دارد . به آرشیو موضوعی سایت و بخش برنامه نویسی شبکه مراجعه کنید .

10 -  در مورد برنامه Multimedia Builder سایت یا کتاب معرفی کنید .
پاسخ : من با این برنامه زیاد کار نکرده ام اما با جستجو در Google می توانید سایتهای بسیار زیادی پیدا کنید . یک کتاب فارسی نیز در مورد این نرم افزار وجود دارد .

11 – در برنامه های نمونه Msdn به ITLegacyCallMediaControl برخوردم . در مورد آن توضیح دهید .
پاسخ : این واسط یک از واسطهای TAPI می باشد که از برنامه هایی که بایستی بطور مستقیم با یک دستگاه ارتباط داشته باشند پشتیبانی می کند . برای اطلاعات بیشتر به اینجا مراجعه کنید .


12 – چگونه می توان فایل مربوط به یک برنامه را به ویندوز شناساند بطوریکه وقتی روی آن فایل کلیک می شود ویندوز برنامه مربوط به آنرا اجرا کند ؟
پاسخ : اینکار با استفاده از نوشتن کلیدهای خاصی در رجیستری امکان پذیر است . قبلاً در بخش آموزش کار با رجیستری به این مطلب اشاره کرده و کلیدهای مربوط به آنرا معرفی کردم . به آرشیو موضوعی و بخش کار با رجیستری مراجعه کنید .

 

+ حامد شیدائیان ; ۱:٠٥ ‎ب.ظ ; دوشنبه ٤ خرداد ،۱۳۸۳
comment نظرات ()