Перейти к содержанию

Как в Lua-Engine работать с формами?


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

Извиняюсь за тупой вопрос, но как в LUA работать с формами?

С формой созданной в CE-же, с дефолтным названием UDF1

События запускают скрипты, это фигня, а как вытащить текст из поля CEdit к примеру?

Я уже все известные мне способы перепробовал, либо говорит что неожиданное появление какого-то знака, либо ничего не делает.

Я уже 3 часа потратил, в ИНете задолбался рыться, нигде никакой инфы о работе с формами нет.

txtBox = component_findComponentByName(UDF1, "CEEdit1")
Вот ж блин, почти допёр.

Решил завтра её попробовать, а она, оказывается, как раз и есть то, что мне надо.

Изменено пользователем Dark_XSM
Ссылка на комментарий
Поделиться на другие сайты

Извиняюсь за тупой вопрос, но как в LUA работать с формами?

С формой созданной в CE-же, с дефолтным названием UDF1

Я тоже не знал как это сделать, но посмотрев здесь узнал:

Создал дефолтную форму UDF1, едит и кнопку. И повесил обработчик на кнопку при клике (код ниже). При клике в лог выводиться текст из едита:


function CEButton1Click(sender)
txtBox = component_findComponentByName(UDF1, "CEEdit1")
textValue = getProperty(txtBox, "Text")
print(textValue)
end

UDF1 в этом случае это объект формы. Если объект формы неизвестен, то нужно использовать перебор форм по индексам от нуля до количества индексов всех форм связанных с Cheat Engine.

getPropertyList(obj_class) создаёт список публичных свойств, среди которых можно найти свойство Text. Можно и не искать таким образом, а поискать названия свойств в дизайнере компонентов.

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

Наверно тему лучше было назвать как-то иначе, потому что есть ещё один вопрос, и к формам отношения никакого не имеет.

Есть скрипт на LUA

Он стартит процесс, открывает его, ловит создание одного адреса(таки допёр как собрать адрес из указателей юзая LUA), и если там появляется цифра 5, меняет её на 6(адрес статичный, в нём тока эта цифра, так что всё ок).

А нельзя ли как-нить сделать из этого .exe ? Типа LaunchNPatch.exe :)

Ибо основная идея - сделать эту штуку общедоступной, без использования CE

Да, и ещё, вот, собсно, скрипт. Хотелось бы узнать, как можно его улучшить



function OpenProcessFunc()
if openProcess("process.exe") then
timer_onTimer(Timer1, ChangeValue)
end
end

function ChangeValue()
Address = getAddress("process.exe")
Address = Address+0x0051E404
b4,b3,b2,b1 = readBytes(Address,4)
Address = string.format("%02x%02x%02x%02x",b1,b2,b3,b4)
Address = getAddress(Address)
Address = Address+0x24
b4,b3,b2,b1 = readBytes(Address,4)
Address = string.format("%02x%02x%02x%02x",b1,b2,b3,b4)
Address = getAddress(Address)
Address = Address+0xE4
b4,b3,b2,b1 = readBytes(Address,4)
Address = string.format("%02x%02x%02x%02x",b1,b2,b3,b4)
Address = getAddress(Address)
Address = Address+0xA0
Value = readFloat(Address)
if (b1 ~= 0) or (b2 ~= 0) or (b4 ~= 0) or (b4 ~= 0) then
if (Value == 5) then
writeFloat(Address,6)
timer_setEnabled(Timer1, false)
closeCE()
end
end
end

Timer1 = createTimer(nil)
timer_setInterval(Timer1,1000)
timer_setEnabled(Timer1, true)
timer_onTimer(Timer1, OpenProcessFunc)
createProcess("DISK:/path/process.exe",nil,nil,nil)

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

А нельзя ли как-нить сделать из этого .exe ? Типа LaunchNPatch.exe :)

Ибо основная идея - сделать эту штуку общедоступной, без использования CE

Можно сделать сохранив данные как .exe файл из меню главного окна. В этом случае будет автоматически выполняться встроенный Lua-код.

Да, и ещё, вот, собсно, скрипт. Хотелось бы узнать, как можно его улучшить



function OpenProcessFunc()
if openProcess("process.exe") then
timer_onTimer(Timer1, ChangeValue)
end
end

function ChangeValue()
Address = getAddress("process.exe")
Address = Address+0x0051E404
b4,b3,b2,b1 = readBytes(Address,4)
Address = string.format("%02x%02x%02x%02x",b1,b2,b3,b4)
Address = getAddress(Address)
Address = Address+0x24
b4,b3,b2,b1 = readBytes(Address,4)
Address = string.format("%02x%02x%02x%02x",b1,b2,b3,b4)
Address = getAddress(Address)
Address = Address+0xE4
b4,b3,b2,b1 = readBytes(Address,4)
Address = string.format("%02x%02x%02x%02x",b1,b2,b3,b4)
Address = getAddress(Address)
Address = Address+0xA0
Value = readFloat(Address)
if (b1 ~= 0) or (b2 ~= 0) or (b4 ~= 0) or (b4 ~= 0) then
if (Value == 5) then
writeFloat(Address,6)
timer_setEnabled(Timer1, false)
closeCE()
end
end
end

Timer1 = createTimer(nil)
timer_setInterval(Timer1,1000)
timer_setEnabled(Timer1, true)
timer_onTimer(Timer1, OpenProcessFunc)
createProcess("DISK:/path/process.exe",nil,nil,nil)

Можно сделать самый просто вариант, но это не значит что он самый лучший.

Предварительно создать запись "MyFloatValue" в главной таблице CE:

по шаблону f[[[[process.exe+0x0051E404]+0x24]+0xE4]+0xA0] = 5

Т.е "f" - значение float.

[[[[process.exe+0x0051E404]+0x24]+0xE4]+0xA0] - цепочка указателей


-- Срабатывает при любом открытии процесса
function onOpenProcess(processid)
local te = getTableEntry("MyFloatValue") -- f[[[[process.exe+0x0051E404]+0x24]+0xE4]+0xA0] = 5
memoryrecord_freeze(te, 0) -- 0=freeze, 1=allow increase, 2=allow decrease

while(true) do
sleep(500)
memoryrecord_unfreeze(te)
local value = memoryrecord_getValue(te)
if (value == "5") then
closeCE()
return caFree
end
memoryrecord_freeze(te, 0)
end
end

listProcess = getAutoAttachList()
stringlist_add(listProcess, "process.exe")

Цикл который я написал в while обычно не рекоммендуется и заменяется таймером, но это уже на твоё усмотрение. С таймерами ты работать у меешь.

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

А "return caFree" чего делает?

И про

"создать запись "MyFloatValue" в главной таблице CE:

по шаблону f[[[[process.exe+0x0051E404]+0x24]+0xE4]+0xA0]"

я не совсем понял.

В главной таблице можно создать просто адрес с указателями, а f[[...]+..] для меня загадка(в смысле, понятно что это, но куда это писать?)...

upd: файл я создал(exe), но при запуске значения не меняются, да ещё и вылазит вопрос, хочу ли я оставить предыдущую таблицу.

Значения так-же не меняются если я запущу CE через process.ct, и соглашусь на выплнение LUA-скрипта.

Если сначала запустить CE, а потом скрипт... та же фигня. Процесс сверху вроде тот написан, но значения он не считывает.

В списке в полях адресов строки типа [process.exe+490DA6]

OpenProcess("process.exe") работает как надо.

Ну и вдогонку, щас процесс создаётся через createProcess("DISK:/path/process.exe",nil,nil,nil), а надо что-нить типо createProcess("process.exe",nil,nil,nil)

Как это реализовать? Именно такая запись почему-то не работает, даже если exe лежит в папке с... exe

Путь-то может быть разный...

Изменено пользователем Dark_XSM
Ссылка на комментарий
Поделиться на другие сайты

<<А "return caFree" чего делает?

Такой код генерирует генератор трейнеров. Поэтому я взял это на заметку.


function CloseClick()
closeCE()
return caFree --onclick doesn't care, but onClose would like a result
end

Этот генератор сделал ДаркБайт и только он более точно знает, что делает этот код. Судя по комментариям вызов closeCE() видимо не всегда достаточно. Совершенно точно не скажу, но это вероятно завершение выполнение Lua кода с возвращением кода действия.

--CloseAction types

caNone=0;

caHide=1;

caFree=2;

caMinimize=3;

caFree, очевидно "точно высвобождает все ресурсы" в том числе и exe-трейнер, таймеры и т.п. Можно проверить на практике, но я этого пока не делал.

И про

"создать запись "MyFloatValue" в главной таблице CE:

по шаблону f[[[[process.exe+0x0051E404]+0x24]+0xE4]+0xA0]"

я не совсем понял.

В главной таблице можно создать просто адрес с указателями, а f[[...]+..] для меня загадка(в смысле, понятно что это, но куда это писать?)...

Такой формат можно задать только в программе MHS. Этот формат довольно удобный и мне удобнее его писать. В CE надо задавать так как позволено.

upd: файл я создал(exe), но при запуске значения не меняются, да ещё и вылазит вопрос, хочу ли я оставить предыдущую таблицу.

Я свой код не проверял. Я забыл, что при сохранении в exe запись в таблице не сохраняется. Её нужно добавить в генераторе трейнеров из главной таблицы CE и уже обращаться к ней. Попробуй сам разобраться...

Ну и вдогонку, щас процесс создаётся через createProcess("DISK:/path/process.exe",nil,nil,nil), а надо что-нить типо createProcess("process.exe",nil,nil,nil)

Как это реализовать? Именно такая запись почему-то не работает, даже если exe лежит в папке с... exe

Путь-то может быть разный...

По-моему путь нужно задавать полный и уж точно через формат двойной косой черты. Попробуй поискать свой ответ здесь.
Ссылка на комментарий
Поделиться на другие сайты

Я свой код не проверял. Я забыл, что при сохранении в exe запись в таблице не сохраняется. Её нужно добавить в генераторе трейнеров из главной таблицы CE и уже обращаться к ней. Попробуй сам разобраться...
Эм... да не, таблица по моему в файле есть, раз он спрашивает оставить ли её. Меня смущает сам факт этого вопроса, ведь если там нажать "No", то и изменений не будет.

В общем, я решил, что для exe лучше в самом скрипте адреса считать, что бы не было этого вопроса.

Про MHS я не в курсе(таких сокращений дико много, я не представляю о чём речь).

По поводу запуска - фиг бы знал.

В теме всё то же что я уже знаю, и что не работает.

os.execute хорошо бы, но она запускает только то что записано в системные пути.

Было бы хорошо считать путь из реестра...

Кстати, через cmd можно бы его получить, и если выполняемый LUA скрипт может принимать внешние параметры запуска, то передавать через них. Да и вообще, если так делать, то можно на реестр забить, и считывать прям так.

P.S Или может ну его на фиг, на каком-нить нормальном языке писать?..

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

>> Эм... да не, таблица по моему в файле есть, раз он спрашивает оставить ли её. Меня смущает сам факт этого вопроса, ведь если там

нажать "No", то и изменений не будет.

Раз вылазит такое сообщение, это странно. Наверняка, эту проблему можно решить.

>>В общем, я решил, что для exe лучше в самом скрипте адреса считать, что бы не было этого вопроса.

Как пожелаешь :) Главное, что работает.

Могу только обратить твоё внимание, что в способе который я предложил уже встроена запись/заморозка значения по цепочке указателей с проверками можно ли прочитать адрес с каждого уровня указателя... И весь этот механизм уже готов. Надо узнать как его использовать из Lua вот и все. Но если это даётся с большими трудом, когда уже есть готовое решение, то может быть стоит этим и не заниматься.

>> Про MHS я не в курсе(таких сокращений дико много, я не представляю о чём речь).

MHS это программа аналогичная Cheat Engine, которая имеет приятные мелочи по исследованию Windows-процессов в частности по указателям... Только жаль не"понимает" инструкции процессора набора SIMD, а самое печальное почему-то давно не обновляется автором.

По поводу запуска - фиг бы знал.

В теме всё то же что я уже знаю, и что не работает.

os.execute хорошо бы, но она запускает только то что записано в системные пути.

Было бы хорошо считать путь из реестра...

Кстати, через cmd можно бы его получить, и если выполняемый LUA скрипт может принимать внешние параметры запуска, то передавать через них. Да и вообще, если так делать, то можно на реестр забить, и считывать прям так.

P.S Или может ну его на фиг, на каком-нить нормальном языке писать?..

Lua скрипт не может принимать параметры запуска. И зачем это надо? Можно сделать файл настроек и его Lua может читать и что-то делать. А лучше сделать не просто текстовый/бинарный файл настроек, а текстовый файл с .lua cо своими переменными, данными и кодом. По поводу реестра я более чем уверен, что можно читать ветки реестра, но только извратом используя автоассемблер и WinApi.

<< P.S Или может ну его на фиг, на каком-нить нормальном языке писать?..

Использовать ли тебе Lua для решения подобных задач я не знаю. Это твоё решение. Я Lua использую, потому что этот язык позволяет управлять Cheat Engine, создавать сценарии, формы, "трейнеры", читы и т.п. Всё это можно делать на любом другом языке программирования в Windows.

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

Раз вылазит такое сообщение, это странно. Наверняка, эту проблему можно решить.
Только если адреса грузить отдельным файлом с таблицей, я так думаю.
Но если это даётся с большими трудом, когда уже есть готовое решение, то может быть стоит этим и не заниматься.
Да не сказать что с большим, просто утомляет. Мне надо было написать небольшой exe для запуска, а этот LUA то одно не умеет, то второе не так как обычно.

Что особого в готовом решении я не совсем понял, тем более что адрес я таки собираю с нуля, да и значение нормально считывается(тут, кстати, забавная штука, указатели на адрес собираются после записи туда значения, в результате чего отловить изначальную запись у меня не получилось, адрес всегда разный)...

Фриз/анфриз мне вообще не нужен, значение задаётся один раз, и пока не вырубишь(ясен пень что я не стал заниматься фигнёй, и нашёл куда пишется базовое значение, с которого берутся все остальные, и с которым сравниваются изменяющиеся).

MHS это программа аналогичная Cheat Engine, которая имеет приятные мелочи по исследованию Windows-процессов в частности по указателям... Только жаль не"понимает" инструкции процессора набора SIMD, а самое печальное почему-то давно не обновляется автором.
Вроде нашёл что-то, тоже позволяет скрипты писать... тока у меня с ней косяк, я не доверяю прогам, и доступ она получила крайне ограниченный, так что не работает :) (менять ничего не хочу, пусть не работает)
Lua скрипт не может принимать параметры запуска. И зачем это надо? Можно сделать файл настроек
Сделал. С ним та же фигня, путь уже чётко заданный нужен. Можно конечно заставлять юзера пихать файл в C:\, но хочется без этого.
Использовать ли тебе Lua для решения подобных задач я не знаю. Это твоё решение.
В курсе, это я так...

Правда с другими языками я тоже не знаком почти.

В общем, благодарю за помощь, но, кажись, LUA я оставлю в сторонке, и буду писать ланчеры на C++

Тем более что ночью скачался C++ Builder 2010-го года. Правда с установкой непонятная фигня, но это уже к теме не относится.

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

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.