日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++程序内嵌lua字节码

發(fā)布時間:2023/12/31 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++程序内嵌lua字节码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

從google找到的資料看,c++和lua交互的經(jīng)典用法,都是c++調(diào)用lua腳本文件.
但是c++程序內(nèi),嵌入lua編譯好的字節(jié)碼緩沖區(qū),也是一種用場.
下載的lua官方包里,沒有例子程序了.
對于開源程序,自帶豐富的例子,是很重要的事情. 雖然說”源碼面前沒有秘密”, 但實際情況心里還是萬馬奔騰,讓人崩潰.
還是M$做的好,每個API都能在MSDN或WDK中找到可以run的例子.
找到了lua歷史版本下載頁: https://www.lua.org/versions.html

試驗記錄

自己編譯出lua.exe

http://blog.csdn.net/lostspeed/article/details/52904410

寫lua文件

假設(shè)文件為TaskBegin.lua, 里面只有一個c++注冊的接口.

fnTaskBegin()

編譯lua文件為目標文件

rem file : build_lua.cmd mylua.exe -o TaskBegin.dat TaskBegin.lua pause

將目標文件制作成數(shù)組

可以搞個小工具來做,我直接用WinHex將TaskBegin.dat拖進, 復(fù)制拷貝成c數(shù)組
這一步可以考慮用對稱加密算法,將數(shù)組加密, 處理后,靜態(tài)分析PE時, 就不知道這是lua的字節(jié)碼了.

const BYTE g_AryLuaObj[132] = {0x1B, 0x4C, 0x75, 0x61, 0x53, 0x00, 0x19, 0x93, 0x0D, 0x0A, 0x1A, 0x0A, 0x04, 0x04, 0x04, 0x08, 0x08, 0x78, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x77, 0x40, 0x01, 0x0F, 0x40, 0x54, 0x61, 0x73, 0x6B, 0x42, 0x65, 0x67, 0x69, 0x6E, 0x2E, 0x6C, 0x75, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x40, 0x00, 0x24, 0x40, 0x80, 0x00, 0x26, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x0C, 0x66, 0x6E, 0x54, 0x61, 0x73, 0x6B, 0x42, 0x65, 0x67, 0x69, 0x6E, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x5F, 0x45, 0x4E, 0x56 };

在程序中加入lua引擎

對于lua5.3.3分2步
* 包含src目錄下的所有文件(.h, .c), 將.c的編譯選項改成不支持預(yù)編譯頭文件
* 將.c中的main注釋掉

在c++程序中調(diào)用嵌入的lua字節(jié)碼數(shù)組

int __cdecl fnTaskBegin(lua_State* L) {TCHAR* pszBuf = NULL;size_t nLenBuf = 0;if (fnProcRegistr(&pszBuf, nLenBuf)) {fnProcRegOk(&pszBuf, nLenBuf);} else {fnProcRegFail(&pszBuf, nLenBuf);}fnClearBuf(&pszBuf, nLenBuf);lua_pushnumber(L, LUA_OK); // 壓入返回值給.luareturn LUA_YIELD; // ! 不能是 LUA_OK }void fnLuaProc() {lua_State* L = NULL;int iLuaErr = 0;// 創(chuàng)建lua新環(huán)境. lua_open被廢棄了L = luaL_newstate();if (NULL != L) {luaL_openlibs(L); // 打開lua庫// 注冊宿主程序的接口函數(shù)給lua用lua_register(L, "fnTaskBegin", fnTaskBegin);// iLuaErr = luaL_dofile(L, LUA_FILE_NAME); // 載入lua文件iLuaErr = luaL_loadbuffer(L, (const char*)g_AryLuaObj, sizeof(g_AryLuaObj), NULL);if (LUA_OK != iLuaErr) {// printf("%s\r\n", luaL_checkstring(L, -1));} else {// 調(diào)用luaL_loadbuffer后, 要調(diào)用lua_pcall, 才能調(diào)用buffer中的lua接口// 這是文檔中沒有的, 機智啊:Plua_pcall(L, 0, LUA_MULTRET, 0);}lua_close(L); // 關(guān)閉lua環(huán)境} }

總結(jié)

在業(yè)務(wù)邏輯的調(diào)用點上, 調(diào)用lua處理函數(shù)fnLuaProc(), 不熟悉lua或沒有源碼的逆向分析師只能去跟lua的實現(xiàn), 將對抗強度轉(zhuǎn)嫁給lua了.

可以考慮修改lua源碼, 增加免查處理, 用來躲過掃描lua特征的工具. 讓他不知道我用的lua版本和lua關(guān)鍵函數(shù).
在沒有這種工具樣本的前提下,可以自己先修改一下lua源碼, 提前做個準備.

總結(jié)

以上是生活随笔為你收集整理的c++程序内嵌lua字节码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。