Autor Beitrag
Gobbles
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mo 24.12.12 16:37 
Tach,

ich bin Aktuell dabei mir in C# mithilfe des WebBrowsers einen eigenen Browser zu schreiben, scheitere jedoch an den Cookies. Da es mein erster Versuch überhaupt ist mit dem WebBrowser in irgendeiner Form was anzufangen, liegen meine Erfahrungen so ziemlich bei 0.
Außer den knapp 40 stunden, die ich die letzten 3 Tage mit Büchern und Google rumgeschlagen habe.

Beispiel anhand meines Browsergames:

Wenn ich unter Opera meine Cookies auslese werden mir folgende aufgelistet

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
Server: www.galaxy-network.net
Name: gn_session_r_speed
Wert: xxxxxxxxxxxxxxxxxxxx
Läuft ab: 2013-11_19 @ 17:42:52
Zuletzt aufgerufen: 2012.12.24 @ 14:09:44
Sicher: Nein
Nur an Ersteller gesendet: Ja
Version: 0 


Server: www.galaxy-network.net
Name: PHPSESSID
Wert: xxxxxxxxxxxxxxxxxxxxxx
Läuft ab: 
Zuletzt aufgerufen: 2012.12.24 @ 14:09:44
Sicher: Nein
Nur an Ersteller gesendet: Ja
Version: 0

Server: www.galaxy-network.net
Name: Runde
Wert: xxxxxxxxxxxxxxxxxxxxxx
Läuft ab: 
Zuletzt aufgerufen: 2012.12.24 @ 14:09:44
Sicher: Nein
Nur an Ersteller gesendet: Ja
Version: 0 

Server: www.galaxy-network.net
Name: Username
Wert: xxxxx
Läuft ab: 
Zuletzt aufgerufen: 2012.12.24 @ 14:09:44
Sicher: Nein
Nur an Ersteller gesendet: Ja
Version: 0

Server: www.galaxy-network.net
Name: Password
Wert: xxxxx
Läuft ab: 
Zuletzt aufgerufen: 2012.12.24 @ 14:09:44
Sicher: Nein
Nur an Ersteller gesendet: Ja
Version: 0

Server: www.galaxy-network.net
Name: login_session_id
Wert: xxxxx
Läuft ab: 
Zuletzt aufgerufen: 2012.12.24 @ 14:09:44
Sicher: Nein
Nur an Ersteller gesendet: Ja
Version: 0

Server: www.galaxy-network.net
Name: Access
Wert: full
Läuft ab: 
Zuletzt aufgerufen: 2012.12.24 @ 14:09:44
Sicher: Nein
Nur an Ersteller gesendet: Ja
Version: 0


Server: www.galaxy-network.net
Name: Userid
Wert: xxxxx
Läuft ab: 
Zuletzt aufgerufen: 2012.12.24 @ 14:09:44
Sicher: Nein
Nur an Ersteller gesendet: Ja
Version: 0


Server: www.galaxy-network.net
Name: Bilder_Pfad
Wert: http%3A%2F%2Fwww.galaxy-network.net%2Fgrapak%2F
Läuft ab: 
Zuletzt aufgerufen: 2012.12.24 @ 14:09:44
Sicher: Nein
Nur an Ersteller gesendet: Ja
Version: 0


Für einen simplen Test spezifisch für die Page sah man Code wie folgt aus:

ausblenden C#-Quelltext
1:
2:
3:
4:
            CookieContainer cookiecon = new CookieContainer();
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.galaxy-network.net");
            cookiecon = request.CookieContainer;
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();


Zu bedauern kann ich keinen der oben aufgelisteten Cookies auslesen oder ich bin schlicht zu doof Überblick in den Variablen request/response zu haben.

Natürlich habe ich über den Webbrowser die Seite geöffnet und es sowohl im eingeloggten zustand als auch im Login-Screen getestet.
Auch andere Urls wie "http://www.galaxy-network.net/game/login.php" welche direkt zum Login verlinkt sowie "http://www.galaxy-network.net/game/login.php?action=dologin" welche ausgerufen wird beim Betätigen des Einlog-Buttons, als auch der ingame Link "http://www.galaxy-network.net/game/?action=internalFrameset" führten zu keinen Ergebnis.

