Здрасте, продолжаем насиловать игру хуками, только уже виртуальных таблиц(обычный jmp hook - https://www.blast.hk/threads/39138/).
Решил сделать либу, в которой этот и jmp хук, ее нужно кинуть в папку /moonloader/lib/
Затрагивая jmp hook, использование никак не изменилось, только пишем
Хуки при завершении скрипта сами снимутся
Теперь про vmt hook, его использование
Требования
Покажу на примере хука метода ракнета, т.к. изначально под него и писалось это чудо. Только там для SAMP R3 было, а тут будет R1
Собственно пишем под ракнет, значит качаем SF.lua(https://github.com/SF-lua/SF.lua/tree/master/SFlua) или хотя бы его библиотеку bitstream.lua. Спасибо за это чудо
Первым делом подключаем либы
Далее ждем инициализации SAMP и узнаем указатель на RakClientInterface
Инициализируем хук
И нам становятся доступны методы
Узнаем прототип, индекс, пишем калбек и ставим хук на функцию отправки пакетов
Полный код
Всем добра, любви и процветания, спасибо за внимание
p.s. можете так еще насиловать directx9, как тут: https://www.blast.hk/threads/13380/post-890736
Решил сделать либу, в которой этот и jmp хук, ее нужно кинуть в папку /moonloader/lib/
Затрагивая jmp hook, использование никак не изменилось, только пишем
Lua:
local hook = require("hooks")
tableHook = hook.jmp.new(прототип, калбэк, адрес, размер)
--вместо tableHook = hook.new(прототип, калбэк, адрес, размер)
Хуки при завершении скрипта сами снимутся
Теперь про vmt hook, его использование
Требования
- Знать FFI
- Знать прототип метода
- Знать индекс метода
Покажу на примере хука метода ракнета, т.к. изначально под него и писалось это чудо. Только там для SAMP R3 было, а тут будет R1
Собственно пишем под ракнет, значит качаем SF.lua(https://github.com/SF-lua/SF.lua/tree/master/SFlua) или хотя бы его библиотеку bitstream.lua. Спасибо за это чудо
Первым делом подключаем либы
Lua:
local ffi = require("ffi")
local bitstream = require("SFlua.bitstream")
local hook = require("hooks")
Lua:
local samp = getModuleHandle("samp.dll")
local pSAMPInfo = 0
while pSAMPInfo == 0 do wait(0)
pSAMPInfo = ffi.cast("uintptr_t*", samp + 0x21A0F8)[0]
end
local pRakClient = ffi.cast("intptr_t*", pSAMPInfo + 0x3C9)[0]
Lua:
local rakClient = hook.vmt.new(pRakClient)
--или не выпендриваться и плевать на зависимости - юзаем sampGetRakclientInterface(), но тогда зависимость сампфункс
Lua:
rakClient.hookMethod(cast, func, method)
rakClient.unHookMethod(method)
rakClient.unHookAll()
rakClient.this
Lua:
sendPacket = rakClient.hookMethod("bool(__thiscall*)(void* this, SFL_BitStream* bitStream, char priority, char reliability, char orderingChannel)", sendPacket, 6)
--Структура SFL_BitStream доступна только если подключена либа bitstream с SF-lua
--нам возвращается оригинальная функция
function sendPacket(this, bitStream, priority, reliability, orderingChannel)
print("packet id", bitStream.data[0]) --выводим ид пакета, посмотреть названия пакетов можно в встроенной в мун библиотеке sampfuncs.lua(не путать с SF.lua)
local res = sendPacket(this, bitStream, priority, reliability, orderingChannel) --вызываем оригинальную функцию(или не вызываем и пакет не отправится)
return res
end
Полный код
Lua:
local ffi = require 'ffi'
local bitstream = require("bitstream")
local hook = require("hooks")
function main()
local samp = getModuleHandle("samp.dll")
local pSAMPInfo = 0
while pSAMPInfo == 0 do wait(0)
pSAMPInfo = ffi.cast("uintptr_t*", samp + 0x21A0F8)[0]
end
local pRakClient = ffi.cast("intptr_t*", pSAMPInfo + 0x3C9)[0]
local rakClient = hook.vmt.new(pRakClient)
--[[
original_method = rakClient.hookMethod(cast, func, method)
rakClient.unHookMethod(method)
rakClient.unHookAll()
rakClient.this
]]
sendPacket = rakClient.hookMethod("bool(__thiscall*)(void* this, SFL_BitStream* bitStream, char priority, char reliability, char orderingChannel)", sendPacket, 6)
--нам возвращается оригинальная функция
wait(-1)
end
function sendPacket(this, bitStream, priority, reliability, orderingChannel)
print("packet id", bitStream.data[0]) --выводим ид пакета, посмотреть названия пакетов можно в встроенной в мун библиотеке sampfuncs.lua(не путать с SF.lua)
local res = sendPacket(this, bitStream, priority, reliability, orderingChannel) --вызываем оригинальную функцию(или не вызываем и пакет не отправится)
return res
end
p.s. можете так еще насиловать directx9, как тут: https://www.blast.hk/threads/13380/post-890736
Вложения
Последнее редактирование: