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

MasterGH

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

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

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

    129

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

  1. Совершенно точно трёхмерный вектор нормали тут не при чем - как его не крути. Ставить бряк на адрес, смотреть как до этого адреса добраться используя инъекцию кода.
  2. По поводу тегов и прочего я тут ни чем помочь не могу. Копию графического файла я прицепил к твоему посту, если надо отредактируй его.
  3. Вот эту строчку "fstp dword ptr [esp+14]" надо поставить под newMem и дописать запись в [esp+14] .... newmem: fstp dword ptr [esp+14] mov dword ptr [esp+14], (float)100500 originalcode: push edx exit: jmp returnhere ....
  4. Немного осложняет, что используется генератор трейнеров. Есть две версии: свой дизайн трейнеров в котором можно делать кнопки и связывать с функциями (финкция из пункта 2 ниже) и есть версия генератора трейнера с галочками и кнопки там не создашь. Один из вариантов, который бы я использовал для разовой записи значения. 1. Создать Форму, кнопку и связывание кнопки с функцией 2. Создаём в Lua запись, суть которой не делать повторной инъекции и обнулять значение по зарегенной метке разрешающее разовую запись в st0 isInjection = false function LuaCheat0() if not isInjection then isInjection = true print("Firts Injection") autoAssemble([[ alloc(newMem,2048) label(...) label(...) .... cmp byte ptr [isOnceSumm], 00 je originalCode mov byte ptr[isOnceSumm], 01 //работа с ST0 .... originalCode: .... isOnceSumm: db 00 .... ]]) else autoAssemble([[ isOnceSumm: db 01 // разрешаем разовую запись ]]) end end Сохранем Lua скрипт. Конечно, надо скрипт писать правильно, у меня только наброски 4. Генерим трейнер Если что-то не получится, то проверить на ошибки.
  5. Что именно попадает в ecx надо смотреть при пошаговой отладке. Скорее всего, на задуманный чит это не как не влиенят - в ecx попадает адрес на некоторую структуру, с которой будет работать оригинальный код следующий далее. По поводу работы с FPU. У FPU множество команд с разными типами данных. Если задать гуглю поисковый запрос "FLD ST(0)", то можно найти множество справочных материалов в том числе и на русском. Сайт1, Сайт2 Так же у нас на форуме "Быстрая информация" есть справка по FPU-набору команд и другим командам. Наиболее полная документация скорее где-то на сайте комании Intel. Отдельного внимание стоит программирование на VS C++ с просмотром в отладчике. Можно писать простые консольные программы например по работе с double числами (сравнение, вычитаение, умножения и т.п.) и видеть в отладчике как выглядит ассемблерный код (обращение к адресам, к регистрам CPU, FPU и т.п.)
  6. Попробуй так [ENABLE] alloc(newmem,2048) label(returnhere) label(cheatByteCode) label(QWordValue) newmem: //.... нули newmem + 64: // адрес должен быть кратен 64 байтам (хотя может быть я путаю, пишу на всякий случай) QWordValue: dq (double)7000 cheatByteCode: fstp qword ptr [edi+18] mov ecx,[esi+0C] fld qword ptr [QWordValue] fstp qword ptr [edi+18] jmp returnhere 01B133C9: jmp cheatByteCode nop returnhere: [DISABLE] 01B133C9: fstp qword ptr [edi+18] mov ecx,[esi+0C] dealloc(newmem)
  7. Ставь игру на паузу. Активируй скрипт и смотри в дизассемблер на результат. Если инструкции ассемблировались не верно, то используй вариант записи байтов label(someLabel) someLabel: db xx xx xx xx ... // написать байтовое представления инструкции movss xmm7,[edx+54] Если инструкции ассемблировались верно, значит инъекция кода неправильная и тогда ищи другие варианты инъекции.
  8. Для начала я думаю, будет полезно почитать статью по поиску ID игроков. Этим же механизмом можно искать смещения от начал структур значения которых будут однозначно указывать для данной версии игры, что структура связана с главным героем и можно будет сделать фильтр по этому значению. Структура обычно находится в динамической памяти, поэтому если что-то нашли в структуре, то чаще всего опираемся не на статические адреса, а на значения в этой структуре находящиеся на постоянном смещении от её начального адреса. В данном случае адресом начала структуры может быть значение регистра ecx. Теперь сжатые ответы: 1. Либо по коду вверх смотреть откуда идёт запись в ecx или искать значение ecx в сканере памяти... и так далее составляя цепочку указателей.... Либо ещё использовать сканер памяти для поиска адресов... Об этом на форуме много раз было. 2. И да и нет, это зависит от игры и от выбранного способа решения задачи. Обычно фильтр или сравнение делается по не меняющемуся значению, а значение это может быть где угодно, хоть в регистрах, хоть на смещении от начала структуры и даже может быть в статическом адресе. Только должен быть постоянный путь до этого не меняющегося значения. Конечно в игре может быть статический адрес, который содержит значение, а это значение может быть в структуре главного игрока на некотором смещении "Статичный адрес1" = Значение1 "[ECX + смещение1]" = Значение1 или "[[[ECX + смещение1]+...n]+...n]" = Значение1
  9. Ещё в профиле бросается в глаза английское слово "Reputation", а не русское "Репутация". Возможно будет и с локализацией отдельная задача.
  10. 2 RisimO: >> Зачем изобретать велосипед? У каждого человека свои предпочтения или тебе это так сложно понять как написать свой протектор ?
  11. Примерно так: function Protsenti(X) writeInteger(X, readInteger(X)*60/100) end Protsenti('Test.exe+5B5A4')
  12. Для версии CE 6.2 Многократно задавался вопрос мне лично, как работать с данными находящимися внутри формы на примере чтения текста и изменения его. Например, это нужно для изменения данных в памяти игры через уже известные адреса. Я понятия не имею как это сделать или очень смутно помню, но я знаю, "что сделать чтобы узнать как это сделать". Чтобы дать правильный ответ нужно попробовать несколько вариантов решения на практике. Об этом будет большой текст под спойлером. Желаю приятного программирования CE Lua P.S. Править и форматировать текст должным образом нет времени. Ну, нашли и что делать дальше? Если бы читатель лазил по форму Cheat Engine, то помнил бы такую фичу. Обращение к переменным и классам через знак "_". В противном случае пришлось бы копаться в main.lua чтобы искать форму и поля ввода через цикл используя функции поиска типов и имен. Пока не будем этим заниматься. 4. Итак что дано: 4.1) Имена и названия типов компонентов: имя компонента формы UDF1 и тип формы - TCEForm, для компонента ввода текста имя CEEdit1 и тип TCEEdit 4.2) Наследование Edit Class: (Inheritance: WinControl->Control->Component->Object) 4.3) Методы класса Control setCaption(caption) : sets the text on a control. All the gui objects fall in this category getCaption() : Returns the text of the control 4.4) Обращение к переменным и классам чререз знак "_". 4.5) Функция вывода ниформации на консоль Print() 4.6) Если вариант со знаком "_" не прокатит, то полезем в main.lua за функциями поиска компонетов через типы и имена. Осталось все соединить во едино. 5) Пишем в Lua консоли Print("Hello World") Не работает. Пишем print('Hello World'), опять не работает. Пишем print('Hello World'). Заработало. Вот так в Lua важно соблюдать правила использования функции print Пишем someText = "Hello World" print(someText) Далее будет готовый ответ чтобы не утомлять читателя в угадывании синтаксиса CE Lua кода. Чтобы получить текст формы мы должны написать это: someText = control_getCaption(UDF1_CEEdit1) print(someText) Обращаем внимание на то control нужно писать с маленькой буквы, хотя в документации этот класс с большой буквы. По аналогии пишем, а потом читаем control_setCaption(UDF1_CEEdit1, ("aaaa")) someText = control_getCaption(UDF1_CEEdit1) print(someText) В консоли я увидел ответы: print(someText) 4345345 control_setCaption(UDF1_CEEdit1, ("aaaa")) someText = control_getCaption(UDF1_CEEdit1) print(someText) aaaa someText = control_getCaption(UDF1_CEEdit1) Ну и на форму посмотрим, теперь там находится текст не "4345345", а "aaaa" Выводы: 1) Знать все чтобы сделать какие-то вещи невозможно даже имея под рукой main.lua. Документация main.lua это даже не документация, а так, справочник опытных пользователей. По идее на CE Вики должно быть когда-нибудь подробное описание, но пока его нет. Многие вещи приходится либо подбирать, угадывать или искать в поисковиках. Приходится лазить по форму CE, искать примеры и запоминать их. В самых тяжелых случаях можно задать вопрос на форуме у нас или на форуме CE, для опытных можно посмотреть исходники с SVN CE о том как работают Lua функции. Ссылка на исходники есть на официальном сайте. 2) CE программа довольно сырая, поэтому если что-то очевидно работающее в ней не работает, то потому что есть ошибки и не доделки. Спрашивайте на форуме CE. 3) В main.lua стоит посмотреть все классы и пробежаться по функциям, возможно каждый найдёт для себя что-то интересное. Например при работе как с компонентами форм трейнера, так и создание расширения функционала Cheat Engine, рисование в окне игры, работа с отладчиком, реакции на горячие клавиши, составления АА-скриптов и многие другие интересные идеи которые могут придти в голову.
  13. ПОЗДРАВЛЯЕМ! Здоровья, счастья, успехов и всех благ!
  14. А зачем выходить из игры "совсем" чтобы потом "открывать"? Перезапусти трейнер или не выходи из игры пока не наиграешься. Если задача "сделать все идеально", то придётся самому посидеть в отладке и поискать причины. Скорее всего, никто за Вас эту работу делать не будет.
  15. Я думаю тут проще будет написать отдельную программу (С++,C# и т.п.) и её вызывать из CE. В CE Lua Engine простых методов я не увидел, разве что ассемблерный код выполнять в некотором процессе.
  16. "Show Module Addresses" как показывает так и отключает модульную адресацию В скриптах вместо такой записи 0x0000000: mov [ebx],eax можно использовать с модульной адресацией "xxxxx.dll + 00000" mov [ebx],eax
  17. А может уже кто-то нашёл решение и опубликовал в Интернете? Боюсь, что эта затея с перебором очень специфичная тема чтобы её обсуждать на теоретическом уровне и возможна довольно долгая и сложная. >> Andrey как ты думаешь можно сделать инъекцию на перебор значений? Если да, то покажи мне код для СЕ на этот самый перебор. То что можно это точно, но сколько времени займет понятия не имею.. Поищи в интернете bruteforce. По аналогии можно сделать и в Cheat Engine. Могут возникнуть большие трудности с определением инструкции начала перебора, с определением условия о том, что перебор ошибочен с возвратом на начало перебора, и так же могут возникнуть трудности с ошибками, обработкой исключений, leak-memory утечками. И остаётся важный вопрос сколько будет длится перебор и сколько времени займет написать этот brutforce. Возможно быстрее будет поиск этих самых id в отладочном коде или поиск каких-то зацепок. К сожалению больше ничем помочь не могу
  18. На форуме существует несколько тем - блогов пользователей. Кваз перенес их в подфорум Мозговой штурм, который виден только разработчикам. Возможно это было правильно , но мне кажется по причине "скрытности" в темах-блогах давно никто ничего не пишет. По крайне мере у меня раньше было больше желания писать в своём Блоге. Поэтому я вернул его обратно. Если кто-то захочет также перенести или написать идеи по этому поводу, то можно написать здесь.
  19. Странно, я помню было все нормально, но у меня нет желания проверять. Можно использовать таймер с проверкой потери процесса и сделать его повторное открытие.
  20. Видео смотреть не стал, просто нет времени на это. Попробуй поставить бряк на чтение адреса. Затем проанализировать все инструкции которые это значения читают. Возможно ты найдёшь инструкции, которые сравнивают эти значения с имеющимися или применяют их обрабатывая ошибку. Если второй случай, то можно попробовать сделать инъекцию кода на тупой перебор, пока не будет ошибки.
  21. Я думаю интересна многим - 130 просмотров. Я просматриваю всегда, когда есть новые сообщения в этой теме. Единственно, что пока особых фишек не появилось в CE. Разве, что теперь можно управлять комментариями напротив инструкций дизассемблерного кода. addReference(fromAddress, ToAddress, type) deleteReference(fromAddress, ToAddress) getReferences(address) getReferencedStrings() И ещё стоит внимания новый класс Disassembler со свойством LastDisassembleData и методом getLastDisassembleData(). Они работают с новым появившимся типом даных LastDisassembleData. Описания ниже. Disassembler Class createDisassembler() - Creates a disassembler object that can be used to disassemble an instruction and at the same time get more data properties LastDisassembleData : Table methods disassemble(address): Disassembles the given instruction and returns the opcode. It also fills in a LastDisassembleData record decodeLastParametersToString() : Returns the unedited "Comments" information. Does not display userdefined comments getLastDisassembleData() : Returns the LastDisassembleData table. The table is build-up as follow: address: integer - The address that was disassembler opcode: string - The opcode without parameters parameters: string - The parameters description: string - The description of this opcode bytes: table - A table containing the bytes this instruction consists of (1.. ) // кажется, это описание левей стороны инструкции modrmValueType: DisAssemblerValueType - Defines the type of the modrmValue field (dvtNone=0, dvtAddress=1, dvtValue=2) modrmValue: Integer - The value that the modrm specified. modrmValueType defines what kind of value // правая сторона инструкции parameterValueType: DisAssemblerValueType parameterValue: Integer - The value that the parameter part specified //Например, хотим узнать что по адресу прыг, call, ret или условный прыг isJump: boolean - Set to true if the disassembled instruction can change the EIP/RIP (not ret) isCall: boolean - Set to true if it's a Call isRet: boolean - Set to true if it's a Ret isConditionalJump: boolean - Set to true if it's a conditional jump По поводу поста 2 с просмотром графической памяти. Раз опция скрыта, наверно она пока и не работает и только заготовка, .
  22. Сообщения перенесены в новую тему "Red Alert 3 Мгновенная постройка" по причине несоответствия публикации сообщений в теме "Создание трейнера на C#" Поставить бряк " на запись" на адрес индикатора строительства. Исследовать ветку кода и стек, который ведет к записи в адрес индикатора строительства. Постараться найти в коде инструкции или инструкцию изменение которой позволит увеличить скорость постройки до мгновенной.
  23. Пример для игры UT3. Код CE Lua function onOpenProcess(processid) -- здесь открывается новый или утерянный процесс игры end local aalist = getAutoAttachList() stringlist_add(aalist, "UT3.exe") Ну, а остальной код уже для конкретной игры. Если есть скрипт или Lua код, который запускается один раз при подключении к процессу игры, то надо запускать его автоматически внутри функции onOpenProcess UDP: Здесь таймер не нужен. Если потребуется узнать утерян процесс или нет по таймеру, то можно использовать функцию getOpenedProcessID() : Returns the currently opened process. If none is open, returns 0 Описание таймера: Timer Class : (Inheritance: Component->object) createTimer(owner, enabled OPT): Creates a timer object. If enabled is not given it will be enabled by default (will start as soon as an onTimer event has been assigned) Owner may be nil, but you will be responsible for destroying it instead of being the responsibility of the owner object) properties Interval: integer - The number of milliseconds (1000=1 second) between executions Enabled: boolean OnTimer: function - The function to call when the timer triggers methods getInterval() setInterval(interval) : Sets the speed on how often the timer should trigger. In milliseconds (1000=1 second) getOnTimer() setOnTimer(function) getEnabled() setEnabled()boolean)
  24. Поподробнее так. LuaCall(luafunction()) это вызов Lua-функции из Автоассемблерных скриптов. Обычно, нет нужны его использовать. Может потребоваться, если действительно есть нужда в АА-скриптах. Если нужды нет, то все можно делать на Lua. Пример1. Один из самых простых примеров это проигрывание звука при активации или деактивации АА-скрипта Скрипт Lua: function PlayCheatActivate() --xmplayer_playXM(tablefile, OPTIONAL noloop) end function PlayCheatNoActivate() --xmplayer_playXM(tablefile, OPTIONAL noloop) end Скрипт АА: [ENABLE] LuaCall(PlayCheatActivate()) //... активация чита [DISABLE] LuaCall(PlayCheatNoActivate()) //...деакциваяи чита По аналогии можно проигрывать не только звук, но и но и что-то менять в форме трейнера (например, цвет надписи) или менять что-то в InGameMenu... Пример2. Ещё один пример это сделать необходимые операции перед включением АА-скрипта однажды Скрипт Lua: local bool isActivated function CheackActivate() if not isActivated then isActivated = true autoAssemble([[ //некоторая разовая инъекция кода ]]) end end Скрипт АА: LuaCall(CheackActivate()) [ENABLE] //... активация чита [DISABLE] //...деакциваяи чита
×
×
  • Создать...

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

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