Kurzzeitig kam ich auf PHPSESSID was aber durch wiederholtes Umschreiben, sowie hier und dort Testen, habe ich es wohl erneut irgendwie zu nichte gemacht :(
Da es ein Aufgeben nicht gibt bei mir, ich aber langsam mit meiem Latain am ende bin, hoffe ich hier Hilfe zu finden =)

Falls noch irgendwelche Informationen fehlen sollten lasst es mich Wissen ich werde mein Möglichstes tun diese schnelltens nachzureichen =)

Mit freundlichen Grüßen
Gobbles

Moderiert von user profile iconTh69: Beitragsformatierung überarbeitet: unnötige Zeilenumbrüche entfernt.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Chefentwickler
Beiträge: 20395
Erhaltene Danke: 2212

Win 10
C# (VS 2017)
BeitragVerfasst: Di 25.12.12 14:00 
Damit ich das richtig verstehe: Die oben genannten Cookies werden nicht erst beim Login gesetzt (den Du ja nicht durchführst!), sondern sollten sofort gesetzt werden, wenn ich nur die Seite aufrufe ohne eingeloggt zu sein?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Gobbles Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 25.12.12 16:58 
Hm, interessante Frage =)
die möglichkeit besteht das diese auch erst beim Login übermittelt werden.
Da Klemme ich mich direkt mal dahinter und versuche das passende zu finden.
Vielen dank für den Denkanstoß.
Wie gesagt hab damit recht wenig erfahrung bis jetzt und
das ganze war ja eher als Beispiel vorgesehen. Später sollte es wenn es mal Fertig wird
schliesslich als Browser dienen der mit allen Seiten und arten von Cookies klar kommt.
Gobbles Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 25.12.12 23:38 
Habe meinen Code jetzt mal wie folgt geändert:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
            CookieContainer cookiecon = new CookieContainer();
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.galaxy-network.net");
            request.Method = "POST";
            request.CookieContainer = cookiecon;

            Stream PostData = request.GetRequestStream();
          
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream Answer = response.GetResponseStream();
            StreamReader _Answer = new StreamReader(Answer);
            response.Close();


mit dem Resultat ich bekomme wieder den Cookie der PHPSESSID,jedoch fehlen mir noch jegliche andere Cookies
User, Pass, Runde, gn_session, login_session_id, Acces, UserID, Bild_Pfad wie im erten Beitrag oben aufgelistet

Hoffe da kann mir wer Helfen drehe mich nun seit guten 10 stunden im Kreis :/

MfG Gobbles
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Chefentwickler
Beiträge: 20395
Erhaltene Danke: 2212

Win 10
C# (VS 2017)
BeitragVerfasst: Di 25.12.12 23:41 
Du loggst Dich doch immer noch nicht ein. Woher sollen denn z.B. Username und Passwort kommen?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Gobbles Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 26.12.12 02:08 
Dann verrate mir doch Bitte wie das mit dem Einloggen geht. Ich mein das soll ja ein Bowser werden
und mein Opera bekommt ja die Cookies auch einfach wenn ich auf den Loginbutton klicke auf der
Homepage.
Wie gesagt ich hab noch nie mit dem WebBrowser gearbeitet und bin erst seit guten 6Tagen dabei mich
dort einzulesen.
Und das soll ja nicht nur für die Homepage funktionieren sondern später mal für alle möglichen.
Das heißt fix Username und Passwort im Programm zu hinterlegen für nen Login ist ja dann der Falsche ansatz,
müsste ja die Textfelder irgendwie auslesen und die können ja auf Unterschiedlichen Homepages auch
unterschidliche ID/Namen haben oder seh ich da was falsch?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Chefentwickler
Beiträge: 20395
Erhaltene Danke: 2212

Win 10
C# (VS 2017)
BeitragVerfasst: Mi 26.12.12 02:15 
Du musst die Daten, die der Benutzer Deines Browsers in die Textfelder für den Login eingibt, per POST an den Server senden, wenn Du das Login-Skript aufrufst.

