Авторизация  
Razi

[Cheat Engine] Как лучше сделать трейнер на считку/запись из адреса?

Рекомендуемые сообщения

1) Как лучше сделать трейнер на считку/запись из адреса на Lua? Есть адрес 009E8625 с 1-байтным значением уровня персонажа. Как лучше считывать из этого адреса в textbox? (textbox в CE называется CEedit). Как и когда лучше делать запись в этот адрес? (Потому что мы считываем значение из этого адреса, а одновременно считывать и записывать в адрес не подходит). 
Интересует такая же возможность как в Artmoney и CE, мы в таблице адресов в любой момент считываем/видим значение в таком-то адресе и в любой момент можем записать в него свое значение.

2) Вопрос такой же как предыдущий, но теперь 9 персонажей, у каждого свой адрес с 1-байтным значением уровня персонажа. Как лучше эти 9 значений считывать/записывать и в какой элемент управления? Подойдет ли для этого такой элемент, как обычная таблица? Но в конструкторе CE обычной таблицы кажется нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
48 минут назад, Razi сказал:

1) Как лучше сделать трейнер на считку/запись из адреса на Lua? Есть адрес 009E8625 с 1-байтным значением уровня персонажа. Как лучше считывать из этого адреса в textbox? (textbox в CE называется CEedit). Как и когда лучше делать запись в этот адрес? (Потому что мы считываем значение из этого адреса, а одновременно считывать и записывать в адрес не подходит). 

Чтение -> readBytes('009E8625')
Запись -> writeBytes('01634040',100)

 

Прочитает и запишет число в CEEdit1 :

UDF1.CEEdit1.Text = readBytes('009E8625')

 

При нажатии на CEEdit1 запишет в адрес 100 :
UDF1.CEEdit1.OnClick = function(sender)

    writeBytes('01634040',100)

end
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
24 минуты назад, ReWanet сказал:

Прочитает и запишет число в CEEdit1 :

UDF1.CEEdit1.Text = readBytes('009E8625')

Читать читает, а вот если написать: 

Скрытый текст

timer = createTimer(true)
timer:setInterval(500)
timer.OnTimer = function()
CETrainer.CEEdit1.Text = readBytes('009E8625')

CETrainer.CEEdit1.OnClick = function(sender)
    writeBytes('009E8625',CETrainer_CEEdit1)
end
end

 

 

тогда постоянно происходит считывание в CEEdit1 и записать свое значение уже нельзя. Как с этой ситуацией разобраться? Нужно и считывание из адреса в CEEdit1 и записывание в адрес из CEEdit1.

Изменено пользователем Razi

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
6 минут назад, Razi сказал:

тогда постоянно происходит считывание в CEEdit1 и записать свое значение уже нельзя. Как с этой ситуацией разобраться? Нужно и считывание из CEEdit1 и записывание в CEEdit1.

Смотри:
Поставь на CEEdit.ReadOnly на true после пропиши туда считывание. И после сделай при нажатии на CEEdit1 выключение CEEdit1.ReadOnly = false и timer.Enabled = false ( отключение таймера ) и все. А там и запись сделаешь через вспомогательную клавишу ну или через нажатие по Enter.

 

 

Насчет второго вопроса ( забыл о нем что-то ). Если лежат в структуре друг за дружком то просто в цикле считываешь.

Изменено пользователем ReWanet

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
14 минуты назад, ReWanet сказал:

Насчет второго вопроса ( забыл о нем что-то ). Если лежат в структуре друг за дружком то просто в цикле считываешь.

Там они не друг за дружком идут, а по идее через какое-то определенное смещение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
31 минуту назад, Razi сказал:

Там они не друг за дружком идут, а по идее через какое-то определенное смещение.

Ну к примеру вот у нас структура:
00000000    -    (byte)100
00000004    -    ?
00000008    -    ?
0000000C    -    ?
00000010    -    (byte)100
00000014    -    ?
00000018    -    ?

0000001C    -    ?
00000020    -    (byte)100
00000024    -    ?
00000028    -    ?
0000002C    -    ?
00000030    -    (byte)100

Каждое 10-ое смещение у нас лежит HP ((byte)100) и пишем цикл на считывание:

local offset = 0
for x = 1, 4 do 

    UDF1["CEEdit"..x].text = readBytes('009E8625+'..string.format('%x',offset)) --%x - для перевода в 16-ую систему.

    offset = offset + 16

