обход /crash

IlyaHL2

Активный
Автор темы
231
49
Версия MoonLoader
.026-beta
Данное животное https://pawno-rus.ru/topic/75-krashnut-igroka-crash/ создала эту тему и на сервере где я обычно веселюсь, используют её частенько
Я попытался игнорировать данный вывод текста, но меня все равно крашит, wtf?
Lua:
function on.onDisplayGameText(style, time, text)
    if text == "•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/" then
        if style == 0 then
            sampAddChatMessage('Вас попытались крашнуть админы данного проекта', mClr)
            sampAddChatMessage('но я их в рот ебал так что они идут нахуй', mClr)
        end
        return false
    end
end

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

При чем все работает

[12:46:29] Вас попытались крашнуть админы данного проекта

[12:46:29] но я их в рот ебал так что они идут нахуй

Снимок экрана (1489).png
 
Последнее редактирование:
  • Грустно
Реакции: RedHolms

RedHolms

Известный
Проверенный
622
369
Эта тема меня заинтересовала, но пока что единственное, что я понял - крашит именно d3d9.dll, т.е. RPC проходит

Смешная вещь получилась. Краш то пофиксил, но зато пропадает текст везде. Возможно это проблема моей сборки, ты тоже чекни.
Энивей, такое решение подавало большие надежды) Скорее всего, можно банально хукать функцию гташки, которая отрисовывать гейм текст (или это самп, хз) и там уже чекать текст и убирать его, если надо
Lua:
local ffi = require "ffi"

ffi.cdef [[
  int __stdcall VirtualProtect(void* address, size_t size, unsigned long prot, unsigned long* prev_prot);
  void* __stdcall VirtualAlloc(void* address, size_t size, unsigned long alloc_type, unsigned long prot);
  int __stdcall VirtualFree(void* address, size_t size, unsigned long free_type);
  void __stdcall MessageBoxA(int, const char*, const char*, int);
]]
local Kernel32 = ffi.load("Kernel32.dll")

