C++ Вопрос Поинтер Чек

На самом деле я Zodiak
Участник
Статус
Оффлайн
Регистрация
22 Дек 2020
Сообщения
1,022
Реакции[?]
181
Поинты[?]
70K
Заебись поинтер чек братва ? Реально хайпово ? Или лютый кринж ? Жидкий такой кринжулик...?


C++:
template <typename T>
    static bool pointer_check ( uintptr_t adress, pointer_check_properties* ret_props = 0 )
    {
        if ( adress <= 0x40000 || adress >= 0x7ffffffffff )
            return false;

        MEMORY_BASIC_INFORMATION basic_info;
        auto query_result = VirtualQuery ( ( void* ) adress, &basic_info, sizeof ( MEMORY_BASIC_INFORMATION ) );
        if ( !query_result )
            return false;

        auto allocation_base = basic_info.AllocationBase;
        auto allocation_protect = basic_info.AllocationProtect;
        auto base_adress = basic_info.BaseAddress;
        auto protect = basic_info.Protect;
        auto region_size = basic_info.RegionSize;
        auto max_valid_adress = ( uintptr_t ) allocation_base + region_size;

        if ( !allocation_base ||
             allocation_protect == PAGE_NOACCESS ||
             allocation_protect == 0 ||
             protect == PAGE_NOACCESS ||
             protect == 0 ||
             !base_adress ||
             !region_size ||
             max_valid_adress <= adress
             )
            return false;

        if ( IsBadReadPtr ( ( void* ) adress, sizeof( T ) ) )
            return false;

        if ( protect != PAGE_READONLY )
            if ( IsBadWritePtr ( ( void* ) adress, sizeof ( T ) ) )
                return false;

        if ( ret_props )
            ret_props->page_protection = protect;

        return true;
    }
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
чел ты мог просто юзнуть

if ( IsBadReadPtr ( ( void* ) adress, sizeof( T ) ) )
return false;
 
На самом деле я Zodiak
Участник
Статус
Оффлайн
Регистрация
22 Дек 2020
Сообщения
1,022
Реакции[?]
181
Поинты[?]
70K
Забаненный
Статус
Оффлайн
Регистрация
24 Июн 2024
Сообщения
28
Реакции[?]
3
Поинты[?]
3K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
а ты чекни какой нибудь адрес типа 0xC5081182 такой хуйней
и что, оно вернет, что бэд адресс, IsBadReadPtr если я не ошибаюсь, хендлит access violation, если адресс не прочитался
 
На самом деле я Zodiak
Участник
Статус
Оффлайн
Регистрация
22 Дек 2020
Сообщения
1,022
Реакции[?]
181
Поинты[?]
70K
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
че это за помойный код? хуйня какая-то

много зависимостей лошара, а isbadread и isbadwrite можно битвыми операциями реализовать, а virtual query экспортом вызвать
всм отдельным экспортом?
аизбедриад и так побитовыми операцеями же не? или ты имеешь ввиду побитывимиаперацииями на самом адресе

bool util::IsBadReadPtr( void* p )
{
MEMORY_BASIC_INFORMATION mbi = { 0 };
if ( ::VirtualQuery( p, &mbi, sizeof( mbi ) ) )
{
DWORD mask = ( PAGE_READONLY | PAGE_READWRITE | PAGE_WRITECOPY | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY );
bool b = !( mbi.Protect & mask );

if ( mbi.Protect & ( PAGE_GUARD | PAGE_NOACCESS ) ) b = true;

return b;
}
return true;
}
 
На самом деле я Zodiak
Участник
Статус
Оффлайн
Регистрация
22 Дек 2020
Сообщения
1,022
Реакции[?]
181
Поинты[?]
70K
побитывимиаперацииями на самом адресе
Да, я точно не помню реализации но можно
bool util::IsBadReadPtr( void* p )
{
MEMORY_BASIC_INFORMATION mbi = { 0 };
if ( ::VirtualQuery( p, &mbi, sizeof( mbi ) ) )
{
DWORD mask = ( PAGE_READONLY | PAGE_READWRITE | PAGE_WRITECOPY | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY );
bool b = !( mbi.Protect & mask );

if ( mbi.Protect & ( PAGE_GUARD | PAGE_NOACCESS ) ) b = true;

return b;
}
return true;
}
можно же просто


C++:
BOOL __stdcall IsBadReadPtr(const void *lp, UINT_PTR ucb)
{
  unsigned __int64 v2; // rdx
  unsigned __int64 v3; // rax
  unsigned __int64 v5; // [rsp+28h] [rbp+10h]
  unsigned __int64 v6; // [rsp+28h] [rbp+10h]

  if ( !ucb )
    return 0;
  if ( lp )
  {
    v5 = (unsigned __int64)lp + ucb - 1;
    if ( v5 >= (unsigned __int64)lp )
    {
      v2 = (unsigned __int64)lp & -4096;
      v3 = -4096 & v5;
      v6 = v3;
      while ( v2 != v3 )
      {
        v2 += (unsigned int)4096;
        v3 = v6;
      }
      return 0;
    }
  }
  return 1;
}
 
