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

Dark_XSM

Стажёры
  • Постов

    14
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Dark_XSM

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  3. А "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

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

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

    Есть скрипт на 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)

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

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

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

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

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

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

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

  6. 5 флоатная, выглядит как 40A00000

    "0xADDRESS" уже пробовал.

    Можно бы вычислить по обращениям в период между началом загрузки, и записью значения в постоянное место, но почему-то условие типа ((ESP == 0x0012FABC) and (EDI == 0x40A00000)) не срабатывает.

    А иначе я задолбаюсь кнопку продолжения тыкать.

  7. Не знаю где спросить, а ИНет почему-то сильно тормозит, и просмотр тем куда надо писать может занять до 30 минут, так что спрашиваю тут:

    Нельзя ли поставить брейкпоинт так, что бы он срабатывал только тогда, когда число в адресе становится равным, к примеру, 5 ?

    Я не знаю как сформулировать вопрос, так что опишу ситуацию:

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

    Обращений к адресу примерно 1000 в секунду, примерно с 600 разных мест.

    И какое-то из обращений пишет в адрес цифру 5

    Можно как-то просто узнать, где она пишется, а не проверять каждую из 600 функций вручную?

  8. Ещё вопрос имеется.

    Есть несколько строк типа "repe movsd", в которых происходит что-то страшное.

    Мне в это надо вмешаться, и что-то подправить, но я не представляю как, и что...

    Как оно работает, и как вмешаться в её работу?

    Там что-то происходит, с участием адреса 306F962C (хотя скорее не он нужен), надо что бы этого не происходило.

    upd: думаю, это важно.

    Во время работы этой строки меняются esi и edi, с шагом 4 байта, и ecx с шагом 1

    00000184

    306F9268

    01B2F610

    ...

    00000183

    306F926C

    01B2F614

  9. Посмотри в дизассемблере что у тебя получается при активации чита.
    Понял.

    И ещё вопрос возник. Не совсем по этой теме...

    Я так понял, на LUA можно несколько удобнее сделать?

    Там же во время выполнения можно менять переменные по горячим клавишам, таким образом включая/отключая разные секции кода?

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

    Жаль что из программирования я тока про Паскаль чего-то помню, и про Java Script

  10. 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

  11. По поводу твоего примера, лучше не писать цепочку в скрипте типа mov ebx,[[[[[p4dftre.dll+01849C8C]+24]+28]+128]+4] и убрать лишние инструкции. Цепочку лучше так не писать, потому что она рассчитывает один раз и ассемблируется как mov ebx,[адрес]. А адрес в течении игры может быть другим! Может быть вылет из игры.
    Если честно, не очень понял. Адрес же через указатели генерится... и если адрес которым будет оперировать игра не совпадёт с тем с которым планировалось, просто ничего не произойдёт... по моему...
    Если есть полная цепочка указателей, то лучше не делать сравнений...
    Эм... указатель-то вроде точный... но не делать сравнения, значит просто его туда дописать отдельно? Э... что-то я тут подвис. Там же куча переменных идёт, через xmm0, все разные, для разных адресов...

    А в этом примере получается что любой адрес будет получать то что генерится в ecx

    И кстати, почему ecx?

    lea ecx,[ecx + 208]
    Учтём.

    P.S В общем, либо я туплю, либо чего-то не понимаю. В данной ситуации это немного разные вещи...

  12. Хм... это бы конечно хорошо, но как это скрестить с тем что есть я не понял.

    Есть вот что:

    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

    (это я к тому, что хотелось бы подробностей, как оно взаимосвязано, но самому смотреть лень)

  13. Не знаю, ответят или нет, но спрашиваю:

    А при замене куска памяти(Injection), если его можно включать и выключать, да и вообще, может произойти крэш?

    Типа, прога обращается к адресу 004F2A12, а инжект в этот момент заменяет адреса с 004F2A00 по 004F2A20(допустим).

    Я только второй день вплотную знакомлюсь со всей этой ассемблерной фигнёй, так что вопросов масса, но этот меня волнует больше всего.

    Ещё вопрос: иногда случается крэш без видимой причины. Всё вроде работает, но при установке брейкпоинта и пошаговом выполнении иногда крэшится. В чём может быть причина?

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

    Ну и интересно было бы как добавить к float'ному значению float'ное же.

    А то в eax что-то вроде 175.4727812, и добавть надо, допустим 3.4383

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

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

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

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