براي کار با رجيستري در ويژوال بيسيک کلاس Registery.bas را مطابق مطالب زير ايجاد کرده و در پروژه هاي خود از آن استفاده کنيد :
1 - تعريف ثابتهاي مورد نياز : براي نوشتن اين کلاس نياز به تعريف چهار دسته ثابت داريم :
- ثابتهاي مربوط به تعريف data type هاي entry هاي رجيستري :
Global Const REG_SZ As Long = 1
Global Const REG_DWORD As Long = 4
- ثابتهاي مربوط به تعريف key هاي رجيستري
Global Const HKEY_CLASSES_ROOT = &H80000000
Global Const HKEY_CURRENT_USER = &H80000001
Global Const HKEY_LOCAL_MACHINE = &H80000002
Global Const HKEY_USERS = &H80000003
- ثابتهاي مربوط به خطاهاي کار با رجيستري
Global Const ERROR_NONE = 0
Global Const ERROR_BADDB = 1
Global Const ERROR_BADKEY = 2
Global Const ERROR_CANTOPEN = 3
Global Const ERROR_CANTREAD = 4
Global Const ERROR_CANTWRITE = 5
Global Const ERROR_OUTOFMEMORY = 6
Global Const ERROR_INVALID_PARAMETER = 7
Global Const ERROR_ACCESS_DENIED = 8
Global Const ERROR_INVALID_PARAMETERS = 87
Global Const ERROR_NO_MORE_ITEMS = 259
- ثابتهاي متفرقه
Global Const KEY_ALL_ACCESS = &H3F
Global Const REG_OPTION_NON_VOLATILE = 0
2 - Declare کردن Api هاي مورد نياز : براي کار با رجيستري از توابع کتابخانه Advapi32.dll استفاده مي کنيم . اين توابع عبارتند از :
- تابع RegCloseKey : آزاد کردن handle مربوط به يک key
Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
- تابع RegCreateKeyEx : ساخت يک key در رجيستري ( اگر key قبلاً وجود داشته باشد ، اين تابع آنرا باز مي کند ) :
Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, ByVal lpSecurityAttributes As Long, phkResult As Long, lpdwDisposition As Long) As Long
- تابع RegOpenKeyEx : باز کردن يک key
Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
- تابع RegQueryValueExLong : استخراج type و data ي يک نام متناظر با يک key باز شده
Declare Function RegQueryValueExString Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByVal lpData As String, lpcbData As Long) As Long
Declare Function RegQueryValueExLong Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Long, lpcbData As Long) As Long
Declare Function RegQueryValueExNULL Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByVal lpData As Long, lpcbData As Long) As Long
- تابع RegSetValueEx : ذخيره يک مقدار در فيلد value يک کليد باز
Declare Function RegSetValueExString Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpValue As String, ByVal cbData As Long) As Long
Declare Function RegSetValueExLong Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpValue As Long, ByVal cbData As Long) As Long
- تابع RegDeleteKey : پاک کردن يک کليد و کليه اطلاعات مرتبط با آن
Private Declare Function RegDeleteKey& Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String)
- تابع RegDeleteValue : حذف مقدار يک key
Private Declare Function RegDeleteValue& Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String)
3 - توابع کمکي : براي نوشتن توابع اصلي کار با رجيستري نياز به نوشتن توابع کمکي زير است :
- تابع SetValueEx : با توجه به نوع داده يک کليد ، مقدار موجود در آنرا در يک متغير ذخيره مي کند :
Public Function SetValueEx(ByVal hKey As Long, sValueName As String, lType As Long, vValue As Variant) As Long
Dim lValue As Long
Dim sValue As String
Select Case lType
Case REG_SZ ' type of value is string
sValue = vValue
SetValueEx = RegSetValueExString(hKey, sValueName, 0&, lType, sValue, Len(sValue))x
Case REG_DWORD ' type of value is Double word
lValue = vValue
SetValueEx = RegSetValueExLong(hKey, sValueName, 0&, lType, lValue, 4)x
End Select
End Function
- تابع QueryValueEx : سايز و نوع داده اي يک داده را که بايد خوانده شود مشخص مي کند .
Function QueryValueEx(ByVal lhKey As Long, ByVal szValueName As String, vValue As Variant) As Long
Dim cch As Long
Dim lrc As Long
Dim lType As Long
Dim lValue As Long
Dim sValue As String
lrc = RegQueryValueExNULL(lhKey, szValueName, 0&, lType, 0&, cch)x
Select Case lType
' For strings
Case REG_SZ:
sValue = String(cch, 0)x
lrc = RegQueryValueExString(lhKey, szValueName, 0&, lType, sValue, cch)x
If lrc = ERROR_NONE Then
vValue = Left$(sValue, cch)x
Else
vValue = Empty
End If
' For DWORDS
Case REG_DWORD:
lrc = RegQueryValueExLong(lhKey, szValueName, 0&, lType, lValue, cch)x
If lrc = ERROR_NONE Then vValue = lValue
Case Else
'all other data types not supported
lrc = -1
End Select
QueryValueExExit:
QueryValueEx = lrc
Exit Function
QueryValueExError:
Resume QueryValueExExit
End Function
4 - توابع اصلي : توابع مربوط به پاک کردن يک کليد از رجيستري ، ساخت يک کليد جديد در رجيستري و مقداردهي به يک کليد :
- تابع DeleteKey : اين تابع يک کليد از رجيستري را حذف مي کند . داراي دو پارامتر ورودي است :
Location که يکي از مقادير HKEY_CLASSES_ROOT ، HKEY_CURRENT_USER
، HKEY_LOCAL_MACHINE و يا HKEY_USERS است .
KeyName که نام کليدي است که بايد از رجيستري حذف شود . اين کليد ممکنست شامل subkey هايي نيز باشد مثلاً Key1\SubKey1
Public Function DeleteKey(lPredefinedKey As Long, sKeyName As String)x
Dim lRetVal As Long
lRetVal = RegDeleteKey(lPredefinedKey, sKeyName)x
DeleteKey = lRetVal ' return function value
End Function
- تابع DeleteValue : اين تابع يک entry را از کليد حذف مي کند . داراي سه پارامتر ورودي است : Location ، KeyName و ValueName که نام آن value را مشخص مي کند .
Public Function DeleteValue(lPredefinedKey As Long, sKeyName As String, sValueName As String)x
Dim lRetVal As Long
Dim hKey As Long
lRetVal = RegOpenKeyEx(lPredefinedKey, sKeyName, 0, KEY_ALL_ACCESS, hKey)x
lRetVal = RegDeleteValue(hKey, sValueName)x
RegCloseKey (hKey)x
DeleteValue = lRetVal
End Function
- تابع CreateNewKey : اين تابع يک کليد جديد ايجاد مي کند . داراي دو پارامتر ورودي است : Location و KeyName
Public Function CreateNewKey(lPredefinedKey As Long, sNewKeyName As String)x
Dim hNewKey As Long
Dim lRetVal As Long
lRetVal = RegCreateKeyEx(lPredefinedKey, sNewKeyName, 0&, vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0&, hNewKey, lRetVal)x
RegCloseKey (hNewKey)x
CreateNewKey = lRetVal
End Function
- تابع SetKeyValue : اين تابع پارامتر data يک entry را تنظيم مي کند . داراي 5 پارامتر ورودي است : Location ، KeyName ، ValueName ، ValueSetting و ValueType
Public Function SetKeyValue(lPredefinedKey As Long, sKeyName As String, sValueName As String, vValueSetting As Variant, lValueType As Long)x
Dim lRetVal As Long
Dim hKey As Long
lRetVal = RegOpenKeyEx(lPredefinedKey, sKeyName, 0, KEY_ALL_ACCESS, hKey)x
lRetVal = SetValueEx(hKey, sValueName, lValueType, vValueSetting)x
RegCloseKey (hKey)x
SetKeyValue = lRetVal
End Function
- تابع QueryValue : اين تابع فيلد داده يک entry را برمي گرداند . داراي سه پارامتر ورودي است : Location ، KeyName و ValueName
Public Function QueryValue(lPredefinedKey As Long, sKeyName As String, sValueName As String)x
Dim lRetVal As Long
Dim hKey As Long
Dim vValue As Variant
lRetVal = RegOpenKeyEx(lPredefinedKey, sKeyName, 0, KEY_ALL_ACCESS, hKey)x
lRetVal = QueryValueEx(hKey, sValueName, vValue)x
QueryValue = vValue
RegCloseKey (hKey)x
End Function
Public Sub CreateAssociation(sExtension As String, sApplication As String, sAppPath As String)x
Dim sPath, sAppExe As String
CreateNewKey "." & sExtension, HKEY_CLASSES_ROOT
SetKeyValue HKEY_CLASSES_ROOT, "." & sExtension, "", sApplication & ".Document", REG_SZ
CreateNewKey sApplication & ".Document\shell\open\command", HKEY_CLASSES_ROOT
SetKeyValue HKEY_CLASSES_ROOT, sApplication & ".Document", "", sApplication & " Document", REG_SZ
sPath = sAppPath & " %1"x
sAppExe = sApplication & ".exe"x
SetKeyValue HKEY_CLASSES_ROOT, sApplication& ".Document\shell\open\command", "", sPath, REG_SZ
CreateNewKey "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\." & sExtension, HKEY_CURRENT_USER
SetKeyValue HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\." & sExtension, "Application", sAppExe, REG_SZ
CreateNewKey "Applications\" & sAppExe & "\shell\open\command", HKEY_CLASSES_ROOT
SetKeyValue HKEY_CLASSES_ROOT, "Applications\" & sAppExe & "\shell\open\command", "", sPath, REG_SZ
End Sub
کاربرد اين تابع بصورت زير است :
CreateAssociation("xxx","MyApp","c:\MyApp.exe")x
در این بخش یک کنترل Ocx معرفی می شود که بوسیله آن می توانید مشخصات سخت افزاری سیستم خود را استحراج کنید .
این کنترل را که Hardware Info نام دارد می توانید از اینجا دانلود نمایید .
برای استفاده از کنترل فوق وارد محیط ویژال بیسیک شده و سپس وارد منوی Components شوید . در آنجا روی دکمه Browse کلیک کنید . وارد پوشه ای که فایل zip را در آنجا باز کرده اید شده و فایل HWInfo.ocx را انتخاب کنید تا این کنترل به لیست کنترلهای نوار ابزار شما اضافه شود . حال می توانید از پس از باز نمودن فایل zip دانلود شده مشاهده خواهید کرد که دو فایل dll و یک فایل ocx در آن وجود دارد . همچنین یگ فایل راهنما نیز بهمراه آنها وجود دارد که طریقه استفاده از کنترل را نشان می دهد . کنترل را روی فرم خود قرار دهید و از امکانات آن استفاده کنید .
این کنترل دارای خصوصیات زیر است :
BaseBoardManufacturer : مشخصات سازنده مادربورد
BaseBoardProduct : نوع چیپ ست مادربورد
BiosVendor : سازنده بایوس
BiosReleaseDate : تاریخ انتشار بایوس
BiosVersion : ورژن بایوس
BiosROMSize : سایز حافظه رام بایوس
SocketDesignation : نوع سوکت پردازنده
ProcessorType : نوع پردازنده
ProcessorManufactor : سازنده پردازنده
ProcessorID : شماره ID پردازنده
ProcessorSerialNumber : شماره سریال پردازنده
با استفاده از این کنترل همچنین می توان اطلاعات هر چهار هارد دیسک IDE سیستم را استخراج نمود برای مثال اگر بخواهید اطلاعات Primary Hard ( شماره یک ) را بدست آورید از خصوصیات زیر استفاده کنید :
HardDisk
HardDisk
خصوصیات دیگری نیز در این کنترل وجود دارد که برای اطلاعات بیشتر به راهنمای آن مراجعه کنید
تقريبا اكثر تروجانها برنامه هاي مخفي اي هستند , يعني اگر سه كليد Ctrl,Alt,Del رو بزنيد و ليست برنامه هاي در حال اجرا رو ببينيد تروجان در اون ليست وجود نداره در حالي واقعا داره اجرا ميشه.
من حالا ميخوام يادتون بدم چطور برنامتون رو مخفي كنين.
Vb رو باز كنيد و يك پروژه جديد درست كنيد
بر روي form دو command button با نام هاي command
در قسمت كد (general) اين كد ها رو وارد كنيد يا copy- pasteكنيد:
-------------------------------------------------------------------------------------------------------
Public Declare Function RegisterServiceProcess Lib "kernel
Public Declare Function GetCurrentProcessId Lib "kernel
-------------------------------------------------------------------------------------------------------
اين قسمت مربوط به معرفي دو تابع API(در مقاله اول راجع بهش توزيح دادم) با نام هاي GetCurrentProcessId و RegisterServiceProcess ميباشد من در اينجا زياد به توزيح اين دو تابع نميپردازم اما به طور مختصر :
GetCurrentProcessId: هنگامي گه شما Ctrl,Alt,Del رو ميگيريد ميبينيد كه چند اسم درون ليست نشان داده شده ويندوز هم مثل شما اين اسم ها رو ميبينه با اين تفاوت كه به اونها يك عدد نسبت ميده و اونها رو با اون عدد ميشناسه مثلا اگر شما در ليست Explorer رو ميبينيد ويندوز اون رو با عدد
اما حالا از كجا بدونيم كه ويندوز برنامه ما رو با چه عددي ميشناسه؟؟
خوب جوابش سادس , با استفاده از همين تابع بالا (GetCurrentProcessId) .
همانطور كه در قسمت كد بالا ميبينيد اين تابع مقدار ورودي نداره و خروجي آن يك عدد از نوع long هست حالا فقط كافيه يك متغير مثلا Process رو برابر با مقدار تابع قرار بدين((Process = getcurentProcessid و حالا Process برابر ميشه با همون عددي كه ميخواهيم .
RegisterServiceProcess: اين تابع كار مخفي كردن رو براي ما انجام ميده همانطور كه ميبينيد اين تابع دو پارامتر ورودي داره با نامهاي dwType و dwProcessId . در اين قسمت بايد همان متغير Process (مثال بالا) رو وارد كنيم مثلا (RegisterServiceProcess Process,
DwProcessId به تابع ميگه كه كدام يك از برنامه ها رو مخفي كنه يا آشكار.
اما dwType به تابع ميگه كه برنامه رو آشكار كنه يا مخفي.اگر اينمقدار
خوب حالا كه فهميدين اين دوتا چيكار ميكنن اين كدها رو در روال click مربوط به command button ها وارد كنيد
-------------------------------------------------------------------------------------------------------
Private Sub Command
Process = getcurentProcessid
RegisterServiceProcess Process,
End Sub
Private Sub Command
Process = getcurentProcessid
RegisterServiceProcess Process,
End Sub
با توضيحات بالا فكر نميكنم ديگه موردي باشه
الان كل كد برنامه به اين صورته
-------------------------------------------------------------------------------------------------------
Private Declare Function RegisterServiceProcess Lib "kernel
Private Declare Function GetCurrentProcessId Lib "kernel
Private Sub Command
Process = getcurentProcessid
RegisterServiceProcess Process,
End Sub
Private Sub Command
Process = getcurentProcessid
RegisterServiceProcess Process,
End Sub
-------------------------------------------------------------------------------------------------------
حالا برنامه رو اجرا كنيد و ببينيد كه با زدن command
خوب عزيزان درس امروز تموم شد .
اگر پرسشي داشتيد حتما بپرسيد.
GDI+ نسل جدید GDI است و برای عملیات ترسیم در سیستمهای عامل ویندوز است. همانطور که از نام آن پیداست، GDI+ امکانات بیشتری از GDI را در اختیار برنامه نویس قرار می دهد. GDI+ به برنامه نویس اجازه می دهد تا برنامه های مستقل از سخت افزاری که در آن اجرا می شوند، بسازد. در ویندوزهای XP و
- گرافیکهای برداری : ترسیم و تغییر هندسی اشکال (خطوط، ترکیبات خطوط، اشکال چهار ضلعی و گرد) در فضا. این اشکال بصورت مجموعه ای از نقاط در یک صفحه و یا ابزار دیگر می باشند. برای استفاده از این امکانات در GDI+ کلاسهای متفاوتی در اختیار شما قرار داده شده است.
- تصویر: امکانات زیادی برای کار با تصاویر و ترسیم آنها در یک ابزار و همچنین تغییر آنها در اختیار شما قرار داده شده است.
- چاپ: برای کار با فونتها امکاناتی در اختیار شما قرار داده شده است.
اصول GDI+
برای استفاده از GDI+ شما باید از کلاسی به نام Graphics استفاده کنید. این کلاس برای انجام عملیات ترسیم متدهای مختلفی دارد. قبل از هر ترسیمی شما باید یک متغیر از نوع Graphics تعریف کنید. برای اینکار راههای مختلفی است که نمونه هایی از آن را در اینجا مشاهده می کنید.
- می توانید به راحتی متغیری از نوع Graphics تعریف کنید. به مثال توجه کنید:
Private Sub Button
System.EventArgs) Handles Button
Dim graph As System.Drawing.Graphics
End Sub
- اگر از رویداد Paint یک پنجره استفاده می کنید، آن رویداد اشاره گری به یک شی Graphics را در اختیار شما قرار می دهد. به مثال زیر توجه کنید:
Private Sub Form
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
e.Graphics . . .
End Sub
- با فراخوانی متد CreateGraphics از هر کنترل می توانید نمونه ای از شی Graphics مربوط به ان کنترل را بدست آورید. به مثال زیر توجه کنید:
Private Sub Button
System.EventArgs) Handles Button
Dim Graph As Graphics = Me.CreateGraphics
End Sub
رنگها در GDI+
رنگها یکی از اشیایی هستند که به اشیای دیگر برای تغییر نمای آنها اضافه می شوند. یک رنگ از ترکیب چهار مقدار
برای بدست آوردن رنگهای مورد نظر در GDI+ می توانید از نام رنگها استفاده کنید. نام همه رنگهای مشهور در GDI+ شناخته شده می باشند مانند RED ، GREEN، BLUE، BLACK، WHITE، YELLOW، Fuchsia، SILVER، LIGHTBLUE، GRAY. به مثال زیر توجه کنید:
Private Sub Button
System.EventArgs) Handles Button
Me.BackColor = Color.DarkBlue
End Sub
اگر رنگ مورد نظر شما جزو رنگهای از پیش تعریف شده نبود، می توانید به راحتی با تعریف یک متغیر از نوع Color و استفاده از یکی از چهار متد Overload شده FromArgb رنگ مورد نظر خود را تعریف کنید. حالت کلی متدهای FromArgb بصورت زیر است:
Public Static FromArgb (argb As Integer) As Color
Public Static FromArgb (Alpha As Integer, BaseColor As Color) As Color
Public Static FromArgb (Red As Integer, Green As Integer, Blue As Integer) As Color
Public Static FromArgb (Alpha As Integer, Red As Integer, Green As Integer, Blue As Integer) As Color
سومین نوع این متد بیشترین استفاده را دارد و سه عدد که هرکدام بین
Private Sub Button
System.EventArgs) Handles Button
Me.BackColor = Color.FromArgb(
End Sub
با استفاده از خواص R و G و B می توانيد مقدار هر کدام از آنها را در يک رنگ بدست آوريد.
قلمها در GDI+
برای ترسیم در شی Graphics نیاز به ابزارهایی داریم که ساده ترین آنها Pen می باشد. برای استفاده از آن باید ابتدا متغیری از نوع Pen تعریف کنیم. مهمترین مشخصات یک Pen رنگ آن می باشد که باید آن را تعریف کنیم. این کار را می توانیم با استفاده از تابع سازنده کلاس Pen و در هنگام تعریف شیی از نوع Pen انجام داد. به مثال زیر توجه کنید:
Private Sub Button
System.EventArgs) Handles Button
Dim PenRed = New Pen(Color.Blue)
Dim graph As Graphics = Me.CreateGraphics()
End Sub