Dark_XSM
-
Постов
14 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные Dark_XSM
-
-
Эм... да не, таблица по моему в файле есть, раз он спрашивает оставить ли её. Меня смущает сам факт этого вопроса, ведь если там нажать "No", то и изменений не будет.Я свой код не проверял. Я забыл, что при сохранении в exe запись в таблице не сохраняется. Её нужно добавить в генераторе трейнеров из главной таблицы CE и уже обращаться к ней. Попробуй сам разобраться...В общем, я решил, что для exe лучше в самом скрипте адреса считать, что бы не было этого вопроса.
Про MHS я не в курсе(таких сокращений дико много, я не представляю о чём речь).
По поводу запуска - фиг бы знал.
В теме всё то же что я уже знаю, и что не работает.
os.execute хорошо бы, но она запускает только то что записано в системные пути.
Было бы хорошо считать путь из реестра...
Кстати, через cmd можно бы его получить, и если выполняемый LUA скрипт может принимать внешние параметры запуска, то передавать через них. Да и вообще, если так делать, то можно на реестр забить, и считывать прям так.
P.S Или может ну его на фиг, на каком-нить нормальном языке писать?..
-
А "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
Путь-то может быть разный...
-
Наверно тему лучше было назвать как-то иначе, потому что есть ещё один вопрос, и к формам отношения никакого не имеет.
Есть скрипт на 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)
-
Извиняюсь за тупой вопрос, но как в LUA работать с формами?
С формой созданной в CE-же, с дефолтным названием UDF1
События запускают скрипты, это фигня, а как вытащить текст из поля CEdit к примеру?
Я уже все известные мне способы перепробовал, либо говорит что неожиданное появление какого-то знака, либо ничего не делает.
Я уже 3 часа потратил, в ИНете задолбался рыться, нигде никакой инфы о работе с формами нет.
Вот ж блин, почти допёр.txtBox = component_findComponentByName(UDF1, "CEEdit1")Решил завтра её попробовать, а она, оказывается, как раз и есть то, что мне надо.
-
5 флоатная, выглядит как 40A00000
"0xADDRESS" уже пробовал.
Можно бы вычислить по обращениям в период между началом загрузки, и записью значения в постоянное место, но почему-то условие типа ((ESP == 0x0012FABC) and (EDI == 0x40A00000)) не срабатывает.
А иначе я задолбаюсь кнопку продолжения тыкать.
-
LUA я не знаю, на OllyDBG оно жалуется что найден отладчик.
-
Не знаю где спросить, а ИНет почему-то сильно тормозит, и просмотр тем куда надо писать может занять до 30 минут, так что спрашиваю тут:
Нельзя ли поставить брейкпоинт так, что бы он срабатывал только тогда, когда число в адресе становится равным, к примеру, 5 ?
Я не знаю как сформулировать вопрос, так что опишу ситуацию:
Есть некий адрес, который используется для хранения самых разных значений, в том числе и нужного мне.
Обращений к адресу примерно 1000 в секунду, примерно с 600 разных мест.
И какое-то из обращений пишет в адрес цифру 5
Можно как-то просто узнать, где она пишется, а не проверять каждую из 600 функций вручную?
-
Ещё вопрос имеется.
Есть несколько строк типа "repe movsd", в которых происходит что-то страшное.
Мне в это надо вмешаться, и что-то подправить, но я не представляю как, и что...
Как оно работает, и как вмешаться в её работу?
Там что-то происходит, с участием адреса 306F962C (хотя скорее не он нужен), надо что бы этого не происходило.
upd: думаю, это важно.
Во время работы этой строки меняются esi и edi, с шагом 4 байта, и ecx с шагом 1
00000184
306F9268
01B2F610
...
00000183
306F926C
01B2F614
-
Понял.Посмотри в дизассемблере что у тебя получается при активации чита.И ещё вопрос возник. Не совсем по этой теме...
Я так понял, на LUA можно несколько удобнее сделать?
Там же во время выполнения можно менять переменные по горячим клавишам, таким образом включая/отключая разные секции кода?
Тогда получается что в моём случае можно было бы менять сразу несколько переменных, включая и отключая любые из них, не трогая остальные(записывающиеся в адреса), а в автоассемблере есть только варианты вкл/выкл вообще всего...
Жаль что из программирования я тока про Паскаль чего-то помню, и про Java Script
-
xmm0 используется там каждые 20-30 строк, при чём постоянно с записями типа movss xmm0,[какой-нить адрес], и movss [тот же адрес],xmm0
Предыдущий код я понял, в тот раз затупил из-за movss xmm0,[ecx], но без неё всё стало ясно.
Не совсем понял чем
mov ecx,[[[[[p4dftre.dll+01849C8C]+24]+28]+128]+4]
lea ecx,[ecx+208]хуже
mov ecx,[p4dftre.dll+01849C8C]
mov ecx,[ecx + 24]
mov ecx,[ecx + 28]
mov ecx,[ecx + 128]
mov ecx,[ecx + 4]
lea ecx,[ecx + 208]Одно и то же делают вроде?
Или это в целях повышения стабильности? Типа, "а вдруг!.."?
Но ведь если адрес поменяется, оба варианта окажутся не верными... и в случае сравнения вообще ничего не произойдёт, всё будет идти как раньше, вылета не будет.
Кстати, крэш.
Разбираюсь.
upd: помогла замена
fld dword [value]
faddp dword [ecx]на
fld dword [ecx]
fadd dword [value]
fstp dwoed [ecx]Работает, но выглядит ужасно(не код, а последствия его срабатывания).
Всё же оставлю сравнение, бывает когда изменение переменной нежелательно(оно само определяет, надо ли менять)
newmem:
pushf
mov ecx,[[[[[p4dftre.dll+01849C8C]+24]+28]+128]+4]
lea ecx,[ecx+208]
cmp eax,ecx
jne originalcode
fld dword [ecx]
fadd dword [value]
fstp dword [ecx]
movss xmm0,[ecx]
originalcode:
popf
mov ecx,esi
movss [eax],xmm0
jmp returnhere -
Если честно, не очень понял. Адрес же через указатели генерится... и если адрес которым будет оперировать игра не совпадёт с тем с которым планировалось, просто ничего не произойдёт... по моему...По поводу твоего примера, лучше не писать цепочку в скрипте типа mov ebx,[[[[[p4dftre.dll+01849C8C]+24]+28]+128]+4] и убрать лишние инструкции. Цепочку лучше так не писать, потому что она рассчитывает один раз и ассемблируется как mov ebx,[адрес]. А адрес в течении игры может быть другим! Может быть вылет из игры.
Эм... указатель-то вроде точный... но не делать сравнения, значит просто его туда дописать отдельно? Э... что-то я тут подвис. Там же куча переменных идёт, через xmm0, все разные, для разных адресов...Если есть полная цепочка указателей, то лучше не делать сравнений...А в этом примере получается что любой адрес будет получать то что генерится в ecx
И кстати, почему ecx?
Учтём.lea ecx,[ecx + 208]P.S В общем, либо я туплю, либо чего-то не понимаю. В данной ситуации это немного разные вещи...
-
Хм... это бы конечно хорошо, но как это скрестить с тем что есть я не понял.
Есть вот что:
newmem:
pushf //на всякий
push ebx //в ebx строю указатель, в eax он уже есть
mov ebx,[[[some.dll+01249F10]+11]+200] //собсно, постройка указателя
add ebx,208 //всё ещё она...
cmp eax,ebx //сравнение того что у меня получилось с тем что записано в eax, ибо через это место единовременно считается примерно 200 переменных для разных адресов
jne originalcode //прыг если не то
add [eax],500000 //а если то, то, к примеру, добавить 500 тысяч обычных прям в память
movss xmm0,[eax] //запись из памяти в какое-то страшное место
originalcode:
pop ebx //восстановление ebx до чего-то там в диапозоне от 1 до 7
popf //восстановление "на всякий"
mov ecx,esi //неизвестная фигня
movss [eax],xmm0 //запись в память из какого-то страшного места
jmp returnhereИменно тут вместо 500000 требуется нечто более точное, ибо в [eax] число с точкой, и требует точности, а то что я написал хоть и работает, но немного не так как хотелось бы.
mov ecx,esi сюда запихать пришлось потому что в месте внедрения не хватило места для джампа. Я не знаю что они делают.
P.S Я, кстати, думаю, что там где +500000 можно записывать не в память, а локально, но не знаю есть ли смысл. Быстродействие не страдает абсолютно, а для чего ещё менять запись?..
upd:
Вот до чего додумался за просмотром серии симпсонов(7-й сезон):
newmem:
pushf
push ebx
mov ebx,[[[[[p4dftre.dll+01849C8C]+24]+28]+128]+4]
add ebx,208
cmp eax,ebx
jne originalcode
fld dword [ebx]
fadd dword [value]
fstp dword [ebx]
movss xmm0,[ebx]
originalcode:
pop ebx
popf
mov ecx,esi
movss [eax],xmm0
jmp returnhere
value:
dd (float)1.0Удивительно, но работает именно так как надо.
Благодарю за помощь.
Хоть я и не понял как работает вот это:
fld dword [esp]
fadd dword [value]
fstp dword [esp]
...
value:
dd (float)1.0
(это я к тому, что хотелось бы подробностей, как оно взаимосвязано, но самому смотреть лень)
-
Не знаю, ответят или нет, но спрашиваю:
А при замене куска памяти(Injection), если его можно включать и выключать, да и вообще, может произойти крэш?
Типа, прога обращается к адресу 004F2A12, а инжект в этот момент заменяет адреса с 004F2A00 по 004F2A20(допустим).
Я только второй день вплотную знакомлюсь со всей этой ассемблерной фигнёй, так что вопросов масса, но этот меня волнует больше всего.
Ещё вопрос: иногда случается крэш без видимой причины. Всё вроде работает, но при установке брейкпоинта и пошаговом выполнении иногда крэшится. В чём может быть причина?
Так всё работает идеально, а поставил брейкпоинт, пару циклов(и не обязательно пару, может вообще не вылететь, может вылететь сразу же) вручную запустил(ну в смысле кнопка Run, когда прога на брейкпоинте тормознёт), и крэш.
Ну и интересно было бы как добавить к float'ному значению float'ное же.
А то в eax что-то вроде 175.4727812, и добавть надо, допустим 3.4383
Читал статьи(где про FPU), но автоассемблер говорит что хрен бы знал чего я от него хочу...
Как в Lua-Engine работать с формами?
in Создание трейнеров в специальных студиях
Опубликовано
Что особого в готовом решении я не совсем понял, тем более что адрес я таки собираю с нуля, да и значение нормально считывается(тут, кстати, забавная штука, указатели на адрес собираются после записи туда значения, в результате чего отловить изначальную запись у меня не получилось, адрес всегда разный)...
Фриз/анфриз мне вообще не нужен, значение задаётся один раз, и пока не вырубишь(ясен пень что я не стал заниматься фигнёй, и нашёл куда пишется базовое значение, с которого берутся все остальные, и с которым сравниваются изменяющиеся).
Вроде нашёл что-то, тоже позволяет скрипты писать... тока у меня с ней косяк, я не доверяю прогам, и доступ она получила крайне ограниченный, так что не работает (менять ничего не хочу, пусть не работает) Сделал. С ним та же фигня, путь уже чётко заданный нужен. Можно конечно заставлять юзера пихать файл в C:\, но хочется без этого. В курсе, это я так...Правда с другими языками я тоже не знаком почти.
В общем, благодарю за помощь, но, кажись, LUA я оставлю в сторонке, и буду писать ланчеры на C++
Тем более что ночью скачался C++ Builder 2010-го года. Правда с установкой непонятная фигня, но это уже к теме не относится.