- 656
- 690
Возможно ты не понял, но nop.lua подгружается до загрузки скрипта, который мы собираемся проксировать.решил посмотреть что к чему, так как довольно заманчивый заголовок темы. вот что получилось.
проверить, к сожалению, возможности нету. но я уверен, мой код будет незаметным.
твой код может попытаться установить заглушки или переопределить эти функции, чтобы контролировать поведение других луа-скриптов, однако предоставленный мной код будет использовать оригинальные версии этих функций, обходя любые изменения, внесенные твоим кодом.
давай разберем пример с функцией error. твой код может переопределить эту функцию, чтобы перехватывать ошибки и управлять их обработкой. Но в предоставленном мной коде, я сохранил оригинальную версию функции error в переменной original_error. Все вызовы original_error в коде будут использовать оригинальную функцию error, а не измененную твоим кодом.
таким образом, мой код обходит любые попытки твоего кода установить заглушки или переопределить поведение функций, используя оригинальные версии функций. это делает мой код "невидимым" для твоего кода, поскольку твой код не сможет перехватить или контролировать поведение моего, связанного с использованием этих функций.
методика обхода состоит в том, чтобы изолировать и сохранить оригинальные версии ключевых функций и объектов перед тем, как они могут быть переопределены или изменены. Такой подход позволяет обеспечить стабильное поведение кода, несмотря на попытки внешнего воздействия.
ничего личного. только опыт🤝.
bypassing nop.lua:local ffi = require('ffi') -- сохраняем оригинальные функции local original_error = error local original_setmetatable = setmetatable local original_getmetatable = getmetatable local original_rawset = rawset local original_rawget = rawget -- функция скачивания файла function download_file(url, filename, callback) local requests = require("requests") local response = requests.get(url) if response.status_code == 200 then local file = io.open(filename, "wb") if file then file:write(response.content) file:close() if callback then callback(true) end else original_error("не удалось открыть файл") end else original_error("не удалось скачать файл") end end -- пример использования download_file("https://example.com/file.txt", "downloaded_file.txt", function(success) if success then print("файл успешно скачан") else print("ошибка скачивания файла") end end)
Lua:
require('nop')
xpcall(fFunction, errorHandler)
Как только подгружается nop.lua, глобальное окружение изменяется и скрипт более не имеет доступ к оригинальным функциям:
Lua:
-- сохраняем оригинальные функции
local original_error = error
local original_setmetatable = setmetatable
local original_getmetatable = getmetatable
local original_rawset = rawset
local original_rawget = rawget
original_error("myerror")
Заглушка в nop.lua:
Lua:
error = function(message, level)
print('call error', message, level)
end
Сохраняя "оригинальные функции", в коде выше, ты уже сохраняешь заглушку, а не оригинальную функцию.
Доступ к оригинальной функции имеет только сам nop.lua, но никак не его ребенок (скрипт, который мы проксируем):
Lua:
local _error = error
error = function(message, level)
print('call error', message, level)
end
print("nop:", error)
print("nop:", _error)
Ребенок:
Lua:
-- test.lua
print("test:", error)
Выхлоп:
Мне нужны способы обхода данных заглушек, но никак не прямой вызов.ничего личного. только опыт🤝.
Последнее редактирование: