Funktion überschreiben evtl LD_PRELOAD



  • Hallo Com,

    ich versuche erfolglos eine Funktion in diesem Demoprog zu überschreiben.

    Ich fand eine Möglichkeit via LD_PRELOAD jedoch funktioniert das glaube nur bei Lib Funktionen.

    Ich es möglich die Funktion test.testfunc(); mit einer Lib zu überschreiben?

    Mainprog:

    #include <stdio.h>
    
    class TestClas
    {
    	public:
    		void testfunc();
    };
    
    void TestClas::testfunc()
    {
    	printf("Main test run\n");
    }
    
    int main()
    {
    	printf("Open Main\n");
    
    	TestClas test;
    	test.testfunc();
    
        printf("Close Main\n");
    
        return 0;
    }
    

    Mein Libversuch:

    #include <stdio.h>
    
    class TestClas
    {
    	public:
    		void testfunc();
    };
    
    void TestClas::testfunc()
    {
    	printf("run new func\n");
    }
    

    zu starten habe ich es hiermit versucht:
    LD_PRELOAD=./testfunc.so ./myprog

    Output ist leider:

    Open Main
    Main test run
    Close Main

    LG Exclain



  • Exclain schrieb:

    Ich fand eine Möglichkeit via LD_PRELOAD jedoch funktioniert das glaube nur bei Lib Funktionen.

    So wie du es dir vorstellst schon, ja.

    Was willst du denn genau machen? Also nicht im Sinne von "Wie willst du es machen?" sondern "Wozu willst du was machen?".



  • Grüß dich,

    ich bin neugierig geworden weil jemand eine lib gebaut hat die direkte Funktionen überschreibt.

    http://prntscr.com/9opiof

    Der Sourcecode dazu wurde auch released jedoch nicht wie man so etwas via Lib macht.

    LG Exclain



  • Du willst funktionen hooken? Einfach die ersten Bytes der Funktion mit einem sprungbefehl zur neuen Funktionen überschreiben.



  • Hooken ist genau das Stichwort 😉

    wird das in diesem Fall mit der LD_PRELOAD Methode gemacht. Die soll man so einbinden jedoch ist die Funktion keine Dynamische Linkung.



  • Exclain schrieb:

    wird das in diesem Fall mit der LD_PRELOAD Methode gemacht.

    Nein, du müsstest die Binary bearbeiten.

    Die Funktion, die aufgerufen wird, ist direkt in deiner Binary, nicht in einer externen Library. Dementsprechend kannst du nicht einfach deine Ersatzmethoden in Form einer Library dazwischenschieben.

    Was genau möchtest du machen?

    Verlinkte Screenshots für Textinformationen sind eine unheimliche Unart. Wenn du hier Text posten möchtest, dann kannst du ihn hier hereinkopieren. Am besten wäre es, den Text auch gleich zusammenzufassen.



  • Danke passt schon er hat es in einem anderen Thread public gemacht

    https://github.com/imerr/LibM2

    damit ist es möglich Statische Funktionen zu überschreiben.

    Ich muss mir den Code dann noch anschauen um mehr sagen zu können 🙂

    LG Exclain



  • Ja, er macht wohl genau was roflo und ich meinten. Nur dynamisch und mit mehr beweglichen Teilen:
    https://github.com/imerr/LibM2/blob/master/utils/detours.h#L350-L447

    Solange du nicht genauer erklärst, was du machen möchtest, wirst du vmtl. keine besonders guten Antworten bekommen.



  • Ich möchte zb diese Funktion verändern:

    void CInputAuth::Login(LPDESC d, const char * c_pData)
    {
    	TPacketCGLogin3 * pinfo = (TPacketCGLogin3 *) c_pData;
    
    	if (!g_bAuthServer)
    	{
    		sys_err ("CInputAuth class is not for game server. IP %s might be a hacker.", 
    			inet_ntoa(d->GetAddr().sin_addr));
    		d->DelayedDisconnect(5);
    		return;
    	}
    
    	char login[LOGIN_MAX_LEN + 1];
    	trim_and_lower(pinfo->login, login, sizeof(login));
    
    	char passwd[PASSWD_MAX_LEN + 1];
    	strlcpy(passwd, pinfo->passwd, sizeof(passwd));
    
    	sys_log(0, "InputAuth::Login : %s(%d) desc %p",
    			login, strlen(login), get_pointer(d));
    
    	if (false == FN_IS_VALID_LOGIN_STRING(login))
    	{
    		sys_log(0, "InputAuth::Login : IS_NOT_VALID_LOGIN_STRING(%s) desc %p",
    				login, get_pointer(d));
    		LoginFailure(d, "NOID");
    		return;
    	}
    
    	if (g_bNoMoreClient)
    	{
    		TPacketGCLoginFailure failurePacket;
    
    		failurePacket.header = HEADER_GC_LOGIN_FAILURE;
    		strlcpy(failurePacket.szStatus, "SHUTDOWN", sizeof(failurePacket.szStatus));
    
    		d->Packet(&failurePacket, sizeof(failurePacket));
    		return;
    	}
    
    	if (DESC_MANAGER::instance().FindByLoginName(login))
    	{
    		LoginFailure(d, "ALREADY");
    		return;
    	}
    
    	DWORD dwKey = DESC_MANAGER::instance().CreateLoginKey(d);
    	DWORD dwPanamaKey = dwKey ^ pinfo->adwClientKey[0] ^ pinfo->adwClientKey[1] ^ pinfo->adwClientKey[2] ^ pinfo->adwClientKey[3];
    	d->SetPanamaKey(dwPanamaKey);
    
    	sys_log(0, "InputAuth::Login : key %u:0x%x login %s", dwKey, dwPanamaKey, login);
    
    	TPacketCGLogin3 * p = M2_NEW TPacketCGLogin3;
    	thecore_memcpy(p, pinfo, sizeof(TPacketCGLogin3));
    
    	char szPasswd[PASSWD_MAX_LEN * 2 + 1];
    	DBManager::instance().EscapeString(szPasswd, sizeof(szPasswd), passwd, strlen(passwd));
    
    	char szLogin[LOGIN_MAX_LEN * 2 + 1];
    	DBManager::instance().EscapeString(szLogin, sizeof(szLogin), login, strlen(login));
    
    	DBManager::instance().ReturnQuery(QID_AUTH_LOGIN, dwKey, p, 
    		"SELECT PASSWORD('%s'),password,securitycode,social_id,id,status,availDt - NOW() > 0,"
    		"UNIX_TIMESTAMP(silver_expire),"
    		"UNIX_TIMESTAMP(gold_expire),"
    		"UNIX_TIMESTAMP(safebox_expire),"
    		"UNIX_TIMESTAMP(autoloot_expire),"
    		"UNIX_TIMESTAMP(fish_mind_expire),"
    		"UNIX_TIMESTAMP(marriage_fast_expire),"
    		"UNIX_TIMESTAMP(money_drop_rate_expire),"
    		"UNIX_TIMESTAMP(create_time)"
    		" FROM account WHERE login='%s'",
    		szPasswd, szLogin);
    }
    

    Der Source ist öffentlich jedoch nutzen viele nur die Kompilierte Version weil sie mit dem Source nicht umgehen können.

    Ich habe diese veraltete Passwort Variante select password() in md5(sha1(salt)md5(password)) geändert dazu muss jedoch der Query abgeändert werden in:

    DBManager::instance().ReturnQuery(QID_AUTH_LOGIN, dwKey, p, 
    	"SELECT password,salt,securitycode,social_id,id,status,availDt - NOW() > 0,"
    	"UNIX_TIMESTAMP(silver_expire),"
    	"UNIX_TIMESTAMP(gold_expire),"
    	"UNIX_TIMESTAMP(safebox_expire),"
    	"UNIX_TIMESTAMP(autoloot_expire),"
    	"UNIX_TIMESTAMP(fish_mind_expire),"
    	"UNIX_TIMESTAMP(marriage_fast_expire),"
    	"UNIX_TIMESTAMP(money_drop_rate_expire),"
    	"UNIX_TIMESTAMP(create_time)"
    	" FROM account WHERE login='%s'",
    	szLogin);
    

    meine Überlegung ist das es für die Nutzer am ende ein leichtes ist eine lib einzubinden.

    Diese Funktion ist aber in keiner Lib sondern so eingetragen wie bei meinem Demobeispiel.

    LG Exclain



  • Exclain schrieb:

    Der Source ist öffentlich jedoch nutzen viele nur die Kompilierte Version weil sie mit dem Source nicht umgehen können.

    Dann verteil eigene Pakete.

    Sorry, ich halte das nicht für sehr glaubwürdig. Du willst ausgerechnet die Login-Funktion austauschen und das ganze eher stealthy halten, hast aber wenig bis keine Ahnung von sowas? Klingt für mich eher nach Schadsoftware.



  • servus,

    was ist daran bitte unglaubwürdig?

    Gern lade ich dich in ein Teamviewer Meeting um es evtl besser erklären zu können.

    Und von Schadsoftware halte ich selber gleich mal gar nichts nur um das mal festzuhalten.

    LG Exclain



  • Keine Zeit und kein Interesse an Teamviewer-Meetings, sorry.

    Nochmal: Warum verteilst du nicht einfach eigene Pakete bzw. entsprechend modifizierte Binaries an deine User?



  • Kein Interesse ist gut.. dann wird sich das hier sicher erledigt haben.

    Ich würde den ganzen Source ja mal hoch laden jedoch sind das 2gb und das würde unseren Rahmen sprängen.

    Zu deiner Frage->

    Weil deren Binarys alle mit unterschiedlichen Zeug gepatcht sind und diese nicht raus gegeben werden wegen was auch immer.

    http://prntscr.com/9p4rxg

    LG Exclain



  • Was genau sollen deine ganzen Screenshots demonstrieren? Ich mache hier mal zu.


Anmelden zum Antworten