Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Помогите разобраться с Readmem
IBayaNI
сообщение 2.7.2020, 20:17
Сообщение #1


*

Registred
Сообщений: 5
Регистрация: 2.7.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.687
Возраст: 19



Здравствуйте, у меня проблема: любая попытка считывания памяти через readmem, что луа, что стандартным возвращает значение -1. Помогите, пожалуйста, кто знает в чём может быть проблема.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 3.7.2020, 1:27
Сообщение #2


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Пилот от админа запущен? Привязка к окну сделана? Защита типа фроста есть?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
IBayaNI
сообщение 3.7.2020, 14:59
Сообщение #3


*

Registred
Сообщений: 5
Регистрация: 2.7.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.687
Возраст: 19



Цитата(cirus @ 3.7.2020, 2:27) *

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

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

--lua
local x = readmem (0x100BEA34, "F")
log (x)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 3.7.2020, 15:24
Сообщение #4


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



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

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


Возможно как связно с тем что в старом синтаксисе десятичный разделитель запятая, а в луа точка.
Либо прочитать отдельно 4 байта и перевести их во float.
Либо использовать старый синтаксис.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
IBayaNI
сообщение 3.7.2020, 16:10
Сообщение #5


*

Registred
Сообщений: 5
Регистрация: 2.7.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.687
Возраст: 19



Странно, старым пробовал, не работало, но сейчас получилось, спасибо. Другой тип прочитал, видимо предположение верное. А на счёт перевода 4 байт в float, я честно говоря не представляют как это сделать. Я как то уже пытался вникнуть в то, как можно перевести одно в другое, но запутался в мантиссе и порядке, дилетантство даёт о себе знать.
--
Правило 1.8


Сообщение отредактировал Fors1k - 3.7.2020, 16:16
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
IBayaNI
сообщение 3.7.2020, 20:29
Сообщение #6


*

Registred
Сообщений: 5
Регистрация: 2.7.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.687
Возраст: 19



Подскажите ещё, пожалуйста, мне нужно получить флоат значение по адресу game.exe+01C72AF4 со смещением 14. Что не так я сделал в этом коде ?
readmem $x 0x01C72AF4 D
set $x1 $x + 0x14
readmem $x2 $x1 F
log $x2
end_script
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 4.7.2020, 3:30
Сообщение #7


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Цитата
А на счёт перевода 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
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
IBayaNI
сообщение 4.7.2020, 11:35
Сообщение #8


*

Registred
Сообщений: 5
Регистрация: 2.7.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.687
Возраст: 19



Цитата(cirus @ 4.7.2020, 4:30) *

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


Кажется, со всем разобрался, большое вам спасибо за помощь
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 4.7.2020, 18:29
Сообщение #9


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Т. к. функция пилота 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)

Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 28.3.2024, 18:01
Designed by Nickostyle