Здравствуйте, у меня проблема: любая попытка считывания памяти через readmem, что луа, что стандартным возвращает значение -1. Помогите, пожалуйста, кто знает в чём может быть проблема.
Пилот от админа запущен? Привязка к окну сделана? Защита типа фроста есть?
Другой тип данных прочитает?
--lua
local x = readmem (0x100BEA34, 'b')
log (x)
readmem $x 0x100BEA34 F
log $x
end_script
Странно, старым пробовал, не работало, но сейчас получилось, спасибо. Другой тип прочитал, видимо предположение верное. А на счёт перевода 4 байт в float, я честно говоря не представляют как это сделать. Я как то уже пытался вникнуть в то, как можно перевести одно в другое, но запутался в мантиссе и порядке, дилетантство даёт о себе знать.
--
Правило 1.8
Подскажите ещё, пожалуйста, мне нужно получить флоат значение по адресу game.exe+01C72AF4 со смещением 14. Что не так я сделал в этом коде ?
readmem $x 0x01C72AF4 D
set $x1 $x + 0x14
readmem $x2 $x1 F
log $x2
end_script
--lua
local ffi = require('ffi')
local kernel = ffi.load('Kernel32.dll')
ffi.cdef[[
void RtlMoveMemory(void *Destination, const void *Source, int Length);
]]
function to_float(byte0, byte1, byte2, byte3)
local pointer_float = ffi.new('float[1]')
kernel.RtlMoveMemory(pointer_float, ffi.new('char[4]', {byte0, byte1, byte2, byte3}), 4)
return tonumber(pointer_float[0])
end
log 'clear' log 'mode compact'
local x = to_float(54, 5, 16, 72) -- массив байт перевести во float
log(x)
readmem $x 0x01C72AF4 D game.exe
readmem $x 0x01C72AF4 D game.exe
Т. к. функция пилота readmem не читает дробные значения в синтаксисе луа, то можно использовать эту функцию.
--lua
local PROCESS_VM_READ = 0x0010
local ffi = require("ffi")
local user, kernel = ffi.load('User32'), ffi.load('Kernel32')
ffi.cdef[[
int OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
int GetWindowThreadProcessId(int hWnd, int *lpdwProcessId);
bool CloseHandle(int hObject);
bool ReadProcessMemory(int hProcess, int lpBaseAddress, void *lpBuffer, int nSize, int *lpNumberOfBytesRead);
]]
function readmemory(address)
if workwindow() == 0 then log('Не указано рабочее окно') return -1 end
local PID, pointer_float = ffi.new('unsigned long[1]'), ffi.new('float[1]')
user.GetWindowThreadProcessId(workwindow(), PID)
local process = kernel.OpenProcess(PROCESS_VM_READ, true, PID[0])
if process > 0 then
kernel.ReadProcessMemory(process, address, pointer_float, 4, nil)
kernel.CloseHandle(process);
return tonumber(pointer_float[0])
end
log('Процесс не открылся') return -2
end
-- всё что выше в начало скрипта
log 'clear' log 'mode compact'
local x = readmemory(0x001756C4) -- прочитать значение типа float с указанного адреса
log(x)
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)