Für den Anfang, so lange der Benutzer noch nichts eingeben kann, kannst Du natürlich Daten einfach mal in Deinem Quelltext hinterlegen und diese dann per POST übertragen.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Gobbles Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 26.12.12 02:25 
Okay danke schonmal =)
nun weiß ich nach was ich in meinen Büchern/google mal wieder zu suchen hab.
Gobbles Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 26.12.12 14:02 
Tach,
leider bringt mir das ganze Einlesen in die Materie irgendwie nichts, ich komme einfach nicht dahinter wie das mit dem Login funktionieren könnte.
Ich bitte eigentlich ungern um Hilfe und bringe es mir gern selbst bei, mit den nötigen Anstupsern auf was man achten sollte.
Insofern fande ich es bis heirher völlig in Ordnung. Jedoch wäre es sehr freundlich wenn mir doch wer an nem Code-Beispiel den Login via Post zeigen
könnte.

MfG Gobbles
Gobbles Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 26.12.12 21:00 
so weitere 6h an dem einen .... hin und her geschrieben

sieht jetzt wie folgt aus

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
                webBrowser1.Navigate(new Uri("http://www.galaxy-network.net"));
                string host = "www.galaxy-network.net";
                string post = "&nick=test&pw=123";
                CookieContainer cookiecontain = new CookieContainer();
                CookieCollection cookiecoll = new CookieCollection();

                HttpWebRequest request1 = (HttpWebRequest)HttpWebRequest.Create("https://www.galaxy-network.net/login.php");
                request1.Method = "POST";
                request1.Host = host;
                request1.ContentType = "application/x-www-form-urlencoded";
                
                
                request1.CookieContainer = new CookieContainer();
                request1.CookieContainer = cookiecontain;
                request1.CookieContainer.Add(cookiecoll);
                ASCIIEncoding encoding = new ASCIIEncoding();
                byte[] loginDataBytes = encoding.GetBytes(post);
                request1.ContentLength = loginDataBytes.Length;
 
                Stream stream = request1.GetRequestStream(); // <<<<-------------------------------------
                stream.Write(loginDataBytes, 0, loginDataBytes.Length);
                stream.Close();

                HttpWebResponse response = (HttpWebResponse)request1.GetResponse();
                StreamReader sr = new StreamReader(response.GetResponseStream());
                string html = sr.ReadToEnd();
                sr.Close();
                cookiecontain.Add(response.Cookies);
                cookiecoll.Add(response.Cookies);
                response.Close();
                return html;


leider wirft er mir an der mit dem Pfeil markierten stelle beim Debuggen ein Fehler an den Kopf
"Die Verbindung mit dem Remoteserver kann nicht hergestellt werden."

bzw ist mein Ansatz denn nun wenigstens richtig?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Chefentwickler
Beiträge: 20395
Erhaltene Danke: 2212

Win 10
C# (VS 2017)
BeitragVerfasst: Mi 26.12.12 21:29 
Der Ansatz sieht zwar so aus, als wären da ein paar Dinge drin, die man nicht braucht, aber die scheint zu stimmen. In meiner lokalen Version der Entwickler-Ecke kann ich mich hiermit einloggen:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
            var domain = "http://testing/";
            var script = "login.php";

            var username = "Christian S.";
            var password = "verrateichnicht";
            var postData = String.Format("login=login&username={0}&password={1}", username, password);
            var postDataBytes = (new ASCIIEncoding()).GetBytes(postData);

            var cookieContainer = new CookieContainer();

            
            var request = (HttpWebRequest)WebRequest.Create(domain + script);

            request.CookieContainer = cookieContainer;
            request.Method = "POST";
            request.ContentLength = postDataBytes.Length;
            request.ContentType = "application/x-www-form-urlencoded";
            request.AllowAutoRedirect = true;

            var requestStream = request.GetRequestStream();
            requestStream.Write(postDataBytes, 0, postDataBytes.Length);

            var response = (HttpWebResponse) request.GetResponse();

            using (var sr = new StreamReader(response.GetResponseStream()))
                webBrowser1.DocumentText = sr.ReadToEnd();

            foreach(Cookie cookie in response.Cookies)
            {
                textBox1.Text += cookie.Name + " = " + cookie.Value + Environment.NewLine;
            }

