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

 
Ответить в эту темуОткрыть новую тему
> Ошибка в lua или я чего-то не понимаю?
nagas
сообщение 30.9.2019, 7:17
Сообщение #1


*

Registred
Сообщений: 6
Регистрация: 20.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.692



есть код написанный на языке пилота для чтения памяти с офсетами
Код
 
proc readIntager %arr
    set #sizeArr size(%arr)
    set #adrVal 0
    for #i 1 #sizeArr 1
        set #address #adrVal + %arr[#i]
        readmem #adrVal #address d
        log #adrVal
    end_for
    set $result #adrVal
end_proc

set #gameAdr 0xC392CC
init_arr %targetOffsets #gameAdr 0x34 0xC88
call readIntager %targetOffsets
end_script

выдает он результат как надо:
7:10:37 AM 16 (, 7): 409636904
7:10:37 AM 16 (, 7): 434424376
7:10:38 AM 16 (, 7): 2194703172

переписал этот код на Lua:
Код

--lua

local readIntager = function (offsets)
    local adrVal = 0
    for i, offset in ipairs(offsets) do
        adrVal = readmem(adrVal + offset, "d")
        log(adrVal)
    end
    return adrVal
end

local gameAdr = 0xC392CC
local targetWID = readIntager({gameAdr, 0x34, 0xC88})

выдает:
7:14:57 AM 17 (autosaved_17.txt, 0): 409636904
7:14:57 AM 17 (autosaved_17.txt, 0): 434424376
7:14:57 AM 17 (autosaved_17.txt, 0): -1
т.е. первые 2 офсета читает норм, а с 3 проблема...
собственно вопрос: wtf?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
nagas
сообщение 30.9.2019, 7:48
Сообщение #2


*

Registred
Сообщений: 6
Регистрация: 20.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.692



выглядит так, будто результат не поместился в int32 и он записал его как -1
может знаете как исправить, чтот не нагуглил по быстрому)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 30.9.2019, 9:58
Сообщение #3


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21043
Пользователь №: 16.156



Скорее адрес неверный/недоступный. Буффер беззнаковый uint32(d в readmem).
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
nagas
сообщение 30.9.2019, 14:02
Сообщение #4


*

Registred
Сообщений: 6
Регистрация: 20.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.692



Цитата(Cockney @ 30.9.2019, 9:58) *

Скорее адрес неверный/недоступный. Буффер беззнаковый uint32(d в readmem).

Как адрес может быть недоступен!?!? Скрипты одинаковые! Первые выдает нормально значение, запускаю второй - он не выдает. Запускаю снова первый, снова нашел все значения, запускаю второй - снова не нашел последнее!!! и так много раз повторил, эффекта - 0
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
nagas
сообщение 30.9.2019, 14:12
Сообщение #5


*

Registred
Сообщений: 6
Регистрация: 20.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.692



Уверен на 99%, что проблема в int32, провел несколько тестов, если последнее значение меньше 2,147,483,647 то значение показывается нормально. Если больше то -1.
Остается вопрос как это можно пофиксить)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
nagas
сообщение 30.9.2019, 14:25
Сообщение #6


*

Registred
Сообщений: 6
Регистрация: 20.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.692



Более того, ошибка находится именно в функции "readmem" так как в самой программе lua нормально работает и с int64. И даже изменение типа на "DO"ничего не изменило(
Если кто-то сможет прочитать с помощью readmem число большее 2,147,483,647 то проблема у меня локальная. Плиз протестите кто-нибудь у себя чтение из памяти!
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
nagas
сообщение 30.9.2019, 17:45
Сообщение #7


*

Registred
Сообщений: 6
Регистрация: 20.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.692



Окей, я пофиксил это костылем с помощью считывания строки и конвертации ее в uint...
если кому вдруг нужен мой луашный нубо-код, вот:
Код

--lua

local tableRaverse = function(table)
    local reversed = {}
    local index = 1
    for i = #table, 1, -1 do
        reversed[index] = table[i]
        index = index + 1
    end
    return reversed
end

function toBits(num)
    local t={}
    while num>0 do
        rest=math.fmod(num,2)
        t[#t+1]=rest
        num=(num-rest)/2
    end
    return tableRaverse(t)
end

local asciiConvertToUInt32 = function (strAscii)
    local bytes = {string.byte(strAscii, 1, 4)}
    local res = 0

    for i, byte in ipairs(bytes) do
        res = res + (byte * 2^((i - 1 )*8))
    end
    return res
end

local readIntager = function (offsets)
    local adrVal = 0
    for i, offset in ipairs(offsets) do
        local adr = adrVal + offset
        adrVal =  asciiConvertToUInt32(readmem(adr, "s", 4))
    end
    return adrVal
end

local gameAdr = 0xC392CC
local targetWID= readIntager({gameAdr, 0x34, 0xC88})
log(targetWID)

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

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

 

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