Text anzeigen - TextOut ?



  • zu Merker:

    je höher die Zahl wird, desto weniger kann man erkennen, und mit dem verlegen bringt auch nicht viel.

    zu Listing:

    aber es muss doch eine Möglichkeit geben...



  • supersass1 schrieb:

    zu Listing:

    aber es muss doch eine Möglichkeit geben...

    eine Möglichkeit was zu machen?



  • eine Möglichkeit, es ohne flackern hinzubekommen.



  • supersass1 schrieb:

    eine Möglichkeit, es ohne flackern hinzubekommen.

    Benutz den code den ich dir gegeben hab!?



  • @Listing: Das ist ja sehr interessant ... dein Code nutzt ja die interne Chat-print-Funktion von Warcraft (er funktioniert auch nur in einem Spiel, also nicht im Menü). Woher hast du ihn? Oder hast du selbst warcraft disassembelt? Bzw wo finde ich weiteren Code, der sich internen Warcraft-Funktionen bedient?
    HINWEIS: Um im BNet zu spielen dürfen keine 3rd-party-Tools verwendet werden! Das gilt sowohl für APM-Zähler, als auch Maphacks oder solchen Spielereien.
    Ich erinnere nur an die groß angelegten Key-Sperren, die euch auch treffen könnten, wenn ihr so ins BNet geht. Deshalb: verwendet unten stehenden Code nur in LANs oder im Spiel gegen den Computer!

    @Threadersteller: Ich habe Listings Code so implementiert:
    Meine exe-Datei, die die Dll-Datei in eine laufende Wc3-Anwendung injiziert:

    #include <windows.h>
    #include <tlhelp32.h>
    #include <iostream.h>
    
    bool InjectDllInProcess(char *pszDllFullPath, DWORD dwProcessId);
    DWORD GetWc3ProcessId();
    bool EnableDebugPrivilege();
    
    int main()
    {
    	cout << "Sleeping 5 seconds ..." << endl;
    	Sleep(5000);
    
    	if(!EnableDebugPrivilege())
    	{
    		cout << "Error enabling debug privilege" << endl;
    		return 0;
    	}
    	DWORD dwId = GetWc3ProcessId();
    	if(!dwId)
    	{
    		cout << "Process Id not found, closing" << endl;
    		return 0;
    	}
    	cout << "Process Id is " << dwId << ", injecting..." << endl;
    
    	if(InjectDllInProcess("E:\\injwc3.dll", dwId))
    		cout << "Injecting successful" << endl;
    	else
    		cout << "Injecting failed" << endl;
    	return 0;
    }
    
    DWORD GetWc3ProcessId()
    {
    	// search for process war3.exe:
    	HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    	PROCESSENTRY32 pe;
    	Process32First(hSnap, &pe);
    	do
    	{
    		if(!lstrcmpi(pe.szExeFile, "war3.exe"))
    		{
    			CloseHandle(hSnap);
    			return pe.th32ProcessID;
    		}
    	} while(Process32Next(hSnap, &pe));
    	CloseHandle(hSnap);
    
    	return 0;
    }
    
    bool InjectDllInProcess(char *pszDllFullPath, DWORD dwProcessId)
    {
    	HANDLE hProcess, hThread;
    	DWORD dwDllStringSize;
    	void *pRemoteString;
    	PTHREAD_START_ROUTINE pfnThreadRoutine;
    
    	pfnThreadRoutine = (PTHREAD_START_ROUTINE)
    	GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA");
    	// could the address of LoadLibraryA function be found?
    	if(!pfnThreadRoutine)
    		return false;
    	// open remote process with threadcreation- and writing-flags
    	hProcess = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION
    				| PROCESS_VM_WRITE | PROCESS_VM_READ, false, dwProcessId);
    	if(!hProcess)
    		return false;
    	// getsize of DllFullPath:
    	dwDllStringSize = lstrlenA(pszDllFullPath) + 1;	// +1 = zero
    	// reserve memory in the remote thread for the name of phtm-dll:
    	pRemoteString = VirtualAllocEx(hProcess, 0, dwDllStringSize,
    									MEM_COMMIT, PAGE_READWRITE);
    	if(!pRemoteString)
    	{
    		// cleanup
    		CloseHandle(hProcess);
    		return false;
    	}
    	// copy dll string into the remote process:
    	if(!WriteProcessMemory(hProcess, pRemoteString, pszDllFullPath,
    					dwDllStringSize, 0))
    	{
    		// cleanup
    		VirtualFreeEx(hProcess, pRemoteString, dwDllStringSize, MEM_RELEASE);
    		CloseHandle(hProcess);
    		return false;
    	}
    
    	hThread = CreateRemoteThread(hProcess, 0, 0,
    					pfnThreadRoutine, pRemoteString, 0, 0);
    	if(!hThread)
    	{
    		// cleanup
    		VirtualFreeEx(hProcess, pRemoteString, dwDllStringSize, MEM_RELEASE);
    		CloseHandle(hProcess);
    		return false;
    	}
    	// wait until remote thread ends:
    	WaitForSingleObject(hThread, INFINITE);
    	// cleanup:
    	VirtualFreeEx(hProcess, pRemoteString, dwDllStringSize, MEM_RELEASE);
    	CloseHandle(hThread);
    	CloseHandle(hProcess);
    
    	return true;
    }
    
    bool EnableDebugPrivilege()
    {
    	HANDLE hToken;
    	TOKEN_PRIVILEGES tp;
    	LUID luid;
    
    	if(!LookupPrivilegeValue(0, SE_DEBUG_NAME, &luid))
    		return false;
    
    	tp.PrivilegeCount		= 1;
    	tp.Privileges[0].Luid	= luid;
    	tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    
    	if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    		return false;
    	if(!AdjustTokenPrivileges(hToken, false, &tp, sizeof(TOKEN_PRIVILEGES), 0, 0))
    		return false;
    
    	CloseHandle(hToken);
    
    	return true;
    }
    

    E:\\injwc3.dll musst du damit mit dem Pfad deiner Dll-Datei ersetzen.

    Den Code der Dll-datei:

    #include <windows.h>
    #include <process.h>
    
    char * dumpFF = "xFFxFFxFFxFF";
    void __declspec(naked) printToScreen(char * myMessage) //by Listing(c)
    {
       __asm{
       printmessage:                           //<= Procedure Start
            push ebp
            mov ebp,esp
            push -1
            mov eax,dword ptr ds:[0x6f84cc20]
            test eax,eax
            je notingame                      //Kleiner Test ob man im Game ist
            cmp dword ptr ds:[eax+0x1ac],0    //weil sonst Abstürze möglich sind
            je notingame
            mov eax,dword ptr ds:[eax+0x3e0]
            mov edx,dword ptr ds:[eax]
            push 0
            push 0x41200000
            push dumpFF
            push [myMessage]  
            mov ecx,eax
            call dword ptr ds:[edx+0x6c]
          notingame:
          leave
          retn
       }
    
    }
    
    void PrintThread(void *p)
    {
    	int i = 0;
    	while(1)
    	{
    		char szBuf[MAX_PATH];
    		wsprintf(szBuf, "|cFFFFFF00Nachricht %i|r", i);
    		printToScreen(szBuf);
    		Sleep(2000);
    		i++;
    	}
    	_endthread();
    }
    
    BOOL WINAPI DllMain(HINSTANCE hinst, DWORD fdwReason, LPVOID lpReserved)  
    {
        switch (fdwReason)
        {
        case DLL_PROCESS_ATTACH:
            Sleep(2000);
    		_beginthread(PrintThread, 0, 0);
            break;
    	}
    
    	return true;
    }
    

    Wenn hier auch jmd TFT zoggt - schaut mal chan clan liz vorbei :).

    MfG



  • Black Shadow schrieb:

    @Listing: Das ist ja sehr interessant ... dein Code nutzt ja die interne Chat-print-Funktion von Warcraft (er funktioniert auch nur in einem Spiel, also nicht im Menü). Woher hast du ihn?

    Dazu sollte man Ahnung von Debuggern haben und ein bisschen asm können,
    ich hab den Code selber herrausgefunden auch wenn er einfach von WC3 gerippt ist
    ist (siehe char * dumpFF = "xFFxFFxFFxFF" ).
    Man muss nur dafür sorgen, dass alle register beim Call gleich sind, und rausfinden was die Argumente sind (bei dieser Funktion nicht viele)

    Bzw wo finde ich weiteren Code, der sich internen Warcraft-Funktionen bedient?
    

    In Warcraft? 😃
    Es gibt leider nicht sehr viel "public" code, der diese Funktionen nutzt, aber du kannst dich ja mal auf einigen Maphack Seiten umsehen, vielleicht findest du ja etwas (cryticalerror.net z.B.)



  • Black Shadow schrieb:

    BOOL WINAPI DllMain(HINSTANCE hinst, DWORD fdwReason, LPVOID lpReserved)  
    {
        switch (fdwReason)
        {
        case DLL_PROCESS_ATTACH:
            Sleep(2000);
    		_beginthread(PrintThread, 0, 0);
            break;
    	}
    	
    	return true;
    }
    

    Threads dürfen nicht im Kontext der DllMain gestartet werden:
    ➡ http://www.c-plusplus.net/forum/viewtopic-var-t-is-177681.html
    (Hoffe ich weiß auch bald wieso 😃 .)



  • @Black Shadow

    Welchen Compiler benutzt du denn?

    ich hab folgende Fehlermeldung:

    main.cpp: In function bool InjectDllInProcess(char*, DWORD)': main.cpp:58: error:PTHREAD_START_ROUTINE' undeclared (first use this function)
    main.cpp:58: error: (Each undeclared identifier is reported only once for each function it appears in.)
    main.cpp:58: error: expected ;' before "pfnThreadRoutine" main.cpp:60: error:pfnThreadRoutine' undeclared (first use this function)
    main.cpp:61: error: expected `;' before "GetProcAddress"
    main.cpp:131:2: warning: no newline at end of file
    Process terminated with status 1 (0 minutes, 1 seconds)
    5 errors, 2 warnings

    Ich habe gerade CodeBlocks benutzt. Ich weiß nicht der beste, aber irgendwie mag ich den 😉

    p.s. ich spiele FT 😉 nick: katha (frag mich bitte nicht warum ich so heiße 😃 )



  • es sieht so aus als hättest du nicht das neueste SDK, denn dein Compiler scheint den Datentyp PTHREAD_START_ROUTINE nicht zu kennen.
    Ich benutze VC++



  • ja das kann sein.. dann aktuallisier ich mal 😉

    ja bei VC++ hab ich nur diese privat-version. Da kommt dann immer erst dieses blöde Messagbox was man erst wegklicken muss. Das nervt mich 😉



  • füg mal sowas oben nach den includes hinzu:

    typedef DWORD (WINAPI *PTHREAD_START_ROUTINE)(
        LPVOID lpThreadParameter
        );
    typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
    

    das sollte allerdings auch in deiner winbase.h stehen - eventuell ist deine zu alt.



  • cool danke, keine Fehlermeldung mehr.

    Allerdings erhalte ich folgendes MessageBox:

    war3.exe - Abbild fehlerhaft
    Die Anwendung oder DLL c:\injwc3.dll ist keine gültige Windows-Datei....

    Kann man das ausschalten?!

    und, es wird kein Text in Warcraft angezeigt 😞



  • supersass1 schrieb:

    cool danke, keine Fehlermeldung mehr.

    Allerdings erhalte ich folgendes MessageBox:

    war3.exe - Abbild fehlerhaft
    Die Anwendung oder DLL c:\injwc3.dll ist keine gültige Windows-Datei....

    Kann man das ausschalten?!

    und, es wird kein Text in Warcraft angezeigt 😞

    wer/was gibt dir diese message box aus? warcraft?
    bist du sicher, dass die Datei C:\injwc3.dll existiert?
    Hast du sie als dynamische link library auch kompiliert?

    Und wie gesagt: wenn es funktioniert siehst du auch erst text wenn du in einem spiel bist.



  • wow, es klappt. Lag am Compiler, den von CodeBlocks hat keine vernünftige DLL Kompilierung, im Prinzip gar keine.

    Kannst du mir vielleicht mal deine injwc3.dll schicken?
    Weil wie gesagt, ich habe nur diese "Billig" Version, und muss immer den OK Button klicken.

    p.s. ich seh grad, kann man hier gar keine Dateien anhängen?



  • Ich sehe wenig sinn darin, dir meine dll-datei zu schicken, da du nur im 2-sekunden intervall "nachricht xx" siehst.
    Lade dir doch das Visual Studio Express runter - das ist kostenlos und hat diese nervige Meldung nicht.
    Wenn du trotzdem meine Dll haben willst: http://rapidshare.com/files/26124524/injwc3.dll.html .
    Ich sprech dich auch mal in TFT an, wenn du on bist.
    @CodeFinder: Jo das hab ich auch gelesen, ich wüsste aber auch gerne wieso 😛 😃 . Also es funktioniert ... 😃



  • ja hast eigentlich Recht 😉
    Okay, wegen Express werd ich machen. Dankeschön 🙂



  • geh mal in wc3 on, ich whisper dich an.
    Oder du mich: SilverSIut ist mein Nick.



  • bin ich



  • @supersass1:
    Was hat man eigentlich davon wenn man sich einen String anzeigen lässt ? Ev. ist TextOut () nach wie vor die bessere Lösung.

    @Black Shadow:
    Bau doch in die "void PrintThread(void *p)" noch eine GetMessage () - Schleife. Dann kannst Du mit dem Thread "kommunizieren". 🙂



  • @merker:

    ich verstehe dich. aber was bringt mit ein Text-Anzeige mittels TextOut() die flackert, und fast kaum lesbar ist. Zumidnest nicht angenehm?!

    Ich weiß ja nicht was es noch für Möglichkeiten gibt..


Anmelden zum Antworten