Xin chào Đạo sư Java! Nói chung, tôi đã tự hỏi mình câu hỏi sau: liệu tôi có thể đọc và ghi vào các ứng dụng quy trình mà tôi đã viết nhờ thư viện Thao tác bộ nhớ Java không?Đây không phải là lần đầu tiên tôi hỏi câu hỏi này, nhưng có rất ít thông tin về nó. vấn đề này trên Internet, bởi vì mọi người đều viết rằng điều này là không thể xảy ra trong Java, mặc dù tôi đã thấy một số bài đăng cho rằng điều này là có thật. Đó là lý do tại sao tôi muốn nhờ bạn giúp đỡ, tôi có thể triển khai sản phẩm này bằng cách nào? :)
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");
}
GO TO FULL VERSION