InternetOpenUrlA hook - URL verändern.

06/06/2013 21:28 vwap#1
Hallo, ich hooke die InternetOpenUrlA-Funktion eines Programmes, und versuche dabei den hostname "xxxxx.net" zu "127.0.0.1" zu ändern (hostname + endung hat genau so viele Zeichen wie 127.0.0.1".

Ich versuche es so:
Code:
	

    HINTERNET __stdcall hkInternetOpenUrlA(HINTERNET hInternet, LPCTSTR lpszUrl, LPCTSTR lpszHeaders, DWORD dwHeadersLength, DWORD dwFlags, DWORD_PTR dwContext)
    {
            char szBuffer[256];
     
            sprintf(szBuffer, "%s", lpszUrl);
     
            szBuffer[7] = '1';
            szBuffer[8] = '2';
            szBuffer[9] = '7';
            szBuffer[10] = '.';
            szBuffer[11] = '0';
            szBuffer[12] = '.';
            szBuffer[13] = '0';
            szBuffer[14] = '.';
            szBuffer[15] = '1';
     
            LPCTSTR newUrl = (LPCTSTR) szBuffer;
     
            return pInternetOpenUrlA(hInternet, newUrl, lpszHeaders, dwHeadersLength, dwFlags, dwContext);
    }
Allerdings crashed das Programm (.. funktioniert nicht mehr) mit meiner Version.
Wo liegt denn das Problem?
06/06/2013 22:11 Padmak#2
Ähm.
Was genau spricht gegen:
Code:
char* szNewUrl = "127.0.0.1";
if(strlen(lpszUrl) >= strlen(szNewUrl))
{
    strncpy(&lpszUrl, szNewUrl, strlen(szNewUrl));
}
(Untested)

€: * vergessen

Padmak
06/06/2013 22:29 MrSm!th#3
Steht dein Projekt auf Unicode oder Multibyte?
06/06/2013 22:38 vwap#4
Multibyte, Smith.
Padmak, ich muss nur einen Teil der übergebenen URL ändern, deswegen der Zugriff per Index.
06/06/2013 22:55 Padmak#5
Dann machs trotzdem so wie ichs gesagt hab:
Code:
char* szNewUrl = "127.0.0.1";
if(strlen(lpszUrl) >= (strlen(szNewUrl) + 7))
{
    strncpy(&lpszUrl[7], szNewUrl, strlen(szNewUrl));
}
Kannst du debuggen und schaun, wos crasht?

Padmak
06/06/2013 22:57 MrSm!th#6
^Würde ich nicht versuchen. Der Parameter ist ein const Pointer, da hast du nichts zu verändern! Und deine Bedingung macht keinen Sinn ;O

Versuch es mal mit Debug-Ausgaben bzw. Logs. Der Code sieht so erstmal nicht falsch aus.
06/06/2013 22:57 vwap#7
Würde ich gerne, allerdings erhalte ich bei der Zeile "strncpy(&lpszUrl[7], szNewUrl, strlen(szNewUrl));" die Fehlermeldung "Das Argument vom Typ ""const CHAR *"" ist mit dem Parameter vom Typ ""char *"" inkompatibel."
Das "&"-Zeichen ist unterstrichen.

Mit folgendem Logging erhalte ich folgende Ausgabe:
Code:
HINTERNET __stdcall hkInternetOpenUrlA(HINTERNET hInternet, LPCTSTR lpszUrl, LPCTSTR lpszHeaders, DWORD dwHeadersLength, DWORD dwFlags, DWORD_PTR dwContext)
{
	char szBuffer[256];

	sprintf(szBuffer, "%s", lpszUrl);

	AddLog("Buffer initialized.");

	szBuffer[7] = '1';
	szBuffer[8] = '2';
	szBuffer[9] = '7';
	szBuffer[10] = '.';
	szBuffer[11] = '0';
	szBuffer[12] = '.';
	szBuffer[13] = '0';
	szBuffer[14] = '.';
	szBuffer[15] = '1';

	AddLog("New address set: %s", szBuffer);

	LPCTSTR newUrl = (LPCTSTR) szBuffer;

	AddLog("Converted buffer: %s", newUrl);
	
	return pInternetOpenUrlA(hInternet, newUrl, lpszHeaders, dwHeadersLength, dwFlags, dwContext);
}
Code:
[06/06/13 23:01:08]: Buffer initialized.
[06/06/13 23:01:08]: New address set: http://127.0.0.1/schit.php?i=memati67&blame=f80e646440c6021501aa90b8b7f26728&surv=fea05fbaa726e6ba3ddfd21872bdf2f1&l=021501aa99590b05fe95c7f460b8b7f2&p=wosifwse
[06/06/13 23:01:08]: Converted buffer: http://127.0.0.1/schit.php?i=memati67&blame=f80e646440c6021501aa90b8b7f26728&surv=fea05fbaa726e6ba3ddfd21872bdf2f1&l=021501aa99590b05fe95c7f460b8b7f2&p=wosifwse
Die Url scheint korrekt zu sein.
06/06/2013 23:21 Padmak#8
Oh, tatsächlich. Die Bedingung macht schon Sinn...
Crasht das ganze auch ohne dein Zeug? Dann wäre nämlich schlicht dein Hook im Ar***^^

Padmak
06/06/2013 23:40 vwap#9
Nein, der Hook passt.
Wenn ich einfach den Parameter wieder returne, funktioniert alles.
06/06/2013 23:50 Padmak#10
Probier mal NUR PROBEHALBER dein Array auf'm Heap zu erstellen, also
Code:
char* szBuffer = new char[256];
Und dann nicht deleten, sondern lassen.. Ist zwar falsch, aber es könnte theoretisch funktionieren :D

Padmak
06/06/2013 23:53 vwap#11
Ändert leider nichts.
06/07/2013 01:14 Schlüsselbein#12
Was spricht gegen Debuggen?
06/07/2013 01:26 MrSm!th#13
Quote:
Würde ich gerne, allerdings erhalte ich bei der Zeile "strncpy(&lpszUrl[7], szNewUrl, strlen(szNewUrl));" die Fehlermeldung "Das Argument vom Typ ""const CHAR *"" ist mit dem Parameter vom Typ ""char *"" inkompatibel."
Das "&"-Zeichen ist unterstrichen.
Wie gesagt, weil der Parameter const ist. Da hast du nichts reinzuschreiben und das teilt dir der Compiler auch mit. Deine Lösung mit dem lokalen Buffer war schon richtig.

Quote:
Die Bedingung macht schon Sinn...
Welchen?

Quote:
Originally Posted by Headpuster View Post
Ändert leider nichts.
Wieso auch? Ob Heap oder Stack ist in dem Fall völlig wurst.

Verstehe ich es richtig, dass nach deinen Logs quasi der Aufruf der originalen Funktion crasht, aber nur mit dem modifizierten Parameter?
Fehlt vielleicht am Ende das 0-Byte? Calling-Conventions richtig?
Der Logstring nach dem Casten des Buffers ist übrigens überflüssig, du verschiebst da letztendlich nur den Pointer in eine andere Variable (daran ist auch nichts "Konvertieren"), insofern kann da auch nichts passieren. Interessanter wäre, wenn du den Return-Wert von pInternetOpenUrlA speicherst, dann diesen loggst und danach erst returnst. Dann weiß man auch, ob der Crash tatsächlich dort stattfindet oder erst später.

Am besten wäre aber in der Tat einfach debuggen.