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

keng

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

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

  • Посещение

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

    55

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

  1. Цитирую MSDN: "The pointer that specifies a desired starting address for the region of pages that you want to allocate." Это - про второй аргумент VirtualAllocEx. Если надо выделить память в конкретной области - даем адрес этой области. Аргумент не обязательный.
  2. Во-первых, почему нету обычного монитора и в чем проблема его купить? Во-вторых, давай модель дискретной видеокарточки и самого ноута, можно будет хотя бы что-то нагуглить.
  3. Согласен, нужно это обсуждение перенести в отдельную тему.
  4. Вторую команду вводить в консоль было не нужно, я просто показал в псевдокоде, что делает первая. Если перезапустить консоль и ввести "path" еще раз - что она выдаст?
  5. Совершенно верно. Вариант для командной строки:setx path "%path%;c:\mingw\bin\" setx - изменяет переменную окружения, %path% возвращает текущее значение переменной path, ; - разделитель. Получается так: path = path + ";c:\mingw\bin" Думаю, что лучше запускать эмулятор командной строки с правами администратора.
  6. Потому что ты не совершал чего-то настолько серьезного, чтобы тебя банить. Не нравится плохая репутация - исправляй. Можно хотя бы интересные новости и статьи на игровую тематику тут выкладывать - за это никто минусовать не будет.
  7. Оно работает из командной строки, нужно папку c:\mingw\bin\ положить в переменную PATH, а потом просто набираешь в командной строке "g++ main.cpp -o my_cool_hack.exe", находясь в папке с исходным кодом. MSVS для маломощных компьютеров мало подходит, т.к. жрет много ресурсов и заметно тормозит, если их нет.
  8. Так ведь без разницы тогда, один аккаунт или их десять. Если на одном косячишь, получая минусы, то и на другом будешь. Минусят не за ник и не за аватарку.
  9. MinGW - это портированный набор компиляторов GCC под Windows. PS: Первым делом лучше смотреть все незнакомые слова в гугле.
  10. Ага. Можешь посмотреть примеры использования этой функции в интернете. А если MSVS медленно работает - поставь себе mingw и не заморачивайся.
  11. Чего ж ты до этого момента терпел с вопросами, если не понял, как оно работает? Давай на примере посмотрим. Есть у тебя вот такой участок игрового кода: 0x100: nop 0x101: nop 0x102: nop 0x103: nop 0x104: nop 1 инструкция nop = опкод 0x90 = 1 байт памяти. Итого 5 байт. Нам нужно сделать так, чтобы игра, дойдя до адреса 0x100, выполнила наш код, длина которого больше 5 байт, а затем вернулась обратно. Как это сделать? Прежде всего, нужно куда-то записать код, который наш, чтобы игра могла его выполнить. Для этого нужно выделить участок памяти. Допустим, что длина нашего кода будет 10 байт. Дальше я буду писать в псевдокоде: allocated_mem = VIrtualAllocEx(10) После выполнения видим, что allocated_mem присвоилось значение 0x110. Это для примера. Итого получаем: 0x100: nop 0x101: nop 0x102: nop 0x103: nop 0x104: nop ... 0x110: <- отсюда лежит 10 байт выделенной нам памяти, в которую мы можем писать 0x111 0x112 0x113 0x114 0x115 0x116 0x117 0x118 0x119 Так, память выделили, теперь нужно научить игру переходить на нужный нам адрес. Для этого нам понадобится команда безусловного перехода - jmp. Она прыгает на относительный адрес, а не на абсолютный. Показываю, опять же, на примере: 0x10: my_code ... 0x15: jmp my_code Вместо "my_code" по адресу 0x15 подставится -5. То есть на пять байт выше относительно текущего адреса (15-5 = 10). Прыжки вниз по коду - то есть вперед - прибавляют нужное смещение от текущего адреса. Смотрим еще раз на код игры и выделенную память. Код игры - 0x100, выделенная память - 0x110. То есть нам нужно прыгнуть ниже по коду, а значит вместо игрового кода по адресу 0x100 записать: 0x100: jmp 10 То есть на 0x110, на 10 байт вперед. Итого управление передастся на наш код, но нам нужно будет вернуться обратно. Чтобы вернуться обратно, нам понадобится еще один jmp и адрес, куда прыгать. Опкод команды jmp занимает 1 байт, адрес - 4 байта, итого 5. Так что для нашего кода нам остается 5 байт, ибо всего у нас их 10. То есть в выделенной памяти по адресу 0x115 нам нужно записать "jmp адрес", где адресом будет игровой код, откуда мы прыгнули, +5 байт. Почему +5? Вот почему: Игровой код: 0x100: jmp 10 0x105: ... jmp 10 занимает 5 байт. Нам нужно продолжить выполнение с команды, идущей сразу после нее, то есть 0x105. Если прыгнем опять на 0x100 - получится, что прыгнули снова на jmp 10, в итоге получится рекурсия и игра зависнет. В общем, нам нужно сделать jmp с адреса 0x115 наверх, на 0x105. Итого: 0x115: jmp -10 У нас есть адрес игрового кода (game_addr), адрес, куда нужно прыгнуть (game_addr + 5), адрес нашей выделенной памяти (allocated_mem), ее размер (10 байт) и адрес, откуда прыгать (allocated_mem + 10 - 5). Считаем, получается, что адрес, куда нужно прыгнуть, это 0x105, адрес, откуда прыгать - 0x110+10 - 5 = 0x115, вычитаем, получаем 110 - 115 = -10. Что дает нам: 0x100: jmp 0x1100x105: <- сюда прыгнем обратно...0x110: <- сюда прыгнем из игрового кода0x111:0x112:0x113:0x114:0x115: jmp 0x105 <- отсюда прыгнем обратно И вот, у нас остается еще целых 5 байт для кода, который выполнит игра вместо своего оригинального. Берем WriteProcessMemory и записываем 5 байт по адресу нашей выделенной памяти, то есть 0x110. Как вернуть все на место? Скажем, когда человек нажал кнопку, чтобы функцию трейнера отключить. У нас есть адрес игрового кода, адрес нашей выделенной памяти, и оригинальный игровой код, который мы заблаговременно сохранили перед его изменением. Алгоритм простой: 0. По адресу 0x100 (игрового кода) используя WriteProcessMemory записываем оригинальный игровой код.1. Очищаем выделенную нами память через VirtualFreeEx. Вот как-то так и работает инъекция кода в Cheat Engine. Единственное, каждый вызов WriteProcessMemory лучше оборачивать в Virtual(Un)ProtectEx.
  12. Отставить панику, это просто один из криво реализованных отладочных приемов. Многие игры тем или иным способом отказываются работать, если находят запущенные сканеры памяти, отладчики, дизассемблеры и прочие подобные утилиты. Просто в этой, видимо, защита реализована в виде обращения к нулевому указателю (что вызывает гарантированный отказ ядра). От подобных штук существуют плагины, в том числе и для Cheat Engine. От большинства подобных штук хорошо помогает kernelmode-отладчик (тот самый, которому нужна DBVM), но он довольно плохо работает (не у всех).
  13. Так ведь это можно в той же [википедии] прочитать.
  14. Скользкий момент тут в том, что VAC не банит сей момент - он как партизан, выжидает некоторое время. Так, в общем-то, делают большинство античитов, а читы потому и делятся на публичные и приватные - чем больше людей запускало конкретный чит, тем скорее он будет однозначно идентифицироваться античитом.
  15. Совершенно верно, с Си. Только вот Си и Си++ - абсолютно разные языки, у них просто синтаксис (написание команд) похож.
  16. Выделить - shift+end, если курсор в начале строки, +стрелка вниз\вверх, если курсор выше или ниже, +home, если курсор в конце строки, удалить - shift+delete, чтобы удалить строку, на которой сейчас находится курсор, и просто delete, если строка уже выделена.
  17. Я планирую и уже давно, просто времени свободного не было, а теперь немного появилось. А хакер - это образ мышления, он скорее в детстве приобретается, чем в каких-то видеоуроках. (:
  18. В уроках по ESP нет ни строчки кода на C++. Уроки по ассемблеру были, но всем захотелось классненький и простой C#, в котором я вижу мало смысла для подобных задач. Когда буду переписывать старые уроки - будут циклы только по ассемблеру и Си. Маловероятно, но возможно, что и по C++.
  19. Я вот на C++ писать не очень планирую. О_о
  20. Знаешь, как работает вирус - можешь сделать антивирус. И наоборот.
  21. Думаю, он имел ввиду бонусы.
  22. [Запросто]. В частности, тебя должен интересовать цикл статей "Перехват API функций в Windows NT" от Ms-Rem'а. Ну и, конечно, блог и книга "Windows Internals" за авторством Марка Руссиновича.
  23. WinAPI - это только вершина айсберга, т.е. те функции, которые можно вызывать из пользовательских привелегий. Так или иначе все процессы проходят через ядро ОС, которому доступно сильно больше, чем WinAPI. И, конечно же, у него самого есть API. Можно обращаться к нему. Это раз. Можно долго искать и найти недокументированные WinAPI, которые не проверяют античиты. Это два. Можно написать свой аналог RPM\WPM, это три. Можно спуститься на уровень ядра и написать *все* свое, выпрашивая у ядра только хэндлы процессов. Это четыре. Можно отказаться и от этого, но тогда нужно будет написать свой менеджер памяти. Это пять. Последнее - можно отказаться от записи на жесткий диск и запускаться с флешки, положив свою, гм, "программу" рядом с ядром. Тут потребуется свой менеджер памяти + свое много чего еще, мини-ОС, в общем. Методы - в порядке нарастания сложности исполнения, градуса кретинизма и трудозатрат в целом.
×
×
  • Создать...

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

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