[C#.NET] Internet Explorer BHO HTTP headers

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 20-09 16:31
Ik ben momenteel bezig met een internet explorer extension / plugin (BHO dus).
Voor het correct laten functioneren van mijn BHO moet ik de HTTP(S) headers uitlezen.

Ik ben sinds gister al op google aan het zoeken (vast niet goed genoeg :p), maar ik kan er helemaal niets over vinden. Wel heb ik een plugin genaamd "DebugBar" voor IE gedownload, deze toont de HTTP(S) headers, dus ik weet dat het kan.
Waarschijnlijk moet het ergens in de "NavigateComplete2" event gebeuren, aangezien bij de "BeforeNavigate2" nog geen headers verzonden zijn lijkt mij.

Kan iemand van jullie mij op weg helpen? Het betreft hier dus een C# DLL in de vorm van een IE BHO; ik maak gebruik van SHDocVw.dll en mshtml.dll.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het is een tijd geleden dat ik wat met een BHO gedaan heb, maar kun je bij een NavigateComplete2 niet gewoon de HttpRequest opvragen en daarbij dus ook de Headers?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 20-09 16:31
Bedankt voor je antwoord.
Voor zover ik weet is de HttpRequest een classe in de "System.Web" package.

Hoe kan ik deze klasse gebruiken i.c.m. mijn IWebBrowser2? Heb de documentatie er ook al op nageslagen, maar bij dit object zit ook geen HttpRequest ofzo.

Any help?

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Nee het zal dan eerder iets van IHttpRequest2 heten, maar zoals ik al zei is het lang geleden dat ik er iets mee gedaan heb. Maar er zal toch wel ergens een property zijn om de HttpRequest te accessen?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 13-09 16:51

http://hawvie.deviantart.com/


Acties:
  • 0 Henk 'm!

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 20-09 16:31
Nou, ik heb alle properties al 30x nagelopen, maar ik zie er niets tussen zitten wat ook maar íets met een http request of response te maken zou hebben.

Het is erg frusterend, want ik weet dat het mogelijk is (debugbar doet precies wat ik wil), ik kan alleen geen oplossing vinden.
Het moet toch ook niet zo moeilijk zijn om de HTTP headers op te vragen? :S
Bedankt, maar de 2e link is een C++ applicatie, die expliciet een request doet naar de opgegeven URL. Op die manier kan ik het in C# ook wel voor elkaar krijgen, maar dan heb ik 2 requests (ik heb namelijk al de "originele" request; daar wil ik de headers van krijgen).
1e link ben ik nu aan het doorspitten.

[ Voor 43% gewijzigd door aaajeetee op 04-03-2009 09:11 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Dat is door gewoon zelf een HTTP request naar een server te doen. Daar heeft hij in dit geval niet zoveel aan.

Ik heb even in de docs gekeken en kan het inderdaad ook niet vinden. Bij het BeforeNavigate2 event krijg je wel de headers mee, maar bij het NavigateComplete2 event inderdaad niet. En ik zie ook nergens hoe je de stream of de headers kunt achterhalen. Mischien moet je even contact openemen met de maker van DebugBar.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 20-09 16:31
Woy schreef op woensdag 04 maart 2009 @ 09:15:
[...]

Dat is door gewoon zelf een HTTP request naar een server te doen. Daar heeft hij in dit geval niet zoveel aan.

Ik heb even in de docs gekeken en kan het inderdaad ook niet vinden. Bij het BeforeNavigate2 event krijg je wel de headers mee, maar bij het NavigateComplete2 event inderdaad niet. En ik zie ook nergens hoe je de stream of de headers kunt achterhalen. Mischien moet je even contact openemen met de maker van DebugBar.
Klopt, en de variabele Headers bij de BeforeNavigate2 is ook leeg (vrij logisch, er zijn nog geen headers verzonden).
Zal eens kijken of ik contact kan krijgen met de maker van debugbar.

Acties:
  • 0 Henk 'm!

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 20-09 16:31
Net contact gehad met de maker. Ging erg snel en is een aardige meneer.
Hi,

You will need to implemented an asynchronous pluggable protocol :

http://msdn.microsoft.com/en-us/library/aa767743(VS.85).aspx

A sample can be found here :

http://groups.google.com/...sg/76bf4910a289d4b3?pli=1

Note that this method won’t work all the time. If another plug-in is installing an APP, your app won’t receive notifications anymore so you won’t get http headers anymore. So this method is not reliable for a production version of a plugin.

Another solution is to implement a socket sniffer engine.

Best Regards / Cordialement
Voorbeeld doet het in ieder geval (al) niet, zal eens gaan kijken of dit iets is.

Acties:
  • 0 Henk 'm!

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 20-09 16:31
Heb verder contact met de maker gehad, blijkt dat hij in C++ programmeert en ik in C#.

Ik heb nog een oplossing in m'n hoofd om de huidige (echte) request te cancelen en zelf een request te maken middels WebRequest (daar zijn de headers volgens mij wel van op te vangen).

Kan iemand mij verder nog helpen? Ik weet dat dit geen 'u vraagt wij doen'-helpdesk is, maar ik ben al sinds vorige week bezig en zie het op dit moment even somber in.

Acties:
  • 0 Henk 'm!

  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 13-09 16:51
aaajeetee, waarom heb je de headers eigenlijk nodig? Misschien dat er meerdere wegen leiden naar je doel? :)

http://hawvie.deviantart.com/


Acties:
  • 0 Henk 'm!

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 20-09 16:31
HawVer schreef op dinsdag 10 maart 2009 @ 11:05:
aaajeetee, waarom heb je de headers eigenlijk nodig? Misschien dat er meerdere wegen leiden naar je doel? :)
Heb ik ook aan zitten denken. Ik heb namelijk alle url's nodig die 'onderweg' gebruikt zijn.
Dus: ik ga naar 1.php, die gaat via een header-location naar 2.php, die gaat via een header-location naar 3.php en 3.php gaat naar 4.php (via header-location).
Iets als dit dus:
1.php -> 2.php -> 3.php -> 4.php.