end

Изменено пользователем ReWanet
  • Понравилось 1
  • Плюс 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну а если у тебя в разброс но смещения известны и они не меняют то просто прописать их типа так:
local offsetHP = { 0x1C, 0x38, 0x40, 0xDC }                -- просто рандом "смещения"

 

for x = 1, #offsetHP do                                                   

    UDF1["CEEdit"..x].Text = readBytes('009E8625+'..string.format('%x',offsetHP[x]))

end

  • Понравилось 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 11.02.2018 в 20:47, Razi сказал:

Подойдет ли для этого такой элемент, как обычная таблица? Но в конструкторе CE обычной таблицы кажется нет.

 

Визуальными стилями, цветами пожалуй возможно сделать подобие таблицы, если ровненько все поставить.

Если очень надо, то радикальный способ. Можно таблицу  сделать программно отрисовывая линии, текст и ставя EditBox в нужную позицию. Надо знать обработчики событий и доки по Lua смотреть.

 

В 11.02.2018 в 22:11, Razi сказал:

тогда постоянно происходит считывание в CEEdit1 и записать свое значение уже нельзя. Как с этой ситуацией разобраться? Нужно и считывание из адреса в CEEdit1 и записывание в адрес из CEEdit1.

 

Можно попробовать такой способ как работу с событиями CEEdit.

Получили фокус — заблокировали чтение из памяти  в EditBox (по таймеру).

Потеряли фокус — разрешили чтение из памяти в EditBox (по таймеру).

Что-то вводим — пишем в память из EditBox.

Скрытый текст

Events.png

 

Рекомендую полистать книжки по Дельфи7 для работы с компонентами похожими на те, что есть в Cheat Engine.  Например, про EditBox

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 часа назад, MasterGH сказал:

Получили фокус — заблокировали чтение из памяти  в EditBox (по таймеру).

Потеряли фокус — разрешили чтение из памяти в EditBox (по таймеру).

Что-то вводим — пишем в память из EditBox.

 

Именно так и пробовал сделать пару часов, но получилось сделать только сейчас.

Скрытый текст

timer = createTimer(true)
timer:setInterval(500)
timer.OnTimer = function()
CETrainer.CEEdit1.Text = readBytes('009E8625',1)
end

CETrainer.CEEdit1.OnEnter = function(sender)
    timer.Enabled = false
end

CETrainer.CEEdit1.OnChange = function(sender)
    writeBytes('009E8625',CETrainer.CEEdit1.Text)
end

CETrainer.CEEdit1.OnExit = function(sender)
    timer.Enabled = true
end

 

 

1) Запись происходит при событии OnChange. Не будет ли происходить запись дополнительно, когда в игре изменится значение в этом адресе, потому что тогда по идее сработает наше событие OnChange в CEEdit1?

2) Вообще в идеале хотелось бы сделать считку/запись также как в Artmoney. Там запись как-то реализована при выходе из поля ввода и после этого происходит сразу считывание. Смотрел в Artmoney: При входе в поле ввода (по второму клику) - считывание останавливается. При выходе происходит запись в адрес и после записи сразу считывание.  Непонятно как они это реализовали и как сделать также в текстбоксе CEEdit1?

3) И выходит если таких текстбоксов CEEdit1 нужно 150 штук, тогда для каждого нужно будет писать такой код? Подсказали, нужно делать через цикл считывание? А для записи в адрес, тогда нужно отдельно писать код для каждого Editbox получается.

Изменено пользователем Razi

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочу сделать что-то похожее: Такой трейнер есть для PC версии игры, хочу сделать для PS1 версии

Скрытый текст

2CgiW.jpg

 

2CgiX.jpg

 

2CgiY.jpg

 

2CgiZ.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
53 минуты назад, Razi сказал:

2) Вообще в идеале хотелось бы сделать считку/запись также как в Artmoney.

А почему не как в СЕ? 

У меня сейчас вот так спокойно читает и спокойно записывает:

 

Скрытый текст

function CETimer1Timer(sender)
UDF1.CEEdit1.Text = readInteger('038713A8')
end

function CEEdit1Change(sender)
writeInteger('038713A8',UDF1.CEEdit1.Text)
end

 

 

  • Плюс 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
9 минут назад, Garik66 сказал:

