جهت مطالعه و دسترسی به سورس ها به ادامه مطلب مراجعه نمائید
نحوه نوشتن جاسوس شبکه و اینترنت
مقدمه :
هدف از تهیه این نوشتار آموزش چیزهایی است که تا بحال از ایرانی دریغ شده است . آیا تابحال فکر کرده اید چرا ایرانیان اینهمه در برنامه نویسی سردرگم هستند و هیچ نوع روش خاص وجود ندارد تا ایرانیان بتوانند بر اساس آن پیش بروند ؛
جاسوس
جاسوس به کسی میگویند که حواسش به برقراری ارتباط و نوع برقراری ارتباط افراد باهم باشد و آن را بلافاصله به مافوق خودش گزارش کند و این یعنی جاسوسی کردن ؟؟؟
جاسوس شبکه
نرم افزاری است که وقتی دو کامپیوتر با هم گفتگو میکنند متوجه شده و اعلام میکند نمونه ای از یک جاسوس در زیر نمایش داده میشود.
همانگونه که مشاهده میشود این جاسوس در حال وارسی دور و اطراف خود میباشد و نحوه شناخت آن هم همان عینک دودی آن است
چگونه میتوان جاسوس شبکه نوشت :
آیا تا بحال به نحوه کار سیستم های فایروال (نرم افزارهای فایروال یا دیواره آتش) فکر کرده اید آیا تا بحال به ارتباطات شبکه ای اندیشیده اید
میدانید میتوان یک برنامه فایروال نوشت تا با نصب آن روی کامپیوتر شبکه از ارتباطات نا معقول جلوگیری کرد ؟
چگونه میتوان یک فایروال خوب نوشت ?
برای پاسخ به این سوال نخست باید پرسید :
من از کجا میتوانم بفهمم که یک کامپیوتر به سیستم من متصل شده است ؟
و هم اکنون این ارتباط در چه وضعیتی قرار دارد؟
آیا ارتباط قطع شده یا هنوز هم ارتباط برقرار است ؟
اینها سوالهایی است که قبل از فایروال نویسی باید بدانها پاسخ داد ؟
برای پاسخ به این سوالها باید نخست نحوه برقراری ارتباط را دانست
پس سوال نخست آنکه : نحوه برقراری ارتباط میان دو کامپیوتر چگونه میباشد
پس از پاسخ به این سوال سوال دومی مطرح میشود و آن اینکه : خوب چه کامپیوتر هایی به کامپیوتر من متصل هستند
و پس از آن باید بدنبال فایروال و بلوک کردن ارتباط بود
نحوه برقراری ارتباط میان دو کامپیوتر چگونه میباشد:
هر ارتباطی نیاز به یک رابط و مرتبط کنند دارد برای نمونه همین زبان ؛ وقتی دو ایرانی با هم سخن میگویند با زبان پارسی که قراردادمشترک میان این دو میباشد سخن میگویند و اگر یک نفر ایرانی با یک فیلپینی بخواهد سخن بگوید باید با زبانی که میان آن دو مشترک میباشد سخن بگوید که هر دو بتوانند این را متوجه شوند(به این همان پروتکلProtocol یا قرارداد نحوه سخن گفتن میگویند) اما لب و زبان (منظور کام) همان وسیله ای است که با آن میتوان سخن گفت و این وسیله در هر دو نفر یکسان است و تنها راه برقراری ارتباط میان دو نفر همین لب و زبان میباشد به این درگاه ارتباطی میگویند .
دو کامپیوتر برای سخن گفتن نیز نیاز به وسیله ای دارند تا با هم سخن بگویند این نقش در یک کامپیوتر چگونه ایفا میشود ؟
وقتی دو فرد میخواهند با هم ارتباط برقرار کنند چگونه این کار را انجام میدهند این ارتباط به چه صورت میباشد دو نفر میتوانند با روشهای زیر با هم ارتباط برقرار کنند
سخن گفتن
نگاه کردن
لمس کردن
…
همین موضوع نیز در کامپیوتر رعایت میشود اما با کمی تفاوت .
دو کامپیوتر برای برقراری ارتباط باید دو خصیصه را در نظر داشته باشند
IP
Port
آی پی که یک خصیصه منحصر به فرد برای یک کامپیوتر میباشد یعنی هر کامپیوتر برای خود یک شماره آی پی دارد که برای خودش میباشدو هیچ کامپیوتر دیگری یافت نمیشود که مقدار آی پی آن همین مقدار باشد
پورت شماره درگاهی است که دو کامپیوتر با هم میخواهند از طریق آن درگاه سخن بگویند
خوب با داشتن این دو اطلاعات میتوان دو کامپیوتر را با هم ارتباط داد
استاندارد ارتباطی میان دو کامپیوتر (البته در سری سیستم عامل ویندوز) وین سوکت(WinSocket) نام دارد و تقریبا در همه انواع ارتباطها از این استاندارد(که مشابه همان پرتکل است) استفاده میکند مثلا اینترنت اکسپلورر IE و شبکه دو نمونه کاملا بزرگ استفاده از این قرارداد یعنی وین سوکت میباشد
توابع API مرتبط با استاندارد وین سوکت :
این توابع همه در فایل wsock32.dll موجود میباشند
Closesocket |
IP Helper چیست ؟
یک سری توابع مربوط به کار با آی پی درون یک فایل Dll با نام iphlpapi.dll قرار دارد
ما در اینجا فقط با یکی از این توابع کار داریم با نام GetTcpTable که در زیر نحوه تعریف کردن آن را مشاهد مینمایید:
Declare Function GetTcpTable Lib “iphlpapi.dll” (ByRef pTcpTable As Any, ByRef pdwSize As Long, ByVal bOrder As Long) As Long |
این تابع میتواند به ما مقادیر آی پی و پورتهایی که هم اکنون توسط ما یا کامپیوترهای دیگر اشغال گردیده را بدهد. حال به تعریف مقادیر پارامترهای این تابع میپردازیم:
pTcpTable : تایپ از نوع MIB_TCPROW است که خود به صورت زیر تعریف میشود)در اینجا آدرس آن به تابع پاس داده میشود و لازم به ذکر است اگر مقدار صفر برای این پارامتر داده شود برگشتی مقدار حافظه مورد نیاز جهت دریافت اطلاعات را برمیگرداند در مثال زیر این قسمت کاملا مشخص است)
Private Type MIB_TCPROW |
: dwState وضعیت فعلی ارتباط را مشخص میکند که میتواند مقادیر زیر باشد
نام مقدار
|
مقدار
|
MIB_TCP_STATE_CLOSED
|
۱
|
MIB_TCP_STATE_LISTEN
|
۲
|
MIB_TCP_STATE_SYN_SENT
|
۳
|
MIB_TCP_STATE_SYN_RCVD
|
۴
|
MIB_TCP_STATE_ESTAB
|
۵
|
MIB_TCP_STATE_FIN_WAIT1
|
۶
|
MIB_TCP_STATE_FIN_WAIT2
|
۷
|
MIB_TCP_STATE_CLOSE_WAIT
|
۸
|
MIB_TCP_STATE_CLOSING
|
۹
|
MIB_TCP_STATE_LAST_ACK
|
۱۰
|
MIB_TCP_STATE_TIME_WAIT
|
۱۱
|
MIB_TCP_STATE_DELETE_TCB
|
۱۲
|
dwLocalAddr شماره آی پی لوکال را میدهد (بصورت یک عدد که ما باید آن را بصورت فرمت xxx.xxx.xxx.xxx در آوریم)
dwLocalPort شماره پورت لوکال را میدهد
dwRemoteAddr شماره آی پی هاست را میدهد (بصورت یک عدد که ما باید آن را بصورت فرمت xxx.xxx.xxx.xxx در آوریم)
dwRemotePort شماره پورت هاست را میدهد
فرم مورد نیاز :
برای برنامه نویسی جاسوس شبکه باید نخست نیازها بررسی شود
خوب ما چه چیز نیاز داریم
یک تایمر
یک لیست ویو
یک چک باکس
اینها را برای چه میخواهیم خوب در زیر توضیح داده شده است
تایمر: این را برای این نیاز داریم تا بتوانیم لحظه به لحظه با اسکن کردن ‘ آی پی های مرتبط را تشخیص دهیم . بهترین زمان برای اسکن کردن هر یک ثانیه میباشد
لیست ویو : برای اینکه بتوانیم مقادیر مربوط به pTcpTable از تابع را نمایش دهیم . این لیست ویو باید شامل این هدرها باشد
Ip Local |
چک باکس : بعد از اجرای برنامه میبینید که یک سری پورتها توسط خود سیستم (سیستم شما) جهت استفاده های خاص مورد استفاده قرار گرفته که این ها همه یک خصلت مشترک دارند و آن لوکال آی پی آنها Local IP همه یا ۰٫۰٫۰٫۰ و یا ۱۲۷٫۰٫۰٫۱ میباشد با این چک باکس میخواهیم این اطلاعات اضافی را از نمایشمان حذف کنیم.
برنامه ماجول فرم :
نخست تعریف تایپ مورد نیاز
Private Type MIB_TCPROW |
تعریف ثابتهای خطا
Private Const ERROR_BUFFER_OVERFLOW = 111& |
تعریف ثابتهای وضعیت ارتباط
Private Const MIB_TCP_STATE_CLOSED = 1 |
تعریف توابع مورد نیاز
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 |
حال میرسیم به برنامه اصلی برنامه ای که بصورت زمانی اجرا میشود و آی پی های اسکن شده را نمایش میدهد این برنامه را در تایمرمان قرار میدهیم.
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 در اینجا تابع اسکن آی پی ها را فرا خوانی میکنیم و مقدار برگشتی آن یعنی
این مقدار بما کمک میکند که بر اساس آن حافظه در اختیار بگیریم
lngRetVal = GetTcpTable(ByVal 0&, lngSize, 0) آیا با خطا روبروشده ایم If lngRetVal = ERROR_NOT_SUPPORTED Then 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
چهار بایت نخست تعداد سطرهای برگشتی را مشخص میکند CopyMemory lngRows, arrBuffer(0), 4 For i = 1 To lngRows هر سطر را در ساختار مربوط به آن کپی میکنیم 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 |
حالا با اجرای برنامه همه آی پی های مرتبط با پورتها نمایش داده میشود
این نرم افزار به چه دردی میخورد؟
راستش را بخواهید به هیچ دردی
نه این نرم افزار بسیار نیرومند است و میتواند شما را از شر افراد سود جو و هکر نجات دهد
نمونه هایی از کاربردهای این نرم افزار به شرح زیر است
فهمیدن لحظه ای برقراری یک ارتباط ناخواسته (مثلا هکری به شما وصل شده باشد)
نوشتن برنامه فایروال برای خودتان تا از ارتباط میان پورتها خاص و یا آی پی های خاص با کامپیوتر خود جلوگیری کنید
و کاربردهایی دیگر که شاید شما بتوانید از آنها استفاده کنید