Ik heb in mijn BHO nu de "BeforeNavigate2" en "NavigateComplete2" methoden geïmplementeerd. Hiermee kan ik de "1.php" en "4.php" opvragen (maar dus niet de 2.php en 3.php).
Omdat deze waarden in de headers meegestuurd worden, leek het mij een goed idee om de HTTP headers op te vangen en deze waarden eruit te vissen.

Ik heb al naar de SHDocVw.WebBrowser interface gekeken, maar er zijn geen andere methods en properties die mij kunnen helpen.
Ook heb ik de "DownloadBegin" enzo al geprobeerd, maar daar worden geen parameters meegestuurd.

Bleven dus 2 oplossingen over (imo):
1. HTTP headers opvangen;
2. Een nieuwe (extra dus dubbel) request maken.

Optie 2 is niet echt de bedoeling; zo wordt een site in principe altijd 2x geladen (tenzij ik dus ergens in het begin de originele request kan cancelen).

Acties:
  • 0 Henk 'm!

  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 13-09 16:51
Is het misschien een optie om een network sniffer te maken die vervolgens de packets controleert op http berichten? Het nadeel is wel dat alle berichten dan binnenkomen en niet alleen die van Webbrowser. Hetzelfde eigenlijk wat de meneer van de debugbar suggereert. http://www.codeproject.com/KB/IP/CSNetworkSniffer.aspx bijvoorbeeld.

http://hawvie.deviantart.com/


Acties:
  • 0 Henk 'm!

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 20-09 16:31
HawVer schreef op dinsdag 10 maart 2009 @ 12:12:
Is het misschien een optie om een network sniffer te maken die vervolgens de packets controleert op http berichten? Het nadeel is wel dat alle berichten dan binnenkomen en niet alleen die van Webbrowser. Hetzelfde eigenlijk wat de meneer van de debugbar suggereert. http://www.codeproject.com/KB/IP/CSNetworkSniffer.aspx bijvoorbeeld.
Punt is dus inderdaad dat ál het verkeer in de gaten gehouden wordt.
Stel ik heb IE en Firefox open. In mijn geval wil ik het verkeer van IE-only in de gaten houden.
Volgens mij kan ik geen 'filter' opgeven, in de zin van "ik wil alleen het verkeer van IE".

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
aaajeetee schreef op dinsdag 10 maart 2009 @ 12:19:
[...]


