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

partoftheworlD

Помогаторы
  • Публикаций

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

  • Посещение

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

    164

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

  1. partoftheworlD

    Посоветуйте литературу !

    Если времени мало, стоит определить для начала для чего нужен асм, если в целом для программирования на асм, то лучше The Art of Assembly Language, 2nd Edition Randall Hyde пока ничего не находил, если для отладки, то куда быстрее будет заняться реверсом, а так же иметь под рукой документацию по асму, решать всякие crackme/keygenme, для начала даже можно самому компилировать простые программки, учиться по ним читать и понимать асм.
  2. Навряд ли, скорее просто проверка инициализировалась ли память под структуру нового предмета. Во-первых обратить внимание на то, как происходит подбор, если без касания к предмету(т.е. гг проезжает мимо и лут собирается) это идеальные условия. Для начала стоит попробовать более простой способ поиска, например, попытаться найти дистанцию между предметом и гг. Если такое значение найдется, считай 75% дела уже сделано и останется как по учебнику повесить бряк на доступ и после подобрать предмет, таким образом ты найдешь инструкцию, которая сравнивает дистанцию между предметами, и если она меньше определенного статического значения, то будет подбор. А дальше на любителя, либо отключить проверку, чтобы подбор было по всей локации, либо увеличить дистанцию.
  3. Статья должна была выйти вместе с видео, но мне лень было её писать. В прошлом видео я показывал, как это работает и настало время для того, чтобы рассказать, как это делалось. Да можно было писать свое значение на прямую в значение разблокировки замка, но это скучно и вообще какой-то дет.сад. На деле все оказалось довольно странно, вместо обычной генерации рандомного значения, в скайриме используется двухуровневая т.е. сначала одна функция генерирует одно значение, результат которой влияет на результат второй функции. Рассмотрим код, хотя в нем особо комментировать нечего, я разделил его на блоки, чтобы проще воспринимались стадии работы алгоритма. Дальше можно в ручную уже посчитать текущее значение для открытия замка: v5 = 9.615000725f * 0.5; // 4.8075003625 v6 = v5 - 90.f; // -85.1924996375 v7 = 90.f - v5; // 85.1924996375 link = &qword_7FF6A0CEED70 LockPick->unlock_Value = ( v7 - v6 ) * (GenerateRandomValue(link, 0xFFFFFFFF) * 2.328306437E-10) + v6; LockPick->unlock_Value = 170.38 * (0xAE504DB6 * 2.328306437E-10) + -85.1924996375 LockPick->unlock_Value = 170.38 * (2924498432.00 * 2.328306437E-10) + -85.1924996375 LockPick->unlock_Value = 170.38 * (0.68) + -85.1924996375 LockPick->unlock_Value = 30.82 И проверяем в отладчике: Генератор отмычек готов.
  4. Функция принимает D3DXVECTOR3, а ты передаешь ей float Так же, твой Vector2D является Vec3, а возвращаемое значение WorldToScreen имеет тип D3DXVECTOR2. Написать перегрузку WorldToScreen, судя по исходникам с этим не должно возникнуть проблем. Или написать шаблон WorldToScreen.
  5. partoftheworlD

    Книги

    Треть на русском(по cpp, регуляркам, патернам, глубокому обучению). Так что давай начинай плюсы учить. Начиная с книги Страуструпа, после Рихтер с winapi и закрепить все это полным справочником по cpp.
  6. partoftheworlD

    Книги

    Немного обновил и упорядочил книги из личного хранилища, может кому пригодятся. (Возможно это считается за пиратством, так что ссылку буду выдавать в личных сообщениях, на форуме или в дискорде) В архив входят:
  7. Потому что эта функция может использоваться любыми программами и даже системой, если что пойдет не так будут проблемы. Да и это достаточно глупо, можно сравнить например, вот возникла трещина в кости, а врачи вместо гипса, конечность отрезали, по сути проблема решена, но стоило ли оно того. Вот и тут так же, поэтому прежде чем что-то внедрять в winapi надо понимать последствия и на их основе уже оценивать необходимость такого подхода.
  8. Мне кажется она будет бесполезна на memcmp, возможно, memcmp будет использоваться какой-нибудь из программ из-за чего трейс будет постоянно не того что нужно, лучше по стеку руками пройтись и в заметках восстановить все.
  9. Если нужны данные, просто выходишь по стеку вызовов на пользовательский код, там вешаешь скрипт и перехватываешь нужные буферы, которые передаются в функцию memcmp как аргументы, регистрируешь глобально символы на них, а дальше делаешь с ними что хочешь, например дамп всех значений в блоке, через lua. Хотя лучше потратить чуть больше времени, и восстановить алгоритм получения указателей на блоки, хотя бы до инструкции работающей с массивами и уже на этом куске кода вешать скрипт.
  10. Чем придумывать велосипед из палок и грязи, просто проиндексируй массив и обращайся к значениям по их индексу. Оу, поспешил, вы что тут вообще творите? Это ведь WinAPi выйди по стеку в пользовательский код и уже там сравнивай. За внедрение кода в winapi обычно по рукам бьют. И код ничего не пишет, уж это можно было загуглить.
  11. Это не будет работать без описания перегрузки, типа
  12. Нет, мне кажется даже глупо спрашивать о таком. Язык лишь инструмент автоматизации, а не супер-пупер инструмент позволяющий взламывать игры. В интернете их полно, тем более для CSS, каждый кому не лень пишет и выкладывает esp. Первый результат в поиске. Не самый разумный подход, если есть желания и дальше продолжать в этой области, надо знать возможности языка, чтобы использовать именно так как тебе нужно. А если это спонтанное желание у которого нет будущего, то проще посмотреть на исходники читов на гитхабе и не тратить впустую время. И с чего у всех какие-то странные временные отрезки по изучению языка в 5 лет, тот же C++ и за 10 лет выучить не удастся, и изучить все его возможности.
  13. 4C 8B 35 это конструкция mov r14, [rip] или mov r14, cs:[0], следующие 4 байта, указывают на смещение относительно этой инструкции.
  14. Не загоняйся по ерунде, на практике все равно будешь использовать 5-10 основных опкодов и инструкций, плюс есть утилиты и онлайн дизассемблеры, где можно посмотреть байты и какие инструкции они представляют для любой архитектуры, если уж так сильно захочется..
  15. Для того чтобы читать табличку, советую использовать интеловские доки (глава 3) там объясняется, что все это значит. Да и вообще интеловские доки, являются некой библией для каждого реверсера, так что, если думаешь серьезно заняться реверсом, советую прочитать их и использовать как справочник.
  16. Разный в зависимости от компиляции, вообще push размером в 1 байт это зарезервированные опкоды от 50 до 57 50 push rax 51 push rcx 52 push rdx 53 push rbx 54 push rsp 55 push rbp 56 push rsi 57 push rdi Ну и табличка:
  17. partoftheworlD

    как задать условие на трассеровку?

    Можешь сохранить трейслог и открыв его в текстовом редакторе искать что нужно
  18. Начнем с того, что теперь я ненавижу юнити, так, что моей ненавистью можно питать пару крупных городов еще и останется. Проблема возникла с тем, что у игры есть свои значения проверяющие загружена игра или нет, но получить к ним доступ через указатель оказалось невозможным. Перепробовав около 50 разных способов и потратив 1.5 недели, решил залезть в управление памятью юнити, возможно что-то интересно окажется там. Доков и исходников нет и поэтому - Реверсим, реврсим, вертим крутим и делаемся всякие непотребства с памятью и... Бам, оказалось( возможно это чистое совпадение), но UnityPlayer использует статические адреса для "работы" с CFG. CFG/CF это Control Flow Guard - механизм защиты Windows, нацеленный на усложнения процесса эксплуатации бинарных уязвимостей в пользовательских и ядреных приложения. Сам механизма проводит валидацию неявных вызовов, предотвращающая перехват потока исполнения, например переписывая таблицы виртуальных функций. Именно этим мы и воспользуемся, но для начала найдем максимум информации о CFG и его внутреннем устройстве. Итак, когда игра не загружена то, адреса должны указывать на статические данные внутри UnityPlayer.dll, но после загрузки игры выделяться, например в куче. Зная это, можем приступать к поиску. В итоге нашелся статический адрес указывающий на старшую часть указателя, который работает с CFG, когда игра находится в меню или загружается, то старшая часть равна 7FFX( X - значение от 0 до F), но когда игра загружена, то значение меняется на адрес кучи. Что-то типа: Static - 7FFFDEADBEEF Heap - 01EFDEADBEEF Значит берем старшую часть, уменьшаем её для более простого сравнения используя: value & 0xFFF В итоге, получаем значение которое можем засунуть для проверки в автосплитере, если игра не загружена, то значение равно от 4080 до 4095, но если игра загружена, то значение меньше 600, но на всякий случай, я указал: value < 4080 И на этом все, на все про все у меня ушло где-то 2.5-3 недели, просто чтобы узнать состояние игры. В общем, было интересно и стало более понятно как юнити работает с памятью. Желаю всем подобных заданий, это ведь интересней, чем патрончики накручивать.
  19. Для этого нужно будет использовать OpenCV на чем-то компилируемом, иначе обработка в 15-20 кадров не подойдет. А для этого надо знать C# Единственный вариант остался, это найти все статические переменные в UnityPlayer в надежде, что какой-нибудь из них является индикатором загрузки уровней/передачи управления гг.
  20. Но, есть же f.lux.
  21. My Friend Pedro, состояние игры нужно, чтобы правильно работал внешний таймер, а именно удалял время между загрузками уровней. ll2cpp Внедрять ничего нельзя, это одна из проблем, игра должна оставаться чистой, только чтение значений из памяти допускается. Делал такую проверку, при переходе между уровнями появляется загрузочный экран, который делится на 3 части, затемнение экрана, загрузка уровня, затемнение экрана. Флаг загрузки уровня нашел, а вот с затемнением такое не работает из-за чего возникает разница во времени, а на 50+ уровнях это очень сильно заметно.(+2-3 минуты)
  22. partoftheworlD

    ReClass v1.2 .Net

    Скомпилировал новую версию, теперь в ней можно дампить и искать значения, и кое-что подправил, а также работает подсветка изменений байт. Ссылка.
  23. Это довольно не простая тема, поэтому в идеале необходимо знать ООП, так будет проще воспринимать устройство инвентаря. В фолаче 4-м вроде нет ячеек, это просто список указателей внутри массива. Если игра написана с использованием виртуальных методов, то для поиска предметов и инвентаря в целом можно использовать RTTI, если нет, придется делать все ручками. По RTTI есть статьи на форуме. А поиск руками, тут все достаточно нудно. Для начала инвентарь лучше забить предметами, которые скорее всего имеют общий родительский класс, ну например CWeapon, который содержит разные характеристики, которые CAK47 будет наследовать, но раз родитель общий, то и все остальные оружия, например CM16A3, тоже будут их наследовать. Получается, первый шаг это восстановить, хотя бы пару наследуемых значений например количество патрон и что-нибудь еще, чтобы в дальнейшем, можно было накладывать этот шаблон под разные указатели и проверять, является ли он каким-нибудь оружием. Из утилит подойдет ReClass, но в принципе хватит и CE. Второй шаг, найти указатель на структуру оружия, например базовый адрес 0xDEADBEEF, адрес патрон 0xE0. С этим справится обычный поиск, переводишь его в HEX вставляешь базовый адрес и ищешь. Получишь некое кол-во адресов. Каждый из которых нужно будет проверить, пока не найдешь, то что нужно. Третий шаг, проверяешь с помощью шаблона ближайшие адреса от найденных на втором шаге, чтобы восстановленное смещение в шаблоне на разных указателях указывало на патроны, а так же чтобы количество лежащих рядом указателей было таким же как и количество оружия/предметов в инвентаре. В упрощенном виде цепочка указателей выглядит примерно так: CWorld -> CLevel -> EntityArray[playerID] -> CActor -> CInventory -> CInventorySlot -> SlotArray[slotID] -> CWeapon -> ammo
  24. partoftheworlD

    как задать условие на трассеровку?

    Посчитай на бумажке как формируется eax, смотря по инструкциям, которые были выше.
×

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

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