Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: [VB.NET] Ohjelman avaamisen estäminen

Sivun loppuun

Short Php [27.10.2008 18:20:09]

#

Onko mitenkään mahdollista tehdä jonkunlaista ohjelmaa, joka estäisi jonkun toisen ohjelman avaamisen. Haxhax..

erkkipetteri [27.10.2008 18:43:35]

#

Tutki loopissa onko ohjelman prosessi(CreateToolHelpSnapshot?) tai ikkuna(FindWindow) auki ja lopeta ohjelma?

neau33 [27.10.2008 19:14:21]

#

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
'...

Short Php [27.10.2008 19:26:22]

#

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

neau33 [27.10.2008 21:40:13]

#

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
'...

Deffi [28.10.2008 03:16:52]

#

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...

ville-v [28.10.2008 07:47:33]

#

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.

neau33 [28.10.2008 10:05:20]

#

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

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta