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

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

Помогите пожалуйста разжевать этот код:





Я его почти полностью разжевал, но кое что всё таки для меня не понятно.
Вот скрины всего что я смог сопоставить с данным кодом:
1
2
3
4
5

Взял я этот код с форума СЕ. Пытался сам взломать игру, не вышло((( Стал искать в инете что-нибудь на эту игру и вдруг, наткнулся случайно и очень удачно на этот код :-D

//Base code[ENABLE]alloc(newmem,512)label(returnhere)label(exit)aobscan(aob_BaseCode,89 11 8B 50 04 89 ?? ?? B9 ?? ?? ?? ?? 39 ?? ?? 7C 6A)label(BaseCode)registersymbol(BaseCode)globalalloc(t_GodMode,4)globalalloc(t_InfAbility,4)globalalloc(t_InfMoney,4)label(GodMode1)label(GodMode2)label(InfAbility)label(InfMoney)t_GodMode:dd 0t_InfAbility:dd 0t_InfMoney:dd 0newmem:mov [ecx],edxGodMode1:cmp [t_GodMode],1jne InfAbilitycmp edi,00000001jne InfAbilitycmp [ecx+04],00000003jne InfAbilitypush esimov esi,[ecx+08]cmp [esi+10],00005048 //"HP"pop esijne InfAbilitypush esimov esi,[ecx-0C]cmp [esi+10],65726966 //"fire"Active (You)pop esijne GodMode2mov [ecx],(float)999GodMode2:push esimov esi,[ecx-0C]cmp [esi+10],72677075 //"upgr"adeLevel (Squad)pop esijne InfAbilitymov [ecx],(float)999InfAbility:cmp [t_InfAbility],1jne InfMoneycmp edi,00000009jne InfMoneycmp [ecx+04],00000003jne InfMoneypush esimov esi,[ecx+08]cmp [esi+10],72616863 //"char"gespop esijne InfMoneymov [ecx],(float)99InfMoney:cmp [t_InfMoney],1jne exitcmp edi,00000001jne exitcmp [ecx+04],00000003jne exitpush esimov esi,[ecx+08]cmp [esi+10],6F736572 //"reso"urcespop esijne exitmov [ecx],(float)9999exit:mov edx,[eax+04]jmp returnhereaob_BaseCode:BaseCode:jmp newmemreturnhere:[DISABLE]BaseCode:mov [ecx],edxmov edx,[eax+04]dealloc(newmem)unregistersymbol(BaseCode)
//Toggle God Mode[ENABLE]t_GodMode:dd 1[DISABLE]t_GodMode:dd 0
//Toggle Inf. Abilities[ENABLE]t_InfAbility:dd 1[DISABLE]t_InfAbility:dd 0
//Toggle Inf. Money[ENABLE]t_InfMoney:dd 1[DISABLE]t_InfMoney:dd 0
Изменено пользователем Korol2010
Ссылка на комментарий
Поделиться на другие сайты

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

Далее добавляешь в таблицу остальные 2,3,4 кода в таблицу.

Сам процесс использовпния скриптов

Активируешь 1 мастер скрипт, далее в игре при активированным мастер скриптом, активируешь уже последущии 2,3,4.

Надеюсь доступно объяснил...

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

Помогите пожалуйста разжевать этот код

 

Код довольно большой чтобы построчно его комментировать.

 

1) aobscan  - находит адрес инструкции кода по сигнатуре "89 11 8B 50 04 89 ?? ?? B9 ?? ?? ?? ?? 39 ?? ?? 7C 6A"

 

2) alloc(newmem,512) - выделяет участок памяти в 512 байт  под меткой newmem. Будет на самом деле больше 512 байт, т.к. кратно размеру страницы памяти.

 

3) BaseCode - метка для для активации и деактиваци, запоминает адрес найденной сигнатуры

 

4) globalalloc это выделение памяти так же как и alloc, но с регистрацией метки. Можно использовать в других скриптах эту метку. Но я бы не стал писать globalalloc, т.к. много места остается пустым. У каждого автора скрипта могут быть свои причины почему они так написали.

 

5) 

  1. [ENABLE] и
  2. [DISABLE]

 