Punt is dus inderdaad dat ál het verkeer in de gaten gehouden wordt.
Stel ik heb IE en Firefox open. In mijn geval wil ik het verkeer van IE-only in de gaten houden.
Volgens mij kan ik geen 'filter' opgeven, in de zin van "ik wil alleen het verkeer van IE".
Je kan idd niet zo'n filter opgeven. Je zou eventueel wel zelf kunnen filteren op de browser string, maar dat is natuurlijk niet 100% waterdicht, aangezien andere browsers IE nog wel eens willen imiteren.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 20-09 16:31
Oké, ben nu bezig met de implementatie van zo'n sniffer. Vraagje die bij mij opkomt: ik heb nu per (IE) tab verschillende instanties van objecten (dus bij openen van nieuw tab krijg ik een nieuwe instantie).

Hoe zit dit met de sniffer? Kán ik dit per tab laten afhandelen? Ik denk het niet namelijk en dan wordt het een leuk feest om de data weer terug te sturen naar het juiste tab (welke headers zijn van welke tab?).

Acties:
  • 0 Henk 'm!

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 20-09 16:31
Even een topic-kick.

Ik ben (na een lange pauze :p) weer begonnen met dit probleem. Heb toch maar gekozen voor het implementeren / maken van zo'n APP (Asynchronous Pluggable Protocol), aangezien dat gewoon hetgeen is wat ik wil.

Ik ben nu die MSDN pagina's aan het doorbladeren / -lezen en ben nu op deze blijven steken.

Om een lang verhaal kort te maken: ik heb nu een klasse (genaamd Henk) die de interfaces IInternetProtocol, IInternetProtocolRoot, IClassFactory en IInternetProtocolInfo implementeert (zoals ook beschreven staat).

Daarnaast doe ik het volgende:
C#:
1
2
3
IInternetSession s;
CoInternetGetSession (0, out s, 0);
s.RegisterNameSpace (Henk.Instance, ref g, "http", 0, null, 0);


Hiermee registreer ik het protocol "http" voor de meegestuurde IClassFactory-klasse (Henk in dit geval).

Dit lijkt te werken: als ik nu via Internet Explorer naar bijv. www.google.nl, krijg ik een melding dat de pagina niet kan worden weergegeven. Comment ik het "RegisterNameSpace" stuk, dan doet google het prima.
Dat vertelt mij dat er dus wel íets gedaan wordt.

In de klasse Henk wordt via CoCreateInstance de "originele" protocol handler opgehaald (zodat ik niet de boel af hoef te handelen).
Ik haal hiermee een IInternetProtocol object op. De functies die bij deze klasse horen laat ik doorsturen naar dit object (zodat ik dit dus niet zelf hoef te doen).

Echter, de functies van IInternetProtocolInfo blijven over, omdat ik dit object niet op kan halen (casten geeft error).
In deze functies staat een MessageBox, maar deze wordt niet getoond: er gaat dus iets fout.


Lang verhaal dus toch nog, maar dit omschrijft het wel eigenlijk.


Nu mijn vraag: kan iemand me verder helpen? Ik vind het al heel wat dat ik het tot zover gekregen heb en mijn gevoel zegt dat ik er bijna ben (als ik het protocol registreer doet google het immers niet).
Ik hoop echt dat iemand me hierbij kan helpen, ben momenteel even een beetje radeloos.


De klasse Henk:
C#:
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using Global;

namespace IEPlugin {
    [
        Guid ("D54C4D88-5C93-49c0-9FE7-2CB076A2FDD1"),
        ComVisible (true),
        ClassInterface (ClassInterfaceType.None)
    ]
    public class Henk : IInternetProtocol, IInternetProtocolRoot, IClassFactory, IInternetProtocolInfo {
        private IInternetProtocol oProtocol;
        private IInternetProtocolInfo oProtocolInfo;
        [ThreadStatic]
        private static Henk oInstance;

