Lua CLEO ASI SF Plugin Белые ID в никах [R1/R3]

SR_team

like pancake
Автор темы
BH Team
4,809
6,487
Добавил lua-версию с использованием хуков от @RTD

К сожалению его хуки расчитаны на хук преамбулы функции, по этому пришлось весь sprintf похукать, что добавило пару лишних тактов там, где не нужно
 

Вложения

  • lua.zip
    1.8 KB · Просмотры: 23
  • Нравится
Реакции: Sana_Minotazaki

Tema05

Известный
1,474
439
Добавил lua-версию с использованием хуков от @RTD

К сожалению его хуки расчитаны на хук преамбулы функции, по этому пришлось весь sprintf похукать, что добавило пару лишних тактов там, где не нужно
Я не знаю почему но у меня это не работает.
 

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,656
2,541
потому что я в последний момент решил, что ffi каст к char* лишний, а он был не лишним
Lua:
sprintfHook = hook.new('int(__cdecl *)(int buf, char *fmt, char *nick, int ID)', sprintfHook, getModuleHandle('samp.dll') + 0xB5BF3, 6)
но ведь у второго аргумента же тип const char*
Lua:
ffi.string('%s {FFFFFF}(%03d)')
что ты тут хотел сделать, достаточно просто передать строку, она в луа и так константная и является указателем
Lua:
sprintfHook = hook.new('int(__cdecl *)(int buf, const char *fmt, char *nick, int ID)', sprintfHook, getModuleHandle('samp.dll') + 0xC7B93, 6)

function sprintfHook(buf, fmt, nick, ID)
    if buf == getModuleHandle('samp.dll') + 0x1409C8 then
        return sprintfHook(buf, '%s {FFFFFF}(%03d)', nick, ID)
    else
        return sprintfHook(buf, fmt, nick, ID)
    end
end

а ещё у тебя там код сломан, лишняя скобка
 

SR_team

like pancake
Автор темы
BH Team
4,809
6,487
Lua:
sprintfHook = hook.new('int(__cdecl *)(int buf, char *fmt, char *nick, int ID)', sprintfHook, getModuleHandle('samp.dll') + 0xB5BF3, 6)
но ведь у второго аргумента же тип const char*
Lua:
ffi.string('%s {FFFFFF}(%03d)')
что ты тут хотел сделать, достаточно просто передать строку, она в луа и так константная и является указателем
Lua:
sprintfHook = hook.new('int(__cdecl *)(int buf, const char *fmt, char *nick, int ID)', sprintfHook, getModuleHandle('samp.dll') + 0xC7B93, 6)

function sprintfHook(buf, fmt, nick, ID)
    if buf == getModuleHandle('samp.dll') + 0x1409C8 then
        return sprintfHook(buf, '%s {FFFFFF}(%03d)', nick, ID)
    else
        return sprintfHook(buf, fmt, nick, ID)
    end
end

а ещё у тебя там код сломан, лишняя скобка
Не работает:
Lua:
function main()
    sprintfHook = hook.new('int(__cdecl *)(int buf, char *fmt, char *nick, int ID)', sprintfHook, getModuleHandle('samp.dll') + 0xB5BF3, 6)
end

function sprintfHook(buf, fmt, nick, ID)
    if buf == getModuleHandle('samp.dll') + 0x12C848 then
        return sprintfHook(buf, "%s {FFFFFF}(%03d)", nick, ID)
    else
        return sprintfHook(buf, fmt, nick, ID)
    end
end

Работает:
Lua:
function main()
    sprintfHook = hook.new('int(__cdecl *)(int buf, char *fmt, char *nick, int ID)', sprintfHook, getModuleHandle('samp.dll') + 0xB5BF3, 6)
end

function sprintfHook(buf, fmt, nick, ID)
    if buf == getModuleHandle('samp.dll') + 0x12C848 then
        return sprintfHook(buf, ffi.cast('char*', ffi.string('%s {FFFFFF}(%03d)')), nick, ID)
    else
        return sprintfHook(buf, fmt, nick, ID)
    end
end

И где лишняя скобка?
 

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,656
2,541
1605962456168.png


sprintfHook = hook.new('int(__cdecl *)(int buf, char *fmt, char *nick, int ID)', sprintfHook, getModuleHandle('samp.dll') + 0xB5BF3, 6) end
sprintfHook = hook.new('int(__cdecl *)(int buf, const char *fmt, char *nick, int ID)', sprintfHook, getModuleHandle('samp.dll') + 0xB5BF3, 6) end
тип
 

SR_team

like pancake
Автор темы
BH Team
4,809
6,487
Посмотреть вложение 76487


sprintfHook = hook.new('int(__cdecl *)(int buf, const char *fmt, char *nick, int ID)', sprintfHook, getModuleHandle('samp.dll') + 0xB5BF3, 6) end
тип
Ну ок, я когда с этими хуками разбирался, и пробовал похукать не функцию, а ее вызов - ничего не работало и я все строки оборачивал в каст, после переноса хука все заработало, когда оставил каст только на формате. Заливая я его удалил, но выше @Tema05 написал, что так у него не работает, и я вернул каст, с котором все работало, когда я тестил
 

Tema05

Известный
1,474
439
потому что я в последний момент решил, что ffi каст к char* лишний, а он был не лишним
P.S. ты не вставил сам cast, а вставил скобки.