Для активации и деактивации. В случае скрипта записываются ноль или единица по меткам из globalalloc

 

6) ассемблерные инструкции есть в справочниках

 

 

 

Могу посоветовать почитать:

 

Ассемблерные инструкции: ссылка на тему

CE Autoassembler Engine: ссылка на тему

Курс для новичков: ссылка на тему

Справка Cheat Engine Autoassembler: ссылка

 

Лучше все воспринимается, когда начинаешь писать скрипты меньших размеров. 

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

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

Dison, я это то знаю)) Я имею в виду что хочу знать как это всё дело так сказать работает, по полочкам)) Что за что отвечает и к чему относится.

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

[terminus]--------------------------------------------------------------------------------

Привет! Попрбуй для начала включить скрипт, перейти на адрес, в который он

инжектится, поставить на него брейкпоинт и по шагам его пройти. Если закрыть

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

которые не понимаешь - выпиши, а еще лучше возьми бумажку и напиши, что скрипт

по-твоему делает, а потом сравним это с действительностью.

--------------------------------------------------------------------------------[/terminus]

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

Кстати, да можно в пошаговой отладке пройтись по скрипту.

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

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

2 MasterGH:

Честно говоря, я всё это и так знал кроме globalalloc и не понятно было для меня ещё на кой хрен такая странная длинная сигнатура, если на самом деле она по идее не должна быть такой большой, у меня СЕ генерирует АОБ только в 5 байт, а тут вон аж сколько ещё и со знаками вопроса. Ещё не ясно для меня было зачем загонять выделенный АОБ в лейбол.

Я уже разбирал этот скрипт, лазил смотрел где что делается, но не когда скрипт включен, а когда скрипт выключен))

 

2 keng:

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

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

NullAlex: цитировать большие сообщения совсем не рекомендуется.
Ссылка на комментарий
Поделиться на другие сайты

[terminus]--------------------------------------------------------------------------------

Вся фишка в том, чтобы у тебя получилась каша, а мы помогли ее правильно

сварить.

--------------------------------------------------------------------------------[/terminus]

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

globalalloc можно выделить один раз. Если она будет повторно срабатывать, то память не будет выделяться по новым адресам. dealloc уже не поможет очистить память по этой метке. Вроде так. 

globalalloc на моей памяти практически не используется на форуме CE. Если метку надо зарегистировать без выделения памяти, то на это есть registersymbol.

 

Я не очень люблю "мастер-скрипты". У них одна и та же проблема. Заставлять пользователя активировать скрипт один раз, а потом уже работать с другими скриптами. Я за вариант таких инъекций, которые меняют одну сигнатуру кода на другую без выделения памяти. Т.е. без так называемых "мастер-скриптов". Или же с выделением памяти, но опять же без мастер-скриптов. Просто так быстрее и удобнее.

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




Вот так я понимаю работу скрипта. То чего я не понимаю хотелось бы чтоб вы мне объяснили и(или) поправили меня в том что я не правильно понял=))


[terminus]--------------------------------------------------------------------------------
Вся фишка в том, чтобы у тебя получилась каша, а мы помогли ее правильно
сварить.
--------------------------------------------------------------------------------[/terminus]

Ну ещё начали только варить=D


globalalloc можно выделить один раз. Если она будет повторно срабатывать, то память не будет выделяться по новым адресам. dealloc уже не поможет очистить память по этой метке. Вроде так. 

globalalloc на моей памяти практически не используется на форуме CE. Если метку надо зарегистировать без выделения памяти, то на это есть registersymbol.

 

Я не очень люблю "мастер-скрипты". У них одна и та же проблема. Заставлять пользователя активировать скрипт один раз, а потом уже работать с другими скриптами. Я за вариант таких инъекций, которые меняют одну сигнатуру кода на другую без выделения памяти. Т.е. без так называемых "мастер-скриптов". Или же с выделением памяти, но опять же без мастер-скриптов. Просто так быстрее и удобнее.

Ясно. Просто я пытался стандартным методом сделать скрипт, найти фильтр, у меня ничего не вышло, а этот скрипт работает на удивление. Да и я так и не понял что в этом скрипте толком является фильтром и какой для чего фильтр предназначен.