        [Flags]
        private enum CLSCTX {
            CLSCTX_INPROC_SERVER = 0x1,
            CLSCTX_INPROC_HANDLER = 0x2,
            CLSCTX_LOCAL_SERVER = 0x4,
            CLSCTX_INPROC_SERVER16 = 0x8,
            CLSCTX_REMOTE_SERVER = 0x10,
            CLSCTX_INPROC_HANDLER16 = 0x20,
            CLSCTX_RESERVED1 = 0x40,
            CLSCTX_RESERVED2 = 0x80,
            CLSCTX_RESERVED3 = 0x100,
            CLSCTX_RESERVED4 = 0x200,
            CLSCTX_NO_CODE_DOWNLOAD = 0x400,
            CLSCTX_RESERVED5 = 0x800,
            CLSCTX_NO_CUSTOM_MARSHAL = 0x1000,
            CLSCTX_ENABLE_CODE_DOWNLOAD = 0x2000,
            CLSCTX_NO_FAILURE_LOG = 0x4000,
            CLSCTX_DISABLE_AAA = 0x8000,
            CLSCTX_ENABLE_AAA = 0x10000,
            CLSCTX_FROM_DEFAULT_CONTEXT = 0x20000,
            CLSCTX_INPROC = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER,
            CLSCTX_SERVER = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER,
            CLSCTX_ALL = CLSCTX_SERVER | CLSCTX_INPROC_HANDLER
        }

        [DllImport ("ole32.dll", ExactSpelling = true, PreserveSig = false)]
        [return: MarshalAs (UnmanagedType.Interface)]
        static extern object CoCreateInstance ([In, MarshalAs (UnmanagedType.LPStruct)] Guid rclsid, [MarshalAs (UnmanagedType.IUnknown)] object pUnkOuter, CLSCTX dwClsContext, [In, MarshalAs (UnmanagedType.LPStruct)] Guid riid);

        private Henk () {
            try {
                Guid CLSID_HttpProtocol = new Guid ("79EAC9E2-BAF9-11CE-8C82-00AA004BA90B");
                Guid IID_IInternetProtocol = new Guid ("79eac9e4-baf9-11ce-8c82-00aa004ba90b");
                Guid IID_IInternetProtocolRoot = new Guid ("79eac9e4-baf9-11ce-8c82-00aa004ba90b");
                Guid IID_IInternetProtocolInfo = new Guid ("79eac9e4-baf9-11ce-8c82-00aa004ba90b");

                Object o = CoCreateInstance (CLSID_HttpProtocol, null, CLSCTX.CLSCTX_INPROC_SERVER, IID_IInternetProtocol);
                this.oProtocol = (IInternetProtocol)o;
                MessageBox.Show (this.oProtocol + "", "1");

                o = CoCreateInstance (CLSID_HttpProtocol, null, CLSCTX.CLSCTX_INPROC_SERVER, IID_IInternetProtocolInfo);
                MessageBox.Show (o + "", "3");

                //Hier gaat het fout: het object kan niet gecast worden naar de IInternetProtocolInfo klasse (omdat het object niet van deze interface overerft).
                this.oProtocolInfo = (IInternetProtocolInfo)o;
                MessageBox.Show (this.oProtocolInfo + "", "4");
            } catch (Exception e) {
                MessageBox.Show (e.ToString (), "ERROR");
                new MM_EventWriter (ref e);
            }
        }

        public static Henk Instance {
            get {
                if (oInstance == null) {
                    oInstance = new Henk ();
                }

                return oInstance;
            }
        }

        #region IInternetProtocolMethods
        public void Start (string szURL, IInternetProtocolSink Sink, IInternetBindInfo pOIBindInfo, uint grfPI, uint dwReserved) {
            this.oProtocol.Start (szURL, Sink, pOIBindInfo, grfPI, dwReserved);
        }

        public void Continue (ref _tagPROTOCOLDATA pProtocolData) {
            this.oProtocol.Continue (ref pProtocolData);
        }

        public void Abort (int hrReason, uint dwOptions) {
            this.oProtocol.Abort (hrReason, dwOptions);
        }

        public void Terminate (uint dwOptions) {
            this.oProtocol.Terminate (dwOptions);
        }

        public void Suspend () {
            this.oProtocol.Suspend ();
        }