Dann wird die Seite im WebBrowser-Element angezeigt und in der Textbox werden die Cookies angezeigt.


Der Fehler bei Dir könnte sein, dass den HttpWebRequest mit einer SSL-URL erstellst, dann aber den Host neu setzt und somit keine SSL-URL mehr aufrufst.

Grüße,
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Gobbles Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 26.12.12 21:40 
Ich habe eben mal mit einem Sniffing-tool den Loginvorgang überprüft und dabei ist mir aufgefallen, dass mein pw dort Verschlüssel zu schein scheint.
Password:d0fb44e6a77ebfa216e1c8a7b2cad003 des weiteren bin ich mir auch nicht sicher wie die Logindaten übermittelt werden, da beim Login
Speziell auf der Hp jetzt auch noch die Runde mitübergeben wird. Aus dem Quelltext der Homepage kann ich das aber schlecht erkennen, da ich weniger Ahnung von html habe
kenne nur dezente Basics.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Chefentwickler
Beiträge: 20395
Erhaltene Danke: 2212

Win 10
C# (VS 2017)
BeitragVerfasst: Mi 26.12.12 21:45 
user profile iconGobbles hat folgendes geschrieben Zum zitierten Posting springen:
Aus dem Quelltext der Homepage kann ich das aber schlecht erkennen, da ich weniger Ahnung von html habe
kenne nur dezente Basics.
Entschuldige, wenn ich das mal so frei heraus und direkt frage: Aber wie kommst Du dann auf die Idee, einen Browser schreiben zu wollen? Das macht doch überhaupt keinen Sinn ...

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Gobbles Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 26.12.12 22:00 
Gute frage nächste bitte... wollte einfach mal wieder was Coden und nach meinem grafischen Taschenrechner einigen Spielen wie Ttetris Bomberman etc ist
mir einfach die Idee des Browsers gekommen da ich zufällig WebBrowser in den Tools gefunden habe und das ganz spannend fand =)
Gobbles Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 26.12.12 22:54 
So habe nun auchmal dein Code für benutzt natürlich urls abgeändert jedoch gibt auch das mir nur die PHPSESSID als Cookie aus.
Jegliche anderen fehlen mir nochimmer

Hatte da nur ne kleine zwischenfrage undzwar die Zeile hab ich wie folgt editiert:

für username: natürlich mein nick.
Das Passwort habe ich nun direkt mal in der codiertenform angegeben wie ich es aus den Cookies meines Brwoser,
ebso den wert der runde r_speed

ausblenden C#-Quelltext
1:
var postData = String.Format("login.php?action=dologin&nick={0}&pw={1}&runde={2}", username, password, runde);					


Aus dem Quellcode der Hp konnte ich folgendes entnehmen

ausblenden HTML-Dokument
1:
<td height="93" background="images/login/login_main_bg.gif" valign="middle" align="center"><form name="form1" method="post" action="login.php?action=dologin">					


ausblenden HTML-Dokument
1:
2:
3:
4:
<input type="text" name="nick" size="20">
<input type="password" name="pw" size="20">
<select name="runde"><option value="r_speed" SELECTED>
<input type="submit" name="todo" value="Einloggen" class="button">


die TD/TR dinger dazwischen hab ich ma weggelassen sind ja Unrelevant
Gobbles Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Do 27.12.12 15:04 
Tach,

hiermal ein kurzeres Status update.

Mithilfe des Tools "HTTP Analyzer" konnte die POST beim einloggen verfolgen welcher wie Folgt ausschaut:

an die URL:
ausblenden HTML-Dokument
1:
http://www.galaxy-network.net/game/login.php?action=dologin					

wird der POST:
ausblenden HTML-Dokument
1:
nick=test&pw=123%21&runde=r_speed&todo=Einloggen&strCheckMe=272d89c2f2&strLogReferer=http%3A%2F%2Fwww.galaxy-network.net%2F&strLogRealIP=NoJava&strLogResolution=1920x1080&strLogColorDepth=32&strLogWindowSize=1887x830&strLogBrowserLanguage=de					

gesendet.

Mein C#-Code habe ich daraufhin angepasst:

die postData Variable beinhaltet beim Debuggen wie es scheint auch den richtigen Inhalt:
ausblenden C#-Quelltext
1:
postData = "?action=dologin&nick=test&pw=123%21&runde=r_speed&todo=Einloggen&strCheckMe=25b6a72e4e&strLogReferer=http%3A%2F%2Fwww.galaxy-network.net%2F&strLogRealIP=NoJava&strLogResolution=1920x1080&strLogColorDepth=32&strLogWindowSize=983x800&strLogBrowserLanguage=de"					


ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
var domain = "http://www.galaxy-network.de/";
            var script = "game/login.php";
            string nick = webBrowser1.Document.GetElementById("nick").GetAttribute("value");
            string pw = "123%21";
            //string pw = webBrowser1.Document.GetElementById("pw").GetAttribute("value");
            string runde = webBrowser1.Document.GetElementById("runde").GetAttribute("value");
            string todo = webBrowser1.Document.GetElementById("todo").GetAttribute("value");
            string checkme = webBrowser1.Document.GetElementById("strCheckMe").GetAttribute("value");
            string strLogReferer = "http%3A%2F%2Fwww.galaxy-network.net%2F";
            //string strLogReferer = webBrowser1.Document.GetElementById("strLogReferer").GetAttribute("value");
            string strLogRealIP = webBrowser1.Document.GetElementById("strLogRealIP").GetAttribute("value");
            string strLogResolution = webBrowser1.Document.GetElementById("strLogResolution").GetAttribute("value");
            string strLogColorDepth = webBrowser1.Document.GetElementById("strLogColorDepth").GetAttribute("value");
            string strLogWindowSize = webBrowser1.Document.GetElementById("strLogWindowSize").GetAttribute("value");
            string strLogBrowserLanguage = webBrowser1.Document.GetElementById("strLogBrowserLanguage").GetAttribute("value");

            var postData = String.Format("?action=dologin&nick={0}&pw={1}&runde={2}&todo={3}&strCheckMe={4}&strLogReferer={5}&strLogRealIP={6}&strLogResolution={7}&strLogColorDepth={8}&strLogWindowSize={9}&strLogBrowserLanguage={10}",nick, pw, runde, todo, checkme, strLogReferer, strLogRealIP, strLogResolution,strLogColorDepth,strLogWindowSize,strLogBrowserLanguage);
            //var postDataBytestest = (new UTF8Encoding()).GetBytes(postData);
            var postDataBytes = (new ASCIIEncoding()).GetBytes(postData);

            var cookieContainer = new CookieContainer();


            var request = (HttpWebRequest)WebRequest.Create(domain + script);

            request.CookieContainer = cookieContainer;
            request.Method = "POST";
            request.ContentLength = postDataBytes.Length;
            request.ContentType = "application/x-www-form-urlencoded";
            request.AllowAutoRedirect = true;

            var requestStream = request.GetRequestStream();
            requestStream.Write(postDataBytes, 0, postDataBytes.Length);

            var response = (HttpWebResponse)request.GetResponse();

            using (var sr = new StreamReader(response.GetResponseStream()))
                webBrowser1.DocumentText = sr.ReadToEnd();

            foreach (Cookie cookie in response.Cookies)
            {
                MessageBox.Show(cookie.Name + " = " + cookie.Value + Environment.NewLine);
            }


Die Variablen pw/strLogReferer habe ich mal Manuell gesetzt da beim auslesen aus der HP
die werte pw="123!" sowie strLogReferer ="http://www.galaxy-network.net/" waren.
Welche ja nicht dem POST den ich mitloggen konnte entsprachen (pw="123%21 / strLogReferer ="http%3A%2F%2Fwww.galaxy-network.net%2F")

Leider das ganze wieder ohne nennenswerte Ergebnise lediglich wie schon zuvor gibt es mir nur die PHPSESSID als cookie zurück.
Da ich mir nun doch auch HTML angeschaut habe meine Frage ob es daran liegen könnte das einige Werte als hidden parameter
übergeben werden? Oder muss ich ggfs. noch die Adresse abfangen welche nach dem Login aufgerufen wird?

Ich kann nur hoffen das wenn es mal mit dieser einen Seite funktioniert es bei der Automatisierung nicht genau so los geht *gg*

MfG Gobbles