2013-03-20 128 views
0

我已經爲Minecraft製作了一個允許Lua修改的mod。一切工作正常,但通常方法的名稱在MC中被混淆。使正常函數名稱重定向到混淆名稱的最佳方式是什麼?什麼是最有效的方式來刪除混淆名稱(我的世界)?

例如,用戶使得腳本,這是打印Hello World塊時右點擊:

function onActivated(world, x, y, z, player) player:addChatMessage("hello world") end

addChatMessage應該調用Java方法EntityPlayer.func_71035_c(字符串文本)

+1

嘗試使用'require'libname'來訪問原始庫。例如,'(require'math')。pi'獲得非混淆的'math.pi'。 – 2013-03-20 15:10:44

+0

我正在談論Minecraft的方法。通常情況下,所有方法都被模糊處理(func_number_a)。所以如果我給Player對象作爲參數,我必須調用player:func_34323_c(text)而不是player:addChatMessage()。 MC編碼器包將方法/字段/類名稱轉換爲邏輯名稱(我擁有名稱文件)。 – Rule 2013-03-20 15:18:44

+1

你有權訪問翻譯算法(將'func_34323_c'轉換爲'addChatMessage')嗎?這是一個祕密嗎? – 2013-03-20 15:27:51

回答

1
-- translation file (translation.txt) 
func_70912_b,setTameSkin,2, 
func_70913_u,getTameSkin,2, 
func_70915_j,getShadingWhileShaking,2,Used when calculating the amount of shading to apply while the wolf is shaking. 
func_70916_h,setAngry,2,Sets whether this wolf is angry. 


-- obfuscated program (script.lua) 
x:func_70913_u(y, z) 
x:func_70915_j(y, z) 


-- your preprocessor (preprocessor.lua) 
local transl = {} 
for line in io.lines'translation.txt' do 
    local obf, orig = line:match'^(.-),(.-),' 
    transl[obf] = orig 
end 
local script = assert(io.open('script.lua','rb')):read'*a' 
local output = assert(io.open('script2.lua','wb')) 
output:write((script:gsub('[%w_]+',transl))) 
output:close() 


-- preprocessor output (script2.lua) 
x:getTameSkin(y, z) 
x:getShadingWhileShaking(y, z) 

編輯:

local obfuscations = {} 
for line in io.lines'translation.txt' do 
    local obf, orig = line:match'^(.-),(.-),' 
    obfuscations[orig] = obf 
end 

local function get_obf_key_value(t, k, __index) 
    local value = __index and __index(t, k) 
    if value == nil and obfuscations[k] then 
     value = t[obfuscations[k]] 
    end 
    return value 
end 

local cache = {get_obf_key_value = true} 

local function __index_constructor(__index) 
    if not __index then 
     return get_obf_key_value 
    end 
    local old__index = cache[__index] 
    if old__index then 
     return old__index == true and __index or old__index 
    else 
     local function new__index(t, k) 
     return get_obf_key_value(t, k, __index) 
     end 
     cache[__index] = new__index 
     cache[new__index] = true 
     return new__index 
    end 
end 

local obf_mt = {__index = get_obf_key_value} 

local function correct_metatable(object) 
    local mt = getmetatable(object) 
    if mt == nil then 
     setmetatable(object, obf_mt) 
    else 
     local __index = mt.__index 
     if __index == nil or type(__index) == 'function' then 
      mt.__index = __index_constructor(__index) 
     else 
     correct_metatable(__index) 
     end 
    end 
end 

-- you should call correct_metatable(class_or_object_of_that_class) 
-- at least once for every class 
correct_metatable(wolf) 
correct_metatable(goat) 
correct_metatable(cabbage) 
... 
+0

通常情況下,MC被混淆了,所以我需要將邏輯函數名稱模糊化,以便用戶不必知道混淆的名稱。問題是我無法每嘀嘀嘀咕Lua文件(每秒20次)。我需要以某種方式將函數重定向到混淆函數。 – Rule 2013-03-20 16:04:35

+1

@Hackingroelz - 它需要改變大量metatables(每個類使用)。 – 2013-03-20 16:15:42

+0

那麼,我將不得不改變我給一個函數的每個對象的metatable?這是否會造成很多滯後?我可以添加一個調用Java方法的全局函數,但是如果沒有,當然會更好。 – Rule 2013-03-20 16:23:37

相關問題