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

MasterGH

Ветераны
  • Постов

    2 999
  • Зарегистрирован

  • Победитель дней

    129

Весь контент MasterGH

  1. Задавать скорее всего нужно более конкретные вопросы чтобы за тебя не писали код, а могли просто поправить или направить на решение
  2. Поищи команду на то чтобы дать конкретное оружие, которое тебе нужно. --- Это поможет?
  3. Я бы искал правилом "изменилось" и "не изменилось" с разными сейвами сделанных на разных картах и с разным оружием. НО. сейвы могут быть запакованы пакером, так что это тоже надо иметь ввиду. Если это так, то надо будет что-то придумывать для сканирования распакованных данных.
  4. Я без понятия. Но скорее всего оружие это объект - структура создаваемая/разрушаемая в памяти игры во время загрузки уровня, во время игры. По твоим силам сделать несколько сейв-файлов и искать в них нужное значение. Если конечно сейвы не сжимаются пакером и не шифруются. Ищи неизвестное как тип байта. Если повезёт, то по экспериментами найдёшь тип оружия и изменишь его на нужный и начнёшь новый уровень. Далее сделаешь чит на бесконечные патроны и будешь играть. И всё. Это наиболее удачный способ "для себя". По этому тутору у меня как-то нет комментариев... Во всех играх есть сценарии: где, когда, какое оружие(или иной предмет) должно быть расположено при создании игрового уровня - это 1-ый участок кода и во время игры - 2-ой участок кода. Это два разных участка кода. Это очень важный факт. ВСЕГДА на втором участке машинный код по циклу читает и выполняет сценарии во время игрового процесса. Я такой цикл находил, но дальше я не пошёл(надо будет повторить)... Нам нужно научиться находить 2-ой участок кода и подменять сценарии (они должны быть как данные в памяти). Для подмены сценария возможно придётся делать инъекцию кода.... Например, создать оружие под ногами героя... Если там LUA поддерживается или консоль на другом движке, то можно использовать её и не искать себе геморроя. По поводу остальных предположений ничего сказать не могу... может быть всё что угодно.
  5. Тут надо не видеоурок делать, а писать самому на LUA. Никто не будет заниматься этим видео. И потом чему учить в этом видео - как и где строчку кода написать? или как формы GUI делать? А остальное тоже - видео делать. Проще будет всё сделать и сразу дать результат, чем снимать видео. Вод тебе в помощь функция. Изменишь её так, чтобы она писала байты активации и деактивации в исходный код MASM для одного чита. А дальше долго будешь мучиться и разбираться как организовать генерацию для нескольких читов из формы GUI...
  6. Это можно сделать с помощью LUA engine в CE. Надо знать LUA, надо знать какие функции, события, свойства CE предоставляет LUA Engine. И тогда ты можешь через GUI формы созданные тобой в IDE CE в прямом смысле давать команды компилировать трейнер на MASM, задав адреса и байты активации и деактивации.
  7. Часть1. ClassName db "SkinClass",0 AppName db "CDS TRAINER",0 Error db "Error",0 game_err db "Game is not loaded",0 szCapt db "GTA: San Andreas",0 Gaddress1 dd 007428e6h ; адрес по которому будем патчить(ammo GTA SA) Gval1 db 0ffh,046h,00ch,090h,090h,090h ;баты для патча Gnum1 db 6 Gaddress2 dd 007428e6h ; адрес по которому будем патчить(возвращаем) Gval2 db 0ffh,04eh,00ch,08bh,046h,008h ;баты для патча Gnum2 db 6 ----------- Часть2 invoke GetAsyncKeyState,VK_F10 ;F10 кнопка действия .if eax mov _option,1 invoke TrainerEngine,Gaddress1,addr Gval1,6; 6 это количество байт для патча ret .endif invoke GetAsyncKeyState,VK_F11 ;F11 кнопка undo .if eax mov _option,2 invoke TrainerEngine,Gaddress2,addr Gval2,6 ret ------------- Часть3 ;#################################################################### TrainerEngine PROC aHack:DWORD, nVal:DWORD, iSize:BYTE LOCAL phandle:DWORD LOCAL windhand:DWORD Invoke FindWindow,0, addr szCapt .if eax ==0 Invoke MessageBoxA,0, addr game_err, addr Error, MB_OK ret .endif mov windhand,eax invoke GetWindowThreadProcessId,windhand,addr pid Invoke OpenProcess, PROCESS_VM_READ or PROCESS_VM_WRITE or PROCESS_VM_OPERATION,NULL, pid test eax,eax jz @F mov phandle,eax Invoke WriteProcessMemory,phandle, aHack, nVal, iSize, NULL;Write Invoke CloseHandle, phandle;Close handle @@: ret;return TrainerEngine ENDP ;####################################################################3 ---------------------------- Собираем всё вместе: 1) ... Gaddress1 dd 007428e6h ; адрес по которому будем патчить(ammo GTA SA) Gval1 db 0ffh,046h,00ch,090h,090h,090h ;баты для патча Gnum1 db 6 ... invoke TrainerEngine,Gaddress1,addr Gval1,6; 6 это количество байт для патча ... 2) ... Gaddress2 dd 007428e6h ; адрес по которому будем патчить(возвращаем) Gval2 db 0ffh,04eh,00ch,08bh,046h,008h ;баты для патча Gnum2 db 6 ... invoke TrainerEngine,Gaddress2,addr Gval2,6 ... 3) TrainerEngine PROC aHack:DWORD, nVal:DWORD, iSize:BYTE ... Invoke WriteProcessMemory,phandle, aHack, nVal, iSize, NULL;Write .... ret;return Прекрасно видно где байты активации, а где деактивации.. также понятны адреса. Следовательно на CE можно написать скрипт такой(заметь на сколько он будет короче всего кода исходника) [ENABLE] 007428e6: db ff 46 00 90 90 90 [DIASABLE] 007428e6: db ff 4e 00 8b 46 08 Я вот понять не могу. Почему тебя беспокоит вопрос написания скриптов на CE по исходнику трейнера на MASM-е. Всё можно сделать на Cheat Engine
  8. На заметку. Для инструкций работающих с регистрами xmm проверяйте, что ваши новые данные должны быть выровнены от начала блока памяти кратно 16 байт (иначе возможно игра будет подвисать, дёргаться или ещё что-нибудь), ещё говорят выровнены по 16-му параграфу. Назначь метку, от метки newmem на расстоянии кратном 16-ти байтам. Пример: [ENABLE] alloc(_newmem,2048) label(_coord) registersymbol(_coord) _newmem: _coord: // кратно 16-ти байтам dd (float)48.45 dd (float)2.96 dd (float)-3.54 dd (float)1 // а тут сделать тело чит-кода // или здесь отступить кратно 16-ти байтам [DISABLE] dealloc(_newmem) unregistersymbol(coord) //Alt: db 0F 28 44 24 10 [ENABLE] aobscan(_faddress,66xxxxxxxx8bxxxxxxxxxx89xxxx80xxxxxxxxxxxx74xxd9xxxxxxxxxxxxd9xx) alloc(_newmem,2048) label(_returnhere) label(_originalcode) _newmem: movaps xmm0,[_coord] _originalcode: db 66 0F D6 46 30 //"movq [esi+30],xmm0" - не компилировалось, поэтому пришлось писать байтами jmp _returnhere _faddress: // 00753ECF = metro2033.exe+353ECF jmp _newmem _returnhere: [DISABLE] aobscan(_faddress,8bxxxxxxxxxx89xxxx80xxxxxxxxxxxx74xxd9xxxxxxxxxxxxd9xx) _faddress-5: db 66 0F D6 46 30 //movq [esi+30],xmm0 dealloc(_newmem) //Alt: db 66 0F D6 46 30
  9. Чтобы вручную не перводить в HEX десятичные целые числа в скриптах можно использовать префикс "#". Если вещественные то (float). Если double, то надо смотреть в справке уже не помню. ... newmem: mov [eax], #100 mov [eax+4], (float)100 ... А Вы сами подумайте можно или нет?! Очевидно, что нет. Либо вручную это делать либо писать программу. Лучше написать программу на LUA, которая бы выводила байты как на TMK... учите LUA, если настолько сильно требуется переводить в TMK формат. Я всё же советую забыть про TMK и пользоваться и учиться Cheat Engine 6.1 CR 1 (последняя тестовая версия и готовиться к финальной 6.1)
  10. 20 мая. Версия RC1 (Release Candidate 1) Добавлены некоторые функции в LUA поддержку. Вот некоторые из них которые я пока не понял. registerCustomTypeAutoAssembler(typename, bytecount, script) Registers a custom type based on an auto assembler script. The script must allocate an "ConvertRoutine" and "ConvertBackRoutine" onAutoGuess(function) : Registers an function to be called whenever autoguess is used to predict a variable type function override (address, ceguess): Return the variable type you want it to be. If no change, just return ceguess Выход CE 6.1 уже близок (я надеюсь).
  11. В этом коротком туторе я покажу пример снятия данных регистров. pmAddress=getAddress("1F72152C") max = 10 count = 0 function debugger_onBreakpoint() -- срабатывает всегда, когда срабатывает брейкпоинт count = count + 1 -- если понадобятся все регистры или некоторые, то вы можете исправить код ниже s = string.format("%3d) 0x%08X: EAX = 0x%08X EBX = 0x%08X ECX = 0x%08X",count, EIP, EAX, EBX, ECX) print(s) if count>=max then debug_removeBreakpoint(pmAddress); end --Breakpoint continue methods: co_run=0, co_stepinto=1, co_stepover=2 debug_continueFromBreakpoint(co_run) -- return 1 --I handled it so dont tell the user -- return 0 --unexpected breakpoint, show the the user end --Breakpoint triggers: bptExecute=0, bptAccess=1, bptWrite=2 --Variable types: (ref http://ce.colddot.nl/browser/Cheat%20Engine%206/bin/defines.lua) debug_setBreakpoint(pmAddress, vtDword, bptWrite) Обращу внимание, что именно по этому примеру можно делать другие не менее полезные. Помимо различных сравнений и ведения логов можно сделать определение адресов на прерывающихся инструкциях больше одного. Результат будет означать, что инструкции за все время своей работы работали только с одним адресом... Так же обращу внимание на "частоты" срабатываний тех или иных инструкций, это тоже можно вести в логе. В нужный момент можно "не отпускать процесс" и проанализировать ситуацию. Можно вести трассировку... Сравнение структур! И т.п. что вам в голову придёт. И ещё. Если вам надо снять брейкпоинты установленные через LUA, то это можно сделать вручную в функциях окна меню дизассемблера.
  12. Точно также сделать нельзя, но принципы должны быть схожи.
  13. Точно ответить не могу. Во-первых это окно прервавшихся инструкций, а нужно окно дизассемблера на адресе внедрения (адрес на котором ты будешь делать прыжок). Значит нужны байты при деактивации (до создания прыжка на адресе внедрения) и байты активации (сам прыжок с нопами если нужны и тело чит-кода). Выделяешь инструкции в дизассемблере, нажимаешь CTRL+C и выбираешь копирование какое нужно (адреса + байты + инструкции (лучше выбрать байты))
  14. Кстати если не очень нудно будет, то я на LUA сделаю GUI форму по выводу инструкций работающих только с одним адресом и с часто обращаемыми. Тогда можно будет экономить время на поиске инструкций. Эту фишку я уже делал на старой-старой модифицированной версии CE RUS 5.5 в Дельфи коде. При беглом просмотре на функциях LUA поддерживаемые CE я понял, что на LUA подобное возможно сделать. Вообще очень здорово, что появилась поддержка LUA. Тогда не придётся делать модификации к CE и каждый раз перекомпилировать (надеюсь, что LUA не пропадёт в новых версиях) Так же ещё по плану сделать на LUA сцепление скриптов в один с автогенерацией автоассемблерных скриптов. Уже написал немного кода... Типа -- Функция генерирует "инциализирующий" скрипт для подготовки с разметкой function GenerateAAscriptAggregateMem( processName: string, sizeMem: string ) : string [[ 1. Формирования инициализирующего скрипта с выделением памяти на синтаксисе Автоассемблера 2. Возвращает строковые данные скрипта ]] -- {0} - nameMem , {1} - sizeMem initScript =[[ alloc({0},{1}) ->>label ->>registersymbol {0}: ->>codeInjected ]] return script end -- Функция объединяет предыдущие скрипты с текущим function GenerateAAscriptAggregateMem(aggregateMem, cheatName, address, injectInstruction, originalcode ) : string [[ 1. Добавляет новый скрипт к общей памяти aggregateMem 2. При вызове этой функции сразу же добавляется один подскрипт в таблицу CE как дочернее дерево aggregateMem, который можно активировать после активации инициализирующего скрипта. ]] end
  15. Можете попробовать задать конкретные вопросы и будет больше шансов на ответ. Мало кому хочется искать, устанавливать игру ради создания чита. Или просто у кого-то нет времени.
  16. В этой теме можно посмотреть как был сделан трейнер на LUA Engine на версии CE 6.1 Beta 3 с методом сканирования сигнатур. С не большой картинкой он был бы 53 Кб. Без неё он немного меньше 4 кб без упаковки архиватором.
  17. Сделал чит теоретически на все версии в том числе и будущее.. перейти. Однако, полностью отдача снимается если вести прицельный огонь (правая кнопка мышки). Доделывать мне лень. Статью кстати писать тоже лень. Там есть LUA код, по нему можно разобраться. На форуме есть справки по LUA engine. Сделал так как было на видео. Плюс сделал инъекцию на то чтобы прицел не разъезжался при беге и стрельбе... Должно работать на всех версиях, кроме мультиплеера. Хотя я на нём не тестировал. В мультиплеере лучше играть без читов.
  18. Версия игры 1.0-1.7 (теоретически любая, тесты были на 1.0 и 1.7); версия трейнера 1.0; +1; дата создания 19.05.2011 Описание: 1) Снятие отдачи от выстрелов Трейнер:iw3sp.rar Дополнительная информация:
  19. О , я эту ошибку не увидел. Во всяком случае я бы её сразу определил при пошаговой отладке. Так что это для меня пустяк. Да, не получится. Т.е. в CE надо идти в дизассемблер и копировать байты вручную.
  20. Тут я спорить не в праве, но поясню. Преодоление трудностей возможно окупится освоением новых возможностей Cheat Engine в будущем. Не пишите сложных скриптов по началу. Пишите простые [ENABLE] label(метка возврата) Адрес инструкции: // изменяем инструкции на прыжок // нопы если нужны метка возврата: Адрес вашего кейва: // новые инструкции // оригинальный код если нужен // прыжок на метку возврата [DISABLE] Адрес инструкции: //восстанавливаем инструкции Почти всё тоже самое что и в Tsearch. Далее лучше писать скрипты не с кейвом в памяти игры, а с участком новой выделенной памяти. Потом можно писать скрипты с проверочными байтами (как было во втором посте этой темы). Затем можно перейти на LUA поддержку. Если всё делать постепенно и кропотливо, то это реально освоить. Если нужно сгенерировать байты, то копировать их можно только в ручную из дизассемблера при выключенном и включённом скрипте. Выделить байты или инструкции и нажать CTRL+C. НО. Версия CE 5.6 позволит сгенерировать терйнеры только на основе скрипта без особо сложных манипуляций размером ~800кб. CE 6.0 не умеет генерировать трейнеры. CE 6.1 Beta 3 умеет (её можно скачать в теме реализов). Пусть размер трейнера будет большой. Если Вы не согласны, то придётся делать свой трейнер на языке программирования. Даже в этом случае скрипт выше будет много меньше любого трейнера. Вообще на мой взгляд лучше пользоваться скриптами LUA и генерировать форму трейнера с его помощью. В этом случае пользователя должна быть установлена CE требуемой версии. Или на худой конец, если Вам кажется сложным писать на LUA, то можно пользоваться только скриптами автоассемблера Cheat Engine. И советую посмотреть видео на нашем форуме. На видео есть информация о том как и где писать скрипты, и как генерировать трейнеры.
  21. Я ошибок не увидел. 1. Все ошибки проверяются в отладке. Научитесь сами проверять ошибки с помощью отладчика Cheat Engine или другого и ~99% не придётся ни у кого спрашивать почему скрипт не работает. 2. Просто к сведению TSearch устаревшая программа. Некоторые инструкции неправильно дизассемблирует, TSearch не умеет обращаться к адресам типа "game.dll + смещение", что бывает важно. 3. Ищем в интернете скрипты и на их основе делаем свои Cheat Engine для тренировки: [ENABLE] aobscan(_faddress,8bxxxxxxxxxxxxxxc2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8bxx8bxx8b) alloc(_newmem,2048) label(_returnhere) label(_originalcode) _newmem: mov dword ptr [ecx+eax*4+000002ec],63 _originalcode: mov eax,[ecx+eax*4+000002ec] jmp _returnhere _faddress: // 00FAE657 = GImage::GImage+20CDD7 jmp _newmem nop nop _returnhere: [DISABLE] aobscan(_faddress,9090xxc2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8bxx8bxx8b) _faddress-5: mov eax,[ecx+eax*4+000002ec] dealloc(_newmem) Я писал про способ, когда aobscan(_faddress,9090xxc2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8bxx8bxx8b) под "[DISABLE] " можно не писать.
  22. Я саму отдачу ещё не сделал не говоря уже о короткой статье. Я сделал так, что просто курсор не прыгает, но ещё оказывается сама рука героя подвластна силе отдачи хотя она стала меньше. Пока я ещё не разобрался с отдачей полностью. Но видео Psych-а дало мне подсказку какие исходники посмотреть. По исходникам я вижу что дело в EjectBrass-ах. Именно они отвечают за отдачу. /* ================ CG_FireWeapon Caused by an EV_FIRE_WEAPON event ================ */ void CG_FireWeapon( centity_t *cent ) { entityState_t *ent; int c; weaponInfo_t *weap; ent = &cent->currentState; weap = &cg_weapons[ ent->weapon ]; // оружия героя //.... Здесь код вырезан //.... // do brass ejection if ( weap->ejectBrassFunc && cg_brassTime.integer > 0 ) { weap->ejectBrassFunc( cent ); // нельзя вызывать эту функцию, иначе будет отдача } } weap->ejectBrassFunc( cent ); Это функция ejectBrassFunc может быть: static voidCG_MachineGunEjectBrass( centity_t *cent ) static void CG_ShotgunEjectBrass( centity_t *cent ) static void CG_NailgunEjectBrass( centity_t *cent ) Позже посмотрю, где я застрял. Кажется застрял ещё до void CG_FireWeapon( centity_t *cent ) не давая изменяться прицелу. Осталось найти FireWeapon... Так что проблема ещё не решена. По поводу видео. Мне оно не очень понравилось. Т.к. сразу видно что у автор делает всё на авось.. я плохо понял почему он выбрал именно тот прыжок и решил нопить один из двух call. Такое ощущение что он нопил все call-ы в надежде получить желаемый эффект. Давайте всегда так делать. Искать исходники игр и на авось нопить коллы. Супер и здорово так делают супер перцы! Давайте и мы так будем делать по этому видео. Смешно. Может быть у меня такая реакция, потому что я недолюбливаю этого автора на форуме Cheat Engine... Всё-таки польза от видео некоторая есть...
  23. Сделал я отдачу меньше чем за 10-15 минут. Может быть сделаю статью, но обещать не буду. Сделал по методу aliast-а. Только после того как я нашёл структуру данных по адресу патронов я сделал поиск адреса точности прицела не "методом тыка", а направленным отсеиванием области памяти равной размеру структуры когда увеличивался или уменьшался прицел при стрельбе. Я нашёл адрес и, заморозив его, прицел оставался почти на одном месте. Надо было сделать инъекцию, но у меня пока времени продолжать дальше нет. Сделаю позже.
×
×
  • Создать...

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

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