Помощь - Поиск - Пользователи - Календарь
Полная версия: Помогите разобраться с Readmem
UoKit.com Форумы > Кликер > UO Pilot
IBayaNI
Здравствуйте, у меня проблема: любая попытка считывания памяти через readmem, что луа, что стандартным возвращает значение -1. Помогите, пожалуйста, кто знает в чём может быть проблема.
cirus
Пилот от админа запущен? Привязка к окну сделана? Защита типа фроста есть?
IBayaNI
Цитата(cirus @ 3.7.2020, 2:27) *

Пилот от админа запущен? Привязка к окну сделана? Защита типа фроста есть?

Да, да, нет. Думаю, что совершил какую-то наитупейшую ошибку, но не вижу её в упор. Вроде всё правильно делал.

--lua
local x = readmem (0x100BEA34, "F")
log (x)
cirus
Другой тип данных прочитает?
Код
--lua
local x = readmem (0x100BEA34, 'b')
log (x)

В старом синтаксисе прочитает?
Код
readmem $x 0x100BEA34 F
log $x
end_script


Возможно как связно с тем что в старом синтаксисе десятичный разделитель запятая, а в луа точка.
Либо прочитать отдельно 4 байта и перевести их во float.
Либо использовать старый синтаксис.
IBayaNI
Странно, старым пробовал, не работало, но сейчас получилось, спасибо. Другой тип прочитал, видимо предположение верное. А на счёт перевода 4 байт в float, я честно говоря не представляют как это сделать. Я как то уже пытался вникнуть в то, как можно перевести одно в другое, но запутался в мантиссе и порядке, дилетантство даёт о себе знать.
--
Правило 1.8
IBayaNI
Подскажите ещё, пожалуйста, мне нужно получить флоат значение по адресу game.exe+01C72AF4 со смещением 14. Что не так я сделал в этом коде ?
readmem $x 0x01C72AF4 D
set $x1 $x + 0x14
readmem $x2 $x1 F
log $x2
end_script
cirus
Цитата
А на счёт перевода 4 байт в float, я честно говоря не представляют как это сделать.

Код
--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)

Цитата
нужно получить флоат значение по адресу game.exe+01C72AF4 со смещением 14.

В readmem нужно указать имя модуля, game.exe в данном случае.
Код
readmem $x 0x01C72AF4 D game.exe
IBayaNI
Цитата(cirus @ 4.7.2020, 4:30) *

В readmem нужно указать имя модуля, game.exe в данном случае.
Код
readmem $x 0x01C72AF4 D game.exe


Кажется, со всем разобрался, большое вам спасибо за помощь
cirus
Т. к. функция пилота readmem не читает дробные значения в синтаксисе луа, то можно использовать эту функцию.
readmem float

Код
--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 © 2001-2024 Invision Power Services, Inc.