Motley How do I cheat? Reputation: 0
Joined: 07 Jan 2022 Posts: 5
|
Posted: Fri Jan 07, 2022 8:12 am Post subject: Java, WriteProcessMemory(...) |
|
|
I'm trying to figure out how Writeprocess memory works.
Code: |
public static byte[] writeProcessMemory(String szWindowName, long lpBaseAddress, int offsets, int nSize, int data) throws MemoryException {
WinNT.HANDLE hProcess = openProcess(process.get(szWindowName).wProcessID);
Memory mToken = new Memory(data);
long lpPointerAddress = ((lpBaseAddress + offsets));
//System.out.println(Kernel32.INSTANCE.ReadProcessMemory(hProcess, new Pointer(lpPointerAddress), mToken, nSize, null));
boolean success = Kernel32.INSTANCE.WriteProcessMemory(hProcess, new Pointer(lpPointerAddress), mToken, nSize, null);
return success ? mToken.getByteArray(0, nSize) : null;
}
|
I'm able to read process memory just fine
Code: |
public static byte[] readProcessMemory(String windowName, int lpBaseAddress, int[] offsets, int nSize) throws MemoryException {
WinNT.HANDLE hProcess = openProcess(process.get(windowName).wProcessID);
byte[] result = readProcessMemory(hProcess, offsets, lpBaseAddress);
return result;
}
public static byte[] readProcessMemory(WinNT.HANDLE hProcess, int[] offsets, long lpBaseAddress) {
long pointer = lpBaseAddress;
long lpPointerAddress = 0;
int i_Size = 4;
Memory pTemp = new Memory(i_Size);
for(int i = 0; i < offsets.length; i++) {
if(i == 0) {
Kernel32.INSTANCE.ReadProcessMemory(hProcess, new Pointer(pointer), pTemp, i_Size, null);
}
lpPointerAddress = ((pTemp.getInt(0)+offsets[i]));
if(i != offsets.length-1)
Kernel32.INSTANCE.ReadProcessMemory(hProcess, new Pointer(lpPointerAddress), pTemp, i_Size, null);
}
System.out.println(Kernel32.INSTANCE.ReadProcessMemory(hProcess, new Pointer(lpPointerAddress), pTemp, i_Size, null));
boolean success = Kernel32.INSTANCE.ReadProcessMemory(hProcess, new Pointer(lpPointerAddress), pTemp, i_Size, null);
return success ? pTemp.getByteArray(0, i_Size) : null;
} |
I've edited my writeprocessmemory method so many times it might be even more broken than I would have thought.
I don't thin it matters but here is part of main
Code: |
public class Main {
public static final int
// Weapon ID in player Weapon Slots, 0 if not exist.
GRENADE_ID = 0x6fb1c8, WEP_GRENADE_OFFSET = 0x464,
M16 = 0x6fb1c8, M16_OFFSET = 0x3EC,
BAT = 0x6fb1c8, BAT_OFFSET = 0x374,
MOLOTOV = 0x6fb1c8, MOLOTOV_OFFSET = 0x44C,
COLT45 = 0x6fb1c8, COLT45_OFFSET = 0x38C,
BOMB = 0xfb1c8, BOMB_OFFSET = 0x47C,
ROCKETLAUNCHER = 0x6fb1c8, ROCKETLAUNCHER_OFFSET = 0x41C,
SHOTGUN = 0x6fb1c8, SHOTGUN_OFFSET = 0x3BC;
public static void main(String[] args) throws WindowNotFoundException, MemoryException {
Program.windowMemory("Grand Theft Auto III");
byte[] ADD_M16 = Program.writeProcessMemory("Grand Theft Auto III", M16, M16_OFFSET, 4, 6 );// nop, nop, nop, nop
//byte[] ADD_M16 = Program.writeProcessMemory("Grand Theft Auto III", M16, new int[] { M16_OFFSET }, 4);
byte[] WEP_M16 = Program.readProcessMemory("Grand Theft Auto III", M16, new int[] { M16_OFFSET }, 4);
//byte[] WEP_SHOTGUN = Program.readProcessMemory("Grand Theft Auto III", SHOTGUN, new int[] { SHOTGUN_OFFSET }, 4);
readByte(ADD_M16);
readByte(WEP_M16);
}
public static void readByte(byte[] readable) {
if (readable != null) {
int value = 0;
value += (readable[3] & 0x000000FF) << 24;
value += (readable[2] & 0x000000FF) << 16;
value += (readable[1] & 0x000000FF) << 8;
value += (readable[0] & 0x000000FF);
System.out.println(value);
}
}
} |
|
|