#1 4. Oktober 2010 Abend, Keine Ahnung ob das besser in der Programmier Bereich oder hier rein passt.. Jedenfalls suche ich paar Info's zur lokalen HTML Code injection/manipulation (also in einen laufenden Browser), z.B. durch DLL Injection, RAM Manipulation etc.. am liebsten waere mir nen sourcecode (egal welche sprache) zur injection in IE und FF. Danke, dreamax + Multi-Zitat Zitieren
#2 5. Oktober 2010 AW: lokale HTML Code Injection (z.B. via .DLL Injection) Das einfachste wäre wahrscheinlich die Daten abzufangen bevor der Browser sie verarbeitet und dann anzupassen. Internet -> PC -> Dein_Programm -> Firefox / IE Das Programm würde dann beispielsweise direkt jedes: Code: <title>*</title> mit Code: <title>Manipuliert</title> ersetzen, bevor es zum Browser gelangt. Firefox bspw. hat eine Proxy Unterstützung die man dafür missbrauchen könnte. + Multi-Zitat Zitieren
#3 5. Oktober 2010 AW: lokale HTML Code Injection (z.B. via .DLL Injection) Ein HTTP Proxy habe ich genau darfuer schon Programmiert (weil ich wie dem Thread zu entnehmen selber "zu bloed" fuer "html injection" bin), allerdings ist das mir eigentlich zu unsauber. ;( + Multi-Zitat Zitieren
#4 5. Oktober 2010 AW: lokale HTML Code Injection (z.B. via .DLL Injection) Das ist meiner Meinung nach sehr sauber, wenn man es richtig macht. DLL-Injection wird schnell heuristisch erkannt und macht auch bei Firewalls oft Probleme. Du musst es nur schaffen "heimlich" die Proxy-Einstellungen zu überschreiben. Ich weis jedoch nicht was du machen willst, also kann ich auch keinen (aus meiner Sicht) best geeigneten Lösungsweg vorschlagen. //EDIT: Hab mir einfach mal irgendein python-HTTP-Proxy-Script gegriffen und entsprechend modifiziert. 1) Encoding hab ich provisorisch verhindert, da ich grad net so viel Zeit habe (-> manche Seiten melden illegal request) 2) Der Regex ist durchaus verbesserungswürdig (dient auch nur zur Veranschaulichung) 3) Das ganze ist noch sehr instabil. 4) Auf WEB.DE - E-Mail-Adresse kostenlos, FreeMail, De-Mail & Nachrichten kann man gut sehen, dass es funktioniert. 5) Viel Spaß beim weiter basteln, egal wer Spoiler Code: # -*- coding: cp1252 -*- # <PythonProxy.py> # #Copyright (c) <2009> <Fábio Domingues - fnds3000 in gmail.com> # #Permission is hereby granted, free of charge, to any person #obtaining a copy of this software and associated documentation #files (the "Software"), to deal in the Software without #restriction, including without limitation the rights to use, #copy, modify, merge, publish, distribute, sublicense, and/or sell #copies of the Software, and to permit persons to whom the #Software is furnished to do so, subject to the following #conditions: # #The above copyright notice and this permission notice shall be #included in all copies or substantial portions of the Software. # #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, #EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES #OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND #NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT #HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, #WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING #FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR #OTHER DEALINGS IN THE SOFTWARE. import socket, thread, select, re __version__ = '0.1.0 Draft 1' BUFLEN = 8192 VERSION = 'Python Proxy/' + __version__ HTTPVER = 'HTTP/1.1' class ConnectionHandler: def __init__(self, connection, address, timeout): self.client = connection self.client_buffer = '' self.timeout = timeout self.method, self.path, self.protocol = self.get_base_header() if self.method == 'CONNECT': self.method_CONNECT() elif self.method in ('OPTIONS', 'GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'TRACE'): self.method_others() self.client.close() self.target.close() def get_base_header(self): print self.client_buffer while 1: self.client_buffer += self.client.recv(BUFLEN) end = self.client_buffer.find('\n') if end != -1: break print '%s' % self.client_buffer[:end]#debug data = (self.client_buffer[:end + 1]).split() self.client_buffer = self.client_buffer[end + 1:] print self.client_buffer self.client_buffer = self.client_buffer.replace("Accept-Encoding: gzip,deflate", "") #Encoding provisorisch verhindern, grad keine Lust da rumzubasteln return data def method_CONNECT(self): self._connect_target(self.path) self.client.send(HTTPVER + ' 200 Connection established\n' + 'Proxy-agent: %s\n\n' % VERSION) self.client_buffer = '' self._read_write() def method_others(self): self.path = self.path[7:] i = self.path.find('/') host = self.path[:i] path = self.path[i:] self._connect_target(host) self.target.send('%s %s %s\n' % (self.method, path, self.protocol) + self.client_buffer) self.client_buffer = '' self._read_write() def _connect_target(self, host): i = host.find(':') if i != -1: port = int(host[i + 1:]) host = host[:i] else: port = 80 (soc_family, _, _, _, address) = socket.getaddrinfo(host, port)[0] self.target = socket.socket(soc_family) self.target.connect(address) def _read_write(self): time_out_max = self.timeout / 3 socs = [self.client, self.target] count = 0 while 1: count += 1 (recv, _, error) = select.select(socs, [], socs, 3) if error: break if recv: for in_ in recv: data = in_.recv(BUFLEN) if in_ is self.client: out = self.target else: out = self.client if data: data = self._manipulate_content(data) #Daten vor dem Rücksenden manipulieren out.send(data) count = 0 if count == time_out_max: break def _manipulate_content(self, data): #Beispiel: alle Image-Tags ersetzen: restr = '(<)(img)(\\s+)(src)(=)(".*?")' #Matcht: <img src="*" rg = re.compile(restr, re.IGNORECASE | re.DOTALL) #Ausdruck compilen return rg.sub('<img src="http://board.raidrush.ws/images/misc/images/rr_head.png"',data) #Jedes Bild durch raid-rush logo ersetzen def start_server(host='localhost', port=8080, IPv6=False, timeout=60, handler=ConnectionHandler): if IPv6 == True: soc_type = socket.AF_INET6 else: soc_type = socket.AF_INET soc = socket.socket(soc_type) soc.bind((host, port)) print "Serving on %s:%d." % (host, port)#debug soc.listen(0) while 1: thread.start_new_thread(handler, soc.accept() + (timeout,)) if __name__ == '__main__': start_server() + Multi-Zitat Zitieren
#5 5. Oktober 2010 AW: lokale HTML Code Injection (z.B. via .DLL Injection) Wenn du eigenen Code via dll einsetzen willst, musst du das aber browserspezifisch umsetzen. Ein größeres Update von Firefox könnte die Funktion dann ebenfalls außer Kraft setzen. Ansonsten such dir ne 3rd-Party DLL im Firefox-Ordner, die sowieso niemals geupdated wird, schau dir die exports an (zB mit dependy walker) und schreib nen wrapper dafür. Dann kannst du die original dll einfach umbennen und deine gefakte dll einsetzen (welche beim start die original dll in den Speicher lädt und die exportierten funktionen weiterleitet). Somit brauchst du keinen Loader, der die DLL zur Laufzeit injiziert sondern Firefox (oder irgendein anderer Browser) erledigt das selbst. Möchte mal sehen, welche Firewall da Alarm schlagen soll... Wenn dein Code erstmal im Hostprozess läuft, musst du weitersehen, wie du am besten vorgehst. Entweder die funktionen für den datenaustausch hooken oder rausfinden wo der HTML Code im RAM abgespeichert wird. Im Fall von Firefox wärs wohl das einfachste, sich mal den Quellcode anzuschauen. Nehmen wir an es gibt eine Funktion (vereinfacht) sethtmlcode(tabid,code), übernimm die structur und mach nen call auf die addresse. + Multi-Zitat Zitieren
#6 5. Oktober 2010 AW: lokale HTML Code Injection (z.B. via .DLL Injection) Schau dir doch meinen SFT Hook an? Funktioniert mit allen Browsern egal welche version... + Multi-Zitat Zitieren
#7 5. Oktober 2010 AW: lokale HTML Code Injection (z.B. via .DLL Injection) @Alex²: Wie gesagt, ich habe das selbe (halt in C) bereits programmiert (firewall/virenscanner ist kein Problem, sind "meine" Systeme) @N0S: Stimmt, werd ich wohl dann mal machen.. danke! + Multi-Zitat Zitieren