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

Как писать скрипты


Akama

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

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

И так - по порядку:

1. Бессмертие.

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

Очень любит подобными вещами заниматься Grom-Skynet, из-за чего его функции выглядят слегка "колхозно".

mov [eax+смещение]#999999 //а то и больше девяток, сколько смелость позволит )))

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

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

Если есть максимум здоровья, то сделать чит с его помощью проще простого. Предположим, что текущее значение здоровья это еах+04, а максимальное значение еах+08, тогда:


push [eax+08] //запоминаем значение максимума
pop [eax+04] //восстанавливаем его в текущее здоровье

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

fst [eax+08]

если значения максимума нет, то нопить функции можно таким способом


[enable]
db 90,90,90,90 //в зависимости от того, сколько байт занимает исходная инструкция
[disable]
db 45,FA,25,65 // просто оригинальные байты

2. Стрельба без перезарядки

В данной ситуации ищется кол-во патронов в обоиме и изменяется, но опять таки не на 999 (и снова Grom-Skynet здесь мастак это делать).

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

Такая функция делается следующим образом, предположим, что кол-во патронов это еах+10.

Вот так делать НЕ ПРАВИЛЬНО:


mov esi,#999
mov [eax+10],esi //родной кусок кода

А вот так ПРАВИЛЬНО:


inc esi //увеличивает значение esi на 1
mov [eax+10],esi //родной кусок кода

ИЛИ


add esi,1 //в данном случае нужно указывать на сколько увеличить esi
mov [eax+10],esi //родной кусок кода

Значение патронов в обоиме будет всегда максимально и гемора будет меньше в будущем.

3. Деньги (или ещё какой-нить шмот)

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

В принципе можно и так делать, но впечатление складыватся, что без "читов" тут дело не обошлось. Если глаз не мозолит, то ничего страшного, пусть будет 999999 денег.

Я предпочитаю в данном случае либо морозить значение денег на определённой отметке, чтоб ниже его не опускалось (например денег может быть и 51862, и 56923, но ниже 50000 не опустится), либо просто функцию добавления денег (+1000 золотый например).

Если хотите, чтоб значение не опускалось ниже 50000, то нужно отлавливать функцию, которая записывает новое значение в адрес денег. Пусть еах+65 это деньги.


mov [eax+65],ebx //именно так эти функции выглядят.

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


cmp ebx,#50000
jge originalcode
mov ebx,#50000
originalcode:
mov [eax+65],ebx

Т.о. меньше, чем 50000 денег не станет как ни старайтесь...

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

mov ebx,[eax+65] //функция доступа выглядит примерно так...

Далее нужно ввести некую переменную (пусть будет _money), и навесить на неё хоткей чтоб тот присваивал переменной значение 1.

Скрипт будет выглядеть так.


cmp dword ptr [_money],1
jne originalcode
add [eax+65],#1000
mov [_money],0 //чтоб бесконечного цикла не получилось...
originalcode:
mov ebx,[eax+65]

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

4. Прыжки

Чем меньше флагов в скрипте - тем лучше, но полностью от них отказаться не возможно. По-этому свидём использование их к минимуму.

Тут уже сам Dark Byte зачем-то в стандартном шаблоне навтыкал ненужные флаги - а именно exit и originalcode. Покажу вам наглядно как обойтись без них.

Подопытным кроликом я использовал игру The Elder Scrolls 3: Morrowind (не кидайтесь плз фикалиями, знаю что старьё).

По-мимо прыжков на флаги можно использовать прыжки через байты.


jmp +3
je +3
jne +3

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

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


[ENABLE]
alloc(newmem,2048)
label(returnhere)

newmem:
fstp dword ptr [ecx+08]
push [ecx+04]
pop [ecx+08]
ret 0010
jmp returnhere

"Morrowind.exe"+122F:
jmp newmem
nop
returnhere:


[DISABLE]
dealloc(newmem)
"Morrowind.exe"+122F:
fstp dword ptr [ecx+08]
ret 0010
//Alt: db D9 59 08 C2 10 00

и знаю, что в ecx+0c хранится идентификатор героя 746464.

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

Вычисляется кол-во байт следующим образом. в данном случае мне нужно перепрыгнуть push [ecx+04] и pop [ecx+08].

1. Активируем скрипт каков он есть.

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

