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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

c++程序内嵌lua字节码

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

前言

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

試驗記錄

自己編譯出lua.exe

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

寫lua文件

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

fnTaskBegin()

編譯lua文件為目標文件

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

將目標文件制作成數組

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

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的編譯選項改成不支持預編譯頭文件
* 將.c中的main注釋掉

在c++程序中調用嵌入的lua字節碼數組

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;// 創建lua新環境. lua_open被廢棄了L = luaL_newstate();if (NULL != L) {luaL_openlibs(L); // 打開lua庫// 注冊宿主程序的接口函數給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 {// 調用luaL_loadbuffer后, 要調用lua_pcall, 才能調用buffer中的lua接口// 這是文檔中沒有的, 機智啊:Plua_pcall(L, 0, LUA_MULTRET, 0);}lua_close(L); // 關閉lua環境} }

總結

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

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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。