Последнее редактирование:
На самом деле я Zodiak
Участник
Статус
Оффлайн
Регистрация
22 Дек 2020
Сообщения
1,022
Реакции[?]
181
Поинты[?]
70K
и что, оно вернет, что бэд адресс, IsBadReadPtr если я не ошибаюсь, хендлит access violation, если адресс не прочитался
нет. не хэндлит.
покажи где именно оно хэндлит?
C++:
BOOL __stdcall IsBadReadPtr(const void *lp, UINT_PTR ucb)
{
  unsigned __int64 v2; // rdx
  unsigned __int64 v3; // rax
  unsigned __int64 v5; // [rsp+28h] [rbp+10h]
  unsigned __int64 v6; // [rsp+28h] [rbp+10h]

  if ( !ucb )
    return 0;
  if ( lp )
  {
    v5 = (unsigned __int64)lp + ucb - 1;
    if ( v5 >= (unsigned __int64)lp )
    {
      v2 = (unsigned __int64)lp & -4096;
      v3 = -4096 & v5;
      v6 = v3;
      while ( v2 != v3 )
      {
        v2 += (unsigned int)4096;
        v3 = v6;
      }
      return 0;
    }
  }
  return 1;
}
 
Модератор форума
Модератор
Статус
Оффлайн
Регистрация
19 Май 2018
Сообщения
954
Реакции[?]
1,067
Поинты[?]
20K
нет. не хэндлит.
покажи где именно оно хэндлит?
C++:
BOOL __stdcall IsBadReadPtr(const void *lp, UINT_PTR ucb)
{
  unsigned __int64 v2; // rdx
  unsigned __int64 v3; // rax
  unsigned __int64 v5; // [rsp+28h] [rbp+10h]
  unsigned __int64 v6; // [rsp+28h] [rbp+10h]

  if ( !ucb )
    return 0;
  if ( lp )
  {
    v5 = (unsigned __int64)lp + ucb - 1;
    if ( v5 >= (unsigned __int64)lp )
    {
      v2 = (unsigned __int64)lp & -4096;
      v3 = -4096 & v5;
      v6 = v3;
      while ( v2 != v3 )
      {
        v2 += (unsigned int)4096;
        v3 = v6;
      }
      return 0;
    }
  }
  return 1;
}
вот тут хендлит
1720515859923.png

Пожалуйста, авторизуйтесь для просмотра ссылки.
1720515903221.png
 
На самом деле я Zodiak
Участник
Статус
Оффлайн
Регистрация
22 Дек 2020
Сообщения
1,022
Реакции[?]
181
Поинты[?]
70K
Модератор форума
Модератор
Статус
Оффлайн
Регистрация
19 Май 2018
Сообщения
954
Реакции[?]
1,067
Поинты[?]
20K
На самом деле я Zodiak
Участник
Статус
Оффлайн
Регистрация
22 Дек 2020
Сообщения
1,022
Реакции[?]
181
Поинты[?]
70K
так нажми продолжить в дебаггере. при исключении сначала дебаггер останавливает, чтобы оповестить пользователя и дать выбор че делать дальше
my bad.
но хз иногда меня от краша не спасал этот чек

для меня любой эксепшн это уже повод переделывать, просто как правило они к крашам приводят, тем более изначально я не знал что там хэндлится
 
Начинающий
Статус
Оффлайн
Регистрация
2 Фев 2022
Сообщения
69
Реакции[?]
14
Поинты[?]
19K
нет. не хэндлит.
покажи где именно оно хэндлит?
C++:
BOOL __stdcall IsBadReadPtr(const void *lp, UINT_PTR ucb)
{
  unsigned __int64 v2; // rdx
  unsigned __int64 v3; // rax
  unsigned __int64 v5; // [rsp+28h] [rbp+10h]
  unsigned __int64 v6; // [rsp+28h] [rbp+10h]

  if ( !ucb )
    return 0;
  if ( lp )
  {
    v5 = (unsigned __int64)lp + ucb - 1;
    if ( v5 >= (unsigned __int64)lp )
    {
      v2 = (unsigned __int64)lp & -4096;
      v3 = -4096 & v5;
      v6 = v3;
      while ( v2 != v3 )
      {
        v2 += (unsigned int)4096;
        v3 = v6;
      }
      return 0;
    }
  }
  return 1;
}
 
Начинающий
Статус
Оффлайн
Регистрация
2 Фев 2022
Сообщения
69
Реакции[?]
14
Поинты[?]
19K
my bad.
но хз иногда меня от краша не спасал этот чек

для меня любой эксепшн это уже повод переделывать, просто как правило они к крашам приводят, тем более изначально я не знал что там хэндлится
В ntdll есть такой прикол


Ты можешь юзать эту функцию для чтения/записи, это похожая хуйня как для кернела PiDqSerializationWrite в которой есть обработка исключений
спасибо за уникальную информацию которой не было в теме очень благодарен
На тот момент не было мессаги выше
 
На самом деле я Zodiak
Участник
Статус
Оффлайн
Регистрация
22 Дек 2020
Сообщения
1,022
Реакции[?]
181
Поинты[?]
70K
Femboy Access
Эксперт
Статус
Оффлайн
Регистрация
11 Ноя 2020
Сообщения
1,333
Реакции[?]
428
Поинты[?]
96K
много зависимостей лошара, а isbadread и isbadwrite можно битвыми операциями реализовать, а virtual query экспортом вызвать
ты чё ваще не шаришь это c++ way за темплейтами будущее я c++20 king
че это за помойный код? хуйня какая-то
чоу ваще тип нубас не понимаешь простецкий с++ код
 
Похожие темы
Сверху Снизу