//Base code[ENABLE]alloc(newmem,512)//Понимаюlabel(returnhere)//Понимаюlabel(exit)//Понимаюaobscan(aob_BaseCode,89 11 8B 50 04 89 ?? ?? B9 ?? ?? ?? ?? 39 ?? ?? 7C 6A)//не совсем но понимаю. Скрипт сканирует участок памяти с байтами инструкций, но почему эта сигнатура такая длинная я не знаю, т. к. если я правильно помню у меня автоматом АОБ СЕ выделяет только это: 89 11 8B 50 04 89.label(BaseCode)registersymbol(BaseCode)//не понимаю зачем дополнительный лейбол BaseCode и зачем его регистрироватьglobalalloc(t_GodMode,4)//тоже не понимал, ну сейчас мне объяснил MastrGH что эта функция делает, но я всё же не понимаю зачем происходит ещё выделение памяти и конкретно 4 байта.globalalloc(t_InfAbility,4)//аналогичноglobalalloc(t_InfMoney,4)//аналогичноlabel(GodMode1)//ну с этим тоже всё понятно, просто меткиlabel(GodMode2)//+label(InfAbility)//+label(InfMoney)//+t_GodMode:dd 0// как я понимаю это устанавливается значение для зарегистрированной меткиt_InfAbility:dd 0//аналогичноt_InfMoney:dd 0//аналогичноnewmem:mov [ecx],edx//первая оригинальная инструкция. Здесь я не понимаю почему эта инструкция находится именно здесь и почему АОБ не делается на эту меткуGodMode1:cmp [t_GodMode],1//тут на сколько я понял сравнивается значение в зарегистрированной метке с единицей (изначально у нас 0, после включения под скрипта №3-один)jne InfAbility//не прыгаем если равно единицеcmp edi,00000001//сравниваем регистр инструкции mov [ecx],edx с единицейjne InfAbility//не прыгаем если равно единицеcmp [ecx+04],00000003//сравниваем значение лежащее по смещению с тройкойjne InfAbility//не прыгаем если равно трёмpush esi//загружаем регистрmov esi,[ecx+08]//кладём в загруженный регистр указатель по смещению [ecx+8]cmp [esi+10],00005048 //"HP"// в моём понимании это что-то вроде фильтра первичного для жизней юнитов отряда игрокаpop esi//восстанавливаем регистрjne InfAbility//не прыгаем если равно 5048push esi//загружаем регистрmov esi,[ecx-0C]//не совсем, но я понимаю что это делается и всё же думаю что лучше бы это дело мне объяснить=)cmp [esi+10],65726966 //"fire"Active (You)//сравниваем с неким числом лежащим в указателе по смещению [ecx-C], но вот от куда это число берётся я так и не понялpop esi//восстанавливаем регистрjne GodMode2//не прыгаем если равно 65726966mov [ecx],(float)999//устанавливаем нужное кол-во жизнейGodMode2:push esi//ну это понятно, дальше я буду пропускать эти строкиmov esi,[ecx-0C]//опять же то что я не совсем понимаю, но по сути мы кладём опять же указатель лежащий по смещению [ecx-C] в регистрcmp [esi+10],72677075 //"upgr"adeLevel (Squad)//сравниваем значение лежащее в указателе [ecx-C] по смещению [esi+10]pop esijne InfAbility//далее писать про эти строки я не будуmov [ecx],(float)999//опять же записываем нужное значение здоровья, но для меня не понятно зачем было это делать 2 раза и в таком виде, да и ещё используя аж 3 фильтраInfAbility:cmp [t_InfAbility],1//про это я тоже писать больше не буду и так всё ясноjne InfMoneycmp edi,00000009//сравниваем регистр со значением 9jne InfMoneycmp [ecx+04],00000003//сравниваем значение лежащее по смещению с тройкойjne InfMoneypush esimov esi,[ecx+08]//кладём указатель лежащий по смещению [ecx+8] в регистрcmp [esi+10],72616863 //"char"ges//ещё 1 фильтрpop esijne InfMoneymov [ecx],(float)99//записываем нужное кол-во расходниковInfMoney:cmp [t_InfMoney],1jne exitcmp edi,00000001//опять же сравниваем регистр с единицейjne exitcmp [ecx+04],00000003//значение лежащее по смещению [ecx+4] сравниваем с тройкойjne exitpush esimov esi,[ecx+08]//аналогично как было и вышеcmp [esi+10],6F736572 //"reso"urces//ещё фильтpop esijne exitmov [ecx],(float)9999//устанавливаем нужное кол-во денегexit:mov edx,[eax+04]//вторая оригинальная инструкция идущая по кодуjmp returnhereaob_BaseCode:BaseCode:jmp newmem//вообще не понятно почему тут так сделано какой-то прям бутерброд получается:-Dreturnhere:[DISABLE]BaseCode:mov [ecx],edxmov edx,[eax+04]//выполняем оригинальный кодdealloc(newmem)//удаляем выделенную памятьunregistersymbol(BaseCode)//снимаем регистрацию с метки
//Toggle God Mode[ENABLE]t_GodMode:dd 1//устанавливаем значение метки[DISABLE]t_GodMode:dd 0//аналогично, с остальными под скриптами думаю тоже понятно.
//Toggle Inf. Abilities[ENABLE]t_InfAbility:dd 1[DISABLE]t_InfAbility:dd 0
//Toggle Inf. Money[ENABLE]t_InfMoney:dd 1[DISABLE]t_InfMoney:dd 0
Ссылка на комментарий
Поделиться на другие сайты

 

 

 