local function showGameText(text, time, style)
  local bs = raknetNewBitStream()
  raknetBitStreamWriteInt32(bs, style)
  raknetBitStreamWriteInt32(bs, time)
  raknetBitStreamWriteInt32(bs, #text)
  raknetBitStreamWriteString(bs, text)
  raknetEmulRpcReceiveBitStream(73, bs)
end

--[[
original code with bug:

.text:101336E0  mov     eax, [eax+4]         <- bug here (EAX = 1)
.text:101336E3  test    eax, eax
.text:101336E5  jz      short loc_101336EB
.text:101336E7  mov     byte ptr [eax+5], 1

fixed code:
fixed code is hooked at 101336E0 (jmp will be placed)

  cmp     eax, 0xffff               <- actual fix
  jb      return                    <- actual fix
  mov     eax, dword ptr [eax + 4]
  test    eax, eax
  jz      return
  mov     byte ptr [eax+5], 1
return:
  jmp     0x101336EB
]]
local FIXED_CODE = "\x3d\xff\xff\x00\x00\x72\x0b\x8b\x40\x04\x85\xc0\x74\x04\xc6\x40\x05\x01\xe9\xd4\x36\x13\x10"
local OFFSET_TO_JUMP = 19

local helper_address_voidptr
local helper_address_uintptr

local original_code = ffi.new("char[11]")
local old_prot = ffi.new("unsigned long[1]")

local function fixCrash()
  local d3d9_base = getModuleHandle("C:\\Windows\\SysWOW64\\d3d9.dll")

  if d3d9_base == 0 then
    ffi.C.MessageBoxA(0, "DAUN", "No d3d9!!!\nAnd it's not my fault", 0)
    print("no d3d9!!! can't fix crash. admini pobedili(((")
    return
  end

  helper_address_voidptr = Kernel32.VirtualAlloc(nil, #FIXED_CODE, 0x00001000, 0x40)
  helper_address_uintptr = tonumber(ffi.cast("uintptr_t", helper_address_voidptr))
  ffi.copy(helper_address_voidptr, FIXED_CODE)

  ffi.cast("uintptr_t*", helper_address_uintptr + OFFSET_TO_JUMP)[0] =
    (d3d9_base + 0x1336EB) -
    (helper_address_uintptr + OFFSET_TO_JUMP + 4)

  local hook_place_voidptr = ffi.cast("void*", d3d9_base + 0x1336E0)

  Kernel32.VirtualProtect(hook_place_voidptr, 11, 0x40, old_prot)

  ffi.copy(original_code, hook_place_voidptr, 11)

  ffi.cast("char*", d3d9_base + 0x1336E0)[0] = 0xE9
  ffi.cast("uintptr_t*", d3d9_base + 0x1336E1)[0] = helper_address_uintptr - (d3d9_base + 0x1336E0 + 5)

  Kernel32.VirtualProtect(hook_place_voidptr, 11, old_prot[0], old_prot)

  print("crash fixed. sosat admini")
end

addEventHandler("onScriptTerminate", function(script, quitGame)
  if script == thisScript() then
    local d3d9_base = getModuleHandle("d3d9.dll")
    local hook_place_voidptr = ffi.cast("void*", d3d9_base + 0x1336E0)
    Kernel32.VirtualProtect(hook_place_voidptr, 11, 0x40, old_prot)

    ffi.copy(hook_place_voidptr, original_code, 11)

    Kernel32.VirtualProtect(hook_place_voidptr, 11, old_prot[0], old_prot)
  end
end)

function main()
  while not isSampAvailable() do wait(0) end

  fixCrash()

  sampRegisterChatCommand("crr", function()
    lua_thread.create(function()
      wait(0)
      showGameText("•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/", 1000, 0)
      showGameText("•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/", 2000, 1)
      showGameText("•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/", 3000, 2)
      showGameText("•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/", 4000, 3)
      showGameText("•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/", 5000, 4)
      showGameText("•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/", 6000, 5)
      showGameText("•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/", 7000, 6)
    end)
  end)

  wait(-1)
end
 
Последнее редактирование:
D

deleted-user-222200

Гость
Данное животное https://pawno-rus.ru/topic/75-krashnut-igroka-crash/ создала эту тему и на сервере где я обычно веселюсь, используют её частенько
Я попытался игнорировать данный вывод текста, но меня все равно крашит, wtf?
Lua:
function on.onDisplayGameText(style, time, text)
    if text == "•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/" then
        if style == 0 then
            sampAddChatMessage('Вас попытались крашнуть админы данного проекта', mClr)
            sampAddChatMessage('но я их в рот ебал так что они идут нахуй', mClr)
        end
        return false
    end
end

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

При чем все работает



Посмотреть вложение 211798


Держи:
function sampev.onDisplayGameText(style, time, text) 
    local chars = 0
    for i = 1, #text do
        local v = string.sub(text, i, i)
        if chars >= 20 then
            sampfuncsLog("Server crashes you with 21 chars in the GameText func: "..text.."!")
            return false
        end
        chars = chars + 1
    end
end
Функция костыльная, проверял на локальном дедике, краш вызывался от 20 символов в геймтексте
 
Последнее редактирование модератором:
  • Вау
  • Нравится
Реакции: qdIbp и sizeoftrickster

IlyaHL2

Активный
Автор темы
231
49
Эта тема меня заинтересовала, но пока что единственное, что я понял - крашит именно d3d9.dll, т.е. RPC проходит

Смешная вещь получилась. Краш то пофиксил, но зато пропадает текст везде. Возможно это проблема моей сборки, ты тоже чекни.
Энивей, такое решение подавало большие надежды) Скорее всего, можно банально хукать функцию гташки, которая отрисовывать гейм текст (или это самп, хз) и там уже чекать текст и убирать его, если надо
Lua:
local ffi = require "ffi"

ffi.cdef [[
  int __stdcall VirtualProtect(void* address, size_t size, unsigned long prot, unsigned long* prev_prot);
  void* __stdcall VirtualAlloc(void* address, size_t size, unsigned long alloc_type, unsigned long prot);
  int __stdcall VirtualFree(void* address, size_t size, unsigned long free_type);
  void __stdcall MessageBoxA(int, const char*, const char*, int);
]]
local Kernel32 = ffi.load("Kernel32.dll")

local function showGameText(text, time, style)
  local bs = raknetNewBitStream()
  raknetBitStreamWriteInt32(bs, style)
  raknetBitStreamWriteInt32(bs, time)
  raknetBitStreamWriteInt32(bs, #text)
  raknetBitStreamWriteString(bs, text)
  raknetEmulRpcReceiveBitStream(73, bs)
end

--[[
original code with bug:

.text:101336E0  mov     eax, [eax+4]         <- bug here (EAX = 1)
.text:101336E3  test    eax, eax
.text:101336E5  jz      short loc_101336EB
.text:101336E7  mov     byte ptr [eax+5], 1

fixed code:
fixed code is hooked at 101336E0 (jmp will be placed)

  cmp     eax, 0xffff               <- actual fix
  jb      return                    <- actual fix
  mov     eax, dword ptr [eax + 4]
  test    eax, eax
  jz      return
  mov     byte ptr [eax+5], 1
return:
  jmp     0x101336EB
]]
local FIXED_CODE = "\x3d\xff\xff\x00\x00\x72\x0b\x8b\x40\x04\x85\xc0\x74\x04\xc6\x40\x05\x01\xe9\xd4\x36\x13\x10"
local OFFSET_TO_JUMP = 19

local helper_address_voidptr
local helper_address_uintptr

local original_code = ffi.new("char[11]")
local old_prot = ffi.new("unsigned long[1]")

local function fixCrash()
  local d3d9_base = getModuleHandle("C:\\Windows\\SysWOW64\\d3d9.dll")

  if d3d9_base == 0 then
    ffi.C.MessageBoxA(0, "DAUN", "No d3d9!!!\nAnd it's not my fault", 0)
    print("no d3d9!!! can't fix crash. admini pobedili(((")
    return
  end

  helper_address_voidptr = Kernel32.VirtualAlloc(nil, #FIXED_CODE, 0x00001000, 0x40)
  helper_address_uintptr = tonumber(ffi.cast("uintptr_t", helper_address_voidptr))
  ffi.copy(helper_address_voidptr, FIXED_CODE)

  ffi.cast("uintptr_t*", helper_address_uintptr + OFFSET_TO_JUMP)[0] =
    (d3d9_base + 0x1336EB) -
    (helper_address_uintptr + OFFSET_TO_JUMP + 4)

  local hook_place_voidptr = ffi.cast("void*", d3d9_base + 0x1336E0)

  Kernel32.VirtualProtect(hook_place_voidptr, 11, 0x40, old_prot)

  ffi.copy(original_code, hook_place_voidptr, 11)

  ffi.cast("char*", d3d9_base + 0x1336E0)[0] = 0xE9
  ffi.cast("uintptr_t*", d3d9_base + 0x1336E1)[0] = helper_address_uintptr - (d3d9_base + 0x1336E0 + 5)

  Kernel32.VirtualProtect(hook_place_voidptr, 11, old_prot[0], old_prot)

  print("crash fixed. sosat admini")
end

addEventHandler("onScriptTerminate", function(script, quitGame)
  if script == thisScript() then
    local d3d9_base = getModuleHandle("d3d9.dll")
    local hook_place_voidptr = ffi.cast("void*", d3d9_base + 0x1336E0)
    Kernel32.VirtualProtect(hook_place_voidptr, 11, 0x40, old_prot)

    ffi.copy(hook_place_voidptr, original_code, 11)

    Kernel32.VirtualProtect(hook_place_voidptr, 11, old_prot[0], old_prot)
  end
end)

function main()
  while not isSampAvailable() do wait(0) end

  fixCrash()

  sampRegisterChatCommand("crr", function()
    lua_thread.create(function()
      wait(0)
      showGameText("•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/", 1000, 0)
      showGameText("•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/", 2000, 1)
      showGameText("•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/", 3000, 2)
      showGameText("•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/", 4000, 3)
      showGameText("•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/", 5000, 4)
      showGameText("•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/", 6000, 5)
      showGameText("•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/", 7000, 6)
    end)
  end)

  wait(-1)
end
Попробуем
Держи:
function sampev.onDisplayGameText(style, time, text)
    local chars = 0
    for i = 1, #text do
        local v = string.sub(text, i, i)
        if chars >= 20 then
            sampfuncsLog("Server crashes you with 21 chars in the GameText func: "..text.."!")
            return false
        end
        chars = chars + 1
    end
end
Функция костыльная, проверял на локальном дедике, краш вызывался от 20 символов в геймтексте
с шансом 95% не заработает
 

XRLM

Против ветра рождённый
Модератор
1,571
1,160
Данное животное https://pawno-rus.ru/topic/75-krashnut-igroka-crash/ создала эту тему и на сервере где я обычно веселюсь, используют её частенько
Я попытался игнорировать данный вывод текста, но меня все равно крашит, wtf?
Lua:
function on.onDisplayGameText(style, time, text)
    if text == "•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/" then
        if style == 0 then
            sampAddChatMessage('Вас попытались крашнуть админы данного проекта', mClr)
            sampAddChatMessage('но я их в рот ебал так что они идут нахуй', mClr)
        end
        return false
    end
end

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

При чем все работает



Посмотреть вложение 211798
зачем ты делаешь проверку по 0 стилю, если сервер отправляет тебе все 7 стилей?
1692281105968.png
 
  • Эм
  • Клоун
Реакции: Air_Official и IlyaHL2

RedHolms

Известный
Проверенный
622
369
  • Эм
Реакции: XRLM

IlyaHL2

Активный
Автор темы
231
49
Эта тема меня заинтересовала, но пока что единственное, что я понял - крашит именно d3d9.dll, т.е. RPC проходит

Смешная вещь получилась. Краш то пофиксил, но зато пропадает текст везде. Возможно это проблема моей сборки, ты тоже чекни.
Энивей, такое решение подавало большие надежды) Скорее всего, можно банально хукать функцию гташки, которая отрисовывать гейм текст (или это самп, хз) и там уже чекать текст и убирать его, если надо
Lua:
local ffi = require "ffi"

ffi.cdef [[
  int __stdcall VirtualProtect(void* address, size_t size, unsigned long prot, unsigned long* prev_prot);
  void* __stdcall VirtualAlloc(void* address, size_t size, unsigned long alloc_type, unsigned long prot);
  int __stdcall VirtualFree(void* address, size_t size, unsigned long free_type);
  void __stdcall MessageBoxA(int, const char*, const char*, int);
]]
local Kernel32 = ffi.load("Kernel32.dll")

local function showGameText(text, time, style)
  local bs = raknetNewBitStream()
  raknetBitStreamWriteInt32(bs, style)
  raknetBitStreamWriteInt32(bs, time)
  raknetBitStreamWriteInt32(bs, #text)
  raknetBitStreamWriteString(bs, text)
  raknetEmulRpcReceiveBitStream(73, bs)
end

--[[
original code with bug:

.text:101336E0  mov     eax, [eax+4]         <- bug here (EAX = 1)
.text:101336E3  test    eax, eax
.text:101336E5  jz      short loc_101336EB
.text:101336E7  mov     byte ptr [eax+5], 1

fixed code:
fixed code is hooked at 101336E0 (jmp will be placed)

  cmp     eax, 0xffff               <- actual fix
  jb      return                    <- actual fix
  mov     eax, dword ptr [eax + 4]
  test    eax, eax
  jz      return
  mov     byte ptr [eax+5], 1
return:
  jmp     0x101336EB
]]
local FIXED_CODE = "\x3d\xff\xff\x00\x00\x72\x0b\x8b\x40\x04\x85\xc0\x74\x04\xc6\x40\x05\x01\xe9\xd4\x36\x13\x10"
local OFFSET_TO_JUMP = 19

local helper_address_voidptr
local helper_address_uintptr

local original_code = ffi.new("char[11]")
local old_prot = ffi.new("unsigned long[1]")

local function fixCrash()
  local d3d9_base = getModuleHandle("C:\\Windows\\SysWOW64\\d3d9.dll")

  if d3d9_base == 0 then
    ffi.C.MessageBoxA(0, "DAUN", "No d3d9!!!\nAnd it's not my fault", 0)
    print("no d3d9!!! can't fix crash. admini pobedili(((")
    return
  end

  helper_address_voidptr = Kernel32.VirtualAlloc(nil, #FIXED_CODE, 0x00001000, 0x40)
  helper_address_uintptr = tonumber(ffi.cast("uintptr_t", helper_address_voidptr))
  ffi.copy(helper_address_voidptr, FIXED_CODE)

  ffi.cast("uintptr_t*", helper_address_uintptr + OFFSET_TO_JUMP)[0] =
    (d3d9_base + 0x1336EB) -
    (helper_address_uintptr + OFFSET_TO_JUMP + 4)

  local hook_place_voidptr = ffi.cast("void*", d3d9_base + 0x1336E0)

  Kernel32.VirtualProtect(hook_place_voidptr, 11, 0x40, old_prot)

  ffi.copy(original_code, hook_place_voidptr, 11)

  ffi.cast("char*", d3d9_base + 0x1336E0)[0] = 0xE9
  ffi.cast("uintptr_t*", d3d9_base + 0x1336E1)[0] = helper_address_uintptr - (d3d9_base + 0x1336E0 + 5)

  Kernel32.VirtualProtect(hook_place_voidptr, 11, old_prot[0], old_prot)

  print("crash fixed. sosat admini")
end

addEventHandler("onScriptTerminate", function(script, quitGame)
  if script == thisScript() then
    local d3d9_base = getModuleHandle("d3d9.dll")
    local hook_place_voidptr = ffi.cast("void*", d3d9_base + 0x1336E0)
    Kernel32.VirtualProtect(hook_place_voidptr, 11, 0x40, old_prot)

    ffi.copy(hook_place_voidptr, original_code, 11)

    Kernel32.VirtualProtect(hook_place_voidptr, 11, old_prot[0], old_prot)
  end
end)

function main()
  while not isSampAvailable() do wait(0) end

  fixCrash()

  sampRegisterChatCommand("crr", function()
    lua_thread.create(function()
      wait(0)
      showGameText("•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/", 1000, 0)
      showGameText("•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/", 2000, 1)
      showGameText("•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/", 3000, 2)
      showGameText("•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/", 4000, 3)
      showGameText("•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/", 5000, 4)
      showGameText("•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/", 6000, 5)
      showGameText("•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/", 7000, 6)
    end)
  end)

  wait(-1)
end
не робит :(

зачем ты делаешь проверку по 0 стилю, если сервер отправляет тебе все 7 стилей?
Посмотреть вложение 212151
ЧТобы уведомить о том что начали крашить
 

XRLM

Против ветра рождённый
Модератор
1,571
1,160
Что бы сообщение о краше выводилось только 1 раз
а блять я понял

попробуй заменить text == "•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/" на text:find("•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/")
 

IlyaHL2

Активный
Автор темы
231
49
а блять я понял

попробуй заменить text == "•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/" на text:find("•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/")
а толку? он находит text == "•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/" но он его вроде и return false но все равно крашит
 

XRLM

Против ветра рождённый
Модератор
1,571
1,160
а толку? он находит text == "•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/" но он его вроде и return false но все равно крашит
первый способ сравнивает строку с другой, а второй способ ищет в строке указанный текст
 
  • Bug
  • Клоун
Реакции: Air_Official и IlyaHL2

IlyaHL2

Активный
Автор темы
231
49
а блять я понял

попробуй заменить text == "•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/" на text:find("•¤¶§!$$%&'()*+,-./01~!@#$^&*()_-+={[}]:;'<,>.?/")

И тем более это должно выгладить так, чтобы match распознал спец символы
1692281670422.png
 
  • Bug
Реакции: XRLM

IlyaHL2

Активный
Автор темы
231
49
не совсем понял а смысл с сервера крашить игрока
нубо рп как ни как, школьники с обедов копят чтобы купить привилегию + команды к ним, чтобы чувствовать власть
и одна из этих команд /crash

Где то 200-500р стоит
 

oliburn

Известный
307
112
нубо рп как ни как, школьники с обедов копят чтобы купить привилегию + команды к ним, чтобы чувствовать власть
и одна из этих команд /crash

Где то 200-500р стоит
Почему не выбрать другой нубо рп?
 
  • Грустно
Реакции: IlyaHL2