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

holy

Пользователи+
  • Постов

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

  • Посещение

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

    2

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

  1. holy

    TrainME by Xipho

    Значения очков, я вроде искал через неизвестные значения. Т.е. изначально ищем неизвестные значения, потом в игре увеличиваются очки, и в Cheat Engine отсеиваю результаты через "Увеличилось значение"
  2. Не знаю Вроде ничем не паковал. А если и пакую, то UPX'ом
  3. Ещё как вариант , предположу что BaseAddress у модуля Game.exe смещается. У тебя на скрине статичный адрес это "Game.exe"+016*** (видны на скрине только первые 3 цифры). А в коде у тебя жестко задано число. Однако в зависимости от смещения Game.exe будет разный первоначальный адрес.
  4. По аналогии с этим: wchar_t My_Little_String[100]; swprintf(My_Little_String, L"%d - %s", 24, L"piupiu"); Все функции printf работают одинаково. Либо они выводят инфу в консоль (и тогда первый параметр является сразу форматом строки) Либо они выводят инфу в строку (и тогда первый параметр всегда строка в которую будет писаться результат)
  5. Я вообще не стал бы конкретно эту ошибку патчить. Судя по описанию ошибки, она может возникнуть во время любой рассинхронизации, а не только в момент читерства. От сюда следует, что эта ошибка, возможно, где-то выше вызывается через call. Возьми отладчик, поставь BP на место где она вызывается, и смотри на стек вызовов. Исследуй код который вызывает эту функцию, возможно найдешь как "починить", если повезет.
  6. Память выделяется динамически, в зависимости от входных данных ) А это значит, что: 1. Эти данные хранятся не в стеке, а в куче 2. Эти данные всегда имеют соответствующий входным строкам размер, а значит переполнения не может быть И именно по этому я не люблю когда Visual Studio что-то пытается решить за меня, по этому юзаю Code::Blocks и GCC компилятор )
  7. Вообще-то все эти ошибки гуглятся... Столько лишних вопросов, попробуй сам гуглить. То что студии не нравится swprintf это я знаю, по этому и не люблю Visual Studio, слишком много на себя берет. Попробуй вторым параметром передать длину строки, т.е. swprintf(My_Little_String, len_string, L"%d - %s", entry.th32ProcessID, entry.szExeFile); Может поможет. Если нет, то загугли альтернативные функции.
  8. так как у тебя ExeFile уже имеет тип WCHAR то тебе уже ничего не надо делать, можешь все что связано с переменной forExeFile удалить, а строку swprintf(My_Little_String, L"%d - %s", entry.th32ProcessID, forExeFile); заменить на swprintf(My_Little_String, L"%d - %s", entry.th32ProcessID, entry.szExeFile);
  9. У меня, в CodeBlocks, в структуре переменная szExeFile имеет тип TCHAR, скорее всего в Visual Studio другой тип. Попробуй вместо strlen использовать wcslen (она для WCHAR)
  10. Используй MessageBoxW MessageBoxA для ASCII строк (там где символы 1 байт), MessageBoxW для UNICODE строк (там символы обычно 2 байта)
  11. DWORD это 32-bit unsigned int (Т.е. целое беззнаковое число от 0x00000000 до 0xFFFFFFFF) Объясни вопрос более подробно и с примером. Иначе не понятно, причем тут число и количество символов в нем. Если более филосовско рассуждать, то DWORD это 2 WORD'а, которые состоят из 4х CHAR'ов :DD а значит 4 символа
  12. Ясно. Я просто думал, что была какая-то причина, но раз это просто желание такое, тогда понял )
  13. Garik, извиняюсь за тупой вопрос, но почему в данном куске кода: ты не использовал регистр? Ведь не важно, использовался он или нет, мы в любом случае сохраняем его значение и восстанавливаем Например так: Просто интересуюсь )
  14. Раздел "Платный запросы", ему подсказки не нужны, ему требуется выполнение запроса за деньги. Почти нереально. Не думаю что кто-то возьмется за такое, тем-более если сервера не маленькие.
  15. Пример создавал в Code::Blocks Полностью рабочий, но большая концентрация быдлокода.
  16. Тебе не хватает понимания того что ты делаешь. По этому не разобрался в моем примере и в том примере который ты привел по ссылке. Но не страшно, метод "тыка" тоже имеет место быть. В функции CreateWindowEx (которую ты наверняка используешь, ибо в коде по ссылке это именно она) четвертый параметр с конца это родительской HWND окна, установи его в NULL. И из стилей созданного окна убери WS_CHILD. А лучше, CTRL+C код для создания основного окна, CTRL+V туда где создаешь второе окно по клику.
  17. У меня работает ) Значит что-то не так у тебя. А разбираться придется тебе самому, врядли кто-то решится копаться в чужой шахте.
  18. А в чем проблема? 1. Создай кнопку OK передав туда параметр HMENU 2. В процедуру обработки оконных сообщений WndProc добавь в switch обработку константы WM_COMMAND, пример: 3. И просто создавай через CreateWindow новое окно, и в него добавляй что тебе надо. P.S. Возможно это не самый лучший вариант, но этим вариантом я пользуюсь при создании TrainMe.
  19. Из визуального значения можно как шерлок-холмс выйти на реальное. Предлагаю найти строку в памяти куда рендерится значение, например "Х%" или просто "Х" смотря в каком виде там рисуется значение, затем подключившись в OllyDbg и используя memory breakpoint на этой строке дойти до нужных инструкций. Я как раз собирался записать один такой урок как-нибудь в ближайшее время.
  20. Верно! Правильный подход. Суть данного TrainMe в том, что он обманывает CheatEngine тем, что выдает якобы "статический" адрес, который на самом деле при перезапуске программы меняется. На самом деле существует 3 таких адреса в коде (3 инструкции в которых присутствует адрес): При инициализации (присвоению значению 100) При увеличении / уменьшении значения на 10 При освобождении динамически выделенной памяти Но суть в том, чтобы добавить в таблицу CE адрес на одну из этих инструкций (например): CPU Disasm Address Hex dump Command Comments 004013A6 |. 8B15 83604000 MOV EDX,DWORD PTR DS:[406083] И добавить к ним оффсет, например в данном случае 004013A6 + 2 (опкод команды MOV в данном случае занимает 2 байта 0x8B15) и получаем указатель на указатель который указывает на значение.
×
×
  • Создать...

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

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