Да и я так и не понял что в этом скрипте толком является фильтром и какой для чего фильтр предназначен.

 

Там где видишь cmp там и есть так называемый "фильтр". Мне не известно как автор скрипта сделал этот фильтр. По скрипту не поймешь, надо сравнивать структуры. Сравнение структур в этой теме Как найти идентификатор игрока ( ID players )

[ENABLE]alloc(newmem,512)label(returnhere)label(exit) aobscan(aob_BaseCode, 89 11 8B 50 04 89 ?? ?? B9 ?? ?? ?? ?? 39 ?? ?? 7C 6A)// только автору известно, почему сигнатура такая длинная. Возможно автор экспериментировал или решил подстраховаться и вручную добавил сигнатуру. Знаки вопроса означают, что байт могут быть любыми.label(BaseCode)registersymbol(BaseCode)//регистрировать метку BaseCode нужно чтобы запомнить адрес сигнатуры. Для этого надо распожоложить BaseCode  под меткой aob_BaseCode и при деактивации скрипта использовать BaseCode (смотри метку aob_BaseCode и под ней BaseCode). Этот способ придумал DarkByte автор Cheat Engine. Ну или кто-то из его окружения. Почему именно так? Я не знаю. Просто так и все. globalalloc(t_GodMode,4)// Я тоже не знаю, зачем выделять лишнюю память. Вместо globalalloc можно было написать две строки label(t_GodMode) и registersymbol(t_GodMode). Был бы тот же самый эффект. Наверно, автор решил, что ему так удобнее. Т.к. метки сами регистрируются и возможно эти метки никогда не удалятся.globalalloc(t_InfAbility,4)//аналогичноglobalalloc(t_InfMoney,4)//аналогичноlabel(GodMode1)label(GodMode2)label(InfAbility)label(InfMoney) t_GodMode:dd 0// это начало нового куска памятиt_InfAbility:dd 0// это начало еще одного нового куска памятиt_InfMoney:dd 0// это начало и еще одного нового куска памяти (похоже памяти так много, что совсем пофиг на неё) newmem:mov [ecx],edx // под newmem начался код инъекции для этого скрипта, другие скрипты не видят newmem. Данная инструкция необходима как часть оригинального кода, который затерли чтобы игра не вылетела. AOB сигна тут совсем не причем. GodMode1:cmp [t_GodMode],1//тут на сколько я понял сравнивается значение в зарегистрированной метке с единицей (изначально у нас 0, после включения под скрипта №3-один)jne InfAbility//не прыгаем если равно единицеcmp edi,00000001//сравниваем регистр инструкции mov [ecx],edx с единицейjne InfAbility//не прыгаем если равно единицеcmp [ecx+04],00000003//сравниваем значение лежащее по смещению с тройкойjne InfAbility//не прыгаем если равно трёмpush esi//загружаем регистрmov esi,[ecx+08]//кладём в загруженный регистр указатель по смещению [ecx+8]cmp [esi+10],00005048 //"HP"// в моём понимании это что-то вроде фильтра первичного для жизней юнитов отряда игрокаpop esi//восстанавливаем регистрjne InfAbility//не прыгаем если равно 5048push esi//загружаем регистрmov esi,[ecx-0C]//не совсем, но я понимаю что это делается и всё же думаю что лучше бы это дело мне объяснить=)cmp [esi+10],65726966 //"fire"Active (You)//сравниваем с неким числом лежащим в указателе по смещению [ecx-C], но вот от куда это число берётся я так и не понялpop esi//восстанавливаем регистрjne GodMode2//не прыгаем если равно 65726966mov [ecx],(float)999//устанавливаем нужное кол-во жизней GodMode2:push esi//ну это понятно, дальше я буду пропускать эти строкиmov esi,[ecx-0C]//опять же то что я не совсем понимаю, но по сути мы кладём опять же указатель лежащий по смещению [ecx-C] в регистрcmp [esi+10],72677075 //"upgr"adeLevel (Squad)//сравниваем значение лежащее в указателе [ecx-C] по смещению [esi+10]pop esijne InfAbility//далее писать про эти строки я не будуmov [ecx],(float)999//опять же записываем нужное значение здоровья, но для меня не понятно зачем было это делать 2 раза и в таком виде, да и ещё используя аж 3 фильтра InfAbility:cmp [t_InfAbility],1//про это я тоже писать больше не буду и так всё ясноjne InfMoneycmp edi,00000009//сравниваем регистр со значением 9jne InfMoneycmp [ecx+04],00000003//сравниваем значение лежащее по смещению с тройкойjne InfMoneypush esimov esi,[ecx+08]//кладём указатель лежащий по смещению [ecx+8] в регистрcmp [esi+10],72616863 //"char"ges//ещё 1 фильтрpop esijne InfMoneymov [ecx],(float)99//записываем нужное кол-во расходников InfMoney:cmp [t_InfMoney],1jne exitcmp edi,00000001//опять же сравниваем регистр с единицейjne exitcmp [ecx+04],00000003//значение лежащее по смещению [ecx+4] сравниваем с тройкойjne exitpush esimov esi,[ecx+08]//аналогично как было и вышеcmp [esi+10],6F736572 //"reso"urces//ещё фильтpop esijne exitmov [ecx],(float)9999//устанавливаем нужное кол-во денег exit:mov edx,[eax+04]//вторая оригинальная инструкция идущая по кодуjmp returnhere aob_BaseCode:BaseCode:jmp newmem// Как я уже писал aob_BaseCode - это метка сигны. Если поставить под метку другую метку, то нижняя метка копирует адрес под верхней. aob_BaseCode нельзя зарегистрировать чтобы она была доступна под [DISABLE] секцией. Но можно зарегистрировать BaseCode и тогда BaseCode будет доступна под [DISABLE]returnhere:[DISABLE]BaseCode:mov [ecx],edxmov edx,[eax+04]//выполняем оригинальный кодdealloc(newmem)//удаляем выделенную памятьunregistersymbol(BaseCode)//снимаем регистрацию с метки 
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

 

Зы: Длинные кометы на длинных скриптах, как видно читать очень неудобно, т.к. прокрутка внизу (выходит за экран). Нужно будет что-то придумать. Может переносить строки? Сейчас попробую.

//Base code[ENABLE]alloc(newmem,512)//Понимаю // Хорошоlabel(returnhere)//Понимаюlabel(exit)//Понимаю aobscan(aob_BaseCode,89 11 8B 50 04 89 ?? ?? B9 ?? ?? ?? ?? 39 ?? ?? 7C 6A)//не совсем но понимаю. Скрипт сканирует участок памяти с байтами инструкций, но почему эта сигнатура такая длинная я не знаю, т. к. если я правильно помню у меня автоматом АОБ СЕ выделяет только это: 89 11 8B 50 04 89.// Видимо потому, что по короткой сигнатуре сканером находится несколько инструкций,// поэтому автор удлинил сигнатуру и заменил байты которые меняются на знаки ?.label(BaseCode)registersymbol(BaseCode)//не понимаю зачем дополнительный лейбол BaseCode и зачем его регистрировать // label для использования метки внутри скрипта, registersymbol, // если собираетесь использовать и в других скриптах таблицы или в отдельном адресе.  globalalloc(t_GodMode,4)//тоже не понимал, ну сейчас мне объяснил MastrGH что эта функция делает, но я всё же не понимаю зачем происходит ещё выделение памяти и конкретно 4 байта. // как я понял раньше использовали для регистрации меток с выделением локальной памяти,// можно заменить (без ущерба) предыдущей конструкцией.globalalloc(t_InfAbility,4)//аналогичноglobalalloc(t_InfMoney,4)//аналогичноlabel(GodMode1)//ну с этим тоже всё понятно, просто метки // Хорошоlabel(GodMode2)//+label(InfAbility)//+label(InfMoney)//+ t_GodMode:dd 0// как я понимаю это устанавливается значение для зарегистрированной меткиt_InfAbility:dd 0//аналогичноt_InfMoney:dd 0//аналогично newmem: // на эту метку происходит прыжок от -> 111 (смотри ниже).mov [ecx],edx//первая оригинальная инструкция. // Здесь я не понимаю почему эта инструкция находится именно здесь и почему АОБ не делается на эту метку - //вопрос не понял. GodMode1:cmp [t_GodMode],1//тут на сколько я понял сравнивается значение в зарегистрированной метке с единицей (изначально у нас 0, после включения под скрипта №3-один)jne InfAbility//не прыгаем если равно единице // наоборот прыгаем на метку InfAbility, если не равно 1.cmp edi,00000001//сравниваем регистр инструкции mov [ecx],edx с единицейjne InfAbility//не прыгаем если равно единице // см. вышеcmp [ecx+04],00000003//сравниваем значение лежащее по смещению с тройкойjne InfAbility//не прыгаем если равно трём // см. вышеpush esi//загружаем регистр // сохраняемmov esi,[ecx+08]//кладём в загруженный регистр указатель по смещению [ecx+8]cmp [esi+10],00005048 //"HP"// в моём понимании это что-то вроде фильтра первичного для жизней юнитов отряда игрокаpop esi//восстанавливаем регистрjne InfAbility//не прыгаем если равно 5048 // см. вышеpush esi//загружаем регистр // восстанавливаемmov esi,[ecx-0C]//не совсем, но я понимаю что это делается и всё же думаю что лучше бы это дело мне объяснить=)cmp [esi+10],65726966 //"fire"Active (You)//сравниваем с неким числом лежащим в указателе по смещению [ecx-C] // не верно - по [[ecx-0c]+10] лежит значение 65726966 в HE , //но вот от куда это число берётся я так и не понял // в структуре.pop esi//восстанавливаем регистрjne GodMode2//не прыгаем если равно 65726966 // см. вышеmov [ecx],(float)999//устанавливаем нужное кол-во жизней GodMode2:push esi//ну это понятно, дальше я буду пропускать эти строкиmov esi,[ecx-0C]//опять же то что я не совсем понимаю, но по сути мы кладём опять же указатель лежащий по смещению [ecx-C] в регистрcmp [esi+10],72677075 //"upgr"adeLevel (Squad)//сравниваем значение лежащее в указателе [ecx-C] по смещению [esi+10] // тоже не верно см. выше подобную инструкциюpop esijne InfAbility//далее писать про эти строки я не будуmov [ecx],(float)999//опять же записываем нужное значение здоровья, но для меня не понятно зачем было это делать 2 раза и в таком виде, да и ещё используя аж 3 фильтра // это нужно изучать код, чтобы понять, но предположу, // что при записи в одном месте GodMod не срабатывал, //я лично делал тоже самое в Ведьмаке 3 ( записывал максимальное значение живучести, // в двух инструкциях - после этого работало). InfAbility:cmp [t_InfAbility],1//про это я тоже писать больше не буду и так всё ясноjne InfMoneycmp edi,00000009//сравниваем регистр со значением 9jne InfMoneycmp [ecx+04],00000003//сравниваем значение лежащее по смещению с тройкойjne InfMoneypush esimov esi,[ecx+08]//кладём указатель лежащий по смещению [ecx+8] в регистрcmp [esi+10],72616863 //"char"ges//ещё 1 фильтрpop esijne InfMoneymov [ecx],(float)99//записываем нужное кол-во расходников InfMoney:cmp [t_InfMoney],1jne exitcmp edi,00000001//опять же сравниваем регистр с единицейjne exitcmp [ecx+04],00000003//значение лежащее по смещению [ecx+4] сравниваем с тройкойjne exitpush esimov esi,[ecx+08]//аналогично как было и вышеcmp [esi+10],6F736572 //"reso"urces//ещё фильтpop esijne exitmov [ecx],(float)9999//устанавливаем нужное кол-во денег exit:mov edx,[eax+04]//вторая оригинальная инструкция идущая по кодуjmp returnhere aob_BaseCode:BaseCode:jmp newmem //111//вообще не понятно почему тут так сделано какой-то прям бутерброд получается:-Dreturnhere:[DISABLE]BaseCode:mov [ecx],edxmov edx,[eax+04]//выполняем оригинальный кодdealloc(newmem)//удаляем выделенную памятьunregistersymbol(BaseCode)//снимаем регистрацию с метки 
Изменено пользователем Garik66
Ссылка на комментарий
Поделиться на другие сайты

