Можно читать конкретные типы из памяти?
Используя JNA, я выяснил, как читать / писать по адресу, но я не уверен, как выяснить, к какому типу данных это, например,
D0 D1 D2 D3 D4 D5 D6 D7
someProgram.exe + "0x755A523D0" : 20 00 00 00 02 00 00 00
D8 D9 DA DA DB DC DE DF
someProgram.exe + "0x755A523D8" : 14 00 00 00 04 00 00 00
Я использую стороннюю программу просмотра памяти, чтобы найти эти значения, чтобы я мог проверить результаты по моей программе.
Два вышеупомянутых адреса содержат 4 целых числа, которые легко найти, просто отсканировав каждые 4 байта и преобразовав их в целое число, но где он становится более сложным, если у меня есть следующие адреса
D0 D1 D2 D3 D4 D5 D6 D7
someProgram.exe + "0x755A523D0" : 20 00 00 00 02 00 00 00
D8 D9 DA DA DB DC DE DF
someProgram.exe + "0x755A523D8" : 14 00 00 00 04 00 00 00
Просто чтобы доказать мою точку зрения, они точно такие же, как указанные выше адреса, но они не являются целыми числами, они длинные
Также может храниться 4 шорта по 8 байт или комбинация типов.
Можно ли было бы определить, что такое тип значения, и прочитать правильные значения с помощью JNA?
фрагмент кода чтения памяти
public static int[] ReadMyProcessMemory(Pointer ProcessToReadFrom, int AdressToReadFrom, int NumberOfBytesToRead)
{
//Make the Desired Functions available
Kernel32 Kernel32dll = Kernel32.INSTANCE;
int offset = AdressToReadFrom;
IntByReference baseAddress = new IntByReference();
baseAddress.setValue(offset);
Memory outputBuffer = new Memory(NumberOfBytesToRead);
boolean reader = Kernel32dll.ReadProcessMemory(ProcessToReadFrom, offset, outputBuffer, NumberOfBytesToRead, null);
if (reader)
{
//Process the received Data
byte[] bufferBytes = outputBuffer.getByteArray(0, NumberOfBytesToRead);
//Who wants signed byte? NOONE ! Lets convert it to a nice int !
int[] realvalues = new int[bufferBytes.length];
for (int i = 0; i < bufferBytes.length; i++)
{
if (bufferBytes[i] < 0)
{
realvalues[i] = 256 + bufferBytes[i];
}
else
{
realvalues[i] = bufferBytes[i];
}
}
//Conversion done ! lets Return the data (Remember its integer not hex)
return realvalues;
}
else
{
//Reading went wrong - SHIT
return null;
}
}
public interface Kernel32 extends StdCallLibrary
{
Kernel32 INSTANCE = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
boolean ReadProcessMemory(Pointer hProcess, int inBaseAddress, Pointer outputBuffer, int nSize, IntByReference outNumberOfBytesRead);
public Pointer OpenProcess(int dwDesiredAccess, boolean bInheritHandle, int dwProcessId);
boolean WriteProcessMemory(Pointer hProcess, int AdressToChange, Pointer ValuesToWrite, int nSize, IntByReference irgendwas);
int GetLastError();
//Needed for some Windows 7 Versions
boolean EnumProcesses(int[] ProcessIDsOut, int size, int[] BytesReturned);
int GetProcessImageFileNameW(Pointer Process, char[] outputname, int lenght);
}
1 ответ
Нет, без дополнительной информации о типах (где-то в памяти) это невозможно