У меня сейчас вот так спокойно читает и спокойно записывает:

У него тот же код )
Он хочет как ArtMoney но даже не показывает как там работает :( 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 минуту назад, ReWanet сказал:

У него тот же код )

Не тот. @Razi, отключает таймер. Этого делать не нужно.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 минуты назад, Garik66 сказал:

Не тот. @Razi, отключает таймер. Этого делать не нужно.

Это по чему?) Ты проверь сможешь ли ты поменять текст в Edit с таким кодом не отключив чтение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
9 минут назад, ReWanet сказал:

Это по чему?) Ты проверь сможешь ли ты поменять текст в Edit с таким кодом не отключив чтение.

Скрытый текст

 

 

  • Плюс 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
16 минут назад, Garik66 сказал:

А почему не как в СЕ? 

В CE чтобы сделать запись в адрес нужно дважды кликнуть по значению и в появившемся окне ввести нужное значение и нажать enter или кнопку "да". А в Artmoney для записи нужно дважды кликнуть по значению и ввести нужное значение и выйти из этого элемента (кликнуть по другому элементу). В принципе там почти одинаково в обоих программах, только в CE появляется окошко для ввода значения и нажать enter или кнопку "да", а в Artmoney после ввода значения нужно нажать enter или выйти из элемента (ячейки).

25 минут назад, Garik66 сказал:

У меня сейчас вот так спокойно читает и спокойно записывает:

Да смотрел, работает как надо. Только один вопрос есть. Запись происходит при событии OnChange. Не будет ли происходить запись дополнительно, когда в игре изменится значение в этом адресе, потому что тогда по идее сработает наше событие OnChange в CEEdit1?

 

17 минут назад, ReWanet сказал:

Он хочет как ArtMoney но даже не показывает как там работает

Так Artmoney думаю очень многие знают как работает. Самый быстрый способ будет ее скачать и посмотреть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
3 минуты назад, Razi сказал:

Не будет ли происходить запись дополнительно, когда в игре изменится значение в этом адресе

Думаю не будет. Потесть в своей игре.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
12 минуты назад, Garik66 сказал:

 

Хм это странно.. По идеи он же не должен давать изменять т.к. постоянно меняет текст.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Только что, ReWanet сказал:

Хм это странно..

Магия Дарк Байта. :D

 

  • Плюс 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 минуту назад, Garik66 сказал:

Магия Дарк Байта. :D

 

Ну "век живи век учись" :D. Но это странно )

Хотя это я затупок ) Понял..

Изменено пользователем ReWanet
  • Плюс 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
10 минут назад, Razi сказал:

Так Artmoney думаю очень многие знают как работает. Самый быстрый способ будет ее скачать и посмотреть.

Ммм самый быстрый способ это объяснить или показать на деле.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Garik66 Но если этот код с формой сохранить и потом загрузить, тогда выдает ошибку: Error:attempt to call a nil value, пока не нажмешь execute script в show cheat table Lua script. Видимо при загрузке таблицы сразу включается таймер на форме, а скрипт мы еще не запустили и выдает ошибку видимо.

В том другом скрипте не позволяло делать запись, потому что постоянно происходило чтение.

Изменено пользователем Razi

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
8 минут назад, Razi сказал:

Garik66 Но если этот код с формой сохранить и потом загрузить, тогда выдает ошибку: Error:attempt to call a nil value, пока не нажмешь execute script в show cheat table Lua script. Видимо при загрузке таблицы сразу включается таймер на форме, а скрипт мы еще не запустили и выдает ошибку видимо.

В том другом скрипте не позволяло делать запись, потому что постоянно происходило чтение.

Ошибку выдает, потому что не хватает ещё записей, Нужно шоу самой формы.

Нужно подключение к процессу и т.д. Т.е. писать уже трейнер. Это же просто часть - опция работающая как тебе надо с элементом Эдит.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
7 минут назад, Garik66 сказал:

Ошибку выдает, потому что не хватает ещё записей, Нужно шоу самой формы.

Надо повесить на событие OnShow формы UDF1 код что ниже или как?

Скрытый текст

function FormShow(sender)
UDF1.show()
end

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Только что, Razi сказал:

Надо повесить на событие OnShow формы UDF1 код что ниже или как?

Просто 

UDF1.show()

Но мы сейчас не будет с тобой писать полностью трейнер. :D

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация