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

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

Всем доброго времени.

В последнее время начал натыкаться все чаще на инструкцию такого типа: movss [NNN+NNNNNNNNN],xmm1.

Собственно, непонятно, как с этой инструкцией работать?

Пытался найти в ассемблере такую команду/функцию - безрезультатно. Хотя, может плохо искал...

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

Допустим, записал инструкцию так:

mov [NNN+NNNNNNNN],100

А в игре значение падает до нуля... Но если попробовать записать так:

movss [NNN+NNNNNNNN],100

То компилятор ругается, что эта инструкция не компилируется.

В общем, непонятно...

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

Выше - cvtsi2ss, ниже - repe ret.

Может кто подскажет как с этим бороться? Замучился уже, честное слово... :(

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

Ну, вообще-то можно открыть любой справочник по ассемблеру, например, ТАК

А вообще, указанная тобой инструкция пересылает флоат (float) значение из регистра xmm1 в какую-то ячейку памяти.

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

Movss - Переслать одиночное короткое вещественное значение.

movss [NNN+NNNNNNN],100- ошибочно написано, так как мы не можем писать 100, мы должны взять значение из переменной типо xmm1 esx aex и т.д.

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

ИМХО.

Читал тут - Ссылка

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

Когда не знаешь как делать инъекцию кода в инструкцию, то задай поиск Гуглю как "Cheat Engine movss"

---

Допустим, записал инструкцию так:

mov [NNN+NNNNNNNN],100

А в игре значение падает до нуля...

Но если попробовать записать так:

movss [NNN+NNNNNNNN],100

То компилятор ругается, что эта инструкция не компилируется.

Надо писать число с точкой (вещественное). Для этого надо привести целой число к float типу.

mov [NNN+NNNNNNNN],(float)100

Если вариант выше не работает и действительно нужно править xmm1:



push eax
mov eax,(float)100
movd xmm1,eax
pop eax
movss [NNN+NNNNNNNNN],xmm1

-------

Когда натыкаешься на movss [NNN+NNNNNNNNN],xmm1, то не обязательно именно её править. Можно посмотреть код выше. Увидеть как происходит запись в xmm1. Возможно будут инструкции, которые можно будет править без выделения памяти. Банально даже прыжок поправить или переписать одну или несколько инструкции.

А бывает вообще ничего править в коде не надо!

1. В игре уже встроены читы, тупо их активировать поставив значение в адрес.

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


[ENABLE]
alloc(newmem,1024)
createthread(newmem)
newmem:
mov eax, 199CD788 // указатель на структуру данных связанная с игроком, который стреляет
call game_x86_rwdi.dll+4CB1E0 // принудительный выстрел
ret

[DISABLE]
dealloc(newmem)

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

2. Вызывать функцию игры с необходимыми параметрами.

Эх... жаль что это практически неосуществимо :( Мне такое удалось только в одной игре (Cry of Fear) и всё..

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

Эх... жаль что это практически неосуществимо :( Мне такое удалось только в одной игре (Cry of Fear) и всё..

Напиши в каких играх не получалось. Может быть я попробую сделать.

Вообще в теории можно следующее:

1. Вызывать функцию, которая увеличивает здоровье (взяв например аптечку)

2. Вызывать функцию, которая увеличивает количество денег (например продав что-то)

3. Вызывать функцию, которая добавляет в инвентарь предмет

4. Вызывать функцию, которая выбрасывает предмет рядом с игроком

Пункт 3 аналогичен пункту 4. Единственно, что придется предмет подобрать .

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

MasterGH, ого, большое спасибо за разжевывание!

Можно посмотреть код выше. Увидеть как происходит запись в xmm1.

Я стараюсь всегда смотреть выше или ниже инструкции, которую показал мне СЕ в отладчике, но в данном случае был полный ступор, т.к. инструкции вообще незнакомые (например pxor, или cvtsi2ss), и все они оперируют с xmm0 и xmm1. По pxor серое вещество, в общем-то, подсказывало, что это родственник "логического исключающего ИЛИ", а по остальному - беда. Так что вот :)

Вызывать функцию игры с необходимыми параметрами.

Это для меня еще сложно... Надо ведь знать, какой тип отправлять в функцию? Вдруг там булевое значение, или целочисленное... или строковое - что еще хуже, наверное... Это же все надо как-то в отладчике искать, колдовать... Я так не умею, и даже не представляю КАК это все делается :(

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

  • 1 год спустя...

Так как часто смотрят этот топик и тема ещё не закрыта, то для новичков выложу более простое решение:

movss [NNN+NNNNNNNNN],xmm1     // Записываем нужное нам значение, после отработки этой инструкцииmov [NNN+NNNNNNNNN],(float)100 // прямо в память [NNN+NNNNNNNNN].
Ссылка на комментарий
Поделиться на другие сайты

mov [NNN+NNNNNNNNN],(float)100 // прямо в память [NNN+NNNNNNNNN].

Так может и не работать... Игру месяца два назад давал (манчикин) или как там правильно то  :-[ Так вот  там если данным способом сделать, то не к чему это не приведет. 50 на 50 этот способ прокатит.

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

[ENABLE]aobscanmodule(Fuer,amtrucks.exe,F3xxxxxxxxxxxxxxxx0F57xxxxxxxxxxxxxxxxxxxxxxxxxx40xx48xxxxxx48xxxxE8xxxxxxxxF3xxxxxxxxxx48)alloc(newmem,$1000)label(code)label(return)label(Baksi)registersymbol(Baksi)newmem:  movss xmm0, [Baksi]code:  movss [rax+00000168],xmm0  jmp return  Baksi:  db (float)100Fuer:  jmp newmem  nop  nop  nopreturn:registersymbol(Fuer)[DISABLE]Fuer:  db F3 0F 10 80 68 01 00 00unregistersymbol(Baksi)unregistersymbol(Fuer)dealloc(newmem) 
Ссылка на комментарий
Поделиться на другие сайты

Так может и не работать...

просто выбрана не та инструкция, поэтому и не сработало.

Скрипт пример

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

Если игра ещё есть, и не лень, то можешь проверить мой скрипт - сработает.

[ENABLE]aobscanmodule(Fuer,amtrucks.exe,F3xxxxxxxxxxxxxxxx0F57xxxxxxxxxxxxxxxxxxxxxxxxxx40xx48xxxxxx48xxxxE8xxxxxxxxF3xxxxxxxxxx48)alloc(newmem,$1000)label(code)label(return)newmem: code:  movss [rax+00000168],xmm0  mov dword ptr [rax+00000168],(float)100 // dword нужно указывать обязательно, думаю знаешь почему  jmp returnFuer:  jmp newmem  nop  nop  nopreturn:registersymbol(Fuer)[DISABLE]Fuer:  db F3 0F 10 80 68 01 00 00unregistersymbol(Fuer)dealloc(newmem)  
Ссылка на комментарий
Поделиться на другие сайты

просто выбрана не та инструкция, поэтому и не сработало.

Нет у меня игры уже давно. Но такой способ не сработал - скрипт то активировался, но он выполнялся как оригинальный код. Да и какая разница уже - теме то почти два года  :rolleyes: Блин Игорь - не могу я найти ту игру... Искал щас в запросах её. Я даже не помню, в личке просили или тут на форуме. Просто столько игр бывает за день смотришь, что не упомнишь. Бывает игру смотришь и кажется что прошло после этого дня минимум пол года, а оказывается ты делал к ней что либо - неделю назад. Да ну и ладно - вот ещо из за игры тут писанину разводить.

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

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

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

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