helldrg Опубликовано 6 октября, 2016 Поделиться Опубликовано 6 октября, 2016 (изменено) Здравствуйте! Посмотрел я видео про реализацию фильтра "свой чужой". Чтобы его сделать необходимо различие в структурах найти. Я нашел в виде строки: Скрытый текст Почитав форумы пришел к выводу, что можно писать так: cmp word ptr[eax+4],'te' и cmp dword ptr[eax+4],'team' Начало у всех одинаковое, надо делать смещение: cmp dword ptr[eax+8],'play' Но почему то программа крашится после того как запускаю скрипт И почему то после перезапуска CE нельзя включить скрипт. Подскажите в чем дело Вот код: Скрытый текст newmem: push eax mov eax,[ecx+10] cmp dword ptr[eax+8],'play' jne code mov dword ptr [ecx+00000134],(float)100 jmp code code: pop eax fld dword ptr [ecx+00000134] jmp return INJECT: jmp newmem nop Изменено 6 октября, 2016 пользователем helldrg Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 6 октября, 2016 Поделиться Опубликовано 6 октября, 2016 Привет! Есть подозрение, что в структуре находится адрес строки, а не сама строка, а в скрипте ты пытаешься адрес со строкой сравнивать. Еще может быть так, что сравнивать нужно побайтно, циклом, потому что не умеет ассемблер сам посчитать длину строки. Еще, как вариант, можно прямо в скрипте объявить строку и сравнивать с ее адресом. Последнее, мне кажется, лучше всего. Ссылка на комментарий Поделиться на другие сайты Поделиться
LIRW Опубликовано 6 октября, 2016 Поделиться Опубликовано 6 октября, 2016 В 06.10.2016в12:45, helldrg сказал: И почему то после перезапуска CE нельзя включить скрипт. Может так надо попробовать. Правда башка ещо не совсем работает, только оклемался и возможно скрипт не верный. Скрытый текст newmem: push eax mov eax,[ecx+10] mov eax,[eax+8] cmp eax'play' jne code mov dword ptr [ecx+00000134],(float)100 jmp code code: pop eax fld dword ptr [ecx+00000134] jmp return INJECT: jmp newmem nop Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 6 октября, 2016 Поделиться Опубликовано 6 октября, 2016 Чаще всего сами строки сравнивать очень невыгодно - если до этого доходит, то обычно сравнение производится через указатель. Намного проще и быстрее работать с идентификаторами. Автор, попробуй в той же структуре циферки поискать - наверняка должны быть. Ссылка на комментарий Поделиться на другие сайты Поделиться
Dino Опубликовано 6 октября, 2016 Поделиться Опубликовано 6 октября, 2016 Не проще ли воспользоваться готовой функцией? Скрытый текст push str1 push str2 call strcmp add esp,8 test eax,eax jne @F //если равны @@: //иначе Ссылка на комментарий Поделиться на другие сайты Поделиться
LIRW Опубликовано 6 октября, 2016 Поделиться Опубликовано 6 октября, 2016 48 минуты назад, keng сказал: Намного проще и быстрее работать с идентификаторами Keng но что бы с ними работать, нужно быть уверенным в них или в нем, а такое явление не часто встретишь. А так просто искать как в ребусе (найди 10 отличий) тоже не особо то надежно и получается не далеко уходишь от той же строки. Вот как ты написал работать с указателем - это будет куда надежнее и процентов на 80 работоспособнее, так как бывают случаи, что и указатели врага загружаются с того или иного смещения вместе с персонажем. Но если поковыряться, то можно найти. Я вот обычно ищу в структуре указателей рядом со смещением жизни и в моих случаях я частенько находил и всё работало как надо. Раньше я помню тоже искал подобное и делал по отличиям, но со временем ушел от этого способа, так как он не особо надежен. Это Keng всего лишь моё мнение и не более того, но я бы взялся за указатели, а то есть за смещение от куда загружается перед последним смещением адрес и его бы сравнил. Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 6 октября, 2016 Поделиться Опубликовано 6 октября, 2016 @Dino - готовой функцией проще, само собой, но лично я не очень доверяю таким решениям. Скажем, в игру на каком-нибудь чудо-языке может быть не подгружен стандартный сишный рантайм, так что функции этой там не окажется. Руками эта функция пишется очень просто, так что лучше уж свою написать, если так хочется. Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 6 октября, 2016 Поделиться Опубликовано 6 октября, 2016 1 hour ago, LIRW said: Keng но что бы с ними работать, нужно быть уверенным в них или в нем, а такое явление не часто встретишь. А так просто искать как в ребусе (найди 10 отличий) тоже не особо то надежно и получается не далеко уходишь от той же строки. Вот как ты написал работать с указателем - это будет куда надежнее и процентов на 80 работоспособнее, так как бывают случаи, что и указатели врага загружаются с того или иного смещения вместе с персонажем. Но если поковыряться, то можно найти. Я вот обычно ищу в структуре указателей рядом со смещением жизни и в моих случаях я частенько находил и всё работало как надо. Раньше я помню тоже искал подобное и делал по отличиям, но со временем ушел от этого способа, так как он не особо надежен. Это Keng всего лишь моё мнение и не более того, но я бы взялся за указатели, а то есть за смещение от куда загружается перед последним смещением адрес и его бы сравнил. Да оно понятно, просто очень редко встречаются игры, где какая-то логика завязана именно на строках - это действительно неслабо бьет по производительности и причин так делать всего несколько - скажем, скриптовый движок или же просто криворукость разработчиков. Следовательно, в 99% оставшихся игр используются айдишники или (реже) указатели, так что ищущий да обрящет. Ссылка на комментарий Поделиться на другие сайты Поделиться
LIRW Опубликовано 6 октября, 2016 Поделиться Опубликовано 6 октября, 2016 4 минуты назад, keng сказал: Да оно понятно Мне больше всех не нравится движок "Unreal Engine" Его наверное много кто не одобряет из за нудности. Игру то наверное многие смотрели под названием "Painkiller" и знают какого это Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 6 октября, 2016 Поделиться Опубликовано 6 октября, 2016 2 minutes ago, LIRW said: Мне больше всех не нравится движок "Unreal Engine" Его наверное много кто не одобряет из за нудности. Игру то наверное многие смотрели под названием "Painkiller" и знают какого это Погоди, в первом Painkiller и движок был свой - Painengine. Он разве на основе UE? 0_o Ссылка на комментарий Поделиться на другие сайты Поделиться
LIRW Опубликовано 6 октября, 2016 Поделиться Опубликовано 6 октября, 2016 23 минуты назад, keng сказал: Погоди, в первом Painkiller и движок был свой - Painengine. Я не первый имел введу, так какой то из них на UE а был ещо что подобное ему. И вот на этом движке делали игру про зомби о второй мировой. Ты вот Keng по любому в эту игру играл и наверное знаешь её название, так как на языке то крутиться, но название вспомнить не могу. Там как то название игры связано с движком. Вспомнил, а то есть в инете нашел название этой игры "NecroVisioN" вот этот движок не чем по сложности не уступает UE хотя может это одно и тоже, но такая же путаница. Извиняюсь что сообщение поправил, но я как бы старался быстрее все сделать, но Keng получился уже ответил. Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 6 октября, 2016 Поделиться Опубликовано 6 октября, 2016 2 minutes ago, LIRW said: Я не первый имел введу, так какой то из них на UE а был ещо что подобное ему. И вот на этом движке делали игру про зомби о второй мировой. Ты вот Keng по любому в эту игру играл и наверное знаешь её название, так как на языке то крутиться, но название вспомнить не могу. Там как то название игры связано с движком. Не, у меня компьютера сейчас нет, чтобы играть. Последнее, что проходил - DooM. Ссылка на комментарий Поделиться на другие сайты Поделиться
helldrg Опубликовано 6 октября, 2016 Автор Поделиться Опубликовано 6 октября, 2016 LIRW Я попробовал как Вы написали, все равно крашит Скрытый текст push eax mov eax,[ecx+10] mov eax,[eax+8] cmp eax,'play' jne code //mov dword ptr [ecx+00000134],(float)100 jmp code code: pop eax Даже в этом куске крашит, тут же ничего не изменятся для того что бы крашило И почему бывает невозможно скрипт активировать, нажимаешь на него, а крестик не ставится Сейчас готовой функцией попробую сравнить Ссылка на комментарий Поделиться на другие сайты Поделиться
helldrg Опубликовано 6 октября, 2016 Автор Поделиться Опубликовано 6 октября, 2016 Цитата mov eax,[eax+8] // на этом моменте почему то крашит Ссылка на комментарий Поделиться на другие сайты Поделиться
Dino Опубликовано 6 октября, 2016 Поделиться Опубликовано 6 октября, 2016 В 06.10.2016в20:16, keng сказал: @Dino - готовой функцией проще, само собой, но лично я не очень доверяю таким решениям. Скажем, в игру на каком-нибудь чудо-языке может быть не подгружен стандартный сишный рантайм, так что функции этой там не окажется. Руками эта функция пишется очень просто, так что лучше уж свою написать, если так хочется. Ну хз.. если говорить об универсальности, то можно и вручную написать. А если занимаешься игрой в которой уже присутствуют готовые решения, то грех ими не воспользоваться. helldrg Фул код в студию. Дело либо в хуке , либо пытаешься прочитать не валидный адрес Ссылка на комментарий Поделиться на другие сайты Поделиться
helldrg Опубликовано 6 октября, 2016 Автор Поделиться Опубликовано 6 октября, 2016 Вот код: Скрытый текст { Game : generals.exe Version: Date : 2016-10-06 Author : User This script does blah blah blah } [ENABLE] //code from here to '[DISABLE]' will be used to enable the cheat aobscanmodule(INJECT2,generals.exe,D9 81 34 01 00 00 D9) // should be unique alloc(newmem,$1000) label(code) label(return) newmem: push eax mov eax,[ecx+10] mov eax,[eax+8] //cmp [eax],'play' //jne code //mov dword ptr [ecx+00000134],(float)100 jmp code code: pop eax fld dword ptr [ecx+00000134] jmp return INJECT2: jmp newmem nop return: registersymbol(INJECT2) [DISABLE] //code from here till the end of the code will be used to disable the cheat INJECT2: db D9 81 34 01 00 00 unregistersymbol(INJECT2) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "generals.exe"+34232D "generals.exe"+34230D: D9 44 24 18 - fld dword ptr [esp+18] "generals.exe"+342311: D8 47 2C - fadd dword ptr [edi+2C] "generals.exe"+342314: D9 5F 2C - fstp dword ptr [edi+2C] "generals.exe"+342317: 8B 55 14 - mov edx,[ebp+14] "generals.exe"+34231A: F6 42 78 08 - test byte ptr [edx+78],08 "generals.exe"+34231E: 74 5C - je generals.exe+34237C "generals.exe"+342320: 8B 45 0C - mov eax,[ebp+0C] "generals.exe"+342323: 8B 88 88 00 00 00 - mov ecx,[eax+00000088] "generals.exe"+342329: 85 C9 - test ecx,ecx "generals.exe"+34232B: 74 4F - je generals.exe+34237C // ---------- INJECTING HERE ---------- "generals.exe"+34232D: D9 81 34 01 00 00 - fld dword ptr [ecx+00000134] // ---------- DONE INJECTING ---------- "generals.exe"+342333: D9 54 24 50 - fst dword ptr [esp+50] "generals.exe"+342337: D8 1D 9C 6D 89 00 - fcomp dword ptr [generals.exe+496D9C] "generals.exe"+34233D: DF E0 - fnstsw ax "generals.exe"+34233F: F6 C4 01 - test ah,01 "generals.exe"+342342: 75 38 - jne generals.exe+34237C "generals.exe"+342344: 81 C1 84 00 00 00 - add ecx,00000084 "generals.exe"+34234A: E8 61 04 E6 FF - call generals.exe+1A27B0 "generals.exe"+34234F: D9 C0 - fld st(0) "generals.exe"+342351: D8 4C 24 50 - fmul dword ptr [esp+50] "generals.exe"+342355: D8 0D BC 6D 89 00 - fmul dword ptr [generals.exe+496DBC] } Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 6 октября, 2016 Поделиться Опубликовано 6 октября, 2016 Есть мнение, что инструкция работает с разными структурами. Ссылка на комментарий Поделиться на другие сайты Поделиться
helldrg Опубликовано 6 октября, 2016 Автор Поделиться Опубликовано 6 октября, 2016 Скрытый текст Вот я посмотрел, какие адреса работают с инструкцией, работал один адрес Ссылка на комментарий Поделиться на другие сайты Поделиться
helldrg Опубликовано 6 октября, 2016 Автор Поделиться Опубликовано 6 октября, 2016 Вот с двумя адресами: Скрытый текст Ссылка на комментарий Поделиться на другие сайты Поделиться
helldrg Опубликовано 6 октября, 2016 Автор Поделиться Опубликовано 6 октября, 2016 Цитата Есть мнение, что инструкция работает с разными структурами. Возможно, но мне другие структуры еще не попадались Ссылка на комментарий Поделиться на другие сайты Поделиться
helldrg Опубликовано 6 октября, 2016 Автор Поделиться Опубликовано 6 октября, 2016 Вот я в Memory View выбираю пункт Find out what addresses this instruction accesses И там появляются ссылки ведущие на однотипные структуры Ссылка на комментарий Поделиться на другие сайты Поделиться
Dino Опубликовано 6 октября, 2016 Поделиться Опубликовано 6 октября, 2016 aobscan возвращает правильный адрес? доступ к структуре точно через ECX? Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 6 октября, 2016 Поделиться Опубликовано 6 октября, 2016 @helldrg бабахни отладчик на инструкцию и сделай действия из скрипта руками, глядя в memory dump. Берешь значение ECX, прибавляешь смещение, переходишь по получившемуся в memory dump. Смотришь, что там. Если то, что ожидалось, тогда еще проблема может быть в доступе (?) или все-таки там несколько типов структур. Или смещение динамическое, но это уже изврат. Можешь дать полное зазвание игры? У меня руки зачесались, хочу тоже потыкать. Ссылка на комментарий Поделиться на другие сайты Поделиться
helldrg Опубликовано 6 октября, 2016 Автор Поделиться Опубликовано 6 октября, 2016 Dino А как проверить правильный или не правильный возвращает? Метку INJECT2 в правильном месте ставит скрипт, наверное значит находит. Точно через ecx!!! keng игра называется command&conquer:generals v1.8 её можно только в антологиях найти, просто 1.4 скачать разница там в основном что процессы по разному называются, в v1.4 game.dat Сейчас в ручную попробую все действия произвести Ссылка на комментарий Поделиться на другие сайты Поделиться
helldrg Опубликовано 6 октября, 2016 Автор Поделиться Опубликовано 6 октября, 2016 Если кого нибудь все таки заинтересует игра, пропишите сразу в ярлыке: -win -quickstart огромное количество времени это сэкономит =) Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения