Жажда Знаний Опубликовано 25 декабря, 2014 Автор Поделиться Опубликовано 25 декабря, 2014 Понял, почему работает Ваш скрипт,Вот в этом месте (будут меняться только при соблюдении всех этих 3 условий.) я ошибся, у Вас работает именно одно условие - последнее: cmp [ecx+928],(float)350 // SpeedPunch А другие два условия можете безболезненно выкинуть из скрипта.И соответственно у Вас сейчас в игре Ваше значение SpeedPunch, которое находится по смещению 928 равно (Float)350.Если Вы уверены, что это значение в процессе игры не изменится, тогда ладно. Я просто не знаю, что это за значение, но всё-же скрипт советую чуть-чуть исправить (не нужно использовать ecx, если в игровой инструкции используется esi).Примерно так: Можете проверить, этот скрипт тоже будет работать пока SpeedPunch будет равно 350.Так я уже тестил. Ошибка. Да можно и так, просто в еsi эти смещения уже находятся в др.месте. На счет одного сравнения (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) Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 25 декабря, 2014 Поделиться Опубликовано 25 декабря, 2014 Так я уже тестил. Ошибка. Да можно и так, просто в еsi эти смещения уже находятся в др.месте. На счет одного сравнения (350) я уже думал, возможно что и так, завтра проверю. Еще появилась мысль о характеристике оружия. Какие способы поиска есть ?Попробуйте именно тот скрипт, который я выложил, уверен - будет работать. А по поводу оружия, у меня игры перед глазами нет. Но начинать нужно с того что можно посчитать - патроны, урон, а уже дальше скорострельность и т.д., а способы разные - всё зависит от конкретной задачи. Ссылка на комментарий Поделиться на другие сайты Поделиться
Жажда Знаний Опубликовано 26 декабря, 2014 Автор Поделиться Опубликовано 26 декабря, 2014 (изменено) Попробуйте именно тот скрипт, который я выложил, уверен - будет работать. А по поводу оружия, у меня игры перед глазами нет. Но начинать нужно с того что можно посчитать - патроны, урон, а уже дальше скорострельность и т.д., а способы разные - всё зависит от конкретной задачи.Сделал Скрипт По твоему Примеру. Получилось в двух вариантах : Скрипт работает на главного героя и второй на всю команду. Искал не совсем ID игрока а просто какое нить поле структуры, Получилось так newMem:mov esi,ecxfld dword ptr [esi+04]cmp [esi+928],(float)350jne Testjmp returnHere Test:mov [esi+194],(float)80 // Cheatersmov [esi+144],(float)80 // Kriticall Killmov [esi+924],(float)60 // SpeedPunchjmp returnHere DragonAge2.AK::MemoryMgr::GetPoolName+81EA4:jmp newMemreturnHere: [DISABLE] 2й Вариант На всю команду newMem:mov esi,ecxfld dword ptr [esi+04]cmp dword ptr [esi+10],00000001je Testjmp returnHere Test:pushad <<<<< // вот без сохранения регистров игра вылетает, На скрипте Coldown тожеmov [esi+314],(float)50 // Cheatersmov [esi+2c4],(float)50 // Kriticall Killmov [esi+aa4],(float)30 // SpeedPunchfmul [esi+924] //Test XP //mana push [esi+13c] как бы сделать так что бы мана начислялась по единицы постоянно и не превышала рамки установленного лимита не более 99? mov [esi+188],0 // Резервация маны popadjmp returnHere DragonAge2.AK::MemoryMgr::GetPoolName+81EA4:jmp newMemreturnHere: [DISABLE] Изменено 26 декабря, 2014 пользователем Жажда Знаний Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 26 декабря, 2014 Поделиться Опубликовано 26 декабря, 2014 (изменено) Сделал Скрипт По твоему Примеру. Получилось в двух вариантах : Скрипт работает на главного героя и второй на всю команду. Искал не совсем 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 не нужны. А вылет думаю происходит по другой причине. (скорее всего где-то ошибка). Изменено 26 декабря, 2014 пользователем garik66 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 28 декабря, 2014 Поделиться Опубликовано 28 декабря, 2014 Жажда Знаний, случайно натолкнулся на статью уважаемого kenga, она тоже касается как раз смещений, фильтров и структур - прочти её.Очень здорово написано. Статья здесь. Ссылка на комментарий Поделиться на другие сайты Поделиться
Жажда Знаний Опубликовано 29 декабря, 2014 Автор Поделиться Опубликовано 29 декабря, 2014 Жажда Знаний, случайно натолкнулся на статью уважаемого kenga, она тоже касается как раз смещений, фильтров и структур - прочти её.Очень здорово написано. Статья здесь. Спасибо, но когда то я уже ее читал. Немного довел скрипт до работы, нашел подходящее поле сравнения, [ecx+1c],(float)50 и [ecx+34],00000001. Почему разные смещения , потому что с разных регистров, все рабочие. А вот как быть если очень большая структура ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 29 декабря, 2014 Поделиться Опубликовано 29 декабря, 2014 Спасибо, но когда то я уже ее читал. Немного довел скрипт до работы, нашел подходящее поле сравнения, [ecx+1c],(float)50 и [ecx+34],00000001. Почему разные смещения , потому что с разных регистров, все рабочие. А вот как быть если очень большая структура ? Хорошо.Кстати понял, почему мы друг друга не понимали по смещениям. Думаю всё дело не в потому что с разных регистров, а в том, что ты использовал в двух случаях разную инструкцию, т.е. в первом случае - DragonAge2.AK::MemoryMgr::GetPoolName+81EA6:fld dword ptr [esi+04]mov ecx,[esi+14] а во втором (она находится очень близко к первой в коде игры)DragonAge2.AK::MemoryMgr::GetPoolName+81EA4:fld dword ptr [esi+04] хотя они и похожи, но это разные инструкции и поэтому смещения отличаются (так как структуры разные). Таких похожих инструкций в коде игры бывает очень много.(поэтому кстати в Аобскане сигнатура может быть очень длинной - чтобы инструкция была уникальной).По второму вопросу А вот как быть если очень большая структура ? Вопроса я не очень понял, структуры - все большие. Главное, чтобы ты в ней находил, то что тебе нужно (например MAX значение здоровья, выносливости ну и т.д., т.е. характеристики на которые мы впрямую не можем повлиять; нахождение например ID (фильтров )). Если ты находишь в структуре, то что тебе нужно - размер роли не играет. Ссылка на комментарий Поделиться на другие сайты Поделиться
Жажда Знаний Опубликовано 29 декабря, 2014 Автор Поделиться Опубликовано 29 декабря, 2014 Хорошо.Кстати понял, почему мы друг друга не понимали по смещениям. Думаю всё дело не в потому что с разных регистров, а в том, что ты использовал в двух случаях разную инструкцию, т.е. в первом случае - DragonAge2.AK::MemoryMgr::GetPoolName+81EA6:fld dword ptr [esi+04]mov ecx,[esi+14]а во втором (она находится очень близко к первой в коде игры)DragonAge2.AK::MemoryMgr::GetPoolName+81EA4:fld dword ptr [esi+04]хотя они и похожи, но это разные инструкции и поэтому смещения отличаются (так как структуры разные). Таких похожих инструкций в коде игры бывает очень много.(поэтому кстати в Аобскане сигнатура может быть очень длинной - чтобы инструкция была уникальной).По второму вопросу А вот как быть если очень большая структура ?Вопроса я не очень понял, структуры - все большие. Главное, чтобы ты в ней находил, то что тебе нужно (например MAX значение здоровья, выносливости ну и т.д., т.е. характеристики на которые мы впрямую не можем повлиять; нахождение например ID (фильтров )). Если ты находишь в структуре, то что тебе нужно - размер роли не играет. Да. Я про это в самом начале писал, что структуру брал с верхних регистров. Про большие структуры я имел в виду напримере игра "OMERTA" :адрес 31DB1737А при бряке регистров можно выделить наиболее приближенный к нему 3BCD21A4Как проблематично вычеслить смещение Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 29 декабря, 2014 Поделиться Опубликовано 29 декабря, 2014 Да. Я про это в самом начале писал, что структуру брал с верхних регистров. Про большие структуры я имел в виду напримере игра "OMERTA" :адрес 31DB1737А при бряке регистров можно выделить наиболее приближенный к нему 3BCD21A4Как проблематично вычеслить смещениеИз всего вышеизложенного я понял только, что ты пытаешься найти смещение отняв из 3BCD21A4 это 31DB1737. Кроме этого я больше, сожалению ничего не понял. Поэтому и помочь ничем не смогу. Если хочешь, чтобы тебе помогли, излагай свои мысли точнее и подробнее. (напиши: что делал, как делал, тогда будет видна или ошибка, если ты ошибаешься, или будет ответ на твой вопрос). Ссылка на комментарий Поделиться на другие сайты Поделиться
lamalamaz Опубликовано 29 декабря, 2014 Поделиться Опубликовано 29 декабря, 2014 А с чего вы взяли что "начало структуры должно быть рядом?" Например здоровье может быть в подструктуре а выход на подструктуру приходит через указатель. Например игра Risen2 начало структуры игрока 6DBA3020 а адрес здоровья 00802345. Что то подобное 0080XXXX вы не найдете ни в стеке ни в регистрах.(исключая непосредственное значение адреса жизней). То же самое со всеми параметрами будь то координаты или патроны или скорость атаки логика очень схожа. То есть структура обращяется к подструктуре1(указатель), подструктура1 обращается к подструктуре2(указатель) и потом уже в подструктуре2 по смещению 14 лежит адрес здоровья. То есть в мое случае 00802345-14 это не начало структур,а начало подструктуры. Надо анализировать стек чтобы точно выйти на начало структуры. В стеке обычно или в регистрах(что реже) указывается адрес начало самой структуры.Я нанес урон по врагу, ставил бряк на жизни врага. В стеке видно Кто нанес урон,чем,сколько урона с каких координат по кому нанес урон. Так вот адрес КТО нанес урон как раз начало структуры игрока которая даааалеко от адреса здоровья.(который хранится в подструктуре).Тоже самое с игрой Painkiller,хотя там логика иная но суть впринципе та же. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 29 декабря, 2014 Поделиться Опубликовано 29 декабря, 2014 А с чего вы взяли что "начало структуры должно быть рядом?" Кому вопрос адресован и где говорилось что "начало структуры должно быть рядом?" Ссылка на комментарий Поделиться на другие сайты Поделиться
lamalamaz Опубликовано 29 декабря, 2014 Поделиться Опубликовано 29 декабря, 2014 Да. Я про это в самом начале писал, что структуру брал с верхних регистров. Про большие структуры я имел в виду напримере игра "OMERTA" :адрес 31DB1737А при бряке регистров можно выделить наиболее приближенный к нему 3BCD21A4Как проблематично вычеслить смещение Я к тому что если адреса похожи то это не значит что это одна структура(исключая конечно если адреса совпадают по всем байтам кроме последних). То есть в случае 31DB1737 и 3BCD21A4. Никакой зависимости одного адреса от другого нет.И начало структуры значения по адресу 31DB1737 может находится где угодно, надо анализировать стек а не только регистры. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 29 декабря, 2014 Поделиться Опубликовано 29 декабря, 2014 Я к тому что если адреса похожи то это не значит что это одна структура(исключая конечно если адреса совпадают по всем байтам кроме последних). То есть в случае 31DB1737 и 3BCD21A4. Никакой зависимости одного адреса от другого нет.Согласен, конечно. Ссылка на комментарий Поделиться на другие сайты Поделиться
Жажда Знаний Опубликовано 29 декабря, 2014 Автор Поделиться Опубликовано 29 декабря, 2014 (изменено) Я к тому что если адреса похожи то это не значит что это одна структура(исключая конечно если адреса совпадают по всем байтам кроме последних). То есть в случае 31DB1737 и 3BCD21A4. Никакой зависимости одного адреса от другого нет.И начало структуры значения по адресу 31DB1737 может находится где угодно, надо анализировать стек а не только регистры.Да, как раз я и анализировал подструктуры и находил нужный адрес, но как использовать смещение если оно в каждой подструктуре..? Если правильно понял то надо использовать смещение указателя подструктуры ? Работу со стеком не совсем понимаю, анализировать его надо саму трассировку или весь стек ? Изменено 29 декабря, 2014 пользователем Жажда Знаний Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения