Ohessa keskustelupalstalla monesti keskusteltu "virus" - eli pilailu ohjelma, joka piilottaa itsensä ja tekee koneella kaikenlaista mukavaa/ikävää.
OHJELMA EI TARTUTA ITSEÄÄN TOISELLE KONEELLE!
Luo projekti ja lisää siihen vain yksi moduli, johon kopioit koodin. Käännä ja aja. Ohjelma ei senjälkeen sammu muutoin kuin sammuuttamalla koneen.
LUE KOMMENTIT TARKOIN - ohjelmassa on tiettyjä epäsopivuuksia käyttöjärjestelmien suhteen.
Voit kyllä ajaa ohjelmaa debug-tilassa, jolloin se ei jää kiusaamaan omalle koneelle.
Asennettaessa pilaksi ohjelman tulee asettaa käynnistymään, joko palveluna tai "StartUp"-kansioon.
Option Explicit
' Koneen sammutus - epävakaa riippuen alustasta.
' Mieti tosissaan haluatko oikeasti käyttää vaikka
' se onkin juuri sopivan ärsyttävä toiminto.
Public Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Public Const EWX_SHUTDOWN = 1 ' Sammuttaa koneen
Public Const EWX_LOGOFF = 0 ' Loggaa käyttäjän ulos
' Messagebox API:n kautta - vähän turha, koska
' voitaisiin käyttää tavallista MsgBoxia, mutta
' tässä sitä käytetään ihan opetuksellisessa
' tarkoituksessa'
Public Declare Function MessageBoxEx Lib "user32" Alias "MessageBoxExA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal uType As Long, ByVal wLanguageId As Long) As Long
Public Const MB_YESNO = &H4& ' Kyllä/Ei painikkeet
Public Const MB_ICONEXCLAMATION = &H30& ' Huutomerkki ikoni
Public Const MB_ICONHAND = &H10& ' Käsi-ikoni
' CD-Rom laitteen käsittelyn mahdollistava API-funktio
Private Declare Function mciSendString Lib "WINMM.DLL" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
' Hiiren painikkeiden vaihto
Private Declare Function SwapMouseButton Lib "user32" (ByVal bSwap As Long) As Long
' Piip-ääni
Public Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
' Timeri funktion API-kutsut
' - Luominen, jälleenkäyttäminen ja asettaminen
' Lisäksi löytyy myös peruuttaminen, jota ei tässä käytetä
Private Declare Function CreateWaitableTimer Lib "kernel32" _
Alias "CreateWaitableTimerA" ( _
ByVal lpSemaphoreAttributes As Long, _
ByVal bManualReset As Long, _
ByVal lpName As String) As Long
'CreateWaitableTimer'in palauttama virhe, jos luotava ajastin on jo olemassa
Private Const ERROR_ALREADY_EXISTS = 183&
Private Declare Function OpenWaitableTimer Lib "kernel32" _
Alias "OpenWaitableTimerA" ( _
ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, _
ByVal lpName As String) As Long
Private Declare Function SetWaitableTimer Lib "kernel32" ( _
ByVal hTimer As Long, _
lpDueTime As FILETIME, _
ByVal lPeriod As Long, _
ByVal pfnCompletionRoutine As Long, _
ByVal lpArgToCompletionRoutine As Long, _
ByVal fResume As Long) As Long
Private Declare Function CancelWaitableTimer Lib "kernel32" ( _
ByVal hTimer As Long)
' Luodun hanskan sulkeminen
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
' Säikeistetty "odottaja" ja sen konstantit
' Kaikkia konstantteja ei käytetä, mutta olkoon ne nyt
' tässä opetusmielessä. Mikäli alatte leikkimään funktiolla
' kehoitan vakavasti lukemaan aiheesta, sillä muutoin saatatte
' aiheuttaa "deadlock":in...
Private Declare Function MsgWaitForMultipleObjects Lib "user32" ( _
ByVal nCount As Long, _
pHandles As Long, _
ByVal fWaitAll As Long, _
ByVal dwMilliseconds As Long, _
ByVal dwWakeMask As Long) As Long
Private Const WAIT_ABANDONED& = &H80&
Private Const WAIT_ABANDONED_0& = &H80&
Private Const WAIT_FAILED& = -1&
Private Const WAIT_IO_COMPLETION& = &HC0&
Private Const WAIT_OBJECT_0& = 0
Private Const WAIT_OBJECT_1& = 1
Private Const WAIT_TIMEOUT& = &H102&
Private Const INFINITE = &HFFFF ' Mikä on ajastimen timeout? - Ikuinen
' Ajastimen keskeytyssyy konstantit ja keskeytys asetukset
' Tällä voidaan asettaa ohjelma päättymään jos jotain tehdään -
' painetaan nappia tai jotain.
Private Const QS_HOTKEY& = &H80
Private Const QS_KEY& = &H1
Private Const QS_MOUSEBUTTON& = &H4
Private Const QS_MOUSEMOVE& = &H2
Private Const QS_PAINT& = &H20
Private Const QS_POSTMESSAGE& = &H8
Private Const QS_SENDMESSAGE& = &H40
Private Const QS_TIMER& = &H10
Private Const QS_MOUSE& = (QS_MOUSEMOVE _
Or QS_MOUSEBUTTON)
Private Const QS_INPUT& = (QS_MOUSE _
Or QS_KEY)
Private Const QS_ALLEVENTS& = (QS_INPUT _
Or QS_POSTMESSAGE _
Or QS_TIMER _
Or QS_PAINT _
Or QS_HOTKEY)
Private Const QS_ALLINPUT& = (QS_SENDMESSAGE _
Or QS_PAINT _
Or QS_TIMER _
Or QS_POSTMESSAGE _
Or QS_MOUSEBUTTON _
Or QS_MOUSEMOVE _
Or QS_HOTKEY _
Or QS_KEY)
' Ajastimen aika strukti
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Private hTimer As Long ' Ajastimen hanska julkisena
Private bOn As Boolean ' Muuttuja, joka pitää ohjelman rullaamassa
'*******************************************************************************
' MAIN - VB ohjelman käynnistävä ja ylläpitävä funktio
'*******************************************************************************
Sub Main()
Dim iValitsin As Integer ' Satunnaisluvusta luotava toiminnon valitsin
Dim iRet As Integer ' Yleinen jälleenkäytettävä paluuarvo muuttuja
Dim iCounter As Integer ' Yleinen jälleenkäytettävä laskurimuuttuja
Dim ltime As Long ' Odotettava aika sekunneissa - arvotaan satunnaisluvulla, jotain välillä 1-1000 sekuntia
Dim strReturn As Long ' mciSendString'in parametri muuttuja
Dim lngReturn As Long ' mciSendString'in paluuarvo muuttuja
On Error Resume Next
' pidetään ohjelma käynnissä toistaiseksi
bOn = True
' piilotetaan ohjelma
App.TaskVisible = False
' Alustetaan satunnaisluku generaattori
Randomize
Do While bOn = True
iValitsin = Int(Rnd(Now) * 7) + 1 ' Arvotaan satunnainen toiminto 1-8
ltime = Int(Rnd(Now) * 999) + 1 ' Arvotaan satunnainen odotusaika 1-1000 sekuntia
Select Case iValitsin
Case 1
' Palauttaa tekstiboxin joka pyytää kahvia ja avaa cd-rommin kahvitelineeksi
iRet = MessageBoxEx(0, "System needs a cup of coffee.", "Important notification!", MB_ICONHAND, 0)
mciSendString "set CDAudio door open", vbNullString, 0, 0
iRet = MessageBoxEx(0, "Free coffee cup holder contributed by Bill G!", "Important notification!", MB_ICONHAND, 0)
Wait ltime
Case 2
' Palauttaa herjan liian tahmeista sormista
iRet = MessageBoxEx(0, "Error -4565: Too sticky fingers!", "Windows alert", MB_ICONHAND, 0)
Wait ltime
Case 3
' Palauttaa herjan järjestelmän kuumenemisesta ja avaa 3 kertaa cd-rommin luukkua ja kiittää.
iRet = MessageBoxEx(0, "Error -77445: System heating! Cooling down - wait!", "Important!", MB_ICONHAND, 0)
iCounter = 0
Do While iCounter < 3
DoEvents
lngReturn = mciSendString("set CDAudio door open", strReturn, 127, 0)
lngReturn = mciSendString("set CDAudio door closed", strReturn, 127, 0)
iCounter = iCounter + 1
Loop
iRet = MessageBoxEx(0, "Thanks!", "Important!", MB_ICONHAND, 0)
Wait ltime
Case 4
' Soittaa nousevan ja laskevan piippiip melodian ja runoilee päälle.
Beep 1000, 300
Beep 1200, 300
Beep 1400, 300
Beep 1600, 300
Beep 1800, 300
Beep 2000, 600
Beep 1800, 300
Beep 1600, 300
Beep 1400, 300
Beep 1200, 300
Beep 1000, 300
iRet = MessageBoxEx(0, "Kello löi jo viisi, bugit kerätkää, Johan nyt on hiisi, onnistu ei tää...", "Tärkeä huomio!", MB_ICONHAND, 0)
Wait ltime
Case 5
' Väittää käyttäjän olevan homo ja jos käyttäjä sen myöntää yrittää sammuttaa koneen
iRet = MessageBoxEx(0, "Malfunction in System user: Homosexual activity Suspected. Confirm?", "Notification", MB_YESNO, 0)
If iRet = 6 Then
iRet = MessageBoxEx(0, "Error in System user: Homosexual enviroment detected. Exiting...", "Notification", MB_ICONHAND, 0)
bOn = False
ExitWindowsEx EWX_LOGOFF, 0
Else
Wait ltime
End If
Case 6
' Avaa itsekseen teksturin
Shell "notepad", vbNormalFocus
Wait ltime
Case 7
' Avaa explorer ikkunan (mikä se nyt onkaan suomeksi?)
Shell "explorer", vbNormalFocus
Wait ltime
Case 8
' Vaihtaa hiiren painikkeita satunnaisesti 1-50 sekunnin välein
' Hermostuttaa käyttäjän varmasti ja aiheuttaa harmaita hiuksia tekniselle tuelle
SwapMouseButton 1
ltime = Int(Rnd(Now) * 50)
Wait ltime
SwapMouseButton 0
ltime = Int(Rnd(Now) * 500)
Wait ltime
SwapMouseButton 1
ltime = Int(Rnd(Now) * 50)
Wait ltime
SwapMouseButton 0
ltime = Int(Rnd(Now) * 400)
Wait ltime
SwapMouseButton 1
ltime = Int(Rnd(Now) * 50)
Wait ltime
SwapMouseButton 0
ltime = Int(Rnd(Now) * 300)
Wait ltime
SwapMouseButton 1
ltime = Int(Rnd(Now) * 50)
Wait ltime
SwapMouseButton 0
ltime = Int(Rnd(Now) * 200)
Wait ltime
SwapMouseButton 1
ltime = Int(Rnd(Now) * 50)
Wait ltime
SwapMouseButton 0
ltime = Int(Rnd(Now) * 100)
Wait ltime
SwapMouseButton 1
ltime = Int(Rnd(Now) * 50)
Wait ltime
SwapMouseButton 0
ltime = Int(Rnd(Now) * 1000)
Wait ltime
End Select
Loop
CloseHandle hTimer ' Suljetaan oikeaoppisesti ajastimen hanska
End Sub
'*****************************************************************
' AJASTIN FUNKTIO
' Kuvaus: Odottava ajastin - ei syö prosessoriaikaa nimeksikään
' Oheinen koodi ei ole kokonaisuudessaan omaani vaan sama
' koodi löytyy useilta vinkki ja keskustelupalstoilta.
'
' Olen itse muokannut koodin sopivaksi tarkoitukseensa.
' Lisäksi olen kommentoinut koodin kunnolla ja kirjoittanut
' vaihtoehtoisia käyttötapoja koodiin. Lukekaa itse.
'
' Käyttötapa: Wait(Odotettava aika sekunneissa)
'*****************************************************************
Sub Wait(ByVal lNumberOfSeconds As Long)
Dim ft As FILETIME ' Aikastrukti
Dim lBusy As Long ' Muuttuja joka pitää odottavan ajastimen yllä odotusajan
Dim lRet As Long ' Yleisesti käytetty paluuarvo
Dim dblDelay As Double
Dim dblDelayLow As Double
Dim dblUnits As Double
' Luodaan uusi ajastin - vähän ruma tapa -
' pitäisi mieluummin tutkia hanska ja sitten
' vasta yrittää luoda uusi. Tässä tapauksessa
' tutkitaan virhe ja sitten vasta avataan
' olemassa oleva ajastin.
hTimer = CreateWaitableTimer(0, True, App.EXEName & "Timer")
' Tutkitaan virhe
If Err.LastDllError = ERROR_ALREADY_EXISTS Then
' Jos ajastin on jo olemassa ei ole haitaksi vaikka se avataan
' niin kauan kuin käyttäjällä, joka sen tekee on riittävät oikeudet
' Tämä on tässä tapauksessa periaatteessa tarpeeton koska funktio voisi
' sulkea luodun ajastimen aina odotus ajan päätteeksi.
'- Tällöin hTimer tulee määritellä julkiseksi: so. esitellä modulin alussa tämän funktion ulkopuolella.
'- Tähän lisätään seuraavat rivit:
lRet = OpenWaitableTimer(0, hTimer, App.EXEName & "Timer")
Else
' Ei virheitä - tai muita virheitä - niistä välittämättä alustetaan ajastin
ft.dwLowDateTime = -1
ft.dwHighDateTime = -1
lRet = SetWaitableTimer(hTimer, ft, 0, 0, 0, 0)
End If
' Konvertoidaanpa odotusaika API:n ymmärtämiksi nanosekunneiksi
dblUnits = CDbl(&H10000) * CDbl(&H10000)
dblDelay = CDbl(lNumberOfSeconds) * 1000 * 10000
' Asettamalla high/low aika negatiiviseksi pyydetään ohjelmaa
' käyttämään "offset" aikaa kovakoodatun ajan sijasta. Jos se
' olisi positiivinen ohjelma yrittäisi konvertoida sen GMT-ajaksi.
ft.dwHighDateTime = -CLng(dblDelay / dblUnits) - 1
dblDelayLow = -dblUnits * (dblDelay / dblUnits - Fix(dblDelay / dblUnits))
' Koska &H80000000 on MAX_LONG, varmistetaan ettei synny ylivuotoa
' kun sitä yritetään sjoittaa FILETIME struktiin
If dblDelayLow < CDbl(&H80000000) Then
dblDelayLow = dblUnits + dblDelayLow
End If
ft.dwLowDateTime = CLng(dblDelayLow)
lRet = SetWaitableTimer(hTimer, ft, 0, 0, 0, False)
Do
' QS_ALLINPUT tarkoittaa, että MsgWaitForMultipleObjects palauttaa
' joka kerran kun säie, jossa se pyörii saa "viestin".
' Voit tässä käsitellä "eventtejä", mutta kutsumalla DoEvents sallit
' DefWindowProgin suorittaa sen normaali windowsin viestien käsittely.
lBusy = MsgWaitForMultipleObjects(1, hTimer, False, INFINITE, QS_ALLINPUT&)
DoEvents
Loop Until lBusy = WAIT_OBJECT_0
' Sulje ajastimen hanska, mikäli ajastinta ei tulla käyttämään uudelleen lähiaikoina.
' Kommentoitu pois koska samaa ajastinta pyritään käyttämään uudelleen.
'CloseHandle hTimer
End SubIhan hauska, mutta minulla ohjelma ei odota yhtään jäynien välillä ja piipitysjuttu ei toimi.
Käytän Win95.
Ohjelma on testattu vain W2000:lla
Tiesitkö että virusten ohjelmointi edes testikäyttöön on laitonta Suomessa?
onko laitonta ohjelmoida etänä viirus jossain ulkomaisella shellillä? :P
Kaiketi on. Ihan hyvältä näyttää.
Virusten ohjelmointi ehkäpä mutta tästä ei kyllä saa virusta tekemälläkään :-) Ihan kiva esimerkki, siis.
Ei tämä mikään viirus ole...
Käänntäminen loppuu aina samaan virheilmotukseen: "Compile Error:
Constants, fixed-lenght strings, arrays, User-defined types and Declare statements no allowed as Public members of objects modules".
Toi tulee noilla sammutus&logout riveil, ja ku ne poistaa ni si kyllä/ei painikkeissa jne.
Hyvin oppii Api-määrittelyitä ;p Virushan tämä ei ole, koska viruksen tuntomerkkeihin soveltuu leviämisrutiini..
Heikki: Laita se moduliin ja muuta koodin alusta Public määrittelyt Privateiksi - niiden ei tarvitse olla Public tyyppisiä.
KYSEESSÄ EI OLE VIRUS VAAN PILAILUOHJELMA. KYSEINEN OHJELMA EI TARTUTA ITSEÄÄN TOISELLE KONEELLE.
Onko exee?
No toi on just kiva ja ei se kyl oo mikää virus todellakaa!
Voiko joku selittää miten käännän ja ajan? Olen vasta aloitteleva vb juuseri...
lainaus:
Hyvin oppii Api-määrittelyitä ;p Virushan tämä ei ole, koska viruksen tuntomerkkeihin soveltuu leviämisrutiini..
no troijalainen sitten
Hemmetti ku on surkee ohjelma. Eihän tää edes toimi!!!!!
Heh! Hauska.
hohoo ja muut:
Virusta/troijalaista tästä ei saa tekemälläkään. Virukset/troijalaiset lähettää spämmiä/tuhoaa tiedostoja/sekottaa koneen/aiheuttaa muuta haittaa/leviää. Tämä ei tee noista mitään.
Kertokaapahan joku viisas, että miten ohjelman saa käynnistymään palveluna???
Kokeile laittaa Käynnistys-kansioon. Ainakin pahimmat peelot juksaat...
Todella upea vinkki.
exe:ä!
Käännetty Demo ois JEES
oisko .exe tiedostoo?
Koodia on ainakin tarpeeks!
Kiva ohjelma,virus tää ei ole
Viittiskö joku tehä exe-päätteisen binääriversion kyseisestä ohjelmasta?
Binäärit saatte klikkaamalla tästä.
Kiva ohjelma! Oppii nuita WinApeja. Mietityttää vaan että miten nuo winapin komennot voi muistaa ulukoa?
"Asennettaessa pilaksi ohjelman tulee asettaa käynnistymään, joko palveluna tai "StartUp"-kansioon."
Palveluna?
Onko tuo moptim:in antama exe. valmis ohjelma, vai pitääkö sille tehdä vielä jotain ?
miten tän saa pois? Jos laittaa päälle. Ajattelin kiusata äitiä
Poista kokonaan.
Lyhyemmin C:llä.
#include<stdio.h>
#include<stdlib.h>
main()
{
system("C:\\WINDOWS\\System32\\shutdown -s");
return 0;
}Tiedoston sijaintia voi muokata.
On kyllä helpompi käyttää valmista tiedostoa.
En kokeillut tuota shutdown tiedoston korvikeena,mutta voihan sitä kokeilla.
Löysin netistä:http://www.programmingsimplified.com/c-program-shutdown-computer
Shutdownitus tai reboottaus menee kyllä näin
#include <stdlib.h>
int main(void)
{
system("shutdown /s /t 0"); // /s = sammutus, /r = reboottaus, /t aika
}Koodissa olisi jossain määrin parantamisen varaa, mm. voisi edes laskea randomit oikein (Int(Rnd*8)+1 käsittääkseni tekee luvun 1–8, ei 1–9), hiiren nappien vaihtelu voisi olla silmukassa jne. Myös sen lisävinkin sisällön voisi muokata osaksi tätä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.