Исходник Гайд Lua vmt+jmp/call hook | Библиотека hooks.lua

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,634
2,482
  • Влюблен
  • Клоун
Реакции: Fott и Gorskin

RTD

Нестандартное звание
Автор темы
Модератор
391
414
*** Скрытый текст не может быть процитирован. ***
Потому что void* это "ничего", на нем даже адресная арифметика не работает, он заглушка. Если хочешь работать с параметрами, то явно нужно указывать тип. В данном случае указатель на структуру
Lua:
local D3D9Device = hooks.vmt.new(ffi.cast('uintptr_t*', 0xC97C28)[0])
hkReset = D3D9Device.hookMethod('long(__stdcall*)(void*, D3DPRESENT_PARAMETERS*)', hkReset, 16)
hkPresent = D3D9Device.hookMethod('long(__stdcall*)(void*, void*, void*, void*, void*)', hkPresent, 17)
--обращаться pPresentationParameters.FullScreen_RefreshRateInHz
кастуй pPresentationParameters в D3DPRESENT_PARAMETERS*
Lua:
local params = ffi.cast('D3DPRESENT_PARAMETERS*', pPresentationParameters)
print(params.FullScreen_RefreshRateInHz)
Нортон, брат. Зачем юзать лишние касты, если можно не юзать, а писать код сразу правильно?
 
  • Вау
  • Влюблен
Реакции: #Northn и Gorskin

Gorskin

I shit on you
Проверенный
1,246
1,043
А это нормально что хуки по какой-то причине вызывают функцию мейн?
 

Gorskin

I shit on you
Проверенный
1,246
1,043
Как можно исправить вызов main() постоянный?

И влияет ли объем кода на скорость хуков, или как там его....

У меня хукается Present
Он как-то вызывает функцию мейн.

UP Вызов main() пропал, решил путем добавления
jit.off(_, false) в код. Но чувствую что это не лучшее решение
 
Последнее редактирование:

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,634
2,482
Как можно исправить вызов main() постоянный?

И влияет ли объем кода на скорость хуков, или как там его....

У меня хукается Present
Он как-то вызывает функцию мейн.

UP Вызов main() пропал, решил путем добавления
jit.off(_, false) в код. Но чувствую что это не лучшее решение
 
  • Клоун
Реакции: Fott

savvin

Известный
407
140
Может быть не совсем по теме, но: возможно как-то хукнуть рендер определенных слоев, чтобы рендерить не поверх всего интерфейса? Знаю, что худ рендерится до интерфейса сампа, но следующий способ хоть и рабочий, но смысла не имеет.

Lua:
function main()
    DrawHud = hook.call.new('void(__cdecl*)()', DrawHud, 0x53E4FF)
end

function DrawHud()
    renderDrawBox(50.0, 50.0, 120.0, 120.0, -1)

    return DrawHud()
end

1682441159442.png
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,769
11,213
Может быть не совсем по теме, но: возможно как-то хукнуть рендер определенных слоев, чтобы рендерить не поверх всего интерфейса? Знаю, что худ рендерится до интерфейса сампа, но следующий способ хоть и рабочий, но смысла не имеет.

Lua:
function main()
    DrawHud = hook.call.new('void(__cdecl*)()', DrawHud, 0x53E4FF)
end

function DrawHud()
    renderDrawBox(50.0, 50.0, 120.0, 120.0, -1)

    return DrawHud()
end

Посмотреть вложение 199208
попробуй хукать это
R1
C++:
void CChat::Draw() {
    ((void(__thiscall*)(CChat*))GetAddress(0x64230))(this);
}

R3
C++:
void CChat::Draw() {
    ((void(__thiscall*)(CChat*))GetAddress(0x67680))(this);
}
 

RTD

Нестандартное звание
Автор темы
Модератор
391
414
Может быть не совсем по теме, но: возможно как-то хукнуть рендер определенных слоев, чтобы рендерить не поверх всего интерфейса?
 
  • Нравится
Реакции: ARMOR

optimal user

Известный
107
5
А это тебе похоже от луа привет, main вызвался второй раз
Старая проблема еще с начала написания...
Можешь закостылить так
Lua:
local init = false
function main()
    if init then
        script.this:reload() --без перезагрузки main будет вызываться каждый раз, почему-то багует
        return
    end
    --.....
    init = true
end
Я не знаю как это со стороны луа решать. У меня он практически не появляется, у других постоянно, у третьих раз в минут 30
появился фикс какой нибудь (не кастыль)?
неприятно видеть в консоли перезагрузки скрипта частые
 

why ega

РП игрок
Модератор
2,539
2,231
Опять же, чуть не по теме, но чет вообще не могу сообразить. Есть код обработки и отправки рпц, обработка происходит гуд, а вот отправка крашит игру
Lua:
require("sampfuncs")
require("SFlua.cdef")
local BitStream = require("SFlua.bitstream")
local add = require("SFlua.addition")
local hooks = require("hooks")
local ffi = require("ffi")


local pRakClient, pRakPeer
local originalOutgoingRpc


-- это находится в main() и получается после инициализации сампа
pRakClient = ffi.cast("intptr_t*", pSAMPInfo + 0x3C9)
pRakPeer = ffi.cast("intptr_t*", pRakClient[0] - 0xDDE)

local rakClient = hooks.vmt.new(pRakClient[0])
originalOutgoingRpc = rakClient.hookMethod("bool(__thiscall*)(void*, int*, SFL_BitStream*, char, char, char, bool)", handleOutgoingRpc, 25)
--


-- обработка происходит гуд, команда считывается, оригинальная функция возвращается без краша
function handleOutgoingRpc(this, id, bitStream, priority, reliability, orderingChannel, shiftTimestamp)
    local rpcId = ffi.cast("int *", id)[0]
    local pBitStream = add.GET_POINTER(bitStream)
    print("rpcId:", rpcId)
    if (rpcId == 50) then      
        local command = raknetBitStreamReadString(pBitStream, raknetBitStreamReadInt32(pBitStream))      
        if (command == "/srpc") then                    
            local bs = BitStream()                      
            sendRpc(52, bs)            
        end      
    end      
    return originalOutgoingRpc(this, id, bitStream, priority, reliability, orderingChannel, shiftTimestamp)
end


-- а вот эта шняга крашит
function sendRpc(id, bs)
    if not pRakClient then return false end
    id = ffi.cast("int*", id)                    
    return originalOutgoingRpc(pRakClient, id, bs, HIGH_PRIORITY, RELIABLE_ORDERED, 0, false) -- при вызове ориг функции с заданными параметрами игру крашит
end
 
Последнее редактирование: