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

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

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

Вот в этом месте (будут меняться только при соблюдении всех этих 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)
Ссылка на комментарий
Поделиться на другие сайты

  • Ответов 63
  • Создана
  • Последний ответ

Топ авторов темы

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

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

 

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

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

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

 

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

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

newMem:
mov esi,ecx
fld dword ptr [esi+04]
cmp [esi+928],(float)350
jne Test
jmp returnHere
 
Test:
mov [esi+194],(float)80  // Cheaters
mov [esi+144],(float)80 // Kriticall Kill
mov [esi+924],(float)60 // SpeedPunch
jmp returnHere
 
 
 
 
 
DragonAge2.AK::MemoryMgr::GetPoolName+81EA4:
jmp newMem
returnHere:
 
[DISABLE]
 
2й Вариант На всю команду
 
newMem:
mov esi,ecx
fld dword ptr [esi+04]
cmp dword ptr [esi+10],00000001
je Test
jmp returnHere
 
Test:
pushad                  <<<<<  // вот без сохранения регистров игра вылетает, На скрипте Coldown тоже
mov [esi+314],(float)50  // Cheaters
mov [esi+2c4],(float)50 // Kriticall Kill
mov [esi+aa4],(float)30 // SpeedPunch
fmul [esi+924]          //Test XP
                                   //mana push  [esi+13c] как бы сделать так что бы мана начислялась по единицы постоянно и не превышала рамки установленного лимита не более 99?
 
mov  [esi+188],0       // Резервация маны         
popad
jmp returnHere
 
 
 
 
 
DragonAge2.AK::MemoryMgr::GetPoolName+81EA4:
jmp newMem
returnHere:
 
[DISABLE]
Изменено пользователем Жажда Знаний
Ссылка на комментарий
Поделиться на другие сайты

 

Сделал Скрипт По твоему Примеру. Получилось в двух вариантах : Скрипт работает на главного героя и второй на всю команду.  Искал не совсем 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 не нужны. А вылет думаю происходит по другой причине. (скорее всего где-то ошибка).

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

Жажда Знаний, случайно натолкнулся на статью уважаемого kenga, она тоже касается как раз смещений, фильтров и структур - прочти её.

Очень здорово написано. Статья здесь. 

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

Жажда Знаний, случайно натолкнулся на статью уважаемого kenga, она тоже касается как раз смещений, фильтров и структур - прочти её.

Очень здорово написано. Статья здесь. 

Спасибо, но когда то я уже ее читал. Немного довел скрипт до работы, нашел подходящее поле сравнения, [ecx+1c],(float)50 и [ecx+34],00000001. Почему разные смещения , потому что с разных регистров, все рабочие. А вот как быть если очень большая структура ? 

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

Спасибо, но когда то я уже ее читал. Немного довел скрипт до работы, нашел подходящее поле сравнения, [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 (фильтров )). Если ты находишь в структуре, то что тебе нужно - размер роли не играет.

   

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

Хорошо.

Кстати понял, почему мы друг друга не понимали по смещениям. Думаю всё дело не в потому что с разных регистров, а в том, что ты использовал в двух случаях разную инструкцию, т.е. в первом случае -

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

Как проблематично вычеслить смещение

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

Да. Я про это в самом начале писал, что структуру брал с верхних регистров. Про большие структуры я имел в виду напримере игра "OMERTA" :адрес 31DB1737

А при бряке регистров можно выделить наиболее приближенный к нему 3BCD21A4

Как проблематично вычеслить смещение

Из всего вышеизложенного я понял только, что ты пытаешься найти смещение отняв  из 3BCD21A4 это  31DB1737.

 

Кроме этого я больше,  сожалению ничего не понял. Поэтому и помочь ничем не смогу.

 

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

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

А с чего вы взяли что "начало структуры должно быть рядом?" Например здоровье может быть в подструктуре а выход на подструктуру приходит через указатель. Например игра Risen2 начало структуры игрока 6DBA3020 а адрес здоровья 00802345.

 

Что то подобное 0080XXXX вы не найдете ни в стеке ни в регистрах.(исключая непосредственное значение адреса жизней).

 

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

 

То есть структура обращяется к подструктуре1(указатель), подструктура1 обращается к подструктуре2(указатель) и потом уже в подструктуре2 по смещению 14 лежит адрес здоровья.

 

То есть в мое случае  00802345-14 это не начало структур,а начало подструктуры.

 

Надо анализировать стек чтобы точно выйти на начало структуры.

 

В стеке обычно или в регистрах(что реже) указывается адрес начало самой структуры.

Я нанес урон по врагу, ставил бряк на жизни врага. В стеке видно Кто нанес урон,чем,сколько урона с каких координат по кому нанес урон. Так вот адрес КТО нанес урон как раз начало структуры игрока которая даааалеко от адреса здоровья.(который хранится в подструктуре).

Тоже самое с игрой Painkiller,хотя там логика иная но суть впринципе та же.

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

А с чего вы взяли что "начало структуры должно быть рядом?" 

Кому вопрос адресован и где говорилось что "начало структуры должно быть рядом?"

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

Да. Я про это в самом начале писал, что структуру брал с верхних регистров. Про большие структуры я имел в виду напримере игра "OMERTA" :адрес 31DB1737

А при бряке регистров можно выделить наиболее приближенный к нему 3BCD21A4

Как проблематично вычеслить смещение

 

Я к тому что если адреса похожи то это не значит что это одна структура(исключая конечно если адреса совпадают по всем байтам кроме последних). То есть в случае 31DB1737 и 3BCD21A4. Никакой зависимости одного адреса от другого нет.

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

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

Я к тому что если адреса похожи то это не значит что это одна структура(исключая конечно если адреса совпадают по всем байтам кроме последних). То есть в случае 31DB1737 и 3BCD21A4. Никакой зависимости одного адреса от другого нет.

Согласен, конечно.

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

Я к тому что если адреса похожи то это не значит что это одна структура(исключая конечно если адреса совпадают по всем байтам кроме последних). То есть в случае 31DB1737 и 3BCD21A4. Никакой зависимости одного адреса от другого нет.

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

Да, как раз я и анализировал подструктуры и находил нужный адрес, но как использовать смещение если оно в каждой подструктуре..? Если правильно понял то надо использовать смещение указателя подструктуры ? Работу со стеком не совсем понимаю, анализировать его надо саму трассировку или весь стек ? Изменено пользователем Жажда Знаний
Ссылка на комментарий
Поделиться на другие сайты

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

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

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