Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Pakettien lähetys prosessin käyttämään serveriin (VB.NET)

JussiR [16.12.2008 09:49:20]

#

Onko VB6:lla mahdollista saada ilman ylimääräisiä kirjastoja tietoon tietyn prosessin (esim. java.exe) käyttämä etä-ip ja käytössä oleva Socket ID johon/josta tämä prosessi lähettää ja vastaanottaa dataa?
Ja lähettää sinne winsockilla paketteja?

Jos tiedätte ohjelman Wpe Pro.. Eli Winsock Packet Editor joka on myös packet sniffer ja jolla voi myös lähettää paketteja. Haluaisin tehdä ohjelman jolla voi tehdä scriptin lähetettävistä paketeista, koska Wpe Pro:ssa voi tehdä vain lähetyslistan, jotka kaikki lähtee saman intervallin välein.
Eli en siis tarvitse muita ominaisuuksia kuin sen, että pystyn lähettämään
serveriin, jonka kanssa prosessi on yhteydessä, paketteja (samalla tavalla kuin prosessoir (client) sen lähettäisi, eli niin ettei serveri blockaa sitä (sama Socket ID).)

Toivottavasti joku ymmärtää mitä tarkoitan, vaikea selittää kun en osaa käyttää winsockia niin hyvin :D

PS: En tiedä mitä socket ID tarkoittaa..

Deffi [16.12.2008 16:41:46]

#

Et pysty Visual Basicilla.

Oon kyllä joskus miettiny voiko noita socketteja kopioida prosessien välillä. "Tietoturvan" kannalta se olis vähän huono, ja siitä vois seurata ongelmia jos sitä käyttäis kaks prosessia samaan aikaan. En jaksanu asiaa kuitenkaan ruveta tutkimaan, että kertokoon joku joka oikeesti tietää jotain. Joka tapauksessa et sais VB:llä sitä socketin id:tä selville (ainakaan fiksusti).

JussiR [16.12.2008 17:09:10]

#

Kuinkahan vaikea se olis toteuttaa WinPCapin kanssa?

Deffi [16.12.2008 18:36:05]

#

WinPCap ei pysty kaappaamaan tietyn prosessin verkkoliikennettä, vaan samalla tulee kaikki mitä käyttöjärjestelmä lähettää tai vastaanottaa. Kannattaisi tehdä samalla tavalla kuin WPE Pro tekee, eli siis hookata sen yksittäisen prosessin ws2_32.dll:stä send()- ja recv()-funktiot. Viestien lähettämiseksi tarvitsee luoda oma thread java.exeen, joka sitten käyttää sitä socketia. Visual Basicilla hookkien kirjoittaminen ei niin vain taida onnistua, kun se on sen verran riippuvainen msvbvm60.dll:istä sun muista.

neau33 [23.12.2008 01:38:39]

#

Moikka taas JussiR!

VB6:lla on mahdollista saada tietoon tietyn prosessin Remote IP/Network Socket ID...mutta jutska vaatii aivan ylettömän extreme'ä WMI/API-vääntöä...sensijaan VB.NET tai paremminkin .NET Framework tarjoaa (System.Net, System.Net.Sockets, System.Net.NetworkInformation...jne.) lähes kaikken unelmoitavissa olevan...
Tämän lisäksi löytyy vielä .NET Framework-extramukavuus elikä ComVisible-ominaisuus, joka mahdollistaa .NET kirjastojen käytön myös esim. VB6-ohjelmissa tai vaikkapa VBA-makroissa...
tässä pieni esimerkki dll-funkkarista:

' Luo Class Library projekti: GetEverythingYouNeed
' Luo projektiin luokka: FromTheNetwork
' HUOM! Vaihda Class1.vb tai NewClass.vb nimeksi: FromTheNetwork.vb
' ja lisää projektiin GAC:sta erikseen referenssi: System.Net

Imports System
Imports System.Net
Imports System.Net.NetworkInformation

Imports System.Runtime.InteropServices
<ClassInterface(ClassInterfaceType.AutoDual)> _
<ComVisible(True)> _
<ProgId("GetEverythingYouNeed.FromTheNetwork")> _
Public Class FromTheNetwork
	Friend InfoStr As String = String.Empty

   <ComVisible(True)> _
   Public Function GetAddress() As String
   Dim properties As IPGlobalProperties = _
      IPGlobalProperties.GetIPGlobalProperties()
      InfoStr += "Computer name: " + properties.HostName.ToString
      InfoStr += Environment.NewLine
      InfoStr += "Domain name:   "  + properties.DomainName.ToString
      InfoStr += Environment.NewLine
      InfoStr += "Node type:     " + properties.NodeType.ToString
      InfoStr += Environment.NewLine
      InfoStr += "DHCP scope:    " + properties.DhcpScopeName.ToString
      InfoStr += Environment.NewLine
      InfoStr += "WINS proxy:    " + properties.IsWinsProxy.ToString

      InfoStr += Environment.NewLine+ Environment.NewLine

      Dim Interfaces As NetworkInterface() = _
      NetworkInterface.GetAllNetworkInterfaces

      Dim iface As Object

      For Each iface In Interfaces
         GetIPAddresses(iface.GetIPProperties)
      Next

      Return InfoStr: InfoStr = Nothing

   End Function

   Private Sub GetIPAddresses( _
   ByVal adapterProperties As IPInterfaceProperties)

      Dim dnsServers As IPAddressCollection  = _
      adapterProperties.DnsAddresses

      If Not dnsServers Is Nothing Then
            For Each dns As System.Net.IPAddress in dnsServers
                  InfoStr += "DNS Servers ......................... : " _
                  + dns.ToString + Environment.Newline
            Next
      End If

      Dim anyCast As IPAddressInformationCollection = _
      adapterProperties.AnycastAddresses

      If Not anyCast Is Nothing Then

            For Each any as IPAddressInformation in anyCast

                  InfoStr +=  "Anycast Address ....................... : " _
                  +  any.Address.ToString  + Environment.Newline _
                  +  "Transient: " + any.IsTransient.ToString _
                  +  Environment.Newline _
                  +  "DNS Eligible: " + any.IsDnsEligible.ToString _
                  +  Environment.Newline
            Next
      End If

      Dim multiCast  As MulticastIPAddressInformationCollection = _
      adapterProperties.MulticastAddresses

      If Not multiCast Is Nothing Then

            For Each multi As IPAddressInformation in multiCast

                  InfoStr += "Multicast Address ................... : " _
                  +  multi.Address.ToString _
                  +  Environment.Newline _
                  + "Transient: " + multi.IsTransient.ToString _
                  +  Environment.Newline _
                  + "DNS Eligible: " + multi.IsDnsEligible.ToString _
                  +  Environment.Newline
            Next
      End If

      Dim uniCast As UnicastIPAddressInformationCollection = _
      adapterProperties.UnicastAddresses

      If Not uniCast Is Nothing Then

         Dim lifeTimeFormat As String  = _
         "dddd, MMMM dd, yyyy  hh:mm:ss tt"

         For Each uni As UnicastIPAddressInformation in uniCast

            Dim xwhen As DateTime

            InfoStr += "Unicast Address ..................... : " _
            + uni.Address.ToString  +  Environment.Newline _
            +         "Prefix Origin ....................... : " _
            +  uni.PrefixOrigin.ToString  +  Environment.Newline _
            +         "Suffix Origin ....................... : " _
            + uni.SuffixOrigin.ToString  +  Environment.Newline _
            +         "Duplicate Address Detection ......... : "  _
            + uni.DuplicateAddressDetectionState.ToString _
            +  Environment.Newline

            xwhen = DateTime.UtcNow + _
            TimeSpan.FromSeconds(uni.AddressValidLifetime)
            xwhen = xwhen.ToLocalTime()
            InfoStr += "Valid Life Time ..................... : " _
            + xwhen.ToString(lifeTimeFormat, _
            System.Globalization.CultureInfo.CurrentCulture) _
            +  Environment.Newline

            xwhen = DateTime.UtcNow + _
            TimeSpan.FromSeconds(uni.AddressPreferredLifetime)
            xwhen = xwhen.ToLocalTime()
            InfoStr += "Preferred life time ................. : " _
            + xwhen.ToString(lifeTimeFormat, _
            System.Globalization.CultureInfo.CurrentCulture) _
            +  Environment.Newline

            xwhen = DateTime.UtcNow + _
            TimeSpan.FromSeconds(uni.DhcpLeaseLifetime)
            xwhen = xwhen.ToLocalTime()
            InfoStr +=  "DHCP Leased Life Time ............... : " _
            + xwhen.ToString(lifeTimeFormat, _
            System.Globalization.CultureInfo.CurrentCulture) _
            +  Environment.Newline
         Next

      End If

   End Sub