Чрезмерно благодарен тебе и всем тем кто отвечал в темах за помощь. Всё работает как задумано. Низкий Вам поклон.
 
Последнее редактирование:

RTD

Потужно
Модератор
399
470
@SR_team на луа, R1
Lua:
local ffi = require 'ffi'
ffi.cdef[[
    int VirtualProtect(void* lpAddress, unsigned long dwSize, unsigned long flNewProtect, unsigned long* lpflOldProtect);
]]
function main()
    local void_addr = ffi.cast('void*', getModuleHandle('samp.dll') + 0x70F45)
    local old_prot = ffi.new('unsigned long[1]')
    local chars = ffi.new('const char[18]', '%s {FFFFFF}(%03d)')
    ffi.C.VirtualProtect(void_addr, 4, 0x40, old_prot)
    ffi.cast('uint32_t*', void_addr)[0] = tonumber(ffi.cast('intptr_t', chars))
    ffi.C.VirtualProtect(void_addr, 4, old_prot[0], old_prot)
    addEventHandler('onScriptTerminate', function(scr)
        if scr == script.this then
            ffi.C.VirtualProtect(void_addr, 4, 0x40, old_prot)
            ffi.cast('uint32_t*', void_addr)[0] = getModuleHandle('samp.dll') + 0xD835C
            ffi.C.VirtualProtect(void_addr, 4, old_prot[0], old_prot)
        end
    end)
    wait(-1)
end
Lua:
local ffi = require 'ffi'
ffi.cdef[[
    int VirtualProtect(void* lpAddress, unsigned long dwSize, unsigned long flNewProtect, unsigned long* lpflOldProtect);
    void *malloc(size_t size);
    void free(void *ptr);
]]
function main()
    local void_addr = ffi.cast('void*', getModuleHandle('samp.dll') + 0x70F45)
    local old_prot = ffi.new('unsigned long[1]')
    local chars = ffi.C.malloc(18)
    ffi.copy(chars, '%s {FFFFFF}(%03d)\0', 18)
    ffi.C.VirtualProtect(void_addr, 4, 0x40, old_prot)
    ffi.cast('uint32_t*', void_addr)[0] = tonumber(ffi.cast('intptr_t', chars))
    ffi.C.VirtualProtect(void_addr, 4, old_prot[0], old_prot)
    addEventHandler('onScriptTerminate', function(scr)
        if scr == script.this then
            ffi.C.VirtualProtect(void_addr, 4, 0x40, old_prot)
            ffi.cast('uint32_t*', void_addr)[0] = getModuleHandle('samp.dll') + 0xD835C
            ffi.C.VirtualProtect(void_addr, 4, old_prot[0], old_prot)
            ffi.C.free(chars)
        end
    end)
    wait(-1)
end
 
Последнее редактирование:

Tema05

Известный
1,474
439
@SR_team на луа, R1
Lua:
local ffi = require 'ffi'
ffi.cdef[[
    int VirtualProtect(void* lpAddress, unsigned long dwSize, unsigned long flNewProtect, unsigned long* lpflOldProtect);
]]
function main()
    local void_addr = ffi.cast('void*', getModuleHandle('samp.dll') + 0x70F45)
    local old_prot = ffi.new('unsigned long[1]')
    local chars = ffi.new('const char[18]', '%s {FFFFFF}(%03d)')
    ffi.C.VirtualProtect(void_addr, 4, 0x40, old_prot)
    ffi.cast('uint32_t*', void_addr)[0] = tonumber(ffi.cast('intptr_t', chars))
    ffi.C.VirtualProtect(void_addr, 4, old_prot[0], old_prot)
    addEventHandler('onScriptTerminate', function(scr)
        if scr == script.this then
            ffi.C.VirtualProtect(void_addr, 4, 0x40, old_prot)
            ffi.cast('uint32_t*', void_addr)[0] = getModuleHandle('samp.dll') + 0xD835C
            ffi.C.VirtualProtect(void_addr, 4, old_prot[0], old_prot)
        end
    end)
    wait(-1)
end
А как тут тогда внедрить фильтр на определённые ники и получить id?
 

SR_team

like pancake
Автор темы
BH Team
4,809
6,487
@SR_team на луа, R1
Lua:
local ffi = require 'ffi'
ffi.cdef[[
    int VirtualProtect(void* lpAddress, unsigned long dwSize, unsigned long flNewProtect, unsigned long* lpflOldProtect);
]]
function main()
    local void_addr = ffi.cast('void*', getModuleHandle('samp.dll') + 0x70F45)
    local old_prot = ffi.new('unsigned long[1]')
    local chars = ffi.new('const char[18]', '%s {FFFFFF}(%03d)')
    ffi.C.VirtualProtect(void_addr, 4, 0x40, old_prot)
    ffi.cast('uint32_t*', void_addr)[0] = tonumber(ffi.cast('intptr_t', chars))
    ffi.C.VirtualProtect(void_addr, 4, old_prot[0], old_prot)
    addEventHandler('onScriptTerminate', function(scr)
        if scr == script.this then
            ffi.C.VirtualProtect(void_addr, 4, 0x40, old_prot)
            ffi.cast('uint32_t*', void_addr)[0] = getModuleHandle('samp.dll') + 0xD835C
            ffi.C.VirtualProtect(void_addr, 4, old_prot[0], old_prot)
        end
    end)
    wait(-1)
end
без хука не интересно
 
  • Нравится
Реакции: RTD