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

Coder

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

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

  • Посещение

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

    13

Сообщения, опубликованные Coder

  1. MasterGH выкладывал очень много полезных и интересных статей на этом форуме.  Всё верно ты сказал. Но тебе не нужно делать какую-нибудь супер-пупер навороченную игру, создай плоскую хоть без текстурок игру.

    Это значительно увеличит твои знания ООП. Начни с самих основ и не спеши, я в своё время танчики делал (правда на C# и XNA еще на 1м курсе в колледже по-моему), потом спустя 2 годика по-моему сделал TrainME на C++/GDI, там где надо машинкой траффик объезжать. Потом вообще под вдохновлением, сделал ремейк танчиков своих на C++/DirectX)

     

    В общем - не торопись, всё продумай и начни потихоньку делать. На форуме тебе помогут.

    • Плюс 1
  2. Привет! Все очень просто, легко ломают игры, те кто в этой сфере крутится. Вот, посмотри на того же MasterGH, я не знаю человека, который ломает игры лучше него из зоны RU.

    Соответственно, если хочешь научиться ломать игры - научись их создавать (хотя бы примитивные). Тогда ты сможешь во всём разобраться и применить полученные знания.

  3. 0 еще скажи что VirtualAlloc может выделить меньше 4096 байта :D

    1 без посторонней "помощи" - очень сомнительно

    2 размер из пе хидера SizeOfImage. безопасности? нарушение от прав на запись? мде

    3 когда протект на весь модуль - все по другому выглядит, особенно если дофига хуков/нестандартные функции вкл/откл вроде "обмена байтами"

    ps RtlMoveMemory там потому что crt не используется. на С конечно бред его юзать xD

    Ловишь предуперждение за очередную порцию вываленной тупости неверной информации. Последующий оффтоп будет наказываться.

  4. VirtualProtect работает 4к блоками xD

    ты собирался сказать что то вроде:

    lea eax,[Buffer]invoke VirtualProtect,[Address],[PatchSize],PAGE_EXECUTE_READWRITE,eaxinvoke RtlMoveMemory,[Address],[Patch],[PatchSize]lea eax,[Buffer]invoke VirtualProtect,[Address],[PatchSize],[eax],eax

    проверка на фейл VirtualProtect - явно на любителя костылей. кст я забил на такое давно. ставлю протект на весь модуль и работаю с ним как с обычным буфером.

    0. "VirtualProtect работает 4к блоками xD" - идем на MSDN читать описание параметра dwSize.

    1. "проверка на фейл VirtualProtect - явно на любителя костылей" - VirtualProtect не всегда возвращает успешный результат.

    2. "Ставлю протект на весь модуль" - размер модуля может быть пару килобайт, а может быть и пару мегабайт/гигабайт. Модифицируя защиту памяти для всего модуля ты создаешь угрозу безопасности, помимо этого может произойти нарушение работы программы.

    3. "Работаю с ним как с обычным буфером буффером" - рокхаммер тоже модифицирует память напрямую (memcpy).

  5. 1. DWORD filler; filler не была инициализирована, а просто объявлена (и в ней может содержаться любой системный мусор. Почему я её не инициализировал? Потому что она служит только заглушкой, поэтому нам абсолютно без разницы какое значение будет в ней содержаться).

    2. blockSize = 4; Даже если ты в VirtualProtect передашь размер блока менее 4х байт,с протект будет выставлен всё равно на 4 байт, я так сделал, чтобы минимизировать время затраты на работу функции VirtualProtect (хоть и на пару тактов процессора).

    3. if (!oldProtect); если oldProtect равен нулю (т.е. мы не передали свой указатель), то в него будет записан указатель на filler, так как 4й параметр у функции VirtualProtect - обязательный.

    4. return ...; нет, функция вернет истину (если результат вызова VirtualProtect вернет число не равное нулю) и ложь (в случае если вызов VirtualProtect вернёт 0).

  6. Боже, ну и кастыль ты сделал)

    По консолям я не спец, это можешь легко загуглить.

    Сделай себе функцию обёртку (wrapper) над VirtualProtect.

    // address - указатель на блок памяти; blockSize - размер блока памяти; newProtect - новая защита памяти; указатель на старую защиту памяти (опциональный параметр) bool SetMemoryProtect(void* address, size_t blockSize, unsigned int newProtect, unsigned int* oldProtect = 0){   DWORD filler;   if (blockSize < 4)      blockSize = 4;   if (!oldProtect)      oldProtect = &filler;     return VirtualProtect(address, blockSize, newProtect, oldProtect) != 0;}

    Если функция вернет true, значит всё в порядке, если false, то пиши в логи. Можешь вообще в самой этой функции сделать кстати говоря и запись в логи, тогда вообще париться не придется.

    Пример использования:

    // пример без восстановления оригинальной защиты памятиint main(){   void* address = 0x00403000;   if (SetMemoryProtect(address, 12, PAGE_EXECUTE_READWRITE, 0))   {      // тут что-то делаем памятью   }   return 0;}// пример с восстановлением оригинальной защиты памятиint main(){   void* address = 0x00403000;   unsigned int oldProtect = 0;   if (SetMemoryProtect(address, 12, PAGE_EXECUTE_READWRITE, &oldProtect))   {      // тут что-то делаем с памятью      // восстановление оригинальной защиты памяти      SetMemoryProtect(address, 12, oldProtect, 0);   }   return 0;}
  7. Нет, ты не понял. В ProtectHacker есть функции записи в память. Массовые. Эта функция инициализируется в потоке, при конекте дллки. Когда функция не закомментирована (т.е. работает) - крашит сразу после инжекта. Теперь, когад функцию ProtectHacker закоментил - крашит при включении любой функции, которая использует запись в память. Думаю проблема как раз функции MemoryHook (запись в память)

    В таком случае, как быть?

    Проверяй, что тебе возвращает VirtualProtect и всё, в общем-то)

    Если возвращает 0, то в логи или куда там ты ошибки пишешь добавляешь запись, например:

    logs.put("Error 0x%X while accessing memory (здесь примерное место в коде, где возникла ошибка (название метода класса/функции или номер строки))", GetLastError());

  8. Ты бы для начала разобрался в том, как работает DirectX, и только потом думал о перехвате в стороннем приложении.

    Создай собственное DirectX приложение, разберись как оно работает и попробуй рисовать примитивы хоть какие-то.

    Потом почитай статьи по игростроению, как они создавали игровое меню, сделай меню для своего DirectX приложения.

    Потом реализуй какое-то взаимодействие с меню, и только потом уже возвращайся к перехвату DirectX в стороннем приложении, а иначе это - слышишь звон, да не знаешь где он.

  9. Да, кстати... Не подскажешь, как это ты так сделал, чтоб "внедренная" библиотека не отображалась в списке дллок?)

    Прост, для себя)

    Я просто не записывал в память процесса NT_IMAGE_HEADERS и не уведомлял процесс о том, что в него загружен был образ PE файла.

  10. Что ж пробуй, удачи :)

    C# исполняется на виртуальной машине со своим ассемблером, поэтому даже если ты напишешь на нем код решающий твою задачу, воспользоваться им не сможешь)

  11. Да действительно, криво прочитал.

    Касательно твоего вопроса, могу дать совет.

    Напиши нужный тебе код на C++ (выполняющий задачу перебора байт и заполнения их по условию), скомпилируй программу в Release сборку и собственно говоря запусти отладку, поставь бряк на своем участке кода и скопируй дизассемблерный код да и все.

  12. Хотел потом сказать, при выкладывании таблицы и скрипта.

     

    Нашёл адреса "Тумана войны" для Героев 2 (которые раньше (ещё на Артемоне) не смог). Вот для того чтобы сделать карту полностью видимой и делаю скрипт.

     

    Более эффективное средство... навряд ли. Там всё просто - нужно прибавить 1 ко всем байтам. Вручную участки карты открываются, значит можно сделать и программно.

     

    А в чём проблема с моим решением: неужели процесс прибавления 1 более затратнЭлый, чем копирование участка памяти, чем мы с Вами совсем недавно занимались.

    Элементарное решение -найди инструкцию, что работает с адресами тумана войны, и просто клади в адреса 1 (если нужно добавь пару условий).

×
×
  • Создать...

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

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