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

MasterGH

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

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

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

    129

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

  1. // Обработчик события клика мышки void OnBtnClick(object sender, MouseArgs args) { GameObject gameObject = nil; // Выбираем объект под курсором мышки gameObject = GetObjectFromMouse(args.x, args.y, argz.z); if (gameObject == nil) // если объекта нет, то проверить был ли выделен объект поьзователя { // Последний выделенныйобъект gameObject = GetlastSelectGameObj(); // Если объект пользователя (!!! вот в этом месте определяется что групаа принадлежит пользователю) if (IsUser(gameObject)) { // то попытаться перенести объект, в данном случае "объект это отряд войска" // в этой функции, где-то там будет проверка на оставшиеся ходы и вычет ходов из остальных отрядов TryMove(gameObject,args.x, args.y, argz.z); } // Если объект не пользователя, то выход return; } seelct(gameObject); // подсветка объекта //... } void TryMove(gameObject,args.x, args.y, argz.z) { //... group = gameObject as GroupClass; //... if (group.move(args.x, args.y, argz.z)) { anyGroup = getGroups(group) anyGroup.decreaseMove(group.lastMove) } // ... } В отладчике надо найти то место, где я отметил восклицательными знаками. Там где выясняется может ли отряд ходить потому что принадлежит пользователю. В OllyDbg надо поставить бряк на обработку щелчка мышки... один бряк поставить на запись очков передвижения... Сделать автоматический трейс по ретам до последнего бряка, и затем отпустить процесс чтобы узнать пересечение участков... и тогда должны выйти под call-ом. Посомтрим выше и должны увидеть код условия о передвижения отряда который принадлежит только нашему герою. написал в теории как смог... Я проверю эту теорию, когда выделю на это время...
  2. Попробуй искать цепочку указателей свою и 2-х чужих машин, и затем сравнивать структуры указателей в Cheat Engine "dessect data" из меню дизассемблера. Как это делается есть в статье про Медал Тотал Вар на нашем сайте. Ещё поищи англоязычные статьи Geri по Cheat Engine. Вот одна. У него даже должно быть видео, вроде, по сравнениям структур.
  3. О, неплохо ты в этом во всём шаришь... Я установил эту игру, думал быстро разберусь, а не тут-то было (сейчас дел навалом, может быть на недели попробую копнуть). Вот что я предполагаю: Пользователь: Группа1 юнитов на карте: Unit_ID: + ..: +44: одинаковый указатель для "Пользователя" +6c: очки действия // либо здесь конец структуры _+B8: одинаковый указатель для "Пользователя" // либо здесь конец структуры Группа2 юнитов на карте: Unit_ID: + ..: +44: одинаковый указатель для "Пользователя" +6c: очки действия // либо здесь конец структуры _+B8: одинаковый указатель для "Пользователя" // либо здесь конец структуры .... ГруппаN юнитов на карте: Unit_ID: + ..: +44: одинаковый указатель для "Пользователя" +6c: очки действия // либо здесь конец структуры _+B8: одинаковый указатель для "Пользователя" // либо здесь конец структуры БотN: Группа1 юнитов на карте: Unit_ID: + ..: +44: одинаковый указатель для БотN +6c: очки действия // либо здесь конец структуры _+B8: одинаковый указатель для БотN // либо здесь конец структуры Группа2 юнитов на карте: Unit_ID: + ..: +44: одинаковый указатель для БотN +6c: очки действия // либо здесь конец структуры _+B8: одинаковый указатель для БотN // либо здесь конец структуры .... ГруппаN юнитов на карте: Unit_ID: + ..: +44: одинаковый указатель для БотN +6c: очки действия // либо здесь конец структуры _+B8: одинаковый указатель для БотN // либо здесь конец структуры Одна инструкция Shogun2.dll+68DEB2 - 89 50 6C - mov [eax+6C],edx работает со всеми адресами ОД (очками действия). У меня много мыслей как поступить дальше, но пока я ничего писать не буду, т.к. могу запутать. Да, и предполагаю, что указатель в виде скобок написать не получиться, потому что его часть по идее может рассчитываться функцией с логическим условием. Например, перебирать такие-то элементы в пока не дойдём до конца массива и возвратить количество элементов в массиве. Если одна группа сдвинулась на шаг, то очки хода у остальных отнимаются. if (group.move) { anyGroup = getGroups(group) anyGroup.decreaseMove(group.lastMove) } Я уверен, что должен быть почти такой код, а это значит, что скорее всего надо больше внимания обращать на функции и её аргументы. Т.е. надо искать по всему стеку в моменты бряков такие функции , которые работают с группой после хода одной группы... Лучше не заморачиваться с указателямя, а заморачиваться с функциями в дереве вызовов...
  4. local te_health = getTableEntry("health") function CECheckbox1Change(sender) if ( checkbox_getState(sender)== 1 ) then memoryrecord_setValue(te_health, "100") memoryrecord_freeze(te_health, 0) else memoryrecord_setValue(te_health, "99") memoryrecord_unfreeze(te_health) end end Поглядывай сюда, тут могут быть подсказки о том какие функции тебе использовать. Тебе пригодиться. Когда я писал для тебя код я смотрел, только туда )
  5. По поводу указателей на адреса патронов... Ты не читал мою статью, там даже скрипты есть. Только сейчас увидел версии игр разные...
  6. local te_health = getTableEntry("health") function CECheckbox1Change(sender) if ( checkbox_getState(sender) ) memoryrecord_freeze(te_health, 0) //0=freeze, 1=allow increase, 2=allow decrease else memoryrecord_unfreeze(te_health) end end В этом примере предварительно нужно установить записываемое значение заморозки в главной таблице Cheat Engine. Будет ли этот код работать без ошибок не знаю, тебе надо проверить.
  7. Чтобы побыстрее ответить я напишу кратко, а если будут вопросы, то задавай. 1. Сначала создаём форму в IDE Cheat Engine. 2. На неё бросаем чекБокс. 3. Заходим во вкладку Events и создаём событие напротив onchange двойным кликом по соседнему полю. И ты увидишь: function CECheckbox1Change(sender) end Если задача записывать в адрес разные значения при активации и деактивации чексбокса, то написать надо следующее. function CECheckbox1Change(sender) if ( checkbox_getState(sender) ) // запись в адрес else // запись в адрес end end Затем надо нажать Execute Script и закрыть IDE, закрыв панель инструментов. Так останется одна форма с чекбоксом. Ну а дальше проверяешь, работает или нет активируя чекбокс.
  8. Ну, вот ещё информация. Поискал я ответы в Интернете и нашёл. Просто я знал, что моддинг к GTA очень развивается... На странице SVN "проекта по созданию модов" есть функция создания машины. Ссылка для скачивания для клиента SVN: http://gta4modding.googlecode.com/svn/trunk/ static void CreateCar(u32 nameHash, f32 x, f32 y, f32 z, Vehicle *pVehicle, b8 unknownTrue) { NativeInvoke::Invoke<scriptVoid>("CREATE_CAR", nameHash, x, y, z, pVehicle, unknownTrue); } Эта функция как и другие, как очевидно, используются для модинга. Ну и ещё есть одна: static void GetCarModel(Vehicle vehicle, eModel *pValue) { NativeInvoke::Invoke<NATIVE_GET_CAR_MODEL, ScriptVoid>(vehicle, pValue); } Разберёмся, что требуется для создания машины и как работает GetCarModel. Т.е. мы разберём технологию спавна "на поверхности", но не так глубоко как хотелось бы. Пока мне не понятно как эта инфа была кем-то сотсавлена и изучена. Одно понятно, что этот человек действительно Гуру создания модов, а читов и подавно. Могу его только сильно уважать. Его никнейм Aru. Все машины в первую очередь создаются по скриптам(на самом деле это что-то вроде своего языка программирования в опкодах), а затем уже машинным кодом. Вот пример из GTAIV создания машины, скрипт декомпилирован из особых опкодов(составленных разработчиками игр) в текстовый формат: .native HAS_MODEL_LOADED // in=1, out=1 .iftrue PushD 8 Var RefGet PushD 9 Var PushD 0 Add RefGet PushD 9 Var PushD 4 Add RefGet PushD 9 Var PushD 8 Add RefGet PushD 23 LocalVar PushD 1 .native CREATE_CAR // in=6, out=0 Вот более понятный вид,но уже из Санд-Андреас: Загружаем модель машины, проверяем что она загрузилась, размещаем модель в игре: :Createcar wait 0 Model.Load(#SULTAN) :Createcar_3 wait 100 if Model.Available(#SULTAN). jf @Createcar_3 $9 = Car.Create(#SULTAN, 2488.917, -1658.0735, 13.3549) 0229: set_car $9 color_to 31 0 Функции ниже это обвертки C++ или Паскальные: Разберём параметры функций (источник "Seemann") static void GetCarModel(Vehicle vehicle, eModel *pValue) { NativeInvoke::Invoke<NATIVE_GET_CAR_MODEL, ScriptVoid>(vehicle, pValue); } //Vehicle vehicle : хендл машины //eModel *pValue : переменная-приемник, куда будет записано ID модели. значения параметров косвенно можно определить по названию функции. Если функция называется GetCarModel (в переводе получить модель машины), значит должно быть как минимум 2 параметра: 1. хендл машины и 2. переменная-приемник, куда будет записано ID модели. Хендл машины - это переменная с ее "именем", позволяющим отличить от другой машины. Хендл получается как раз из следующей функции: CreateCar. Её параметры можно понять по названию: static void CreateCar(u32 nameHash, f32 x, f32 y, f32 z, Vehicle *pVehicle, b8 unknownTrue) { NativeInvoke::Invoke<scriptVoid>("CREATE_CAR", nameHash, x, y, z, pVehicle, unknownTrue); } //u32 nameHash : хэш имени модели (http://www.gtamodding.com/index.php?title=List_of_models_hashes), например Например, для //AMBULANCE хэш равен 1171614426 или 0x45D56ADA //f32 x, f32 y, f32 z : это координаты места, где будет создана машина. Например, 100.10 -986.12 55.0 //Vehicle *pVehicle : Переменная с типом Vehicle, в которую будет записан хендл созданной машины (см. выше) //b8 unknownTrue : Неизвестный параметр. В оригинальных скриптах всегда равен 1 или True. Пример вызова функций на Паскале: var _mycar:Vehicle; _mymodel: u32; CreateCar(1171614426, 100.10, -986.12, 55.0, _mycar, true); Можно догадаться чему будет равен результат теперь: GetCarModel(_mycar; _mymodel); Более подробно как я уже писал смотрим: GTAModding.ru Wiki - ссылка обсуждение вопроса создания машины (там в основном Паскаль): ссылка хеши (или уникальные ID) моделей: здесь ------------ Вопрос о том можно ли подобное создать на Cheat Engine. Ответ да, можно... Есть сложные пути, а есть и простые. О сложных путях было написано уже до этого поста. А простой путь это найти необходииые Lua- модули с описанием CreateCar. Вызывать эту функцию из LUA-Engine... ------------- А вот пример, от самого Aru (там есть и спавн машины и другие читы
  9. А чем Вас видео не устроило : "Взлом денег Mafia 2 Обман денег и создание скрипта", а также "Devil May Cry 4 Бесконечное здоровье и убийство с одного удара." Может быть что-то не понятно или Вы просто не посмотрели? Все видео находится в соответствующем разделе форума. ZOCKIR-у, если увидит это сообщение за видео ещё раз спасибо лично от меня.
  10. >>OllyDbg у меня выдает ошибку ntdll.DbgBreakPoint на винде Win 7 64bit У меня OllyDbg запускается под Win7 64. У меня две версии OllyDbg, та которая с нашего сайта и последняя с официального сайта OllyDbg. И та и та запускается. Сначала надо запустить игру в конном режиме,а после аттачить его из OllyDbg из меню файла. Если будут остановки из-за исключений, то пропускать их по подсказкам внизу окна Olly или же настроить пропуск исключение из настроек Olly. По повод IDA, всё-таки советую с ним разобраться... он может гораздо удобнее показать код стрелками и связанными блоками, но только после того как будет проанализирован весь исполняемый файл... Так декомпиляция Arrays по горячей клавише F5 покажет псевдокод в удобном представлении. Можно довольно быстро сориентироваться поступает ли указатель прямо из функции или указатель извлекается внутри функции. Тоже самое правда с ошибками делает RecStudio. По поводу DBVM и ошибок из-за виртуальных машин ничего сказать не могу. У меня DBVM не работал лишь один раз при комиляции Cheat Engine из SDK...
  11. Не забывайте, что одновременно с Cheat Engine есть инструменты OllyDbg(удобный отладчик в пошаговой отладке и установки условных бряков), IDA + Hex-Rays(анализирование дизассемблерного кода и декомпилирование), RecSudio(декомпилирование), Function Hacker (перехват тех или иных функций), MHS... В последней программе есть удобная функция просматривания и составления цепочек указателей.... В Cheat Engine есть LUA engine, который поможет ставить бряки и удобно снимать показания регистров в лог... Так же в CE есть инструмент трассировщика с условием прерывания. Этот трейсер может показать огромное дерево иерархии вызовов кода... В CE есть сканер указателей и dessect data tool позволит просматривать и сравнивать структуры. Так же повторюсь, если очень трудно искать всю цепочку указателя и нужно найти лишь частичный путь это цепочки, то важно определять сколько и какие адреса проскакивают в квадратных скобках инструкций работающие с указателями уровней. Cheat Engine это умеет делать, пример этого я приводил выше. Сами понимаете, что учиться овладеть этим далеко непросто. Можно использовать только OllyDbg, ставив условные бряки при выходе из call-а, по методу из статьи Never Winter Nigth. У Cheat Engine есть сканер указателей. Его лучше не использовать, потому что он может найти неправильный указатель руководствуясь поиском указателей через вычитание и сложение смещений, когда могут быть и другие операции... и быть на 100% уверенным в том, что этот указатель будет всегда работать нельзя. У некоторого пользователя в какой-то момент этот указатель может "сбиться".
  12. Путь адреса будет меняться с каждым запуском. Сделать этот путь постоянным практически не возможно. Поэтому требуется найти этот путь: словно такой-то город, такая-то улица, такой-то дом, такая-то квартира... "о здрасте, а вот и ты Адрес здоровья моего героя!" . Некоторая машинная инструкция может работать с более коротким путём и может позволить быстрее добраться до адреса. Поэтому лучше не искать цепочки указателей, а искать адреса, ставить на них бряки и искать инструкции которые ближе к этому пути...Данное занятие невероятное муторное, запутанное и сложное для тех кто никогда этим не занимался. Но у нас есть много информации на форуме, которая может направить в нужном направлении.
  13. Там гед я писал слово "уровень" это относилось к некоторому указателю в цепочки указателей... Код игры прекрасно знает кто пользователь, а кто Бот. Это нужно всегда помнить. Ищите зацепки в коде, в бряках на уровнях указателей, в структурах указателей. По крайне мере ищите цепочку указателей до статического адреса (он должен быть зелёным в CE) и не проиграйте. Ещё один вариант это просто сравнивать структуры по адресам уровней указателей своих выбранных отрядов и отрядов бота. Выясните какие данные позволяют Вам передвигать Ваших юнитов и не позволяют командовать отрядами ботов. Я говорю сейчас про условную карту Мира, а не карту где войска могут захватывать замок... Могу посоветовать установить игру по которой я делал статью и попытаться сделать также. Понимаю, наверно, это сложно, но ничего более точного и толкового подсказать не могу. Просто сейчас у меня нет возможность установить игру.
  14. Ты мне не смог помочь (даже не указал где это видно)... макросы меня путают. Я вытягивать информацию не люблю. Буду сам разбираться.
  15. Наверно, тогда не ID модели, а название модели машины. Должна быть функция дать игроку машину определённого названия...
  16. Я вот всё равно не пойму, когда исключение срабатывает при обращении к несуществующему адресу, то как определяется чему должен установиться EIP? Есть быстрый ответ?
  17. В посте номер 4. Есть строка кода: 58D5DD9F - 88 8E C4000000 - mov [esi+000000C4],cl Определите какие адреса проскакивают в квадратных скобках. Это можно сделать из меню дизассемблера функцией "Find out what addresses this code accesses". Если адрес будет проскакивать один, то это хорошо. Если больше двух, то ищем указатель уровня выше (который что-то писал в esi). На адрес указателя "уровня выше" ставим бряк на доступ и определяем прервавшиеся инструкции. На них также определяем проскакивающие адреса... Если найдётся один адрес, то к нему можно обращаться как фильтру... Может быть я запутанно написал, но пока ничем больше помочь не могу.
  18. Не увидел этот вопрос... Это уже второстепенный вопрос. Сначала надо понять что нужно реализовать, а затем уже думать на чём делать. Так что такой вопрос задавать без исследования рано. Возможно и на АА сделать можно. Я думаю ты запутался Вот попробуй найти указатель на машину, когда герой в неё садиться и выходит. Сесть в другую машину, чтобы найти указатель другой машины. Сравнивать структуры машин в поисках ID. Затем если найдёшь эти ID и поставишь бряк на доступ, то на конструктор ты не выйдешь, даже если поднимешься до корневого элемента в дереве вызовов... Когда найдёшь и покажешь, тогда тебе и поверим... иначе всё останется туманной теорией
  19. Я ни разу не делал обработку исключений (SEH) на Ассемблере. Xipho, может быть ты делал и знаешь быстрое решение? Я знаю есть мануалы, но пока мне их некогда читать. Вот пример АА на CE (в комментариях указано где нужно обработать SEH): [ENABLE] alloc(newmem,2048) label(returnhere) label(originalcode) label(_cmpString) label(_valueString) label(_pValueString) label(_pCmpString) newmem: pushfd pushad push ecx //+44(4 + 4*9 + 4) или 11 двордов lea eax, [esp+4*B+0ac] lea ebx,[_cmpString] mov [_pCmpString], ebx lea ebx,[_pCmpString] // прооверка строки "GetPlayerFaction" по [esp+ac] cld mov ecx,#16 lds esi,[eax] //<<< здесь нужна обработка исключения в случае если по eax нет указателя на строку les edi,[ebx] cmpsb jnz short originalcode // если строки совпали, то записать по [esp] "999999" lea ebx,[_valueString] mov [_pValueString], ebx lea ebx,[_pValueString] mov ecx,7 lds esi,[ebx] les edi,[esp] //<<< здесь нужна обработка исключения в случае если по esp нет указателя на строку cld rep movsb originalcode: pop ecx popad popfd mov eax,[ecx] mov edx,7EFEFEFF jmp returnhere db 90 90 90 90 90 _pCmpString: dd 0 _pValueString: dd 0 _cmpString: //"GetPlayerFaction" db 47 65 74 50 6C 61 79 65 72 46 61 63 74 69 6F 6E 00 _valueString: // "999999" db 39 39 39 39 39 39 00 "SpazGame.exe"+157790: jmp newmem nop nop returnhere: [DISABLE] "SpazGame.exe"+157790: mov eax,[ecx] mov edx,7EFEFEFF dealloc(newmem) Есть ещё один вариант "не париться" с ассемблером, а сделать dll-инжект на языке высокого уровня с обработкой исключений в секциях try ... catch. Но всё-таки может быть кто-то в курсе обработки на ассемблере?
  20. Нельзя. Этот ID уже появился. Конструктор (инструкции машинного кода) уже создал этот ID. Конструктор для этого ID уже отработал своё и более работать не будет. По этому ID ты не выйдешь на конструктор поставив бряк. Чтобы сделать чит надо быть серьёзным реверсером - программистом с багажом практики у которого есть время копаться в этом.
  21. Спасибо за оформленный вопрос (мне понравилось). Сегодня я не смогу ответить... так что наверно до завтра.
  22. Почему я не мог раньше догадаться до такой простой вещи - аттач к процессу сделать по горячей клавише! В этом случае пользователь не увидит, что форма подвисает при AObscan-е.
  23. 1) По-моему некрасиво показывать "смех" типа "нафига ты написал так много, когда можно было сделать проще". Ничего смешного нет. Хотя бы потому, что я вложил свой труд в создание статьи. 2) Не все игры поддерживают параметры запуска оконного режима: ни -w, ни "-win", ни "window", ни другие могут не работать. Тогда кому-то возможно будет полезна именно эта статья особенно в случае, когда один процес запускает другой с параметрами... и дочерний процесс можно запустить минуя родительский с установлением оконного режима. Польза от статьи я думаю есть.
×
×
  • Создать...

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

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