ASI ResetRemove

kin4stat

mq-team · kin4@naebalovo.team
Автор темы
Всефорумный модератор
2,744
4,808
Версия SA-MP
  1. 0.3.7 (R1)
  2. 0.3.7-R2
  3. 0.3.7-R3
  4. 0.3.7-R4
  5. CR-MP 0.3.7
Убирает краш, связанный с переполнением буфера RPC_ScrRemoveBuildingForPlayer, при частых переподключениях.

source: https://github.com/kin4stat/samp_reset_remove
 

Вложения

  • reset_remove.asi
    109.5 KB · Просмотры: 1,679
Последнее редактирование:

kin4stat

mq-team · kin4@naebalovo.team
Автор темы
Всефорумный модератор
2,744
4,808
UPD:
Починил плагин, спустя 2 года(спасибо что напомнили лол)

Ну еще сурс прилагаю сюда же, и работу на R1 и R3(на другие мне лень адреса искать, кому не лень - PR на гитхабе откройте, сделаю)
 

Я Санёк

Потрачен
206
68
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
люти пон
 

sizeoftrickster

Известный
Проверенный
139
565
Лень открывать PR 😇
C++:
R2
EntryPoint -> 0x3195DD
hook_address -> 0xA122
zero_address -> 0x13B958

R4
EntryPoint -> 0xCBCB0
hook_address -> 0xA605
zero_address -> 0x14FC00
 

kizn

\ 0 _ 0 /
Всефорумный модератор
2,408
2,090
  • Нравится
Реакции: sizeoftrickster

Preston.

Новичок
2
0
а куда скрипты пихать а то я в корень чисто закинул и вылетает каждую 1 минуту
 

ARMOR

Модератор по раксампу
Модератор
4,936
6,738
Добавил R5 и DL.

Исходник:
C++:
#include "kthook/kthook.hpp"
enum class samp_version {
  kR1,
  kR2,
  kR3,
  kR4,
  kR5,
  kDL,
  kUnknown,
};
samp_version get_samp_version() {
  static samp_version ver = []() {
    auto base = reinterpret_cast<std::uintptr_t>(GetModuleHandleA("samp.dll"));
    auto ntheader = reinterpret_cast<IMAGE_NT_HEADERS*>(base + reinterpret_cast<IMAGE_DOS_HEADER*>(base)->e_lfanew);
    // NOLINT(performance-no-int-to-ptr)
    auto ep = ntheader->OptionalHeader.AddressOfEntryPoint;
    switch (ep) {
    case 0x31DF13:
      return samp_version::kR1;
    case 0x3195DD:
      return samp_version::kR2;
    case 0xCC4D0:
      return samp_version::kR3;
    case 0xCBCB0:
      return samp_version::kR4;
    case 0xCBC90:
      return samp_version::kR5;
    case 0xFDB60:
      return samp_version::kDL;
    default:
      return samp_version::kUnknown;
    }
  }();
  return ver;
}

struct Plugin {
  using window_init_t = HWND(__cdecl*)(HINSTANCE);
  Plugin() {
    auto sampdll = reinterpret_cast<std::uintptr_t>(GetModuleHandleA("samp.dll"));
    if (sampdll == 0) {
      window_init_hook.set_cb([this](const auto& hook, auto&& hinst) {
        make_hook();
        return hook.get_trampoline()(hinst);
      });
      window_init_hook.install();
    }
    else {
      make_hook();
    }
  }
  void make_hook() {
    auto sampdll = reinterpret_cast<std::uintptr_t>(GetModuleHandleA("samp.dll"));
    if (sampdll) {
      std::uintptr_t hook_address = 0;
      std::uintptr_t zero_address = 0;
      switch (get_samp_version()) {
      case samp_version::kR1:
        hook_address = sampdll + 0xA131;
        zero_address = sampdll + 0x13B958;
        break;
      case samp_version::kR2:
        hook_address = sampdll + 0xA122;
        zero_address = sampdll + 0x13B958;
        break;
      case samp_version::kR3:
        hook_address = sampdll + 0xA2BA;
        zero_address = sampdll + 0x14FAD8;
        break;
      case samp_version::kR4:
        hook_address = sampdll + 0xA605;
        zero_address = sampdll + 0x14FC00;
        break;
      case samp_version::kR5:
        hook_address = sampdll + 0xA618;
        zero_address = sampdll + 0x14FD88;
        break;
      case samp_version::kDL:
        hook_address = sampdll + 0xA302;
        zero_address = sampdll + 0x18DC18;
        break;
      default:
        // if samp version unknown, then hook_address will be zero and
        // kthook_naked.install() wont install hook
        break;
      }
      reset_hook.set_dest(hook_address);
      reset_hook.set_cb([this, zero_address](const kthook::kthook_naked& hook) {
        *reinterpret_cast<unsigned long*>(zero_address) = 0;
      });
      reset_hook.install();
    }
  }
  kthook::kthook_naked reset_hook;
  kthook::kthook_simple<window_init_t> window_init_hook{0x745560};
} instance{};
 

Вложения

  • reset_remove.asi
    118.5 KB · Просмотры: 48