Другое С/С++ Вопрос - Ответ

SR_team

like pancake
BH Team
4,798
6,470
@Picador я особо не вдавался в работу VAC. отследить вызов ReadProcessMemory можно только с помощью драйвера. в MTA, например, он есть. кроме ReadProcessMemory есть и другие способы прочитать память процесса, они сложнее. есть и возможность скрытно загрузить dll в процесс и скрыть её вообще от всего, только это тоже сложно и сам процесс скрытия может детектироваться.
по этому надо переходить на линукс. Процессы запущенные под вайн чувствуют себя как в винде и могут видеть только виртуальное пространство типа винды, в то время, как со стороны линукс приложений видно все, и они могут воздействовать на процессы линукса. Таким образом можно подцепить линуксовый дебагер к виндовым приложениям и они его никак не смогут задетектить
 
  • Нравится
Реакции: RanGoo и p1cador

p1cador

cerf
Проверенный
221
359
Очень нубский вопрос: максимум, к примеру, может быть 32 игрока, т.е. 32 объекта структуры игрока. Читаю циклом все. Если какого-то игрока нет, то игру нахер крашит. Как попытаться прочитать значение по опред. адресу?
Например, в client_dll + 0x4AC5E94 лежит моя стр-ра, дальше по адресам client_dll + 0x4AC5E94 + 0x10*i находятся стр-ры других игроков. Пробовал проверять через иф, не помогает вроде, да и хз, должно ли.
Пробовал что-то такое:
C++:
for (short i(0); i < 32; i++)   
            if (client_dll + 0x4AC5E94 + 0x10 * i != NULL)
            {
                x = *(float*)(0xa0 + *(DWORD*)(client_dll + 0x4AC5E94 + 0x10 * i));
                y = *(float*)(0xa0 + 0x4 + *(DWORD*)(client_dll + 0x4AC5E94 + 0x10 * i));
                z = *(float*)(0xa0 + 0x8 + *(DWORD*)(client_dll + 0x4AC5E94 + 0x10 * i));//высота
                alpha = *(float*)(0x128 + *(DWORD*)(client_dll + 0x4AC5E94 + 0x10 * i));
                beta = *(float*)(0x12c + *(DWORD*)(client_dll + 0x4AC5E94 + 0x10 * i));
                hp = *(int*)(0xfc + *(DWORD*)(client_dll + 0x4AC5E94 + 0x10 * i));
                team = *(short*)(0xf0 + *(DWORD*)(client_dll + 0x4AC5E94 + 0x10 * i));
            }

пс на самом деле, вак - не такая уж страшная штука, немного про него порасспрашивал
YrdO99kMUOc.jpg
 
  • Нравится
Реакции: RanGoo

Dark_Knight

Me, me and me.
Друг
4,078
2,095
Получай сначала количество игроков на сервере. Потом уже юзай цикл.
 
  • Нравится
Реакции: RanGoo

p1cador

cerf
Проверенный
221
359
Получай сначала количество игроков на сервере. Потом уже юзай цикл.
Хотел так сделать, но там, вроде, не всегда адресация по порядку идет
Да и в любом случае, как можно проверить указатель?
 
Последнее редактирование:
  • Нравится
Реакции: RanGoo

FYP

Известный
Администратор
1,763
5,906
if (client_dll + 0x4AC5E94 + 0x10 * i != NULL)
if (*(intptr_t*)(client_dll + 0x4AC5E94 + 0x10 * i) != NULL)

советую повыпиливать всю эту хуету с оффсетами и заменить их структурами и массивами - это избавит от лишней головной боли.
а для каких-то отдельных значений можно использовать, например, такое: https://gist.github.com/THE-FYP/81d68e85a198b01b911ff6aa7197910b
 
  • Нравится
Реакции: RanGoo и p1cador

D3structoR

Известный
71
92
[m0d sa]При телепортировании ко всем игрокам цикл находит только ид 0. В чем проблема может быть?
 
  • Нравится
Реакции: RanGoo

p1cador

cerf
Проверенный
221
359
Как проверить кнопку на однократное нажатие?
Желательно без огромных хуков клавиатуры.
 
Последнее редактирование:
  • Нравится
Реакции: RanGoo

iAmerican

Известный
Друг
614
260
Как проверить кнопку на однократное нажатие?
Желательно без огромных хуков клавиатуры.
Для работы с кнопками можно использовать метод GetAsyncKeyState(Байт_код), но с ней иногда бывают проблеммы(залипание, фантомное срабатывание иногда просто не действует), поэтому опишем свою функцию.
Прототип:
C++:
BOOL  State_Key(int Key,DWORD dwTimeOut);
Key - байт код клавиши
dwTimeOut - время до возможности повторного действия в Мсек(не совсем точное определение)

Определяем структуру.
C++:
static struct _Keys
{
bool        bPressed;
DWORD       dwStartTime;
}kPressingKeys[256];

функа :
C++:
BOOL  State_Key(int Key,DWORD dwTimeOut)
{
if(HIWORD(GetKeyState(Key)))
{
  if(!kPressingKeys[Key].bPressed || (kPressingKeys[Key].dwStartTime && (kPressingKeys[Key].dwStartTime + dwTimeOut) <= GetTickCount()))
  {
   kPressingKeys[Key].bPressed = TRUE;
   if( dwTimeOut > NULL )
    kPressingKeys[Key].dwStartTime = GetTickCount();
   return TRUE;
  }
}
else
  kPressingKeys[Key].bPressed = FALSE;
return FALSE;
}

Ставишь в функе время, секунд 15 , думаю хватит.

Автор "крайслер"
Взято с zhyk.ru.

p.s. делал как то без времени , когда запаривался по поводу этого вопроса , но так как все свои сурсы проебал , не помню уже.
 

TheMY3

Известный
33
8
Кто нибудь компилил C++ для SAMPFUNCS на Ubuntu? У меня с инклудами проблема, нашел выход только поставить виртуалку и скачать VC 2012
 
  • Нравится
Реакции: RanGoo