Garik66, Прокручивать в стороны можно используя зажатый Shift + колёсико мышки)) Дерзай!  ;)

 

MasterGH, Спасибо за объяснение, прям очень помог ^_^  Теперь осталось понять как такое дело реализовать самому и немножко посвойму, а ещё понять от куда он брал некоторые "фильтры" и как он это делал (автор).

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

Garik66, Прокручивать в стороны можно используя зажатый Shift + колёсико мышки)) Дерзай! 

Korol2010, Спасибо.  :-D

Но вообще-то там под спойлером комментарии для тебя (как вижу ты их не читал). ;)  

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

Korol2010, Спасибо.  :-D

Но вообще-то там под спойлером комментарии для тебя (как вижу ты их не читал). ;)  

ооо точно, а я думал ты ничего там больше не добавил после Мастера)))

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

не добавил после Мастера)))

Не после Мастера, а во время, когда я писал комметы, сообщения от Мастера ещё не было. :-D  (вот такой онлайн)

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

Ты написал что наоборот, про функцию JNE, но как интерпретировать действия этой функции совершенно не важно, моя интерпретация тоже верна)))


Не после Мастера, а во время, когда я писал комметы, сообщения от Мастера ещё не было. :-D  (вот такой онлайн)

ааа ясно, вот оно как))))

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

Ничего, прощаю :-D Кстати большое спасибо и тебе за "разжовувание" скриптика :-D


Хотя правда значение из одного фильтра, если точней то из cmp [esi+10],65726966 я так и не нашёл в своей структуре, возможно оно конечно появляется каким-то образом когда включаешь базовый скрипт, тут я не в курсе.

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

 cmp [esi+10],65726966 я так и не нашёл в своей структуре

Нужно построить структуру, зацепив [ecx-0C], т.е. выше чем ecx. Тогда по смещению -0с у тебя будет поинтер, при нажатии на него раскроется новая структура и вот там уже по смещению +10 и будет лежать искомое число 65726966.

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

Нужно построить структуру, зацепив [ecx-0C], т.е. выше чем ecx. Тогда по смещению -0с у тебя будет поинтер, при нажатии на него раскроется новая структура и вот там уже по смещению +10 и будет лежать искомое число 65726966.

В этом и дело что я так делал, но там лежит не это а 72677075.

Вот и уткнулся я носом в "стену" как утконос, и хз где искать и как значение 65726966 :-D 

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

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

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

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