'*** ennen projektin kääntämistä:
' Valitse: Project -> Project Options
' Valitse välilehti: Signign
' Ruksaa: Sign the assembly
' Valitse pudotusvalikosta: Create
' Klikkaa: OK
' Tallenna ja käännä projekti...
End Class

AssemblyInfo.vb tiedoston pitäisi näyttää suurin piirtein seuraavanlaiselta
HUOM! luo uusi oma GUID GuidGen-apuohjelmalla, kopioi Windowsin leikepöydälle
(poista aaltosulkeet kun olet tuonut leikepöydältä AssemblyInfo-tiedostoon)

Imports System.Reflection
Imports System.Runtime.CompilerServices
Imports System.Runtime.InteropServices

<assembly: AssemblyTitle("GetEverythingYouNeed")>
<assembly: AssemblyDescription("")>
<assembly: AssemblyConfiguration("")>
<assembly: AssemblyCompany("")>
<assembly: AssemblyProduct("GetEverythingYouNeed")>
<assembly: AssemblyCopyright("Copyright 2008")>
<assembly: AssemblyTrademark("")>
<assembly: AssemblyCulture("")>
<assembly: ComVisible(True)>
<assembly: Guid("45802655-D603-495a-A35E-1F799AA9A641")>
<assembly: AssemblyVersion("1.0.0.0")>

Avaa Projektikansio ja siirry edelleen bin-kansioon...tarkista että kansiossa on tiedostot: GetEverythingYouNeed.dll & GetEverythingYouNeed.TLB
jätä bin-kansio avoimeksi avaa windowsin komentokehote...kirjoita komentokehotteeseen: CD ja välilyönti klikkaa hiiren oikealla projektin bin-kansion jotain tiedostoa ja valitse ominaisuudet, maalaa kohdan sijainti perästä: hakemistopolku harmaaksi, klikkaa harmaan alueen päällä hiiren oikealla ja valitse kopioi...
siirry takaisin komentokehote-ikkunaan, klikkaa ikkunassa hiiren oikealla, valitse liitä ja paina Enter-näppäintä...

HUOM! alla mainitut ohjelmat ovat .NET Framework-työkaluja ja ne toimivat suoraan mistä tahansa hakemistosta vain siinä tapauksessa, että Windowsin Ympäristömuuttajan path-asetuksissa on viittaus ao. hakemistoon (esim. C:\Program Files\Microsoft SDKs\Windows\v6.1\Bin mikäli Windows SDK for Windows Server 2008 and .NET Framework 3.5 on asennettu)

Jos tiedosto GetEverythingYouNeed.TLB löytyi voit jättää 1. kohdan väliin ja jatkaa kohdasta 2

1. Kirjoita komentokehotteeseen:
TlbExp GetEverythingYouNeed.dll /out: GetEverythingYouNeed.Tlb ja paina Enter-näppäintä...

2. Kirjoita komentokehotteeseen: gacutil /i GetEverythingYouNeed.dll ja paina Enter-näppäinta...

3. Kirjoita komentokehotteeseen:
ngen install GetEverythingYouNeed.dll ja paina taas Enter-näppäintä...nyt assembly on rekisteröity ja siitä on luotu samalla Native Image GAC:een (Global Assembly Cache)...

Testaus: Avaa esim. Excel/VB-Editori valitse Tools -> References -> Browse...siirry AddReference-Dialogin avulla .NET projektin bin-kansioon, tuplaklikkaa tiedoston GetEverythingYouNeed.TLB kuvaketta, klikkaa OK-painiketta, lisää VBA-projektiin UserForm, lisää formille nappi ja tekstiboxi, aseta tekstiboxin multline-arvoksi: True, ScrollBars-arvoksi: Vertical ja kirjoita nappulan Click_tapahtuman koodiksi:

Private Sub CommandButton1_Click()
   Private Sub CommandButton1_Click()
   Dim TheThing As New GetEverythingYouNeed.FromTheNetwork
   TextBox1.Text = TheThing.GetAddress()
   TextBox1.SetFocus
   TextBox1.SelStart = 0
End Sub

kun .dll jutskat on selvillä niin ala tutkimaan mitä kaikkea kivaa System.Net assembly kätkee taakseen...

JussiR [27.12.2008 18:06:59]

#

Kiitoksia jälleen kerran!
Pitäis kai siirtyä tuohon .NETtiin ja kokeilla tuota.

Vastaus

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

Tietoa sivustosta