Hilfe bei C++ rand() und srand()



  • Du verhaust hier gerade etwas.

    std::cout << name[i];
    

    Außerhalb der Schleife führt das Zwangsläufig zu einem Fehler. Er bezog sich darauf, dass du quasi "name" und nicht "name[n]" ausgibst.

    Du hast also 5 Elemente im Array. - Greifst aber auf keines davon zu, sondern gibst das Array (die Adresse dessen) aus.



  • Bei einem Array ist der Zugriff mittels des Namens dasselbe wie "&arrayname[0]", d.h.

    std::cout << name;
    

    sowie

    std::cout << &name[0];
    

    geben dieselbe Adresse aus.



  • Danke dir @Th69 das wusste ich nicht.

    und zu @inflames2k ich weis das er sich darauf bezogen hat. Da habe ich mich in meinem davohrige beitrag wohl etwas schlecht ausgedrückt trotzdem danke.

    Falls jemand weiß warum mein random array(mitlerweile string wie @Th69 vorgeschlagen hat) den gleichen array(string) aus gibt würde ich es gerne wissen 😃



  • Dann poste deinen aktuellen Code hier direkt im Forum (mit C++-Tags).

    PS: Kann ein Mod diesen Thread ins "C++"-Forum verschieben?



  • okay danke hier ist der volle projektcode.

    // AssaultCubeWithClr.cpp: Hauptprojektdatei.
    
    #include "stdafx.h"
    
    using namespace System;
    
    class variabeln
    {
    	public:
    		DWORD clientAddress = 0x400000;
    		DWORD playerBaseAdress = 0x00509b74;
    		DWORD offsePrimaryAmmo = 0x128;
    		DWORD offsetPistolAmmo = 0x13C;
    		DWORD offsetArmor = 0xFC;
    		DWORD offsetHealth = 0xF8;
    		DWORD offsetRoll = 0x0080;
    		//DWORD baseforName = 0x005028FC;
    		DWORD baseforName = 0x51019C;
    		DWORD teamNum1 = 0x204;
    		DWORD teamNum2 = 0x32C;
    		DWORD playerVertical = 0x44;
    		DWORD playerHorizontal = 0x40;
    
    		int inputCheat;
    		int inputNumber;
    		DWORD processId;
    		DWORD localPlayer;
    		DWORD localName;
    		DWORD primaryAmmo;
    		DWORD pistolAmmo;
    		DWORD health;
    		DWORD armor;
    		DWORD roll;
    
    		bool firstSetRand = true;
    		bool firstExecute = true;
    };
    
    struct InitRandHelper
    {
    	InitRandHelper() { srand((unsigned)time(0)); }
    };
    
    std::string randomName()
    	{
    	static InitRandHelper init;
    
    	int i = 1;
    	static std::string name;
    	for (int i = 1; i < 5; i++)
    		{
    			name += (char)('a' + rand() % ('z' - 'a' + 1));
    			std::cout << name[i] << std::endl;
    		}
    		return name;
    	}
    
    void StartText()
    {
    	//Text to See in the Console
    	Console::ForegroundColor = System::ConsoleColor::Green;
    	Console::WriteLine("Welcome to my Cheat for AssaultCube!");
    	Console::WriteLine("------------------------------------");
    	Console::WriteLine("1. For More Health type in: 1.");
    	Console::WriteLine("2. For More Ammo type in: 2");
    	Console::WriteLine("3. For More Armor type in: 3");
    	Console::WriteLine("4. For Turn on Name changer: 4");
    }
    int main(array<System::String ^> ^args)
    {
    	//create new object with variabeln
    	variabeln varobj;
    
    	HWND hwnd = FindWindowA(NULL, "AssaultCube");		//Find Window with Name AssaultCube
    
    	StartText();		//function call
    	while (true)
    	{
    
    		if (hwnd == NULL)	//Check if the game exists
    		{
    			if (varobj.firstExecute == true)
    			{
    				Console::ForegroundColor = System::ConsoleColor::Red;
    				Console::WriteLine("ERROR: The Game couldn´t found!");
    				varobj.firstExecute = false;
    			} 
    		}
    		else
    		{
    			GetWindowThreadProcessId(hwnd, &varobj.processId);		//Get Process id from the Window
    			HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, false, varobj.processId);
    
    			if (handle == NULL) //check if process id exsits
    			{
    				Console::ForegroundColor = System::ConsoleColor::Red;
    				Console::WriteLine("ERROR: Wrong Process Id!");
    				Console::ForegroundColor = System::ConsoleColor::Green;
    			}
    			else
    			{
    				ReadProcessMemory(handle, (LPCVOID)varobj.playerBaseAdress, &varobj.localPlayer, sizeof(varobj.playerBaseAdress), NULL); //Read the local adresse and save it in localPlayer
    				ReadProcessMemory(handle, (LPCVOID)varobj.baseforName, &varobj.localName, sizeof(varobj.playerBaseAdress), NULL);
    
    				varobj.primaryAmmo = varobj.localPlayer + varobj.offsePrimaryAmmo;
    				varobj.pistolAmmo = varobj.localPlayer + varobj.offsetPistolAmmo;
    				varobj.health = varobj.localPlayer + varobj.offsetHealth;
    				varobj.armor = varobj.localPlayer + varobj.offsetArmor;
    				varobj.roll = varobj.localPlayer + varobj.offsetRoll;
    
    				std::cin >> varobj.inputCheat;		//wait for user input
    
    				switch (varobj.inputCheat)			//check which case match with the user input
    				{
    					case 1:
    						Console::WriteLine("Write how much Health you want: ");
    						std::cin >> varobj.inputNumber;
    						WriteProcessMemory(handle, (LPVOID)varobj.health, &varobj.inputNumber, sizeof(varobj.inputNumber), NULL); //Write to the local adress memory and change the value
    						Console::WriteLine("\nWhat did you want to cheat up: ");
    						break;
    
    					case 2:
    						Console::WriteLine("Write how much Ammo you want: ");
    						std::cin >> varobj.inputNumber;
    						WriteProcessMemory(handle, (LPVOID)varobj.primaryAmmo, &varobj.inputNumber, sizeof(varobj.inputNumber), NULL); //Write to the local adress memory and change the value
    						Console::WriteLine("\nWhat did you want to cheat up: ");
    						break;
    
    					case 3:
    						Console::WriteLine("Write how much Armor you want: ");
    						std::cin >> varobj.inputNumber;
    						WriteProcessMemory(handle, (LPVOID)varobj.armor, &varobj.inputNumber, sizeof(varobj.inputNumber), NULL); //Write to the local adress memory and change the value
    						Console::WriteLine("\nWhat did you want to cheat up: ");
    						break;
    
    					case 4:
    						Console::WriteLine("Random Number: ");
    						WriteProcessMemory(handle, (LPVOID)varobj.localName, &randomName(), sizeof(randomName()), NULL); //Write to the local adress memory and change the value
    						Console::WriteLine("\nWhat did you want to cheat up: ");
    						break;
    
    					case 5:
    						Console::WriteLine("test: ");
    						std::cin >> varobj.inputNumber;
    						WriteProcessMemory(handle, (LPVOID)varobj.roll, &varobj.inputNumber, sizeof(varobj.inputNumber), NULL); //Write to the local adress memory and change the value
    						Console::WriteLine("\nWhat did you want to cheat up: ");
    						break;
    
    					default:
    						Console::ForegroundColor = System::ConsoleColor::Red;
    						Console::WriteLine("ERROR: Wrong Entry!");
    						Console::WriteLine("Try a other input :D");
    						Console::ForegroundColor = System::ConsoleColor::Green;
    						break;
    				}
    			}
    		}
    		Sleep(200);
    	} 
    	return 0;
    }
    


  • Du benutzt ja doch C++/CLI, aber das solltest du wirklich sein lassen und natives C++ verwenden (d.h. ein Win32-Konsolenprojekt im VS erzeugen).
    Du mischst in deinem Code bisher die WinAPI, C++-Standard als auch .NET - das wird auf Dauer nur Probleme machen...

    Entferne das 'static' bei 'std::string name'.

    Außerdem ist der Aufruf in Zeile 139

    WriteProcessMemory(handle, (LPVOID)varobj.localName, &randomName(), sizeof(randomName()), NULL); //Write to the local adress memory and change the value
    

    völlig falsch!

    Ich schreibe dir jetzt extra nicht sofort die Lösung hin, damit du ein bißchen darüber nachdenkst und recherchierst...



  • @Th69 okay vielen dank für die Antwort ich werde mal etwas rumexperimentieren und versuchen es rauszukriekgen 👍



  • was mir noch eingefallen ist wann soll man den dann C++\Cli benutzen und wann die c++ standart liabary?



  • C++/CLI ist nur als Interop-Sprache für Projekte zwischen C++ und .NET gedacht, nicht um damit eigenständige Programme zu entwickeln. Für .NET benutzt man daher hauptsächlich C#.

    s.a. den als wichtig markierten Beitrag Windows Forms und Visual C++ MACHT KEINEN SINN!



  • 2 Dinge erstens zu meinem Problem das konnte ich nun lösen und es funktioniert auch super indem ich das gemacht habe:

    char NamePrefix[][5] = {
    	"", "bel", "nar",
    	"xan", "bell", "natr",
    	"ev", "pe", "da", "wen"
    };
    char NameSuffix[][5] = {
    	"", "us", "ix", "ox", "ith",
    	"ath", "um", "ator", "or", "axia",
    	"imus", "ais", "itur", "orex", "o",
    	"y"
    };
    const char NameStems[][10] = {
    	"adur", "aes", "anim", "apoll", "imac",
    	"educ", "equis", "extr", "guius", "hann",
    	"equi", "amora", "hum", "iace", "ille",
    	"inept", "iuv", "obe", "ocul", "orbis"
    };
    char playerName[21];
    
    char* randomName(char* playerName)
    {
    	playerName[0] = 0;
    
    	strcat(playerName, NamePrefix[(rand() % 10)]);
    	strcat(playerName, NameSuffix[(rand() % 20)]);
    	strcat(playerName, NameStems[(rand() % 16)]);
    
    	playerName[0] = toupper(playerName[0]);
    	std::cout << playerName << std::endl;
    
    	return playerName;
    }
    
    case 4:
    					Console::WriteLine("Random Number: ");
    						WriteProcessMemory(handle, (LPVOID)varobj.localName, randomName(playerName), sizeof(playerName), NULL); //Write to the local adress memory and change the value
    						Console::WriteLine("\nWhat did you want to cheat up: ");
    						break;
    

    Wie du gesagt hast habe ich jetzt ein neues Projekt ohne Cli erstellt und tue von meinem altem Projekt nur die Funktionen übernehmen.

    2tens:
    Zudem was du zu C++/Cli geschrieben hast(und den link) konnte ich das hier raus zulesen bitte korrigiere mich falls es nicht stimmt.
    Cli nimmt man wenn man ein fertiges C++ Programm hat und das mit .net verbinden will.

    und was ich nicht weiß kann man auch ohne Cli .net programmieren oder ist das zwingend. Ich weiß das man mit c# .net programmieren kann geht das aber auch mit C++? 😕


Anmelden zum Antworten