        public void Resume () {
            this.oProtocol.Resume ();
        }

        public uint Read (IntPtr pv, uint cb, out uint pcbRead) {
            return this.oProtocol.Read (pv, cb, out pcbRead);
        }

        public void Seek (_LARGE_INTEGER dlibMove, uint dwOrigin, out _ULARGE_INTEGER plibNewPosition) {
            this.oProtocol.Seek (dlibMove, dwOrigin, out plibNewPosition);
        }

        public void LockRequest (uint dwOptions) {
            this.oProtocol.LockRequest (dwOptions);
        }

        public void UnlockRequest () {
            this.oProtocol.UnlockRequest ();
        }
        #endregion

        #region IClassFactoryMethods
        public void CreateInstance (IntPtr pUnkOuter, ref Guid riid, out IntPtr ppvObject) {
            System.Windows.Forms.MessageBox.Show ("CreateInstance", "", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information, System.Windows.Forms.MessageBoxDefaultButton.Button1, System.Windows.Forms.MessageBoxOptions.ServiceNotification);


            ppvObject = IntPtr.Zero;
            if (pUnkOuter != IntPtr.Zero) {
                Marshal.ThrowExceptionForHR (CLASS_E_NOAGGREGATION);
            }
            if (riid == IID_IInternetProtocolInfo || riid == IID_IUnknown) {
                MM_Main oMain = new MM_Main ();
                ppvObject = Marshal.GetComInterfaceForObject (oMain, typeof (IInternetProtocol));
            } else {
                Marshal.ThrowExceptionForHR (E_NOINTERFACE);
            }
        }

        private const int CLASS_E_NOAGGREGATION = unchecked ((int)
        0x80040110);
        private const int E_NOINTERFACE = unchecked ((int)0x80004002);
        private readonly Guid IID_IInternetProtocol = new
            Guid ("{79EAC9E4-BAF9-11CE-8C82-00AA004BA90B}");
        private readonly Guid IID_IInternetProtocolInfo = new
        Guid ("{79EAC9EC-BAF9-11CE-8C82-00AA004BA90B}");
        private readonly Guid IID_IUnknown = new
        Guid ("{00000000-0000-0000-C000-000000000046}");


        public void LockServer (bool fLock) {
            throw new NotImplementedException ();
        }
        #endregion

        #region IInternetProtocolInfoMethods
        public uint ParseUrl (string pwzUrl, PARSEACTION ParseAction, uint dwParseFlags, IntPtr pwzResult, uint cchResult, out uint pcchResult, uint dwReserved) {
            //Deze functie zou als eerste aangeroepen moeten worden, maar de messagebox wordt niet getoond.

            MessageBox.Show ("ParseUrl", "ParseUrl", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification);
            pcchResult = 0;
            return HRESULT.INET_E_DEFAULT_ACTION;
        }

        public uint CombineUrl (string pwzBaseUrl, string pwzRelativeUrl, uint dwCombineFlags, IntPtr pwzResult, uint cchResult, out uint pcchResult, uint dwReserved) {
            MessageBox.Show ("CombineUrl", "CombineUrl", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification);
            pcchResult = 0;
            return HRESULT.S_OK;
        }

        public uint CompareUrl (string pwzUrl1, string pwzUrl2, uint dwCompareFlags) {
            MessageBox.Show ("CompareUrl", "CompareUrl", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification);
            return (UInt32)pwzUrl1.CompareTo (pwzUrl2);
        }

        public uint QueryInfo (string pwzUrl, QUERYOPTION OueryOption, uint dwQueryFlags, IntPtr pBuffer, uint cbBuffer, ref uint pcbBuf, uint dwReserved) {
            MessageBox.Show ("QueryInfo", "QueryInfo", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification);
            return HRESULT.INET_E_DEFAULT_ACTION;
        }
        #endregion

    }
}

Acties:
  • 0 Henk 'm!

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 20-09 16:31
Ben inmiddels een stap verder. In de functie CreateInstance (van IClassFactory) maakte ik een nieuwe MM_Main aan in plaats van de instantie van Henk.
Daarnaast checkte ik op IID_IInternetProtocolInfo in plaats van IID_IInternetProtocol.

