Onko mitenkään mahdollista tehdä jonkunlaista ohjelmaa, joka estäisi jonkun toisen ohjelman avaamisen. Haxhax..
Tutki loopissa onko ohjelman prosessi(CreateToolHelpSnapshot?) tai ikkuna(FindWindow) auki ja lopeta ohjelma?
Moikka Short Php!
Imports System Imports System.Diagnostics Imports System.Windows.Forms Imports Microsoft.VisualBasic '... Sub MainFormLoad(sender As Object, e As EventArgs) Timer1.Interval = 100 Timer1.Enabled = True Timer1.Start End Sub Sub Timer1Tick(sender As Object, e As EventArgs) Timer1.Stop Dim prosessi As Process = _ System.Diagnostics.Process.GetProcessesByName("Excel") ' "Esim." If Not prosessi Is Nothing Then For i As Integer = LBound(prosessi) To UBound(prosessi) Try prosessi(i).Kill() Catch ex As Exception End try Next End if prosessi = Nothing Timer1.Start End Sub '...
Dim prosessi As Process = _ System.Diagnostics.Process.GetProcessesByName("Excel") ' "Esim."
Tuossa kohdassa jotain häikkää. Sanoo "Value of type '1-dimensional array of System.Diagnostics.Process' cannot be converted to 'System.Diagnostics.Process'"
Edit: Juu ite huomasin virheen
Dim prosessi As Process = _ System.Diagnostics.Process.GetProcessesByName("Excel") ' "Esim." --> Dim prosessi() As Process = _ System.Diagnostics.Process.GetProcessesByName("Excel") ' "Esim."
Edit2: Notepadin kanssa yritin, mutta ei vaan kuole vaikka mitä yrittäisi :S
Moikka taas Short Php!
kokeile toimiiko tämä...(voit jättää 'Imports Microsoft.VisualBasic' pois)
'... Dim prosessi() As Process = _ Process.GetProcessesByName("Notepad") If Not prosessi Is Nothing Then For i As Integer = 0 To _ prosessi.GetUpperBound(0) Try prosessi(i).Kill Catch ex As Exception End Try Next End If '...
Oon sattunut just vähän aihetta tutkimaan :) Tuollaisen toteuttaminen on hankalaa fiksusti ja resursseja säästävästi (jos sellasella on mitään merkitystä nykypäivinä). Dokumentoitu tapa seurata prosessien käynnistymistä on kutsua PsSetCreateProcessNotifyRoutine-APIa kernelissä, mutta se vaatii erillisen ajurin ja paljon työtä. Usermodessa vois jonkun system-wide hookin asennella ja seurata vaikka CreateProcess-kutsuja (vaikka prosessin kyllä voi luoda kutsumatta tätä APIa), tosin jokaisen prosessin muokkaaminen on purkkaa, vaarallista ja ei myöskään niin kevyt ratkaisu.
Mutta sittenpä keksin ehkä parhaan ratkaisun, jota ei kukaan oo välttämättä vielä toteuttanut (eli onkohan edes mahdollinen :D). Kun prosessi luodaan, niin otetaan yhteyttä csrss.exe-prosessiin CsrClientCallServer-APIa käyttämällä. csrss:ltä pyydetään prosessille hProcess, hThread, TID, PID ja muuta sälää, eli sitä on pakko kutsua kun prosessia luodaan. Meidän tarvitsee vain tutkia missä päin csrss.exeä käsitellään uuden prosessin luonti, ja hookkaammalla sieltä jokin sopiva kohta tai funktio (esimerkiksi vastauksen lähettäminen takas prosessia luovalle prosessille), niin pystymme seuraamaan jokaisen prosessin luontia. Näin päästään käsiksi tärkeisiin kahvoihin ja tunnuksiin ennen kuin edes prosessia luova prosessi vastaanottaa ne. Helposti GetModuleFileNameEx:llä (tai suoraan ZwQueryInformationProcess:lla) saadaan kahvasta tiedostopolku, jolloin voidaan vaikka tappaa tietyn nimisten .exe-tiedostojen prosessit.
Nojoo, ehkä turhan teknistä ja hankalaa toteuttaa varsinkin VB.NETillä. Etkö voisi vain uudelleennimetä tai poistaa sitä ohjelmaa? Tai sitten vaan käytät sitä timeriä tai looppia...
Kun ohjelmasi käynnistyy, muokkaa sen toisen ohjelman ensimmäiset käskyt niin että se lopettaa heti (laita vaikka ensimmäisiksi tavuiksi B4 4C CD 21), ja ohjelmasi sulkeutuessa muokkaat ne takaisin. Siltä varalta, että ohjelmasi pakotetaan sulkeutumaan, tallennat edelliset käskyt tiedostoon josta luet ne ohjelman sulkeutuessa, ja tallennat tiedostoon alussa vain jos ohjelman ensimmäiset käskyt eivät ole jo valmiiksi B4 4C CD 21.
Heippa taas!
siis onko tässä nyt vielä jotain epäselvää..?
' (väännetty SharpDevelop 3.0:lla) ' käännä, pistä .exe pyörimään, ' avaa Tehtävienhallinta ja tutki suoritinkäyttöä... Imports System Imports System.Diagnostics Imports System.Windows.Forms Public Partial Class MainForm: Inherits Form Public Sub New() Me.InitializeComponent() End Sub Sub MainFormLoad(sender As Object, e As EventArgs) Timer1.Interval = 25 Timer1.Enabled = True Timer1.Start End Sub Sub Timer1Tick(sender As Object, e As EventArgs) Timer1.Stop Dim prosessi() As Process = _ Process.GetProcessesByName("Notepad") If Not prosessi Is Nothing Then For i As Integer = 0 To _ prosessi.GetUpperBound(0) Try prosessi(i).Kill Catch ex As Exception End Try Next End If prosessi = Nothing Timer1.Start End Sub Sub MainFormFormClosed( _ sender As Object, e As FormClosedEventArgs) End End Sub Sub MainFormFormClosing( _ sender As Object, e As FormClosingEventArgs) Me.Dispose End Sub End Class
Aihe on jo aika vanha, joten et voi enää vastata siihen.