Paketdaten in C# laden - Online Game

Paketdaten in C# laden - Online Game

Hallo Miteinander.

Bis jetzt sieht es folgender Maßen aus.

Ich habe ein Programm in C# programmiert, wo ich Daten vom Spiel per Hand eingeben kann und dieses Programm mir daraufhin, irgendwelche Berechnungen tätigt. (Genauere muss ich hier nicht ins Detail gehen. Geht um die Main Message)

Die Daten die ich für mein Tool benötige, werden nicht nur im Spiel normal angezeigt, sondern werden auch über Wireshark per TCP teilweise unverschlüsselt übertragen.
(Siehe Anhang)

Ich habe bereits mein Glück mit Wincap versucht, aber dafür reichen meine Programmierkenntnisse nicht aus! :/

MJSniffer sieht da schon etwas besser aus, aber damit sehe ich die Eigenschaften der Datenpakte -Length -Checksum etc. aber nicht die Daten im Detail.

Ein funktionierendes Projekt wäre nice, worin ich mir dann meinen C# Code von meinem TOOL selbst reinprog.

Bitte um Hilfe.
danke
Karli
 
Zuletzt bearbeitet:
wo genau kommst du nicht mit klar?


Mit der Thematik, ein C# Projekt zu finden , welches TCP Paketdaten empfängt und passend verarbeitet. Sodass ich die Infos zb. in String Arrays oder ähnlichem zur Verfügung gestellt bekomme.

ps. Ein paar Videos auf Youtube zum Thema "C# Netzwerkprogramming" machen aus mir bestimmt keinen Experten -.- also vollblut Anfänger. Aber vlt. kann ich mir den Aufwand ersparen, mich Monate bzw. über Jahre in diesen Teil der Programmierung einzulesen, da ich es nur einmal benötige.

mfg
Karl
 
Wenn ich das im Code richtig sehe (MJSniffer) dann werden dort die Daten die du benötigst schon mitgelesen aber nicht in dieser GUI mitangezeigt.

A Network Sniffer in C# - CodeProject

As an example of parsing the application layer protocols, the attached project can detect DNS packets as well.

Code:
 //If the port is equal to 53 then the underlying protocol is DNS
                    //Note: DNS can use either TCP or UDP thats why the check is done twice
                    if (tcpHeader.DestinationPort == "53" || tcpHeader.SourcePort == "53")
                    {
                        TreeNode dnsNode = MakeDNSTreeNode(tcpHeader.Data, (int)tcpHeader.MessageLength);
                        rootNode.Nodes.Add(dnsNode);
                    }

Die Data-Methode (in der TCPHeader-Klasse) ist das was du suchst. Diese Methode liefert dir die TCP-Daten als byte[]-Array zurück.

Code:
public byte[] Data
        {
            get
            {
                return byTCPData;
            }
        }

Edit:
Du kannst doch einfach mal den Code so umschreiben das in der Debug-Konsole die TCP-Daten ausgegeben bzw. die GUI so anpassen
das in der Tree auch die Daten angezeigt werden.
 
Zuletzt bearbeitet:
hab mal ein bischen rumgespielt...

Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using PcapDotNet.Core;
using PcapDotNet.Packets;
using System.Threading;