30b1042f21cc275f1cd1d3643b44c4e6.png

Я обвёл красным те байты, которые мне нужно перепрыгнуть. Судя по картинке их 6 (шесть круглешков)

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


[ENABLE]
alloc(newmem,2048)
label(returnhere)

newmem:
fstp dword ptr [ecx+08]
cmp [ecx+0C],746464
jne +6 // если не равно перепрыгнуть через 6 байт.
push [ecx+04]
pop [ecx+08]
ret 0010
jmp returnhere

"Morrowind.exe"+122F:
jmp newmem
nop
returnhere:


[DISABLE]
dealloc(newmem)
"Morrowind.exe"+122F:
fstp dword ptr [ecx+08]
ret 0010
//Alt: db D9 59 08 C2 10 00

как видите обошёлся двумя флагами (один из которых и флаг и выделение памяти под скрипт).

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

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

Но ты гонишь на меня ... я много 9999999999 использую тока в деньгах... и ни где более....

пару скриптов здоровья....

Сталкер чистое небо 10 патч

Здоровье=2 в оригинале=1


//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048) //2kb should be enough
label(returnhere)
label(originalcode)
label(exit)

newmem: //this is allocated memory, you have read,write,execute access
//place your code here
mov [ecx+04],(float)2

originalcode:
movss xmm0,[ecx+04]

exit:
jmp returnhere

xrGame.dll+212F02:
jmp newmem
returnhere:

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
xrGame.dll+212F02:
movss xmm0,[ecx+04]
//Alt: db F3 0F 10 41 04
[ENABLE]

Кризис-2

Здоровье


//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048) //2kb should be enough
label(returnhere)
label(originalcode)
label(exit)

newmem: //this is allocated memory, you have read,write,execute access
//place your code here

originalcode:
fstp dword ptr [esi+0000032C]
mov eax,[Crysis2.exe+017881C0]
mov eax,[eax+4c]
mov [eax+32c],447A0000
exit:
jmp returnhere

Crysis2.exe+C5E656:
jmp newmem
nop
returnhere:

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
Crysis2.exe+C5E656:
fstp dword ptr [esi+0000032C]
//Alt: db D9 9E 2C 03 00 00
[ENABLE]

Во попробовал отлично работает ...

Dead Space2 патноны в обойме


//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048) //2kb should be enough
label(returnhere)
label(originalcode)
label(exit)

newmem: //this is allocated memory, you have read,write,execute access
//place your code here
inc ebp

originalcode:
mov [esi+0000039C],ebp

exit:
jmp returnhere

deadspace2.exe+9BA807:
jmp newmem
nop
returnhere:

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
deadspace2.exe+9BA807:
mov [esi+0000039C],ebp
//Alt: db 89 AE 9C 03 00 00
[ENABLE]

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

Grom-Skynet, я конечно ничего не имею против цифры девять, но почему именно девять и почеу так много этих девяток ты используешь?

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

Grom-Skynet, я конечно ничего не имею против цифры девять, но почему именно девять и почеу так много этих девяток ты используешь?

Да ХЗ .. просто так...

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

cmp dword ptr [_money],1

jne originalcode

add [eax+65],#1000

mov [_money],0 //чтоб бесконечного цикла не получилось...

originalcode:

mov ebx,[eax+65]

Се ругается что [_money] нe объявлен

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

Се ругается что [_money] нe объявлен

потому что это только часть скирпта.

В секции [ENABLE] нужно добавить registersymbol(_money), а в [DISABLE] unregistersymbol(_money)

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

  • 3 недели спустя...
  • 2 месяца спустя...

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

inc esi

mov [eax+10],esi

а если например у меня так

mov eax,[ecx+esi*4], то как правильно

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

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

inc esi

mov [eax+10],esi

а если например у меня так

mov eax,[ecx+esi*4], то как правильно

mov eax,[ecx+esi*4] если инструкция правильная... то можно

вот так

inc [ecx+esi*4]

mov eax,[ecx+esi*4]

Можно и так

inc eax

mov eax,[ecx+esi*4]

Пробуй.....

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

И какой в этом смысл? Сначала увеличиваем значение регистра, потом затираем другим.

А я думаю если инструкция на запись

то зачем заморачиваться

зонопал и усё

если конечноже не возникает ни каких нюансов

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

