هدف از تهیه این نوشتار آموزش چیزهایی است که تا بحال از ایرانی دریغ شده است . آیا تابحال فکر کرده اید چرا ایرانیان اینهمه در برنامه نویسی سردرگم هستند و هیچ نوع روش خاص وجود ندارد تا ایرانیان بتوانند بر اساس آن پیش بروند ؛
جاسوس به کسی میگویند که حواسش به برقراری ارتباط و نوع برقراری ارتباط افراد باهم باشد
نرم افزاری است که وقتی دو کامپیوتر با هم گفتگو میکنند متوجه شده و اعلام میکند نمونه ای از یک جاسوس در زیر نمایش داده میشود.
همانگونه که مشاهده میشود این جاسوس در حال وارسی دور و اطراف خود میباشد و نحوه شناخت آن هم همان عینک دودی آن است
میدانید میتوان یک برنامه فایروال نوشت تا با نصب آن روی کامپیوتر شبکه از ارتباطات نا معقول جلوگیری کرد ؟
برای پاسخ به این سوال نخست باید پرسید :
برای پاسخ به این سوالها باید نخست نحوه برقراری ارتباط را دانست
پس سوال نخست آنکه : نحوه برقراری ارتباط میان دو کامپیوتر چگونه میباشد
پس از پاسخ به این سوال سوال دومی مطرح میشود و آن اینکه : خوب چه کامپیوتر هایی به کامپیوتر من متصل هستند
و پس از آن باید بدنبال فایروال و بلوک کردن ارتباط بود
هر ارتباطی نیاز به یک رابط و مرتبط کنند دارد برای نمونه همین زبان ؛ وقتی دو ایرانی با هم سخن میگویند با زبان پارسی که قراردادمشترک میان این دو میباشد سخن میگویند و اگر یک نفر ایرانی با یک فیلپینی بخواهد سخن بگوید باید با زبانی که میان آن دو مشترک میباشد سخن بگوید که هر دو بتوانند این را متوجه شوند(به این همان پروتکلProtocol یا قرارداد نحوه سخن گفتن میگویند) اما لب و زبان (منظور کام) همان وسیله ای است که با آن میتوان سخن گفت و این وسیله در هر دو نفر یکسان است و تنها راه برقراری ارتباط میان دو نفر همین لب و زبان میباشد به این درگاه ارتباطی میگویند .
دو کامپیوتر برای سخن گفتن نیز نیاز به وسیله ای دارند تا با هم سخن بگویند این نقش در یک کامپیوتر چگونه ایفا میشود ؟
وقتی دو فرد میخواهند با هم ارتباط برقرار کنند چگونه این کار را انجام میدهند این ارتباط به چه صورت میباشد دو نفر میتوانند با روشهای زیر با هم ارتباط برقرار کنند
همین موضوع نیز در کامپیوتر رعایت میشود اما با کمی تفاوت .
دو کامپیوتر برای برقراری ارتباط باید دو خصیصه را در نظر داشته باشند
خوب با داشتن این دو اطلاعات میتوان دو کامپیوتر را با هم ارتباط داد
استاندارد ارتباطی میان دو کامپیوتر (البته در سری سیستم عامل ویندوز) وین سوکت(WinSocket) نام دارد و تقریبا در همه انواع ارتباطها از این استاندارد(که مشابه همان پرتکل است) استفاده میکند مثلا اینترنت اکسپلورر IE و شبکه دو نمونه کاملا بزرگ استفاده از این قرارداد یعنی وین سوکت میباشد
این توابع همه در فایل wsock32.dll موجود میباشند
یک سری توابع مربوط به کار با آی پی درون یک فایل Dll با نام iphlpapi.dll قرار دارد
ما در اینجا فقط با یکی از این توابع کار داریم با نام GetTcpTable که در زیر نحوه تعریف کردن آن را مشاهد مینمایید:
Declare Function GetTcpTable Lib "iphlpapi.dll" (ByRef pTcpTable As Any, ByRef pdwSize As Long, ByVal bOrder As Long) As Long
این تابع میتواند به ما مقادیر آی پی و پورتهایی که هم اکنون توسط ما یا کامپیوترهای دیگر اشغال گردیده را بدهد. حال به تعریف مقادیر پارامترهای این تابع میپردازیم:
Private Type MIB_TCPROW
نام مقدار |
مقدار |
MIB_TCP_STATE_CLOSED |
1 |
MIB_TCP_STATE_LISTEN |
2 |
MIB_TCP_STATE_SYN_SENT |
3 |
MIB_TCP_STATE_SYN_RCVD |
4 |
MIB_TCP_STATE_ESTAB |
5 |
MIB_TCP_STATE_FIN_WAIT1 |
6 |
MIB_TCP_STATE_FIN_WAIT2 |
7 |
MIB_TCP_STATE_CLOSE_WAIT |
8 |
MIB_TCP_STATE_CLOSING |
9 |
MIB_TCP_STATE_LAST_ACK |
10 |
MIB_TCP_STATE_TIME_WAIT |
11 |
MIB_TCP_STATE_DELETE_TCB |
12 |
برای برنامه نویسی جاسوس شبکه باید نخست نیازها بررسی شود
خوب ما چه چیز نیاز داریم
اینها را برای چه میخواهیم خوب در زیر توضیح داده شده است
تایمر: این را برای این نیاز داریم تا بتوانیم لحظه به لحظه با اسکن کردن ‘ آی پی های مرتبط را تشخیص دهیم . بهترین زمان برای اسکن کردن هر یک ثانیه میباشد
لیست ویو : برای اینکه بتوانیم مقادیر مربوط به pTcpTable از تابع را نمایش دهیم . این لیست ویو باید شامل این هدرها باشد
نخست تعریف توابع و ثابتها
نخست تعریف تایپ مورد نیاز
Private Type MIB_TCPROW
dwState As Long
dwLocalAddr As Long
dwLocalPort As Long
dwRemoteAddr As Long
dwRemotePort As Long
End Type
تعریف ثابتهای خطا
Private Const ERROR_BUFFER_OVERFLOW = 111&
Private Const ERROR_INVALID_PARAMETER = 87
Private Const ERROR_NO_DATA = 232&
Private Const ERROR_NOT_SUPPORTED = 50&
Private Const ERROR_SUCCESS = 0&
تعریف ثابتهای وضعیت ارتباط
Private Const MIB_TCP_STATE_CLOSED = 1
Private Const MIB_TCP_STATE_LISTEN = 2
Private Const MIB_TCP_STATE_SYN_SENT = 3
Private Const MIB_TCP_STATE_SYN_RCVD = 4
Private Const MIB_TCP_STATE_ESTAB = 5
Private Const MIB_TCP_STATE_FIN_WAIT1 = 6
Private Const MIB_TCP_STATE_FIN_WAIT2 = 7
Private Const MIB_TCP_STATE_CLOSE_WAIT = 8
Private Const MIB_TCP_STATE_CLOSING = 9
Private Const MIB_TCP_STATE_LAST_ACK = 10
Private Const MIB_TCP_STATE_TIME_WAIT = 11
Private Const MIB_TCP_STATE_DELETE_TCB = 12
تعریف توابع مورد نیاز
Private Declare Function GetTcpTable Lib "iphlpapi.dll" (ByRef pTcpTable As Any, _
ByRef pdwSize As Long, ByVal bOrder As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(ByRef pDest As Any, ByRef pSource As Any, ByVal Length As Long)
حال یک تابع نیاز داریم که یک عدد لانگ Long را بگیرد و تبدیل به یک رشته (استرینگ) با فرمت xxx.xxx.xxx.xxx نماید این تابع را در زیر تعریف میکنم
Private Function GetIpFromLong(lngIPAddress As Long) As String
'
Dim arrIpParts(3) As Byte
' CopyMemory به لیست آی پی آی موجود در سایت نگاه کنید
CopyMemory arrIpParts(0), lngIPAddress, 4
GetIpFromLong = CStr(arrIpParts(0)) & "." & CStr(arrIpParts(1)) _
& "." & CStr(arrIpParts(2)) & "." & CStr(arrIpParts(3))
End Function
حالا تابعی نیاز داریم تا وضعیت های پیشامده در ارتباط را بصورت یک رشته به ما برگرداند
Private Function GetState(lngState As Long) As String
'
Select Case lngState
Case MIB_TCP_STATE_CLOSED: GetState = "CLOSED"
Case MIB_TCP_STATE_LISTEN: GetState = "LISTEN"
Case MIB_TCP_STATE_SYN_SENT: GetState = "SYN_SENT"
Case MIB_TCP_STATE_SYN_RCVD: GetState = "SYN_RCVD"
Case MIB_TCP_STATE_ESTAB: GetState = "ESTAB"
Case MIB_TCP_STATE_FIN_WAIT1: GetState = "FIN_WAIT1"
Case MIB_TCP_STATE_FIN_WAIT2: GetState = "FIN_WAIT2"
Case MIB_TCP_STATE_CLOSE_WAIT: GetState = "CLOSE_WAIT"
Case MIB_TCP_STATE_CLOSING: GetState = "CLOSING"
Case MIB_TCP_STATE_LAST_ACK: GetState = "LAST_ACK"
Case MIB_TCP_STATE_TIME_WAIT: GetState = "TIME_WAIT"
Case MIB_TCP_STATE_DELETE_TCB: GetState = "DELETE_TCB"
End Select
'
End Function
این تابع شماره پورت بازگشته را بصورت هگزا دسیمال برمیگرداند بنابر این باید یک تابع باشد تا عدد را به شماره پورت واقعی تبدیل کند که در زیر تعریف شده است .
Private Function GetTcpPortNumber(DWord As Long) As Long
GetTcpPortNumber = DWord / 256 + (DWord Mod 256) * 256
End Function
حال میرسیم به برنامه اصلی برنامه ای که بصورت زمانی اجرا میشود و آی پی های اسکن شده را نمایش میدهد این برنامه را در تایمرمان قرار میدهیم.
Private Sub timNetWorkSpyer_Timer()
'
Dim arrBuffer() As Byte
Dim lngSize As Long
Dim lngRetVal As Long
Dim lngRows As Long
Dim i As Long
Dim TcpTableRow As MIB_TCPROW
Dim lvItem As ListItem
'
ListView1.ListItems.Clear
'
lngSize = 0
'
' به ما مقدار حافظه مورد نیاز را میدهد lngSize در اینجا تابع اسکن آی پی ها را فرا خوانی میکنیم و مقدار برگشتی آن یعنی
' این مقدار بما کمک میکند که بر اساس آن حافظه در اختیار بگیریم
' Call the GetTcpTable just to get the buffer size into the lngSize variable
lngRetVal = GetTcpTable(ByVal 0&, lngSize, 0)
' آیا با خطا روبروشده ایم
If lngRetVal = ERROR_NOT_SUPPORTED Then
'
'This API works only on Win 98//2000 and NT4 with SP4
MsgBox "IP Helper is not supported by this system."
Exit Sub
'
End If
'
' در اختیار گیری حافظه
ReDim arrBuffer(0 To lngSize - 1) As Byte
'
' فراخوانی تابع مجدد ولی اینبار دریافت مقدار مورد نیاز
lngRetVal = GetTcpTable(arrBuffer(0), lngSize, 0)
' آیا با خطا روبروشده ایم نه پس
If lngRetVal = ERROR_SUCCESS Then
'
' چهار بایت نخست تعداد سطرهای برگشتی را مشخص میکند
'The first 4 bytes contain the quantity of the table rows
'Get that value to the lngRows variable
CopyMemory lngRows, arrBuffer(0), 4
'
For i = 1 To lngRows
' هر سطر را در ساختار مربوط به آن کپی میکنیم
'Copy the table row data to the TcpTableRow structure
CopyMemory TcpTableRow, arrBuffer(4 + (i - 1) * Len(TcpTableRow)), Len(TcpTableRow)
' این قسمت مربوط به چک باکس روی فرم است
If Not ((Check1.Value = vbChecked) And ـ
(GetIpFromLong(TcpTableRow.dwLocalAddr) = "0.0.0.0" Or ـGetIpFromLong(TcpTableRow.dwLocalAddr) = "127.0.0.1")) Then
' وحالا به لیست ویو مقادیر را اضافه میکنیم
With TcpTableRow
Set lvItem = ListView1.ListItems.Add(, , GetIpFromLong(.dwLocalAddr))
lvItem.SubItems(1) = GetTcpPortNumber(.dwLocalPort)
lvItem.SubItems(2) = GetIpFromLong(.dwRemoteAddr)
lvItem.SubItems(3) = GetTcpPortNumber(.dwRemotePort)
lvItem.SubItems(4) = GetState(.dwState)
End With
'
End If
'
Next i
'
End If
'
End Sub
مرحله پایانی نیز در آن لود فرم مقدار زیر را بنویسید
Private Sub Form_Unload(Cancel As Integer)
Unload Me
End Sub
حالا با اجرای برنامه همه آی پی های مرتبط با پورتها نمایش داده میشود
راستش را بخواهید به هیچ دردی
نه این نرم افزار بسیار نیرومند است و میتواند شما را از شر افراد سود جو و هکر نجات دهد
نمونه هایی از کاربردهای این نرم افزار به شرح زیر است
ü فهمیدن لحظه ای برقراری یک ارتباط ناخواسته (مثلا هکری به شما وصل شده باشد)
ü نوشتن برنامه فایروال برای خودتان تا از ارتباط میان پورتها خاص و یا آی پی های خاص با کامپیوتر خود جلوگیری کنید
ü و کاربردهایی دیگر که شاید شما بتوانید از آنها استفاده کنید