namespace HaboCaptureExample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        LivePacketDevice firstNetworkDevice;
        PacketCommunicator firstCom;
        Thread captureThread;
        private void Form1_Load(object sender, EventArgs e)
        {
            captureThread = new Thread(() => prepCapture());
            captureThread.Start();
        }

        private void prepCapture()
        {
            Thread.CurrentThread.IsBackground = true;
            firstNetworkDevice = LivePacketDevice.AllLocalMachine.First(x => !x.Attributes.HasFlag(DeviceAttributes.Loopback));
            firstCom = firstNetworkDevice.Open();

            using (BerkeleyPacketFilter filter = firstCom.CreateFilter("ip and tcp"))
            {
                firstCom.SetFilter(filter);
            }

            firstCom.ReceivePackets(-1, new HandlePacket(OnPacketReceived));

        }


        private void OnPacketReceived(Packet p) 
        {
            var raw = p.ToArray();
            var eth = p.Ethernet;
            var ipv4 = eth.IpV4;
            var source_ip = ipv4.Source.ToString();
            var destination_ip = ipv4.Destination.ToString();
            var tcp = ipv4.Tcp;

            var payload = tcp.Payload;

            if (checkForHaBo(payload, habo) || checkForHaBo(payload, http11))
            {
                this.Invoke(new Action(() => textBox1.AppendText(Encoding.ASCII.GetString(payload.ToArray()))));
            }
        }

        byte[] habo = Encoding.ASCII.GetBytes("www.hackerboard.de");
        byte[] http11 = Encoding.ASCII.GetBytes("HTTP/1.1");
        private bool checkForHaBo(Datagram payload, byte[] search)
        {
            var arr=payload.ToArray();

            for (int i = 0; i < arr.Length-search.Length; i++)
            {
                if (arr[i] == search[0])
                {
                    for (int j = 1; j < search.Length; j++)
                    {
                        if (arr[i + j] != search[j])
                            break;
                        if (j == search.Length - 1)
                            return true;
                    }
                }
            }

            return false;
        }

        #region designer
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.SuspendLayout();
            // 
            // textBox1
            // 
            this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
            | System.Windows.Forms.AnchorStyles.Left)
            | System.Windows.Forms.AnchorStyles.Right)));
            this.textBox1.Location = new System.Drawing.Point(12, 12);
            this.textBox1.Multiline = true;
            this.textBox1.Name = "textBox1";
            this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
            this.textBox1.Size = new System.Drawing.Size(583, 357);
            this.textBox1.TabIndex = 0;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(607, 381);
            this.Controls.Add(this.textBox1);
            this.Name = "Form1";
            this.Text = "Pcap.net Capture Example // [HaBo] hackerboard.de";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.TextBox textBox1;

        #endregion
    }
}
 
Sorry, dass ich mich erst jetzt wieder melde. Bei mir gings es in den letzten Tagen wirklich drunter und drüber..:/

Danke für eure Hilfestellungen! TCP_Data war wirklich schon im Programm sauber abrufbar reinprogrammiert. Dies habe ich nun über ein Label ausgegeben.

lg
karli
 
Guten Abend liebe Community

In der folgenden Funktion, schreibe ich die tcp.Header.Data auf ein String.

Wie man sieht, habe ich auch die Ausgabe auf den Treeview ausdeklariert, da ich dies nicht benötige. Das habe ich auch in den anderen Funktionen gemacht!

Die Abfrage, ob in einem Paket ein definiertes Wort enthalten ist, hat zur Folge, einen bestimmten Code auszuführen. Siehe Abfragen "WORT1" usw.
Das klappt auch so in 99% der Fälle. Jedoch kann es ab und zu passieren, das obwohl das OnlineGame ein Paket mit einem bestimmten Wort sendet, das Programm dieses nicht erkennt und folglich nicht in die If-Verzweigung hineingeht.

Die Pakete werden teilweise sehr schnell hintereinander vom Client geschickt, aber wieso erkennt er dann die anderen 99% ?
Ich habe auch schon versucht, die IP des OnlineGames als Filter zu programmieren, leider vergebens. Um so vlt. das Tool "MJSniffer" nicht zu sehr auszulasten.

Danke schon mal für eure Hilfestellungen!

Ps. Anfangs war die Häufigkeit der nicht erkannten Pakete etwas größer. Das beenden der Firewall und des AntiViren Programms haben hier schon sehr viel Abhilfe geschaffen, jedoch noch nicht ganz.

Grüße
Karli
 
punkt 1:
wenn du code anhängst, dann nicht als bild, sondern als kopierbaren text

keiner hier hat lust deinen kram abzutippen wenn man damit in einen debugger will

punkt 2:
wenn du code anhängst, dann hänge den code an der ein minimalbeispiel deines problems zeigt

der von dir angehängte code ausschnitt mag zwar der sein wo du dein problem vermutest, aber dieser ausschnitt ist gelinde gesagt müll... alleine ist er nicht lauffähig, und der relevante rest um dafür eine fundierte aussage treffen zu können fehlt.

punkt 3:
wer sagt dir dass der paket inhalt ein string ist? du wandelst nach string ohne zu wissen was du da umwandelst ... was wenn da null bytes drin sind?
 
Ich habe mich nun durchgerungen, das Buch "C# lernen und professionell anwenden" von Ulla Kirch, durchzulesen.
Da mir im Bezug auf Klassen Programmierung, sehr viel Wissen fehlt.

Ich werde versuchen, nochmal selbst einen IP-Filter zu bauen, bevor ich nochmal einfach so hier im Forum, drauf los tip und ggf. unnötige Threads eröffne.

Danke für die Tips im Bezug auf Thread-Erstellung und der richtigen Schilderung von Problemen.

Ich werde mich bei Fragen melden.

vielen dank.
mfg
Karli
 
Zurück
Oben