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

keng

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

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

  • Посещение

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

    55

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

  1. Хорошо. Каким образом можно, зная адрес здоровья, выйти на pBase?
  2. По идее, одна секция заканчивается там, где начинается следующая. У тебя .data идет первой, потом идет .code, так что везде между .data и до .code - секция .data.
  3. Это обыкновенный Courier New Regular. Там же в настройках посмотреть можно.
  4. Ассемблер, по поводу Си думаю, но меньше чем про первый вариант.
  5. Извиняюсь, я задумался не о том, пока отвечал. С утра распишу подробнее. P.S.: Скоро у меня на канале начнется курс по программированию трейнеров. С полнейшего нуля, ага.
  6. Карочи! Ты такой: int flag = 0; /* объявляем флажок */ if ( GetAsyncKeyState(0x20) & 0x8000 && !flag ) { /* Если кнопка в нижнем положении и флажок == 0 */ flag = 1; /* Ставим флажок в 1 */ /* Выполняем нужный код */} else if ( !GetAsyncKeyState(0x20) ) { /* Иначе, если кнопка НЕ нажата */ flag = 0; /* Снимаем флажок */}Заметь, что перед 0x8000 стоит логическое И. В чем суть? В том, что функция GetAsyncKeyState возвращает значение типа SHORT. SHORT - это два байта. Младший показывает состояние кнопки (нажата - не нажата), а старший - подробности. Эти самые подробности в бинарном виде выглядят так: 0000 0000 0000 0000 // Кнопка вверху и не нажата 1000 0000 0000 0001 // Кнопку нажали и она теперь внизу 1000 0000 0000 0000 1000 0000 0000 0000 // Кнопка все еще внизу 1000 0000 0000 0000 1000 0000 0000 0000 0000 0000 0000 0000 // Кнопка отжалась обратно То же, но в 16-ричном формате: 0x0000 0x8001 0x8000 0x8000 0x8000 0x8000 0x0000 Итого: 0x0000 0x8001 OnKeyDown - нажали кнопку и держим ее так. 0x8000 ИЛИ 0x8001 OnKeyPressed - нажали и отпустили, НО предыдущяя проверка должна была вернуть 0. 0x8001 OnKeyHold - с момента предыдущей провери кнопка все еще нажата. В духе: "ABCDDDDDDDDDDD". 0x8000 ИЛИ 0x8001 0x0000 OnKeyUp - то есть кнопка отпустилась из предыдущего своего состояния. Такая вот штуковина! =D
  7. Привет! Думаю, состояние таймера можно тем или иным образом контролировать. Самый простой вариант - поставить не 100мс, а 500, чтобы исключить "повторные" нажатия. А вообще, подумай как следует и напиши, что конкретно ты хочешь чтобы оно делало и как работало. Тогда будет проще придумать.
  8. Привет! На какой из вопросов темы ты ответил своим сообщением?
  9. Привет!В подобных темах хорошо указывать название игры. А так, погода - это несколько состояний, вроде "ясно", "пасмурно", "снег идет". Это и нужно будет искать, методом "изменилось\не изменилось". Начать можно с типа "целое, 4 байта".
  10. Вроде бы, все ок. Думаю, корректнее было бы скрипт обернуть в lua-таймер - оно вроде как это умеет.
  11. Говорят, что создание потока в скрипте нужно вызывать последним, т.е. в самом низу. Сначала, мол, код записать, а потом уже поток сделать.
  12. Представь себе пример. Есть программа, которая показывает кнопку "Скачать файл", по нажатию на которую начинает этот самый файл скачивать. Файл размером в 100 Тб, скорость - 56 Кбит\сек. То есть понадобится дофигалион времени на скачивание. А пользователю во время скачивания нужно показывать индикатор загрузки. Раньше было так, что можно было или качать и ждать, или рисовать этот самый индикатор. Потом изобрели потоки, которые позволили разделить контекст выполнения программы - одна ее часть теперь рисует индикатор, а другая - грузит файл. Процессор переключается между этими двумя потоками и выполняет их код поочередно. Для пользователя это выглядит, будто оно одновременно делает и то и другое, но это просто процессор работает быстро. А потом изобрели многозадачные ОС, которые работают примерно по этому же принципу. Дык вот в моем примере есть функция. Допустим, такая: void func(int a, int b, int c); Чтобы вызвать эту функцию из Си, надо сделать так: func(1, 2, 3); Чтобы из ассемблера - так: PUSH 3PUSH 2PUSH 1CALL func Мы взяли и нашли через Cheat Engine адрес этой самой функции, но нам хочется сделать такую инъекцию, чтобы не трогать сам код игры, но чтобы эта функция вызвалась в нужный нам момент. Тут и спасут потоки. Создаем поток и передаем ему код вызова функции - при создании потока ОС увидит его, скажет об этом процессору, тот переключит контекст выполнения на этот поток и выполнит код, а затем поток просто завершится и ничего больше не будет делать. Регистры и флаги не пострадают, потому что это выполнится "параллельно" (отдельно) от остального игрового кода. Такая вот штука.
  13. Тем, что label просто позволяет дать имя адресу памяти, а CreateThread создает поток. Почитать о них подробнее можно, например, [тут]. RET нужна, насколько я помню, для того чтобы поток понял, что пора завершаться.
  14. У меня тоже такое видео есть, а HD-версию я вот прямо сейчас залил на ютуб. Это ведь 5-й или 6-й раздел официального туториала - ты его не проходил? Полезная штука ведь.
  15. Ну да. Отладчиком. Или ты думаешь, что до написания автоматического сканера указатели не использовались?
  16. То, что в видео найдено - не то, я думаю. Попробуй на адрес собственного здоровья найти указатель вручную, а не сканером.
  17. Привет!Смотря какую функцию и смотря откуда. Если игровую и из инъекции кода, то тебе нужно будет знать ее адрес и аргументы. А дальше сделать примерно так: alloc(mycode,4096) // Выделяем 4096 байт памяти для записи нашего кодаCREATETHREAD(mycode); // Создаем новый поток и передаем управление на выделенную памятьmycode: PUSH arg2 // Кладем в стек аргументыPUSH arg1PUSH arg0CALL 0x1234567 // Вызываем функцию по адресу 0x1234567RET // Выходим
  18. Настройки наверняка хранятся в реестре, так что они вполне могли остаться старыми.
  19. Мое обычное решение - оригинальная версия программы, не в обиду SER[G]ANT'у будет сказано. А вообще, адресное пространство общее, тебе в любом случае понадобится image base client.dll, даже внутри dll твоего хука. Адрес-то один фиг будет вида "image base + offset", потому что этот самый image base меняется при перезапуске игры.
  20. Забавно! Как вариант - можно посмотреть, ммм, "Список загруженных модулей", там найти client.dll и поглядеть ее image base. А потом - какие адреса начинаются с такого же адреса. Второй вариант - отсеять адреса, т.к. замораживаться там будет только один - он тоже будет лежать в client.dll.
  21. Там целое 4 байта, не знаю, почему у тебя может не получаться. Пункт с модулями все-таки находится в меню "Просмотр", 4-й или 5-й снизу.
  22. wts использует видовую матрицу, чтобы понять, на экране находится объект или нет. А до этого - чтобы сделать проекцию трехмерных координат объекта на двумерное пространство (окно игры). Если in russian, то это надо зайти в, ммм, "Просмотр Памяти", потом выбрать меню "Вид" и ткнуть там опцию "Показать имена модулей" (О_о). Не люблю я in russian, а то каждый раз как представлю: целое ничего главное(целое колво_аргументов, указатель буква аргументы){ возврат 0;}Кошмар же, ну! Брр... А прямоугольник рисуется легко. Представь, что [0:0] - это верхний левый угол экрана. Линия рисуется на двумерной плоскости, так что нужно две точки: 0. От [0:0] до [10:0] 1. От [10:0] до [10:10] 2. От [10:10] до [0:10] 3. От [0:10] до [0:0] По часовой стрелке. Координаты - в формате [X:Y]. Попробуй сначала на бумажке это нарисовать. Id команды находится там же, где и здоровье с координатами - все в одной структуре. Когда найдешь их массив (или отладишь функцию нанесения урона) - увидишь при сравнении. Там значения 0, 1 и 2 (T, CT и Spectator, вроде так).
  23. Привет!С модулями можно потыкать меню "View" окна "Memory view", вроде как оно там зовется "Show symbols". Нужен модуль "client.dll". Структура там здоровая, как и почти все в source engine - здоровье находится по смещению что-то около 0x90. С CS:GO никакой разницы, разве что эти самые смещения в структурах. Попутный ответ - рисуется прямоугольник из линий. Тут нужно будет только немного поиграться с его размером.
×
×
  • Создать...

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

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