Перейти к содержанию
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

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

Поделиться сообщением


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

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

Но ты гонишь на меня ... я много 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)

Поделиться сообщением


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

Добавил в статью хитрость с прыжками, или как обойтись без лишних флагов.

Поделиться сообщением


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

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]

Пробуй.....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Можно и так

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

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

Поделиться сообщением


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

Се ругается что [_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..

Поделиться сообщением


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

А int3 - не прерывание, что ли? 0_о

Поделиться сообщением


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

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

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

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

Поделиться сообщением


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

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

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

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

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

Поделиться сообщением


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

mov dword ptr [ecx+0xA8],0x437A

Привет! Неужели понимает как байт ?

Поделиться сообщением


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

Как насчет

inc dword ptr ecx

Поделиться сообщением


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

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

[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

Поделиться сообщением


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

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

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

Поделиться сообщением


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

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

Поделиться сообщением


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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Предпросмотр

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

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

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