JavaRush/Java блог/Random/Java Memory Manipulation
Cyber Cheat
5 уровень

Java Memory Manipulation

Статья из группы Random
участников
Добрый день гуру Java! Вообщем задался таким вопросом, могу ли я читать и записывать в процесс приложений мною написанными благодаря библиотеке Java Memory Manipulation Задаюсь этим вопросом не первый раз, но в интернете очень мало информации по данному вопросу, т.к все пишут, что в Java это невозможно, хотя видел некоторые посты, что это реально. По этому хотел попросить помощи у вас, как мне реализовать данный продукт? :)
public static void main(String args[]) {
    	//Get ProcessID
    	long pid = findProcessId("nuclearthrone.exe");
    	if(pid == 0) {
    		System.err.println("ProcessId not found.");
    		System.exit(1);
    	}
    	System.out.println(pid);

    	Pointer readProcess = openProcess(readRight, pid);//opens process with read privileges
    	Pointer writeProcess = openProcess(writeRight, pid);

    	int size = 4;//we want to read 4 bytes
    	int adress = Integer.parseInt("036CB314", 16);

    	//ReadMemory
    	 read = readMemory(readProcess, adress, size);
    	System.out.println(read.getInt(0));//value of memory read

    	//Write Memory
    	Cheater.writeMemory(4, 1079246848, writeProcess, adress);
    }

    static long findProcessId(String processName) {
		//This Reference will contain the processInfo that will be parsed t recover the ProcessId
		Tlhelp32.PROCESSENTRY32.ByReference processInfo = new Tlhelp32.PROCESSENTRY32.ByReference();

		//this handle allows us to parse the process map
		WinNT.HANDLE processesSnapshot = kernel32.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPPROCESS, new DWORD(0L));
		if(processesSnapshot == kernel32.INVALID_HANDLE_VALUE) {
			if(DEBUG) System.err.println("INVALID_HANDLE_VALUE");
			return 0L;
		}

		try {// This will parse all the processes to find the process id corresponding to the process name
			kernel32.Process32First(processesSnapshot, processInfo);
			if(processName.equals(Native.toString(processInfo.szExeFile))) {
				if(DEBUG) if(DEBUG) System.out.println("Process " + processName + " found : " + processInfo.th32ProcessID.longValue());
                return processInfo.th32ProcessID.longValue();
			}

			while(kernel32.Process32Next(processesSnapshot, processInfo)) {
				if(processName.equals(Native.toString(processInfo.szExeFile)))
                {
                    if(DEBUG) System.out.println("Process " + processName + " found : " + processInfo.th32ProcessID.longValue());
                    return processInfo.th32ProcessID.longValue();
                }
			}

			if(DEBUG) System.out.println("Did not find requested Process: " + processName);
			return 0L;
		} finally {
			kernel32.CloseHandle(processesSnapshot);
		}
	}//findProcessId

    static Pointer openProcess( permissions, long pid) {
    	Pointer process = myKernel32.OpenProcess(permissions, true, (int)pid);
    	 process;
    }
    static Memory readMemory( process, int adress, int readSize) {
    	 output = new Memory(readSize);
		if(!myKernel32.ReadProcessMemory(process, adress, output, readSize, new IntByReference(0))) {
			int error =myKernel32.getLastError();
			switch(error) {
			default:
				System.err.println("Failed to read the process: " + error);
				break;
			case 0x12B:
				System.err.println("Failed to read the specified adress");
				break;
			}
			System.exit(1);
		}
		return output;
    }
    static void writeMemory(int readSize, int newValue, Pointer process, long adress) {
    	IntByReference written = new IntByReference(0);
		 toWrite = new Memory(readSize);

		toWrite.setInt(0, newValue);

		if(!myKernel32.WriteProcessMemory(process, (int)adress toWrite, , written)) {
			int error = myKernel32.getLastError();
			switch(error)
            {
                default:
                    System.err.println("Failed to write in the process : " + error);
                    break;
            }
            System.exit(1);
		}
		System.out.println("Wrote " + written.getValue() + " times");
    }
Комментарии (4)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Ярослав Java Developer Master
17 апреля 2019, 20:55
Так, ты можешь понятнее объяснить, что тебе нужно, в чем проблема, которую ты хочешь решить?
Cyber Cheat
Уровень 5
17 апреля 2019, 21:02
Указал код выше, почему-то когда я начинаю читать процесс благодаря коду моему, процесс аварийно завершается.. Не могу понять почему..
Ярослав Java Developer Master
18 апреля 2019, 06:42
Что значит "аварийно завершается"? Это ничего не говорит. Какая ошибка, где стак трэйс? Далее, что вообще код должен сделать? Вычитать 4 байта из одного процесса и записать в другой? Тут следует словами объяснить цель или проблему, которую вы хотите решить. И вы уверены, что Java - язык, который для этого нужен? Java избегает низкого уровня - управление памятью и все в таком духе. Конечно есть несколько хаков, как через рефлексию достать Unsafe объект, и заюзать его для обращения к памяти, но это уже экзотические техники. Для решения вашей задачи, вам нужны языки ближе к низкому уровню, это С, С++ или хотя бы С#, если я правильно знаю, там тоже можно как-то обращаться с памятью напрямую.
Cyber Cheat
Уровень 5
18 апреля 2019, 14:02
Нет, либо я не так выразился, либо вы не поняли.. Я С++ знаю, и на С++ знаю как читать память и создавал драйвера и процессы для чтения памяти. Но я решил изучать Java и знаю, что Java плохо подходит для этого, но всё же, реализовать возможно. Только нужно решить как.. Завершает процесс не сам код который я написал, а приложение с которого я пытаюсь прочитать память. Будь то игра, приложение подобно "Telegram.exe" и т.д.. По этому я хочу решить этот вопрос и обратился за помощью к Гуру Явы)))