Nu doet 'ie iets meer, krijg nu een halve google.nl. Nu verder debuggen en ik hou jullie op de hoogte.

Acties:
  • 0 Henk 'm!

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 20-09 16:31
Volgens deze pagina zou UrlMon.dll mijn "ParseUrl" functie aan moeten roepen, als de interface IInternetProtocolInfo is geïmplementeerd.

Deze is geïmplementeerd (zie ook bovenstaande voorbeeld), maar de ParseUrl functie wordt niet aangeroepen.

Ik gok dat ik nog een of andere QueryInterface functie mis, maar zou niet weten hoe / waar.


Iemand die me kan helpen?

Acties:
  • 0 Henk 'm!

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 20-09 16:31
Echt niemand die hier meer van weet? :'(

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
aaajeetee schreef op dinsdag 12 mei 2009 @ 15:57:
Echt niemand die hier meer van weet? :'(
Je weet dat een topickick binnen 24 uur niet gewenst is? Je mag best een keer kicken (en desnoods vaker) maar als je geen reactie(s) krijgt zal het dus wel zo zijn dat niemand je er mee kan/wil helpen.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 20-09 16:31
Het is inmiddels opgelost.

Ik heb erg lang gezocht en veel dingen gelezen, en ik heb het nu opgelost door de "send" en "recv" functies van WinSock te hooken (in een C++ DLL).

Aan de hand van dit voorbeeld en samen met deze library heb ik het voor elkaar gekregen om de "send" en "recv" functies van WinSock te hooken.

Mijn C# BHO roept de initialiseer functie van de C++ DLL. Hierdoor wordt deze DLL geïnitialiseerd en worden de functies via mijn functies "omgeleid".

In het voorbeeld worden er een paar tekstbestanden weggeschreven. Deze bestanden bevatten voor mij alle informatie, zoals de response headers. Deze kan ik weer filteren (bijv. 302 found ofzo) en vervolgens de "location" eruit vissen.

Voor de geïnteresseerden, de code. Mijn C# DLL roept de DLLInjectedAdd () en DLLRemove () methods aan.

C++:
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#pragma comment(lib, "detours/lib/detoured.lib")
#pragma comment(lib, "detours/lib/detours.lib")
#pragma comment(lib, "Ws2_32.lib")

#undef UNICODE
#include <cstdio>
#include <Winsock2.h>
#include <ws2tcpip.h>
#include <windows.h>
#include "detours\include\detours.h" //*IMPORTANT: Look at path if compiler error
#include "MM_Main.h"

//Prototype "recv".
int (WINAPI *pRecv)(SOCKET s, char* buf, int len, int flags) = recv;
int WINAPI MM_Recv (SOCKET s, char* buf, int len, int flags);

//Prototype "connect".
int (WINAPI *pConnect)(SOCKET s, const struct sockaddr *name, int namelen) = connect;
int WINAPI MM_Connect (SOCKET s, const struct sockaddr *name, int namelen);


//Properties.
FILE* pRecvLogFile;
//Pointer to this module.
HINSTANCE oCurrentModule = 0;
//Pointer to the HHook.
HHOOK oHHook = 0;
//Factory and url parser objects.
IMM_SingletonFactoryPtr oFactory;
IMM_UrlParserPtr oUrlParser;


