Akama Опубликовано 6 сентября, 2011 Поделиться Опубликовано 6 сентября, 2011 Решил написать статью о том, как правильно скрипты писать. Она не призвана научить вас писать скрипты с нуля "шоб работало". Пишу лишь для того, чтоб народ понял как грамотно делать ту или иную функцию, и выглядело это красиво.И так - по порядку: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,#999mov [eax+10],esi //родной кусок кодаА вот так ПРАВИЛЬНО:inc esi //увеличивает значение esi на 1mov [eax+10],esi //родной кусок кодаИЛИadd esi,1 //в данном случае нужно указывать на сколько увеличить esimov [eax+10],esi //родной кусок кодаЗначение патронов в обоиме будет всегда максимально и гемора будет меньше в будущем.3. Деньги (или ещё какой-нить шмот)И опять сами-знаете-кто любит присвоить деньгам значение 9999999 (денег же много не бывает).В принципе можно и так делать, но впечатление складыватся, что без "читов" тут дело не обошлось. Если глаз не мозолит, то ничего страшного, пусть будет 999999 денег.Я предпочитаю в данном случае либо морозить значение денег на определённой отметке, чтоб ниже его не опускалось (например денег может быть и 51862, и 56923, но ниже 50000 не опустится), либо просто функцию добавления денег (+1000 золотый например).Если хотите, чтоб значение не опускалось ниже 50000, то нужно отлавливать функцию, которая записывает новое значение в адрес денег. Пусть еах+65 это деньги.mov [eax+65],ebx //именно так эти функции выглядят.то скрипт в данном случае будет выглядеть так:cmp ebx,#50000jge originalcodemov ebx,#50000originalcode:mov [eax+65],ebxТ.о. меньше, чем 50000 денег не станет как ни старайтесь...Если хотите добавлять 1000 денег, то нужно отлавливать функцию, которая чаще всех будет получать доступ к деньгам.mov ebx,[eax+65] //функция доступа выглядит примерно так...Далее нужно ввести некую переменную (пусть будет _money), и навесить на неё хоткей чтоб тот присваивал переменной значение 1.Скрипт будет выглядеть так.cmp dword ptr [_money],1jne originalcodeadd [eax+65],#1000mov [_money],0 //чтоб бесконечного цикла не получилось...originalcode:mov ebx,[eax+65]на нажатию хоткея добавится 1000 денег (как резко зависит от того, как часто инструкция получает доступ к деньгам)4. ПрыжкиЧем меньше флагов в скрипте - тем лучше, но полностью от них отказаться не возможно. По-этому свидём использование их к минимуму.Тут уже сам Dark Byte зачем-то в стандартном шаблоне навтыкал ненужные флаги - а именно exit и originalcode. Покажу вам наглядно как обойтись без них.Подопытным кроликом я использовал игру The Elder Scrolls 3: Morrowind (не кидайтесь плз фикалиями, знаю что старьё).По-мимо прыжков на флаги можно использовать прыжки через байты.jmp +3je +3jne +3Как видите синтаксис тот же, но изменилось то, что прыгаем через некое колличество байт (указывается в шестнадцатиричной системе счисления)И так, я написал скрипт, который сделает здоровье, ману и выносливость бесконечными.[ENABLE]alloc(newmem,2048)label(returnhere)newmem:fstp dword ptr [ecx+08]push [ecx+04]pop [ecx+08]ret 0010jmp returnhere"Morrowind.exe"+122F:jmp newmemnopreturnhere:[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. смотрим в отладчике что скрипт делает теперь и замечаем байты нужных нам строк.Я обвёл красным те байты, которые мне нужно перепрыгнуть. Судя по картинке их 6 (шесть круглешков)Следовательно мне нужно перептыгнуть 6 байт, и мой скрипт будет выглядеть теперь вот так.[ENABLE]alloc(newmem,2048)label(returnhere)newmem:fstp dword ptr [ecx+08]cmp [ecx+0C],746464jne +6 // если не равно перепрыгнуть через 6 байт.push [ecx+04]pop [ecx+08]ret 0010jmp returnhere"Morrowind.exe"+122F:jmp newmemnopreturnhere:[DISABLE]dealloc(newmem)"Morrowind.exe"+122F:fstp dword ptr [ecx+08]ret 0010//Alt: db D9 59 08 C2 10 00как видите обошёлся двумя флагами (один из которых и флаг и выделение памяти под скрипт). 5 Ссылка на комментарий Поделиться на другие сайты Поделиться
Grom-Skynet Опубликовано 12 сентября, 2011 Поделиться Опубликовано 12 сентября, 2011 Статья конечно класс ... я даже что то подчеркну из нее для себя... спсНо ты гонишь на меня ... я много 9999999999 использую тока в деньгах... и ни где более.... пару скриптов здоровья....Сталкер чистое небо 10 патч Здоровье=2 в оригинале=1//code from here to '[DISABLE]' will be used to enable the cheatalloc(newmem,2048) //2kb should be enoughlabel(returnhere)label(originalcode)label(exit)newmem: //this is allocated memory, you have read,write,execute access//place your code heremov [ecx+04],(float)2originalcode:movss xmm0,[ecx+04]exit:jmp returnherexrGame.dll+212F02:jmp newmemreturnhere:[DISABLE]//code from here till the end of the code will be used to disable the cheatdealloc(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 cheatalloc(newmem,2048) //2kb should be enoughlabel(returnhere)label(originalcode)label(exit)newmem: //this is allocated memory, you have read,write,execute access//place your code hereoriginalcode:fstp dword ptr [esi+0000032C]mov eax,[Crysis2.exe+017881C0]mov eax,[eax+4c]mov [eax+32c],447A0000exit:jmp returnhereCrysis2.exe+C5E656:jmp newmemnopreturnhere:[DISABLE]//code from here till the end of the code will be used to disable the cheatdealloc(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 cheatalloc(newmem,2048) //2kb should be enoughlabel(returnhere)label(originalcode)label(exit)newmem: //this is allocated memory, you have read,write,execute access//place your code hereinc ebporiginalcode:mov [esi+0000039C],ebpexit:jmp returnheredeadspace2.exe+9BA807:jmp newmemnopreturnhere:[DISABLE]//code from here till the end of the code will be used to disable the cheatdealloc(newmem)deadspace2.exe+9BA807:mov [esi+0000039C],ebp//Alt: db 89 AE 9C 03 00 00[ENABLE] Ссылка на комментарий Поделиться на другие сайты Поделиться
Akama Опубликовано 12 сентября, 2011 Автор Поделиться Опубликовано 12 сентября, 2011 Grom-Skynet, я конечно ничего не имею против цифры девять, но почему именно девять и почеу так много этих девяток ты используешь? Ссылка на комментарий Поделиться на другие сайты Поделиться
Grom-Skynet Опубликовано 16 сентября, 2011 Поделиться Опубликовано 16 сентября, 2011 Grom-Skynet, я конечно ничего не имею против цифры девять, но почему именно девять и почеу так много этих девяток ты используешь?Да ХЗ .. просто так... Ссылка на комментарий Поделиться на другие сайты Поделиться
Ac1d Опубликовано 17 сентября, 2011 Поделиться Опубликовано 17 сентября, 2011 cmp dword ptr [_money],1jne originalcodeadd [eax+65],#1000mov [_money],0 //чтоб бесконечного цикла не получилось...originalcode:mov ebx,[eax+65] Се ругается что [_money] нe объявлен Ссылка на комментарий Поделиться на другие сайты Поделиться
SER[G]ANT Опубликовано 17 сентября, 2011 Поделиться Опубликовано 17 сентября, 2011 Се ругается что [_money] нe объявленпотому что это только часть скирпта.В секции [ENABLE] нужно добавить registersymbol(_money), а в [DISABLE] unregistersymbol(_money) Ссылка на комментарий Поделиться на другие сайты Поделиться
Akama Опубликовано 8 октября, 2011 Автор Поделиться Опубликовано 8 октября, 2011 Добавил в статью хитрость с прыжками, или как обойтись без лишних флагов. Ссылка на комментарий Поделиться на другие сайты Поделиться
Ramil Опубликовано 29 декабря, 2011 Поделиться Опубликовано 29 декабря, 2011 Akama, вот вы сказали на счёт патронов стрельба без перезарядки, inc esi mov [eax+10],esiа если например у меня так mov eax,[ecx+esi*4], то как правильно Ссылка на комментарий Поделиться на другие сайты Поделиться
Grom-Skynet Опубликовано 29 декабря, 2011 Поделиться Опубликовано 29 декабря, 2011 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 eaxmov eax,[ecx+esi*4]Пробуй..... Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 29 декабря, 2011 Поделиться Опубликовано 29 декабря, 2011 Можно и такinc eaxmov eax,[ecx+esi*4]И какой в этом смысл? Сначала увеличиваем значение регистра, потом затираем другим. Ссылка на комментарий Поделиться на другие сайты Поделиться
JIeXA Опубликовано 29 декабря, 2011 Поделиться Опубликовано 29 декабря, 2011 И какой в этом смысл? Сначала увеличиваем значение регистра, потом затираем другим.А я думаю если инструкция на записьто зачем заморачиватьсязонопал и усёесли конечноже не возникает ни каких нюансов Ссылка на комментарий Поделиться на другие сайты Поделиться
Grom-Skynet Опубликовано 30 декабря, 2011 Поделиться Опубликовано 30 декабря, 2011 И какой в этом смысл? Сначала увеличиваем значение регистра, потом затираем другим.тупанул че то)))) Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 30 декабря, 2011 Поделиться Опубликовано 30 декабря, 2011 Да, кстати. Перечитал первый пост, там есть вот такой кусочек:ret 0010jmp returnhereЯ может просто сонный ещё, но нафига нам ret 10 тут? И тот же jmp после него - в каком случае мы до него доходим? Я проверить не могу сейчас, но по-моему мы же по ret возвращаемся и на этом всё. Ссылка на комментарий Поделиться на другие сайты Поделиться
Grom-Skynet Опубликовано 30 декабря, 2011 Поделиться Опубликовано 30 декабря, 2011 Да, кстати. Перечитал первый пост, там есть вот такой кусочек:ret 0010jmp returnhereЯ может просто сонный ещё, но нафига нам ret 10 тут? И тот же jmp после него - в каком случае мы до него доходим? Я проверить не могу сейчас, но по-моему мы же по ret возвращаемся и на этом всё. я тоже так в каком то скрипте думал... убрал этот прыжок и скрипт не работает... Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 6 июня, 2012 Поделиться Опубликовано 6 июня, 2012 Се ругается что [_money] нe объявленПримерно так.[ENABLE]alloc(newmem,2048)label(returnhere)label(originalcode)label(exit)label(_money)newmem:cmp dword ptr [_money],1jne originalcodeadd [eax+65],#1000mov [_money],0originalcode:mov ebx,[eax+65]exit:jmp returnhere_money:dd 1 //Если 1 сразу активируем чит............"game.exe"+CF4E:jmp newmemnopreturnhere:[DISABLE]"game.exe"+CF4E:mov ebx,[eax+65]dealloc(newmem) Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 6 июня, 2012 Поделиться Опубликовано 6 июня, 2012 _Money:dd 1 Эх, ребята... Ну вот нафига для булевой (по сути) переменной резевировать аж четыре байта? Я понимаю, сейчас оперативки исчисляются десятками гигабайт, но это вовсе не значит, что оперативу можно так бездумно расходовать... Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 7 июня, 2012 Поделиться Опубликовано 7 июня, 2012 В 64-ОС уже не поддерживаются короткие машинные инструкции dos программВпервые слышу. В винде просто вообще убран режим ДОС, вот и все. А если глянуть в сторону тех же никсов, то, программируя на асме, спокойно можно обращаться к прерываниям. Конечно, такое программирование не прибавит стабильности системе. А вот в винде без ДОС режима к прерываниям уже не обратишься, собственно, именно поэтому и приходится использовать эмуляторы.И да, кстати, насколько мне известно, поддержка ДОС инструкций "сидит" в самом процессоре, которые, пока еще, вроде как, совместимы с 80х86.. Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 7 июня, 2012 Поделиться Опубликовано 7 июня, 2012 А int3 - не прерывание, что ли? 0_о Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 7 июня, 2012 Поделиться Опубликовано 7 июня, 2012 >>В 64-ОС уже не поддерживаются короткие машинные инструкции dos программЯ имел ввиду что на Win7 64 разрядной не запускаются 16-разрядные приложения. И я почему-то решил что инструкции не поддерживаются для работы с 16-битными регистрами. Т.е. mov ax, bx и т.п. Видимо какие-то инструкции поддерживаются. Так что я ошибся с однозначным выводом, ссори.Тем не мене речь шла об экономии памяти. Так что ничего не меняется. Если в страннице памяти, есть свободное место, то об экономии можно не думать, а обычно в странице памяти всегда остаётся свободное место. Ссылка на комментарий Поделиться на другие сайты Поделиться
Grom-Skynet Опубликовано 10 октября, 2012 Поделиться Опубликовано 10 октября, 2012 Всем привет....У меня вопрос... как в скрипте записать инструкцию mov и что бы комп понял что это 4 байта? а то что то понимает как 1 байт?вот эта инструкция... dword ptr я добавил. но не работает...mov dword ptr [ecx+000000A8],#17274 Ссылка на комментарий Поделиться на другие сайты Поделиться
ARM4ND0 Опубликовано 10 октября, 2012 Поделиться Опубликовано 10 октября, 2012 mov dword ptr [ecx+0xA8],0x437AПривет! Неужели понимает как байт ? Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 10 октября, 2012 Поделиться Опубликовано 10 октября, 2012 Как насчет inc dword ptr ecx Ссылка на комментарий Поделиться на другие сайты Поделиться
MoL4uN87 Опубликовано 8 июня, 2013 Поделиться Опубликовано 8 июня, 2013 помогите разобраться в коде:[ENABLE]//code from here to '[DISABLE]' will be used to enable the cheataobscan(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 enoughlabel(returnhere)label(originalcode)label(exit)newmem: //this is allocated memory, you have read,write,execute access//place your code heremov [pHealth],ecxoriginalcode:cvtsi2ss xmm0,[ecx+0000037C]exit:jmp returnhere///pHealth:dd 0///healthscriptAOB: //"RememberMe.exe"+A9341A:healthscriptAOB_jmp:jmp newmemnopnopnopreturnhere:[DISABLE]//code from here till the end of the code will be used to disable the cheatdealloc(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 Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 8 июня, 2013 Поделиться Опубликовано 8 июня, 2013 Это резервирование переменной, в которую в ходе выполнения скрипта записывается (в данном случае, в других скриптах может быть и по-другому) указатель на здоровье (регистр есх).ЗЫ. Код нужно помещать в специальный тег. Предыдущий пост поправил. Ссылка на комментарий Поделиться на другие сайты Поделиться
maxx500 Опубликовано 16 февраля, 2018 Поделиться Опубликовано 16 февраля, 2018 Уважаемые админы и помогаторы хорошо бы сделать видео уроки на ютуб как писать скрипты. Было бы очень хорошо для новичков да и остальным тоже познавательно. Пожалуйста сделайте подобные видео уроки. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения