InternetExplorerServer URL bzw. HTML-Source setzen



  • Hallo liebe C-ler,

    folgendes:
    Ich arbeite an einer Art Erweiterung für ein P2p-Programm.
    Diese Programm wird offiziell nicht mehr weiterentwickelt und ist ohne weites zutuen nicht mehr funktionstüchtig.
    Daher haben wir im Moment die betreffenden Domainnamen auf unsere eigenen Entryserever per hosts-File gelenkt.
    Allerdings ist diese Lösung nicht sehr praktikabel, da sich die IP-Adressen relativ häufig ändern und ich daher die entsprechenden Winsockfunktionen "entführt" habe und die betreffenden DNS-Namen umschreibe. Dies funktioniert bestens, allerdings nicht für das eingebundene IE-Control, welches meldungen zu Updates etc. darstellen soll und wohl nicht die WinSock resolver nutzt.

    Nun wäre meine Überlegung, diesem Control eine andere URL mit auf den Weg zu geben oder den Seitenquelltext manuell zu setzten.

    Allerdings wäre eine Möglichkeit die Auflösung des Controls abzufangen mir am liebsten, allerdings sehe ich da etwas schwarz.

    Nach einigem Suchen habe ich bis jetzt keine Lösung gefunden.

    Vielen Dank für eure Mühe
    theeagle



  • Hi, ich bin sicher Du brauchst DnsQuery_W api hooken. Das ist sau einfach - einmal WriteProcessMemory und AddVectoredExceptionHandler:

    // mixed c/c++ und aurora code

    #include <windns.h> // +Dnsapi.lib
    
    void install()
    {
    	UCHAR bp = 0xCC;
    	// set an INT3 breakpoint, overwriting PUSH 24h
    	WriteProcessMemory(GetCurrentProcess(), &DnsQuery_W, &bp, 1, &lpvReserved);
    	AddVectoredExceptionHandler(TRUE, &MyHandler);
    }
    
    struct STACK
    {
    	DWORD retaddr;
    	// DnsQuery_W parameters
    	PWSTR lpstrName;
    	WORD wType;
    	DWORD fOptions;
    	IP4_ARRAY *aipServers;
    	DNS_RECORD** ppQueryResultsSet;
    	PVOID* pReserved;
    };
    
    struct STACK
    {
    	DWORD retaddr;
    	// DnsQuery_W parameters
    	PWSTR lpstrName;
    	WORD wType;
    	DWORD fOptions;
    	IP4_ARRAY *aipServers;
    	DNS_RECORD** ppQueryResultsSet;
    	PVOID* pReserved;
    };
    
    LONG __stdcall MyHandler(EXCEPTION_POINTERS *ExceptionInfo)
    {
    	if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT)
    	{
    		if (ExceptionInfo->ExceptionRecord->ExceptionAddress == &DnsQuery_W)
    		{
    			STACK *stack = (STACK*)ExceptionInfo->ContextRecord->Esp;
    			if ((stack->wType == DNS_QUERY_STANDARD) && stack->lpstrName && wcslen(stack->lpstrName))
    			{
    				// handle DNS_QUERY_STANDARD (default flag used in IE)
    				if (is_banned(stack->lpstrName))
    				{
    					ExceptionInfo->ContextRecord->Eip = stack->retaddr;
    					ExceptionInfo->ContextRecord->Esp += sizeof(STACK);
    					ExceptionInfo->ContextRecord->Eax = ERROR_FILE_NOT_FOUND;
    					return EXCEPTION_CONTINUE_EXECUTION;
    				}
    				else if (my_resolve(stack->lpstrName, stack->ppQueryResultsSet))
    				{
    					ExceptionInfo->ContextRecord->Eip = stack->retaddr;
    					ExceptionInfo->ContextRecord->Esp += sizeof(STACK);
    					ExceptionInfo->ContextRecord->Eax = 0;
    					return EXCEPTION_CONTINUE_EXECUTION;
    				}
    				//else do_default
    				//{
    				//	ExceptionInfo->ContextRecord->Eip = &_DnsQuery_W; // below, in __asm block
    				//	return EXCEPTION_CONTINUE_EXECUTION;
    				//}
    			}
    			// todo: not an DNS_QUERY_STANDARD
    
    			// last chance to handle DnsQuery_W exception. Use default handling
    			ExceptionInfo->ContextRecord->Eip = &_DnsQuery_W;
    			return EXCEPTION_CONTINUE_EXECUTION;
    		}
    	}
    	return EXCEPTION_CONTINUE_SEARCH;
    }
    
    // nasm syntax
    __asm {
    	align 4
    _DnsQuery_W:
    	push 24h
    	mov eax,[__imp_DnsQuery_W]
    	add eax,2 ; skip int3 | push 24h
    	jmp eax
    }
    


  • vielen dank Sapero für deine Antwort.
    für die betreffende Anwendung funktoniert der code leider nicht und führt zu einem kompletten Absturz...

    Allerdings habe ich jetzt eine andere, für mich bessere Lösung gefunden:
    Ich erzeuge ein neues Ole-Control, dem ich dann die entsprechende URL mitgebe und platziere es genau an der selben stelle wie das original COntrol, dieses wird einfach versteckt.
    So ist das für meinen Fall die flexibleste Lösung, da wir nun nicht mehr den VirtualHost und URL-Path auf den ursprünglichen Namen setzen müssen.

    Dennoch vielen Dank für deine Mühe.

    Grüße theeagle


Anmelden zum Antworten