Кто знает оффсет для хука диалога?

Статус
В этой теме нельзя размещать новые ответы.

Vabots

Участник
Автор темы
73
5
Версия MoonLoader
.027.0-preview
Использую библиотек hook.new.И там есть, как хукать диалог с помощью оффсета. Кто нибудь может знает хук на onSendDialogResponse, чтобы хукать input в диалог? Или может вы можете подсказать, где искать их все. Потому что я смотрел в init.lua, где собраны некоторые оффсета для луа. Но там такого нет почему -то

Хук:
local ffi = require 'ffi'
--HOOKS
local hook = {hooks = {}}
addEventHandler('onScriptTerminate', function(scr)
    if scr == script.this then
        for i, hook in ipairs(hook.hooks) do
            if hook.status then
                hook.stop()
            end
        end
    end
end)
ffi.cdef [[
    int VirtualProtect(void* lpAddress, unsigned long dwSize, unsigned long flNewProtect, unsigned long* lpflOldProtect);
]]
function hook.new(cast, callback, hook_addr, size)
    jit.off(callback, true) --off jit compilation | thx FYP
    local size = size or 5
    local new_hook = {}
    local detour_addr = tonumber(ffi.cast('intptr_t', ffi.cast('void*', ffi.cast(cast, callback))))
    local void_addr = ffi.cast('void*', hook_addr)
    local old_prot = ffi.new('unsigned long[1]')
    local org_bytes = ffi.new('uint8_t[?]', size)
    ffi.copy(org_bytes, void_addr, size)
    local hook_bytes = ffi.new('uint8_t[?]', size, 0x90)
    hook_bytes[0] = 0xE9
    ffi.cast('uint32_t*', hook_bytes + 1)[0] = detour_addr - hook_addr - 5
    new_hook.call = ffi.cast(cast, hook_addr)
    new_hook.status = false
    local function set_status(bool)
        new_hook.status = bool
        ffi.C.VirtualProtect(void_addr, size, 0x40, old_prot)
        ffi.copy(void_addr, bool and hook_bytes or org_bytes, size)
        ffi.C.VirtualProtect(void_addr, size, old_prot[0], old_prot)
    end
    new_hook.stop = function() set_status(false) end
    new_hook.start = function() set_status(true) end
    new_hook.start()
    table.insert(hook.hooks, new_hook)
    return setmetatable(new_hook, {
        __call = function(self, ...)
            self.stop()
            local res = self.call(...)
            self.start()
            return res
        end
    })
end
--HOOKS

function main()
    dialogHook = hook.new('void(__thiscall *)(void *this, uint16_t wID, uint8_t iStyle, char *szCaption, char *szText, char *szButton1, char *szButton2, bool bSend)', dialogHook, getModuleHandle('samp.dll') + 0x6B9C0)
end

function dialogHook(this, id, style, caption, text, button1, button2, send)
    dialogHook(this, id, style, ffi.cast('char*', ffi.string(caption)..' | Hooked'), text, button1, button2, send)
end
 
Последнее редактирование:
Решение
RPC SendDialogResponse отправляется в CDIalog::Close
чтобы получить инпут, ты можешь хукать этот метод и получать текст инпута через CDXUTEditBox::GetText
скорее всего. пока ты на луа напишешь это всё, с ума сойдешь. лучше пиши на плюсах
Эта функция для тебя шутка ? https://wiki.blast.hk/ru/moonloader/lua/sampGetCurrentDialogEditboxText
Это на плюсах надо все получать вручную)

XRLM

Против ветра рождённый
Модератор
1,570
1,154
RPC SendDialogResponse отправляется в CDIalog::Close
чтобы получить инпут, ты можешь хукать этот метод и получать текст инпута через CDXUTEditBox::GetText
ну или как вариант ещё хукать деструктор битстрима и разбирать битстрим рпц
скорее всего. пока ты на луа напишешь это всё, с ума сойдешь. лучше пиши на плюсах
 
  • Злость
Реакции: MLycoris и Lance_Sterling

Lance_Sterling

Известный
992
354
RPC SendDialogResponse отправляется в CDIalog::Close
чтобы получить инпут, ты можешь хукать этот метод и получать текст инпута через CDXUTEditBox::GetText
скорее всего. пока ты на луа напишешь это всё, с ума сойдешь. лучше пиши на плюсах
Эта функция для тебя шутка ? https://wiki.blast.hk/ru/moonloader/lua/sampGetCurrentDialogEditboxText
Это на плюсах надо все получать вручную)
 
Статус
В этой теме нельзя размещать новые ответы.