2016-05-09 103 views
1

比方說,我知道一個函數從一個DLL文件地址:我可以跳轉到Lua中的實際虛擬地址嗎?

0x7A0BA032: hello_world() { printf("Hello World!"); } 

是它在某種程度上可以從Lua字節碼中調用這個函數?

預編譯的Lua文件:hello_world.lua

JMP 0x7A0BA032 

,然後例如調用它像

dofile "hello_world.lua" 

有沒有類似這樣的工作的機會?

假設我不能使用loadlib()或任何簡單地加載DLL並調用其方法..

+0

純Lua沒有變化。 – lhf

回答

1

有一個機會,像這樣的作品?

那可能從來沒有工作。不在Lua中,不在LuaJIT中,甚至不在C。許多現代操作系統隨機化代碼加載到的內存地址,精確到防止外部代碼靜態地知道特定函數的地址。

至少,您需要一種方法來在運行時查詢該函數的地址。而普通的Lua並沒有提供這個。一個Lua模塊可以提供加載DLL和從Lua調用/調用的能力。 LuaJIT有一個類似的FFI。

但所有這些都依賴於函數地址的運行時查詢。因此,它們永遠不會被烘焙成一個已編譯的Lua腳本。

+0

很遺憾。我嘗試修改一個遊戲([Supreme Commander](http://supcom.wikia.com/wiki/Lua)),該遊戲似乎有它自己的Lua 5.0修改版本,它刪除了所有像'loadlib'這樣有用的東西。我甚至不能創建像管道這樣的東西,至少可以進行進程間通信或任何其他任何事情。 – displayname

+0

@displayname:Lua的主要目的之一是它可以讓你創建一個無懈可擊的沙箱腳本環境。如果擁有系統不希望你擁有IPC,那麼你不能。如果擁有系統不希望你與DLL交談,那麼你不能。無論。這是該語言的*特性*。 –

+0

好的,謝謝你的額外信息。似乎我不得不在這裏另闢蹊徑。我的計劃是增加對「遠程」控制的AI的支持,但看起來比我想象的要難得多。 – displayname