INT APIENTRY DllMain (HMODULE hDLL, DWORD Reason, LPVOID Reserved) {
    switch (Reason) {
        case DLL_PROCESS_ATTACH:    //Do standard detouring
            //Get the factory and url parser object.
            //oFactory = NULL;
            //oUrlParser = NULL;
            
            //Check for valid object.
            if (oFactory == NULL) {
                HRESULT hRes = oFactory.CreateInstance (CLSID_MM_SingletonFactory);
                if (hRes == S_OK) {
                    oFactory->Initialize ();

                    //Read in the url parser.
                    oUrlParser = oFactory->UrlParser;
                } else {
                    oFactory = NULL;
                }
            }

            //Hook.
            oCurrentModule = hDLL;
            DisableThreadLibraryCalls (hDLL);

            //DetourTransactionBegin();
            //DetourUpdateThread(GetCurrentThread());
            //DetourAttach(&(PVOID&)pSend, MySend);
            //if(DetourTransactionCommit() == NO_ERROR) {
            //OutputDebugString("send() detoured successfully");
            //}

            //Hook the recv method.
            DetourTransactionBegin ();
            DetourUpdateThread (GetCurrentThread ());
            DetourAttach (&(PVOID&)pRecv, MM_Recv);
            DetourTransactionCommit ();

            //Hook the connect method.
            DetourTransactionBegin ();
            DetourUpdateThread (GetCurrentThread ());
            DetourAttach (&(PVOID&)pConnect, MM_Connect);
            DetourTransactionCommit ();


            //if (DetourTransactionCommit () == NO_ERROR) {
            //}
            break;

        case DLL_PROCESS_DETACH:
            //DetourTransactionBegin(); //Detach
            //DetourUpdateThread(GetCurrentThread());
            //DetourDetach(&(PVOID&)pSend, MySend);
            //DetourTransactionCommit();

            //Unhook the recv method.
            DetourTransactionBegin ();
            DetourUpdateThread (GetCurrentThread ());
            DetourDetach (&(PVOID&)pRecv, MM_Recv);
            DetourTransactionCommit ();

            //Unhook the connect method.
            DetourTransactionBegin ();
            DetourUpdateThread (GetCurrentThread ());
            DetourDetach (&(PVOID&)pConnect, MM_Connect);
            DetourTransactionCommit ();
            break;

        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
            break;
    }

    return TRUE;
}


//This is the "connect"-hook method.
int WINAPI MM_Connect (SOCKET s, const struct sockaddr *name, int namelen) {
    MessageBox (NULL, "Connecting", "MM_Connect", MB_OK);
    return pConnect (s, name, namelen);
}

//This is the "recv"-hook method.
int WINAPI MM_Recv (SOCKET s, char* buf, int len, int flags) {
    //Send the buffer to the UrlParser object.


    //MessageBox (NULL, buf, "MyRecv", MB_OK);
    //fopen_s (&pRecvLogFile, "C:\\RecvLog.txt", "a+");
    //fprintf (pRecvLogFile, "%s\n", buf);
    //fclose (pRecvLogFile);

    //Call the original Recv method.
    return pRecv (s, buf, len, flags);
}

LRESULT CALLBACK HookProc (int nCode, WPARAM wParam, LPARAM lParam) {
    return CallNextHookEx (oHHook, nCode, wParam, lParam); 
}

extern "C" __declspec (dllexport) HHOOK __stdcall DLLInjectedAdd () {
    MessageBox (NULL, "Hallo!", "DLLInjectedAdd", MB_OK);
    if (!oHHook) {
        oHHook  = SetWindowsHookEx(WH_CBT, HookProc, oCurrentModule, 0);
    }

    return (oHHook);
}

extern "C" __declspec (dllexport) void __stdcall DLLRemove () {
    //MessageBox (NULL, "Doei!", "DLLRemove", MB_OK);
    if (oHHook) {
        UnhookWindowsHookEx (oHHook);
        oHHook = 0;
    }
}



Toch allemaal bedankt voor het meedenken!

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Mooi dat het toch nog opgelost is via een omweg. Ik had het idee dat je met je vorige oplossing al redelijk in de buurt moest zitten, maar ik heb op het moment geen tijd om het te proberen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 20-09 16:31
Woy schreef op donderdag 14 mei 2009 @ 09:28:
Mooi dat het toch nog opgelost is via een omweg. Ik had het idee dat je met je vorige oplossing al redelijk in de buurt moest zitten, maar ik heb op het moment geen tijd om het te proberen.
Dat idee had ik dus ook. Plaatjes werden niet ingeladen en het hele ding was erg instabiel.
Daarnaast vind ik hetgeen ik nu heb eigenlijk een betere oplossing omdat ik nu alleen de functies hoef te implementeren die ik ook echt wíl. Ook kan ik deze zonder enige moeite weer doorsturen naar de originele functie (en waarbij ik weet dat het werkt). Geeft mij allemaal iets meer zekerheid.
Pagina: 1