Да, кстати. Перечитал первый пост, там есть вот такой кусочек:


ret 0010
jmp returnhere

Я может просто сонный ещё, но нафига нам ret 10 тут? И тот же jmp после него - в каком случае мы до него доходим? Я проверить не могу сейчас, но по-моему мы же по ret возвращаемся и на этом всё. laugh.gif

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

Да, кстати. Перечитал первый пост, там есть вот такой кусочек:


ret 0010
jmp returnhere

Я может просто сонный ещё, но нафига нам ret 10 тут? И тот же jmp после него - в каком случае мы до него доходим? Я проверить не могу сейчас, но по-моему мы же по ret возвращаемся и на этом всё. laugh.gif

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

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

  • 5 месяцев спустя...

Се ругается что [_money] нe объявлен

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


[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)
label(_money)

newmem:
cmp dword ptr [_money],1
jne originalcode
add [eax+65],#1000
mov [_money],0
originalcode:
mov ebx,[eax+65]

exit:
jmp returnhere

_money:
dd 1 //Если 1 сразу активируем чит............

"game.exe"+CF4E:
jmp newmem
nop
returnhere:

[DISABLE]
"game.exe"+CF4E:
mov ebx,[eax+65]
dealloc(newmem)

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


_Money:
dd 1

Эх, ребята... Ну вот нафига для булевой (по сути) переменной резевировать аж четыре байта? Я понимаю, сейчас оперативки исчисляются десятками гигабайт, но это вовсе не значит, что оперативу можно так бездумно расходовать...

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

В 64-ОС уже не поддерживаются короткие машинные инструкции dos программ

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

И да, кстати, насколько мне известно, поддержка ДОС инструкций "сидит" в самом процессоре, которые, пока еще, вроде как, совместимы с 80х86..

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

>>В 64-ОС уже не поддерживаются короткие машинные инструкции dos программ

Я имел ввиду что на Win7 64 разрядной не запускаются 16-разрядные приложения. И я почему-то решил что инструкции не поддерживаются для работы с 16-битными регистрами. Т.е. mov ax, bx и т.п. Видимо какие-то инструкции поддерживаются. Так что я ошибся с однозначным выводом, ссори.

Тем не мене речь шла об экономии памяти. Так что ничего не меняется. Если в страннице памяти, есть свободное место, то об экономии можно не думать, а обычно в странице памяти всегда остаётся свободное место.

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

  • 4 месяца спустя...

Всем привет....

У меня вопрос... как в скрипте записать инструкцию mov и что бы комп понял что это 4 байта? а то что то понимает как 1 байт?

вот эта инструкция... dword ptr я добавил. но не работает...

mov dword ptr [ecx+000000A8],#17274

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

  • 7 месяцев спустя...

помогите разобраться в коде:

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
aobscan(healthscriptAOB,F3 0F 2A 81 7C 03 00 00 F3 0F 11 04 24)
label(healthscriptAOB_jmp)
registersymbol(healthscriptAOB_jmp)

label(pHealth)
registersymbol(pHealth)

alloc(newmem,2048) //2kb should be enough
label(returnhere)
label(originalcode)
label(exit)

newmem: //this is allocated memory, you have read,write,execute access
//place your code here
mov [pHealth],ecx

originalcode:
cvtsi2ss xmm0,[ecx+0000037C]

exit:
jmp returnhere

///
pHealth:
dd 0
///

healthscriptAOB: //"RememberMe.exe"+A9341A:
healthscriptAOB_jmp:
jmp newmem
nop
nop
nop
returnhere:




[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
healthscriptAOB_jmp: //"RememberMe.exe"+A9341A:
db F3 0F 2A 81 7C 03 00 00
//Alt: cvtsi2ss xmm0,[ecx+0000037C]
unregistersymbol(healthscriptAOB_jmp)
unregistersymbol(pHealth)

pHealth:

dd 0- ? это что

pHealth:

dd 0

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

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

ЗЫ. Код нужно помещать в специальный тег. Предыдущий пост поправил.

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

  • 4 года спустя...

Уважаемые админы и помогаторы хорошо бы сделать видео уроки на ютуб как писать скрипты. Было бы очень хорошо для новичков да и остальным тоже познавательно. Пожалуйста сделайте подобные видео уроки.

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

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

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

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