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

Garik66

Помогаторы
  • Постов

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

  • Победитель дней

    292

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

  1.  

    Сделал Скрипт По твоему Примеру. Получилось в двух вариантах : Скрипт работает на главного героя и второй на всю команду.  Искал не совсем ID игрока а просто какое нить поле структуры, Получилось так 

     

    Видимо пока не всё понял.

    Начнём с первого скрипта, ты поменял условный переход (прыжок): было je Test, теперь jne Test, т.е. теперь чтобы выполнялся скрипт у тебя всегда должно быть, чтобы [esi+928] не было равно (float)350.

    Думаю первый скрипт можно выкинуть. Он не нужен.

     

    А вот во втором, теперь давай посмотрим. Если у тебя в [esi+10] всегда (и также для всех членов команды) лежит 1, то это и есть ID, а условие прыжка: 

    cmp dword ptr [esi+10],00000001je Test

    Это и есть нужный фильтр - свой/чужой. Т.е. ты как бы говоришь игре - выполни, если это мои люди (ID=1), то что написано в Test.

     

    Теперь по самим характеристикам, то что в Test. почему у тебя всегда съезжают смещения:

    было

    mov [esi+194],(float)80  // Cheatersmov [esi+144],(float)80 // Kriticall Killmov [esi+924],(float)60 // SpeedPunch

    стало

    mov [esi+314],(float)50  // Cheatersmov [esi+2c4],(float)50 // Kriticall Killmov [esi+aa4],(float)30 // SpeedPunch

    Они должны быть всегда на одном месте. Ты определись, где у тебя и какое точно значение. Потом ты постоянно записываешь в адрес разные значения (float)50 (float)80 и т.д.- мне это тоже не очень понятно. Проще записывать всегда MAX значение. Посмотри структуру, скорей всего у тебя будет выглядеть так: 

    [esi]     // начало структуры          // опираюсь на последние данные по смещениям, т.е. смещения из последнего скрипта[esi+aa4] // SpeedPunch (float)какое-то текущее значение (лучше пиши по русски, мне лично не понятно)[esi+aa8] // SpeedPunch (float)MAX - предполагаю, что здесь будет лежать максимум твоего значения).[esi+2c4] // Kriticall Kill,(float)50 - текущее[esi+2c8] // Kriticall Kill,(float)50 - MAX[esi+314] // Cheaters,(float)50 - текущее[esi+318] // Cheaters,(float)50 - MAXНу и т.д.

    И тогда проще переписать так:

    // Далее записываем MAX значения для интересующих нас характеристик, здесь же может быть и// здоровье, в этом случае это будет GodMod.  push [esi+aa8] pop [esi+aa4]  push [esi+2c8] pop [esi+2c4] push [esi+318] pop [esi+314]

    Но это нужно проверить и поизучать структуру.

    pushad                  <<<<<  // вот без сохранения регистров игра вылетает

    popad

    Тоже не понятно, так как ты регистров не используешь, pushad popad не нужны. А вылет думаю происходит по другой причине. (скорее всего где-то ошибка).

    • Плюс 1
  2. Так я уже тестил. Ошибка. Да можно и так, просто в еsi эти смещения уже находятся в др.месте. На счет одного сравнения (350) я уже думал, возможно что и так, завтра проверю. Еще появилась мысль о характеристике оружия. Какие способы поиска есть ?

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

     

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

  3. Понял, почему работает Ваш скрипт,

    Вот в этом месте (будут меняться только при соблюдении всех этих 3 условий.) я ошибся, у Вас работает именно одно условие - последнее:

     cmp [ecx+928],(float)350 // SpeedPunch  А другие два условия можете безболезненно выкинуть из скрипта.

    И соответственно у Вас сейчас в игре Ваше значение SpeedPunch, которое находится по смещению 928 равно (Float)350.

    Если Вы уверены, что это значение в процессе игры не изменится, тогда ладно. Я просто не знаю, что это за значение, но всё-же скрипт советую чуть-чуть исправить (не нужно использовать ecx, если в игровой инструкции используется esi).

    Примерно так:

     

    Можете проверить, этот скрипт тоже будет работать пока SpeedPunch будет равно 350.

     


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

    Если значения в этих адресах не меняются, то бессмертие можно будет сделать.

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

    ENABLE]alloc(newMem, 64)label(Test)label(returnHere) newMem:mov esi,ecxfld dword ptr [esi+04]//cmp [ecx+198],(float)1000 // Cheaters                 // Эти две строчки - лишние, их можно//cmp [ecx+148],(float)1000 // Kriticall Kill           // убрать.cmp [esi+928],(float)350 // SpeedPunch                  // Правильнее использовать esi, а не ecx.                                                        // потому-что это в Вашем случае совпало, je Test                                                 // что начало структуры лежит и в ecx и в                                                         // esi. В другой раз такого может и не бытьjmp returnHere Test:mov [esi+194],(float)60  // Хитрость, %крит,уронаmov [esi+144],(float)80 // %критического нанесения mov [esi+924],(float)80 // скорость Атакиjmp returnHere DragonAge2.AK::MemoryMgr::GetPoolName+81EA4:jmp newMemreturnHere: [DISABLE]DragonAge2.AK::MemoryMgr::GetPoolName+81EA4:mov esi,ecxfld dword ptr [esi+04]dealloc(newMem) 
  4.  

    Дело еще в том что никто не учел то что нельзя ставить число для сравнения а затем менять его. Скрипт сработает только раз затем смещения просто поменяются, 

     

    Как раз учли (прочитайте внимательно п. 16). Ошибаетесь - смещения не поменяются, поменяются адреса (поэтому они и называются динамические) и их, если фильтр подобран не верно, нужно будет опять обновлять в Окне "Анализа структур", т.е. повторить все шаги с п.1 по 15.  

    Продолжу: всё-таки судя по Вашему коду, Вы не до конца всё поняли.

    Не пожалейте времени (конечно видео занимает 40 минут), пересмотрите видео урок Coderа (и может несколько раз).

    Кидаю ещё раз ссылку на него (см.здесь).

     

    Теперь вернёмся к Вашему скрипту, я уверен практически на 100 %, что он работать не будет.

    Во- первых, так как у Вас одна игровая инструкция, то и для всех нужных Вам значений будет нужно только один фильтр, который подходит для всех нужных Вам адресов, а Вы накидали какие 3 условия:

    cmp [ecx+198],(float)1000 // Cheaterscmp [ecx+148],(float)1000 // Kriticall Killcmp [ecx+928],(float)350 // SpeedPunch 

    Причём вместе и соответственно нужные Вам значения будут меняться только при соблюдении всех этих 3 условий.

    Об этом Вам писал NullAlex и делил их в предложенном варианте кода:

    cmp [esi+314],(float)-100  // Cheatersjne criticalmov [esi+314],(float)200  // Cheaterscritical:cmp [esi+2c4],(float)-100 // Kriticall Killjne speed_punchmov [esi+2c4],(float)200 // Kriticall Killspeed_punch:cmp [esi+aa4],(float)-100 // SpeedPunchjne originalcodemov [esi+aa4],(float)200 // SpeedPunch 

    Так что пересмотрите видео, почитайте эту тему и поймёте.

      

    • Плюс 1
  5. в Fallout есть степень невидимости то есть какая то шкала где 0 нет невидимости 100 полностью невидим.

    Вариант искать с предметами дающие разное количество процентов невидимости. И искать по методу увеличилось-уменьшилось-не изменилось.

    Спасибо за вариант попробую.

  6. Хочу попробовать взломать невидимость в Fallout 3. До этого, ни разу не ломал такую характеристику.

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

    Попробовал точное (1-видят, 0 - не видят и наоборот 0 - видят 1 - не видят), тоже вроде ни чего.

     

    Вопрос в чём, с какими вариантами невидимости сталкивались, при её взломе? (ну типа 100 видим / 0 не видим (float)) ну и т.д.

     

    Предложите варианты поиска: какой тип (byte и т.д.) значения искать и какой метод (неизвестное и т.д.)?

     

    Заранее Спасибо.

  7.  Для Жажда Знаний (который задал вопрос в личке) и тех кто читает, чтобы не повторяться, продолжу развивать тему нахождения фильтров.

     

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

     

    Фильтр деньги/товар найден с помощью стандартной методики "Анализ Структуры":

    1. В отладчике  выделяем Вашу инструкцию (правой кнопкой выбираем из контекстного меню: "Найти адреса, получающие доступ к этой инструкции. ) Откроется новое окошко.

    2. Переходим в игру, открываем меню героя или то, что влияет на Вакшу инструкцию.

    3. Возвращаемся в СЕ , смотрим что в окошке.

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

    5. Выбираем, интересующие нас адреса (в моём случае - это адреса денег ГГ, денег Торговца и два, три адреса товара для сравнения).

    6. Переходим обратно в "Отладчик",   выделяем Вашу инструкцию, смотрим на самый верх отладчика, видим "Инструменты", жмём, далее выбираем "Анализ данных/структур". Откроется новое окно "Анализ структуры".

    7. Вносим все свои адреса (используя файл/добавить дополнительный адрес), не забывая отнимать Ваше смещение( в моём случае, допустим для инструкции sub [eax+04],esi  это 04).

    8. Назовём Группу 1 - "Деньги" и добавим в неё деньги торговца и ГГ

    9. Добавим Группу 2 - "Товар" и добавим в неё два, три адреса товара для сравнения из п.5.

    10. Жмём наверху "Структуры"/Определить новую структуру", указываем название структуры (например "TORG"), дальше подтверждаем, следующее опять подтверждаем. В результате окно заполниться и в нём будут различные строчки разных цветов (для нахождения нашего фильтра нас интересуют строчки фиолетового цвета). 

    11. В моём случае фиолетового ничего не было, но см. смещения и видим (в моём  случае на смещении 08 стоит Pointer (указатель), при раскрытии которого я получил кучу фиолетовых строк.

    12. Перебираем варианты (здесь уже больше от интуиции зависит, мне повезло на смещении 0144, у Группы Деньги было значение 2, а у Группы Товар - 0. Это смещение и значения в нём я выбрал для фильтра (см.мой скрипт.) ).

    13. Пишем скрипт, проверяем работу. Работает - хорошо.

    14 Проверяем стабильность (т.е. правильно ли мы выбрали фильтр) - загружаем вначале сейв игры. Работает - хорошо.

    15. Дополнительно (обязательно сделать раза 3) проверяем стабильность - выходим из игры, проверяем, Работает - хорошо.

    16. Если в пунктах 14 или 15 не работает , нужно повторить всё с самого начала и выбрать другое фиолетовое смещение.

     

    Теперь перейдём к фильтру в моём скрипте - фильтр Торговец/ГГ

    в данном случае в "Анализе структуры" Группа 1 "Герой", Группа 2 "Торговцы".

    Но подобрать стандартным методом - методом "Анализа структуры" стабильный фильтр мне не удалось.

    Поэтому применил свой метод. 

    т.е начинаем с п.1 и заканчиваем п.4 

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

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

     

    По фильтрам вроде бы всё.

     

    • Плюс 2
  8. Посмотри на мой скрипт в этом посте (№ 4) здесь, там как раз тоже инструкция пишет не только по адресам, которые мне нужны, поэтому сделан фильтр.


    Здесь пример использования двойного фильтра: здесь.

    И ещё пример:здесь.

    Вообще вся тема практически посвящена фильтрам. Все фильтры написаны с использованием вышеизложенной методики.


    Да ещё, вспомнил, посмотри обязательно этот видео урок:

    здесь

  9. Так посмотрите, какие адреса используют Вашу инструкцию. (И изначально, тема так и должна называться - "Помогите найти фильтр".)

    Как делаем:

    1. В отладчике  выделяем Вашу инструкцию (правой кнопкой выбираем из контекстного меню: "Найти адреса, получающие доступ к этой инструкции. ) Откроется новое окошко.

    2. Переходим в игру, открываем меню героя.

    3. Возвращаемся в СЕ , смотрим что в окошке.

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

     

      

    • Плюс 1
  10. newMem:

    fld dword ptr [esi+04]

    mov ecx,[esi+14]

    cmp [ecx],aa4 // (float)-100

    jne Test

    jmp returnHere

    Test:

    push eax

    mov [ecx+314],(float)200 // Current

    mov [ecx+2c4],(float)200 // Kriticall Kill

    mov [ecx+aa4],(float)200 // SpeedPunch

    pop eax

    jmp returnHere

    Работает и с ecx и esi одинаково

    Что я делаю не так ?

    В этом коде я вооще ничего не понимаю, зачем  eax. Если по смещениям 314, 2c4 и aa4 лежат нужные Вам характеристики, то и перепишите код правильно, никакого cmp в Вашем случае не нужно.  

    newMem:fld dword ptr [esi+04]mov ecx,[esi+14]mov [esi+314],(float)200 // Currentmov [esi+2c4],(float)200 // Kriticall Killmov [esi+aa4],(float)200 // SpeedPunchjmp returnHere

    Попробуйте так

  11. Либо ещё вариант с использованием константы:

    -----------------label(Skorost)registersymbol(Skorost)newMem:fld dword ptr [Skorost]mov ecx,[esi+14]jmp returnHereSkorost:dd (float)100------------------unregistersymbol(Skorost)

    Оба варианта это часть кода.

  12. Я думаю, просто человек немного запутался:

    в его конкретном примере, начало структуры лежит и в ecx, и в esi - это 203E7F90.

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

    newMem:mov dword ptr [esi+04],(float)100fld dword ptr [esi+04]mov ecx,[esi+14]jmp returnHere 
  13. Я уже устал описывать это куда уж более детально, неужели вам это не понятно, или может не совсем 3накомо. К тому же от вас больше встречаешь банальной лени тем что просто отписывая "поищи, посмотри и т.д . Повторенье мать ученияТ

    То как Вы описали, действительно не понятно. Прочитав, всю тему, из нее ничего не понял.  

    Так что обижаться тут не на кого, если не поняло не сколько человек, значит объяснено не правильно.

    Ну например: на Ваш вопрос

     

    Инструкция такая, на примере: mov [eax],ebx. Проблема: как найти и вычеслить смещение. Опишите пожалуйста принцип пошагово. Можно в разных вариациях.

     

     

    Вам ответили:

     

    смещение = 0

    И это правильно.
    Дальше я не понимаю что. Но вот дошли до чего-то более конкретного:

     

    Что то не получается такой вариант, может я что делаю нет так . Пробовал не нескольких играх, не сработало, игры сворачиваются. На примере игра Dragon Age 2, Ищу смещение на скорость Атаки(адрес 203E7F94). Ставя чтение на доступ на этот адрес Вылезает инструкция ( fld dword ptr [esi+04]  ). Затем ставя бряк на Адрес срабатывают такие регистры как :

    eax 005AE690

    ebx 203D47E4 (Анализ структур провожу по регистру ebx) , бряк на адресе  203E7F94
    ecx 203E7F90
    edx 00BF5C1C
    esi 203E7F90
    edi 203D45F0
    ebp 205895D0
    По нему нахожу постоянное смещение (D84)
    Вот Скрипт который я делал newMem:
    cmp [ebx],d84
    mov  [esi+04],или [esi+d84] (float)100
    je @f
    @@:
    fld dword ptr [esi+04]
    mov ecx,[esi+14]
    jmp returnHere
     
    DragonAge2.AK::MemoryMgr::GetPoolName+81EA6:
    jmp newMem
    nop
    returnHere:
     
    [DISABLE]
    DragonAge2.AK::MemoryMgr::GetPoolName+81EA6:
    fld dword ptr [esi+04]
    mov ecx,[esi+14]
     
    dealloc(newMem)
    что я делаю не так ?

     

    Причём здесь "ebx 203D47E4 (Анализ структур провожу по регистру ebx) , бряк на адресе  203E7F94"? А этот фильтр "cmp [ebx],d84", в Вашем конкретном случае - полная лажа.

    Я бы понял например, если был фильтр типа: cmp ebx, 203D47E4 (и то его можно использовать, если ebx всегда равно 203D47E4).

     

    Ну короче, из всей темы, лично я ничего не понял. 

  14. Какой вопрос - такой ответ. Хочешь получить ответ, который бы тебя устроил? - Опиши проблему детально.

    Помоги сам - опиши свою проблему, и ее решение, - многие тебе спасибо за это скажут.

    Правильно сказал - плюсую.

    А то часто читая форум, встречаешь темы, которые обрываются - нет решения в конце (а время на чтение убито).   

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

    в этом сообщении.

  16. Автоасемблер и сам lua разные вещи. Автоасемблер это инжектор в код программы своего кода...

    То есть надо отталкиваться от lua и приходить к ассемблерным вставкам а не наоборот отталкиваться от инжектора и приходить к вставкам lua.

     

     

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

    Жаль, а можно компактней записать мой скрипт, не посмотрите?

  17. По поводу скрипта, это с форума cheat engine. Вот темка со скриптом покопайся может быть осенит как что делать.

     

    http://forum.cheatengine.org/viewtopic.php?p=5387584

    Так там всё на английском, а у меня с ним очень не хорошо (знаю только ЗЭ ТЭЙБЛ :-D ). а через Гугл-переводчик очень мало понимаю, из-за этого и с LUA пока не стал связываться.

     

    CE, только благодаря уважаемому  SER[G]ANT,  смог заняться. До этого ломал с помощью бесплатной версии Артмани, даже где-то осталась Огромная таблица для Герое 2. В ней всё взломал почти, кроме тумана войны и не смог найти как поменять вид замка на карте (хотя изнутри замок менял, как потом у них в 6 Героях появилась фишка перестроить замок.) С Артмани и осталась привычка лазить по региону памяти, а не как в СЕ Структура.

     

    Но всё равно спасибо, может посмотрю. 

    Кстати 

    lamalamaz

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

  18. Спасибо конечно, но хотелось бы самому понять - как выйти на такую инструкцию.

    Объясните, как вышли на неё ПЖЛСТА.

    А то я уже всё перепробовал, но пока не получилось и мыслей не осталось.

    Думал попробовать найти расстояние до противника (используя временно дружественных НПС) подходя и отходя от него (пока без V.A.T.S.),а потом через это расстояние попробовать выйти на инструкции в V.A.T.S., но пока не пробовал, в голове не сложилось.

     

    Сейчас пытаюсь взломать компьютер Смотрителя. 

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

     

    Нашёл просто: через число попыток, вышел на регион памяти (там даже есть счётчик символов в строке кода, меняется от 0 до В, где методом научного тыка (проб и ошибок) нашёл, что нужно заменить в одном адресе 2 на 4 и всё компьютер взломан, но вот как засчитать опыт - пока вопрос.  

     

     

  19. В Fallout 3 есть система боя (V.A.T.S.).

    Для неё нашел практически всё (ОД - очки действия и расход патронов, скрипты выложены в посте № 11 

    здесь.

    Но есть ещё одна характеристика - точность.

     

    На точность влияют расстояние до противника, восприятие и навык, соответствующего оружия.

    Проблема  в том, что, чтобы обновить изменение этих характеристик, я должен выйти из   V.A.T.S., а при этом

    адреса обновляются и соответственно  я не могу произвести отсеивание значений.

     

    Мастера, как в таком случае производить поиск? 

  20. Повторюсь, а то чёй-то никто не отвечает:

     

    По второй задаче кое-что нашёл:

    luacall(showMessage("ВНИМАНИЕ!!! Статы могут иметь значения от 1 до 10 включительно.")) 

    Но:

    1. В самом коде русский язык не воспринимается (неужели нету поддержки русского языка в СЕ). Приходится, чтобы можно было прочитать, перед командой ставить //. 

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

    Так что вопрос пока не решён. Подскажите. 

     

    Всё-таки интересно, как можно вызвать в ассемблерском скрипте, написанным в СЕ, вызвать когда мне нужно вставку LUA-скрипта (не писав при этом полностью скрипт на LUA, так как пока его не изучал)? 

  21. С первой задачей справился сам:

    Что нужно:

    1. Добавить дополнительные условия (защита от непонятливых). {см. скрипт} РЕШЕНО.

    Смотрите скрипт.

    Что было не правильно, а точнее что сделал, чтобы заработало:

    1. Был прыжок не туда. Поэтому добавил новую метку (TStat -> см. скрипт).

    2. Оказалось несмотря на то, что вроде бы прописал размеры Переменных (db 0), нужно было всё-таки указать размеры данных везде.

    После этого всё заработало.

    Изменённый скрипт:

    Остаются ещё две задачи:

    2. Добавить сообщение об ошибке (для тех же непонятливых).{см. скрипт}

    3. Так как в скрипте много повторяющихся элементов, я думаю его можно записать 

        более компактно и корректно.


    По второй задаче кое-что нашёл:

    Но:

    1. В самом коде русский язык не воспринимается (неужели нету поддержки русского языка в СЕ). Приходится, чтобы было понятно, перед командой ставить //. 

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

    Так что вопрос пока не решён. Подскажите. 

    [ENABLE]aobscan(AdresInGame8, 8axxxxxxc2xxxxxxxxxxxxxx80xxxxxxxx8a)alloc(newMem8, 2048)label(returnHere8)label(OK)label(TStat) // Добавил меткуlabel(TStat1)label(TStat2)label(TStat3)label(TStat4)label(TStat5)label(TStat6)label(TStat7)label(MenjaemStat)label(MStat)label(MaxStat)registersymbol(MaxStat)label(NaStat1)label(Stat1)registersymbol(Stat1)label(NaStat2)label(Stat2)registersymbol(Stat2)label(NaStat3)label(Stat3)registersymbol(Stat3)label(NaStat4)label(Stat4)registersymbol(Stat4)label(NaStat5)label(Stat5)registersymbol(Stat5)label(NaStat6)label(Stat6)registersymbol(Stat6)label(NaStat7)label(Stat7)registersymbol(Stat7)registersymbol(AdresInGame8)newMem8:mov al,[eax+ecx-01]cmp byte ptr [MaxStat],1je MStatcmp byte ptr [MaxStat],2Je MenjaemStatTStat: // Добавил метку, на которую прыгаем если Игрок ввёл цифру > 10 или < 1cmp edx,5je TStat1cmp edx,6je TStat2cmp edx,7je TStat3cmp edx,8je TStat4cmp edx,9je TStat5cmp edx,aje TStat6cmp edx,bje TStat7MenjaemStat:cmp edx,5je NaStat1cmp edx,6je NaStat2cmp edx,7je NaStat3cmp edx,8je NaStat4cmp edx,9je NaStat5cmp edx,aje NaStat6cmp edx,bje NaStat7OK:ret 0004jmp returnHere8TStat1:mov byte ptr [Stat1],aljmp OKTStat2:mov byte ptr [Stat2],aljmp OKTStat3:mov byte ptr [Stat3],aljmp OKTStat4:mov byte ptr [Stat4],aljmp OKTStat5:mov byte ptr [Stat5],aljmp OKTStat6:mov byte ptr [Stat6],aljmp OKTStat7:mov byte ptr [Stat7],aljmp OKNaStat1:cmp byte ptr [Stat1],1  //(Выполняется условие, чтоjb TStat                // меньше 1 Стат быть не может)// jmp  Message  (сюда хочу вставить сообщение об ошибке)cmp byte ptr [Stat1],a  //(Выполняется условие, чтоja TStat                // больше 10 Стат быть не может)// jmp  Message  (сюда хочу вставить сообщение об ошибке)mov al,byte ptr [Stat1]jmp OKNaStat2:cmp byte ptr [Stat2],1jb TStatcmp byte ptr [Stat2],aja TStatmov al,byte ptr [Stat2]jmp OKNaStat3:cmp byte ptr [Stat3],1jb TStatcmp byte ptr [Stat3],aja TStatmov al,byte ptr [Stat3]jmp OKNaStat4:cmp byte ptr [Stat4],1jb TStatcmp byte ptr [Stat4],aja TStatmov al,byte ptr [Stat4]jmp OKNaStat5:cmp byte ptr [Stat5],1jb TStatcmp byte ptr [Stat5],aja TStatmov al,byte ptr [Stat5]jmp OKNaStat6:cmp byte ptr [Stat6],1jb TStatcmp byte ptr [Stat6],aja TStatmov al,byte ptr [Stat6]jmp OKNaStat7:cmp byte ptr [Stat7],1jb TStatcmp byte ptr [Stat7],aja TStatmov al,byte ptr [Stat7]jmp OKMStat:mov byte ptr [Stat1],a // изменил, чтобы в таблице СЕ значения тоже поменялисьmov byte ptr [Stat2],amov byte ptr [Stat3],amov byte ptr [Stat4],amov byte ptr [Stat5],amov byte ptr [Stat6],amov byte ptr [Stat7],ajmp MenjaemStat        // Поэтому изменил безусловный переход.Stat1:db 0Stat2:db 0Stat3:db 0Stat4:db 0Stat5:db 0Stat6:db 0Stat7:db 0MaxStat:db 0AdresInGame8:jmp newMem8nopnopreturnHere8:[DISABLE]AdresInGame8: // Fallout3.exe+516D4mov al,[eax+ecx-01]ret 0004unregistersymbol(MaxStat)unregistersymbol(Stat1)unregistersymbol(Stat2)unregistersymbol(Stat3)unregistersymbol(Stat4)unregistersymbol(Stat5)unregistersymbol(Stat6)unregistersymbol(Stat7)unregistersymbol(AdresInGame8)dealloc(newMem8) 
    luacall(showMessage("ВНИМАНИЕ!!! Статы могут иметь значения от 1 до 10 включительно."))
  22. МАСТЕРА опять без Вас не обойтись.

     

    Написал (рабочий) скрипт на основные Статы для Fallout 3.

     

    В кратце, что делает скрипт:

    1. Получает текущее значение Статов из игры.

    2. Позволяет Геймеру менять значения Статов:

        2.1 Сразу все на MAX или

        2.2 на выбор игрока.

    3. При отключении скрипта - возвращает значения Статов, соответствующих игре.

     

    Более подробно опишу работу скрипта, при выкладывании в соответствующей теме.

     

    Что нужно:

    1. Добавить дополнительные условия (защита от непонятливых). {см. скрипт}

    2. Добавить сообщение об ошибке (для тех же непонятливых).{см. скрипт}

    3. Так как в скрипте много повторяющихся элементов, я думаю его можно записать 

        более компактно и корректно.

     

    МАСТЕРА, если возможно то с пояснениями.

     

    За помощь заранее Болшой Спасыб!!! :-D

     

    Сам скрипт:

     


    Небольшое уточнение

    Перепробовал наверное все варианты прыжков:

    Использование JB (и его аналогов) допускает изменение Стата, но само условие не работает.

    Использование JA (и его аналогов) не допускает изменение Стата, т.е. код не переходит на строчку -  mov al,[stat1].

     

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

    [ENABLE]aobscan(AdresInGame8, 8axxxxxxc2xxxxxxxxxxxxxx80xxxxxxxx8a)alloc(newMem8, 2048)label(returnHere8)label(OK)label(TStat1)label(TStat2)label(TStat3)label(TStat4)label(TStat5)label(TStat6)label(TStat7)label(MenjaemStat)label(MStat)label(MaxStat)registersymbol(MaxStat)label(NaStat1)label(Stat1)registersymbol(Stat1)label(NaStat2)label(Stat2)registersymbol(Stat2)label(NaStat3)label(Stat3)registersymbol(Stat3)label(NaStat4)label(Stat4)registersymbol(Stat4)label(NaStat5)label(Stat5)registersymbol(Stat5)label(NaStat6)label(Stat6)registersymbol(Stat6)label(NaStat7)label(Stat7)registersymbol(Stat7)registersymbol(AdresInGame8)newMem8:mov al,[eax+ecx-01]cmp [MaxStat],1je MStatcmp [MaxStat],2Je MenjaemStatcmp edx,5je TStat1cmp edx,6je TStat2cmp edx,7je TStat3cmp edx,8je TStat4cmp edx,9je TStat5cmp edx,aje TStat6cmp edx,bje TStat7MenjaemStat:cmp edx,5je NaStat1cmp edx,6je NaStat2cmp edx,7je NaStat3cmp edx,8je NaStat4cmp edx,9je NaStat5cmp edx,aje NaStat6cmp edx,bje NaStat7OK:ret 0004jmp returnHere8TStat1:mov [Stat1],aljmp OKTStat2:mov [Stat2],aljmp OKTStat3:mov [Stat3],aljmp OKTStat4:mov [Stat4],aljmp OKTStat5:mov [Stat5],aljmp OKTStat6:mov [Stat6],aljmp OKTStat7:mov [Stat7],aljmp OKNaStat1:// cmp [Stat1],1 (сюда нужно вставить условие, что// jb OK          меньше 1 Стат быть не может)// jmp  Message  (сюда хочу вставить сообщение об ошибке)// cmp [Stat1],a (сюда нужно вставить условие, что// ja OK          больше 10 Стат быть не может)// jmp  Message  (сюда хочу вставить сообщение об ошибке)mov al,[Stat1]jmp OKNaStat2:mov al,[Stat2]jmp OKNaStat3:mov al,[Stat3]jmp OKNaStat4:mov al,[Stat4]jmp OKNaStat5:mov al,[Stat5]jmp OKNaStat6:mov al,[Stat6]jmp OKNaStat7:mov al,[Stat7]jmp OKMStat:mov al,ajmp OKStat1:db 0Stat2:db 0Stat3:db 0Stat4:db 0Stat5:db 0Stat6:db 0Stat7:db 0MaxStat:db 0AdresInGame8:jmp newMem8nopnopreturnHere8:[DISABLE]AdresInGame8: // Fallout3.exe+516D4mov al,[eax+ecx-01]ret 0004unregistersymbol(MaxStat)unregistersymbol(Stat1)unregistersymbol(Stat2)unregistersymbol(Stat3)unregistersymbol(Stat4)unregistersymbol(Stat5)unregistersymbol(Stat6)unregistersymbol(Stat7)unregistersymbol(AdresInGame8)dealloc(newMem8) 
    NaStat1:// cmp [Stat1],1 (сюда нужно вставить условие, что// jb OK          меньше 1 Стат быть не может)// jmp  Message  (сюда хочу вставить сообщение об ошибке)// cmp [Stat1],a (сюда нужно вставить условие, что// ja OK          больше 10 Стат быть не может)// jmp  Message  (сюда хочу вставить сообщение об ошибке)mov al,[Stat1]jmp OK
  23. Попробуй так:

    mov dword ptr [ecx+eax*4+00000288],Karma4_1

    Конечно это я попробовал в первую очередь, т.к. MOV - пожалуй первая инструкция, с которой я познакомился.

    Но она записывает не правильное значение (почему - не разобрался).

     

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

     

    Разъяснение  и готовый скрипт читайте в теме.:

    этом посте.

  24. Необязательно. Во всех (ну или почти во всех) играх присутствуют таймеры, которые подхватывают значения, и что-то с ними делают (вне зависимости, сделал что-то персонаж, или нет). Чтобы получить к такому таймеру доступ - ставим бряк на доступ, на адрес в таблице, и смотрим, какие инструкции обращаются при выполнении. Как правило, инструкции, где количество хитов зашкаливает - с ними и работает таймер. Собственно, вот и весь "секрет".

    P.S.

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

    Если я правильно понял, то именно такую инструкцию я выбрал и сделал фильтр в ней, но почему скрипт не работает?

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

  25. Если это надо сделать на CE Autoassembler, то пример из справки с записью 16 байт из адреса 00410000.

    ReadMem examplealloc(x,16)alloc(script,2048)script:mov eax,[x]mov edx,[x+c]retx:readmem(00410000,16) //place the contents of address 00410000 at the address of X

    Если на Ассемблере, то укажи какой именно Ассемблер: fasm, masm, tasm и прочие... Хотя ты мог поискать как работать с память на WinAPI на интересующем Ассемблере.

    У меня вопрос, этот пример только для статического адреса или можно скрипт как-то для динамического адреса написать.

    Вот я попробовал несколько вариантов.

    Пере пишите пожалуйста, если всё-таки пример возможен и для динамического адреса, мой скрипт:

    Собственно вопрос, что здесь (readmem(Istochnik,364)) вместо Istochnik нужно поставить в моём случае, потому что ни константу, ни [eax+dbc], ни адрес с поинтерами СЕ не компилирует.

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

    [ENABLE]aobscan(address23, 8D B4 10 B8 0D 00 00 F3 A5 E8 FD 82 2E 00)alloc(newMem23, 1024)alloc(x,364)label(Istochnik)label(returnHere23)registersymbol(address23)registersymbol(Istochnik)newMem23:lea esi,[eax+edx+00000DB8]repe movsdmov [eax+ea4],femov [eax+ea8],felea Istochnik,[eax+dbc]push ebx         // Сохраняемpush ecx         // регистрыmov ebx,[x]      // адрес источника [eax+dbc] -> xmov ecx,[x+45ec] // адрес приёмника [eax+53a8]-> x+(53a8-dbc)-> x+45ECret              // копируем памятьpop ecx          // Восстанавливаемpop ebx          // регистрыx:readmem(Istochnik,364)Istochnik:dd 0jmp returnHere23address23:jmp newMem23db 90 90 90 90returnHere23:[DISABLE]address23: {TH.exe+20CB5:}lea esi,[eax+edx+00000DB8]      // Собственно копируем полностьюrepe movsd                      // характеристики предметаunregistersymbol(Istochnik)     // положенного 1 в рюкзак поверхunregistersymbol(address23)     // характеристик взятого предметаdealloc(x,364)dealloc(newMem23) 
×
×
  • Создать...

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

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