基于Lua語(yǔ)言的編程方法和裝置制造方法【專利摘要】本發(fā)明公開(kāi)了一種基于Lua語(yǔ)言的編程方法和裝置,屬于計(jì)算機(jī)【
技術(shù)領(lǐng)域:
】。所述方法包括:為L(zhǎng)ua語(yǔ)言實(shí)現(xiàn)調(diào)用應(yīng)用程序編程接口API的功能;為L(zhǎng)ua語(yǔ)言實(shí)現(xiàn)創(chuàng)建內(nèi)存對(duì)象的功能;基于具備調(diào)用API功能和創(chuàng)建內(nèi)存對(duì)象功能的Lua語(yǔ)言,實(shí)現(xiàn)目標(biāo)程序代碼。本發(fā)明通過(guò)為L(zhǎng)ua語(yǔ)言擴(kuò)展調(diào)用API的功能和創(chuàng)建內(nèi)存對(duì)象的功能,從而能夠基于Lua語(yǔ)言實(shí)現(xiàn)目標(biāo)程序代碼,則目標(biāo)程序代碼中將保存Lua語(yǔ)言編譯后的字節(jié)碼,Lua語(yǔ)言的字節(jié)碼的反編譯的難度較大,反編譯工具很難反編譯Lua語(yǔ)言的字節(jié)碼,提高了破解難度,避免了對(duì)用戶造成的損失?!緦@f(shuō)明】基于Lua語(yǔ)言的編程方法和裝置【
技術(shù)領(lǐng)域:
】[0001]本發(fā)明涉及計(jì)算機(jī)【
技術(shù)領(lǐng)域:
】,特別涉及一種基于Lua語(yǔ)言的編程方法和裝置?!?br>背景技術(shù):
】[0002]軟件的應(yīng)用程序通常是由C語(yǔ)言實(shí)現(xiàn)的,但隨著IDA(InteractiveDisassembler,交互式反匯編程序)、OD(OllyDebug)等反編譯工具的盛行,破解者可以通過(guò)這些反編譯工具跟蹤應(yīng)用程序所調(diào)用的每一個(gè)API(Applicat1nProgrammingInterface,應(yīng)用程序編程接口)以及API的參數(shù)和返回結(jié)果,大大降低了破解難度?!?br/>發(fā)明內(nèi)容】[0003]為了解決現(xiàn)有技術(shù)的問(wèn)題,本發(fā)明實(shí)施例提供了一種基于Lua語(yǔ)言的編程方法和裝置。所述技術(shù)方案如下:[0004]第一方面,提供了一種基于Lua語(yǔ)言的編程方法,所述方法包括:[0005]為L(zhǎng)ua語(yǔ)言實(shí)現(xiàn)調(diào)用應(yīng)用程序編程接口API的功能;[0006]為L(zhǎng)ua語(yǔ)言實(shí)現(xiàn)創(chuàng)建內(nèi)存對(duì)象的功能;[0007]基于具備調(diào)用API功能和創(chuàng)建內(nèi)存對(duì)象功能的Lua語(yǔ)言,實(shí)現(xiàn)目標(biāo)程序代碼。[0008]第二方面,提供了一種基于Lua語(yǔ)言的編程裝置,所述裝置包括:[0009]第一功能實(shí)現(xiàn)模塊,用于為L(zhǎng)ua語(yǔ)言實(shí)現(xiàn)調(diào)用應(yīng)用程序編程接口API的功能;[0010]第二功能實(shí)現(xiàn)模塊,用于為L(zhǎng)ua語(yǔ)言實(shí)現(xiàn)創(chuàng)建內(nèi)存對(duì)象的功能;[0011]代碼實(shí)現(xiàn)模塊,用于基于具備調(diào)用API功能和創(chuàng)建內(nèi)存對(duì)象功能的Lua語(yǔ)言,實(shí)現(xiàn)目標(biāo)程序代碼。[0012]本發(fā)明實(shí)施例提供的技術(shù)方案帶來(lái)的有益效果是:[0013]本發(fā)明實(shí)施例提供的方法和裝置,通過(guò)為L(zhǎng)ua語(yǔ)言擴(kuò)展調(diào)用API的功能和創(chuàng)建內(nèi)存對(duì)象的功能,從而能夠基于Lua語(yǔ)言實(shí)現(xiàn)目標(biāo)程序代碼,則目標(biāo)程序代碼中將保存Lua語(yǔ)言編譯后的字節(jié)碼,Lua語(yǔ)言的字節(jié)碼的反編譯的難度較大,反編譯工具很難反編譯Lua語(yǔ)言的字節(jié)碼,提高了破解難度,避免了對(duì)用戶造成的損失?!緦@綀D】【附圖說(shuō)明】[0014]為了更清楚地說(shuō)明本發(fā)明實(shí)施例中的技術(shù)方案,下面將對(duì)實(shí)施例描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。[0015]圖1是本發(fā)明實(shí)施例提供的一種基于Lua語(yǔ)言的編程方法的流程圖;[0016]圖2a是本發(fā)明實(shí)施例提供的一種基于Lua語(yǔ)言的編程方法的流程圖;[0017]圖2b是本發(fā)明實(shí)施例提供了一種C++語(yǔ)言的代碼示意圖;[0018]圖2c是本發(fā)明實(shí)施例提供的一種Lua語(yǔ)言的代碼示意圖;[0019]圖2d是本發(fā)明實(shí)施例提供的獲取API地址的流程示意圖;[0020]圖2e是本發(fā)明實(shí)施例提供的調(diào)用API的流程示意圖;[0021]圖3是本發(fā)明實(shí)施例提供的一種基于Lua語(yǔ)言的編程裝置結(jié)構(gòu)示意圖。【具體實(shí)施方式】[0022]下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。[0023]在對(duì)本發(fā)明實(shí)施例進(jìn)行說(shuō)明之前,首先對(duì)本發(fā)明實(shí)施例涉及的Lua語(yǔ)言進(jìn)行介紹:[0024]Lua語(yǔ)言是一種嵌入式腳本語(yǔ)言,主要用于嵌入基于其他語(yǔ)言的應(yīng)用程序中,與該應(yīng)用程序協(xié)同工作,數(shù)據(jù)可以在其他語(yǔ)言環(huán)境與Lua語(yǔ)言環(huán)境之間共享。[0025]Lua語(yǔ)言基于虛擬機(jī)實(shí)現(xiàn),Lua語(yǔ)言首先會(huì)將源程序編譯成為字節(jié)碼,然后交由虛擬機(jī)來(lái)解釋執(zhí)行。由于虛擬機(jī)本身的實(shí)現(xiàn)機(jī)制及其復(fù)雜,一個(gè)Lua指令需要上百個(gè)指令來(lái)執(zhí)行,因此,Lua語(yǔ)言的字節(jié)碼很難被IDA、OD等反編譯工具破解。[0026]但是,由于Lua語(yǔ)言不具備調(diào)用API的功能和創(chuàng)建內(nèi)存對(duì)象的功能,導(dǎo)致Lua語(yǔ)言無(wú)法獨(dú)立地應(yīng)用于應(yīng)用程序代碼的編寫,只能嵌入到基于其他語(yǔ)言的應(yīng)用程序代碼中,因此,目前很少將Lua語(yǔ)言應(yīng)用于編程。[0027]圖1是本發(fā)明實(shí)施例提供的一種基于Lua語(yǔ)言的編程方法的流程圖,參見(jiàn)圖1,該方法包括:[0028]101、為L(zhǎng)ua語(yǔ)言實(shí)現(xiàn)調(diào)用應(yīng)用程序編程接口API的功能。[0029]102、為L(zhǎng)ua語(yǔ)言實(shí)現(xiàn)創(chuàng)建內(nèi)存對(duì)象的功能。[0030]103、基于具備調(diào)用API功能和創(chuàng)建內(nèi)存對(duì)象功能的Lua語(yǔ)言,實(shí)現(xiàn)目標(biāo)程序代碼。[0031]本發(fā)明實(shí)施例提供的方法,通過(guò)為L(zhǎng)ua語(yǔ)言擴(kuò)展調(diào)用API的功能和創(chuàng)建內(nèi)存對(duì)象的功能,從而能夠基于Lua語(yǔ)言實(shí)現(xiàn)目標(biāo)程序代碼,則目標(biāo)程序代碼中將保存Lua語(yǔ)言編譯后的字節(jié)碼,Lua語(yǔ)言的字節(jié)碼的反編譯的難度較大,反編譯工具很難反編譯Lua語(yǔ)言的字節(jié)碼,提高了破解難度,避免了對(duì)用戶造成的損失。[0032]可選地,該為L(zhǎng)ua語(yǔ)言實(shí)現(xiàn)調(diào)用應(yīng)用程序編程接口API的功能包括:[0033]基于預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,生成指定調(diào)用函數(shù),該指定調(diào)用函數(shù)用于調(diào)用不同的應(yīng)用程序編程接口API,該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言具備調(diào)用API的功能;[0034]基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,將該指定調(diào)用函數(shù)添加至Lua語(yǔ)言的全局表,使得Lua語(yǔ)言具備調(diào)用API的功能;[0035]根據(jù)該全局表中的指定調(diào)用函數(shù),基于Lua語(yǔ)言調(diào)用API。[0036]可選地,該根據(jù)該全局表中的指定調(diào)用函數(shù),基于Lua語(yǔ)言調(diào)用API包括:[0037]基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,從動(dòng)態(tài)鏈接庫(kù)DLL的導(dǎo)出表中,獲取待調(diào)用的API地址,將該待調(diào)用的API地址存放在該指定調(diào)用函數(shù)的閉包中;[0038]基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,從該指定調(diào)用函數(shù)的閉包中,獲取待調(diào)用的API地址,根據(jù)該API地址,獲取該API在運(yùn)行時(shí)所需的參數(shù),將獲取到的API地址和參數(shù)壓入堆棧;[0039]基于Lua語(yǔ)言,從該堆棧中獲取該API地址和該參數(shù),基于該API地址、該參數(shù)和該全局表中的指定調(diào)用函數(shù),調(diào)用該API,得到該API的返回值,將該返回值壓入該堆棧;[0040]基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,從該堆棧中獲取該返回值。[0041]可選地,該為L(zhǎng)ua語(yǔ)言實(shí)現(xiàn)創(chuàng)建內(nèi)存對(duì)象的功能包括:[0042]基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,定義一個(gè)結(jié)構(gòu)體,該結(jié)構(gòu)體包括一個(gè)內(nèi)存的指針和內(nèi)存長(zhǎng)度;[0043]基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,實(shí)現(xiàn)第一函數(shù)和第二函數(shù),該第一函數(shù)用于獲取該結(jié)構(gòu)體的內(nèi)存指針,該第二函數(shù)用于獲取該結(jié)構(gòu)體的內(nèi)存長(zhǎng)度;[0044]基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,創(chuàng)建一個(gè)元表,將該第一函數(shù)和該第二函數(shù)添加至該元表,使得該元表具備獲取該結(jié)構(gòu)體的內(nèi)存指針和內(nèi)存長(zhǎng)度的功能;[0045]將該兀表添加至Lua語(yǔ)目的全局表,使得Lua語(yǔ)目具備創(chuàng)建內(nèi)存對(duì)象的功能;[0046]其中,該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言具備創(chuàng)建內(nèi)存對(duì)象的功能。[0047]可選地,該為L(zhǎng)ua語(yǔ)言實(shí)現(xiàn)創(chuàng)建內(nèi)存對(duì)象的功能還包括:[0048]基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,實(shí)現(xiàn)第三函數(shù),該第三函數(shù)用于釋放該結(jié)構(gòu)體;[0049]將該第一函數(shù)、該第二函數(shù)和該第三函數(shù)添加至該元表。[0050]可選地,該方法還包括:[0051]基于Lua語(yǔ)言,創(chuàng)建一個(gè)指定程序段;[0052]基于Lua語(yǔ)言,將該全局表中的元表設(shè)置給該指定程序段,則該指定程序段用于創(chuàng)建內(nèi)存對(duì)象。[0053]可選地,該基于具備調(diào)用API功能和創(chuàng)建內(nèi)存對(duì)象功能的Lua語(yǔ)言,實(shí)現(xiàn)目標(biāo)程序代碼之后,該方法還包括:[0054]刪除該目標(biāo)程序代碼對(duì)應(yīng)的調(diào)試文件,以去除該目標(biāo)程序代碼的調(diào)試功能。[0055]上述所有可選技術(shù)方案,可以采用任意結(jié)合形成本發(fā)明的可選實(shí)施例,在此不再--贅述。[0056]圖2a是本發(fā)明實(shí)施例提供的一種基于Lua語(yǔ)言的編程方法的流程圖,參見(jiàn)圖2a,該方法包括:[0057]201、基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,生成該指定調(diào)用函數(shù),將該指定調(diào)用函數(shù)添加至Lua語(yǔ)言的全局表,使得Lua語(yǔ)言具備調(diào)用API的功能。[0058]在本發(fā)明實(shí)施例中,為了基于Lua語(yǔ)言,實(shí)現(xiàn)目標(biāo)程序代碼,需要首先為L(zhǎng)ua語(yǔ)言實(shí)現(xiàn)調(diào)用API的功能和創(chuàng)建內(nèi)存對(duì)象的功能。[0059]其中,該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言可以為C語(yǔ)言、C++語(yǔ)言,或者其他能夠獨(dú)立用于開(kāi)發(fā)軟件的編程語(yǔ)言,本發(fā)明實(shí)施例對(duì)此不做限定。該指定調(diào)用函數(shù)用于調(diào)用不同的API,即所有的API均可以通過(guò)該指定調(diào)用函數(shù)進(jìn)行調(diào)用,該指定調(diào)用函數(shù)可以為CallApi函數(shù),本發(fā)明實(shí)施例對(duì)該指定調(diào)用函數(shù)不做限定。將該指定調(diào)用函數(shù)添加至Lua語(yǔ)言的全局表時(shí),即可基于Lua語(yǔ)言,運(yùn)行該指定調(diào)用函數(shù),從而調(diào)用API。[0060]目前的相關(guān)技術(shù)中,將基于C語(yǔ)言實(shí)現(xiàn)的一個(gè)API進(jìn)行包裝之后,使用Lua語(yǔ)言即可調(diào)用該API,但是,對(duì)于成千上萬(wàn)的API來(lái)說(shuō),每個(gè)API都要經(jīng)過(guò)包裝才能在Lua語(yǔ)言中使用,僅包裝API的代碼就要有幾十萬(wàn)行,實(shí)現(xiàn)時(shí)較為困難,不太現(xiàn)實(shí)。而在本發(fā)明實(shí)施例中,為所有的API包裝了一個(gè)統(tǒng)一的指定調(diào)用函數(shù),該指定調(diào)用函數(shù)利用Lua語(yǔ)言的閉包特性,能夠調(diào)用不同的API。[0061]該指定調(diào)用函數(shù)的流程為:在該指定調(diào)用函數(shù)的上下文中取出一個(gè)真實(shí)的、待調(diào)用的函數(shù)地址,在Lua語(yǔ)言的堆棧中逐個(gè)取出參數(shù),將這些參數(shù)使用匯編語(yǔ)言逐個(gè)壓入待調(diào)用的函數(shù)的堆棧。則調(diào)用時(shí),基于C++語(yǔ)言,生成該指定調(diào)用函數(shù),通過(guò)該指定調(diào)用函數(shù),生成函數(shù)閉包,將該指定調(diào)用函數(shù)添加至Lua語(yǔ)言的全局表,則該指定調(diào)用函數(shù)在Lua語(yǔ)言中可以使用。由于該函數(shù)閉包的上下文信息中保存了待調(diào)用函數(shù)的真實(shí)地址,則基于Lua語(yǔ)言調(diào)用該函數(shù)閉包,即可調(diào)用函數(shù)。[0062]以通過(guò)CallApi函數(shù)調(diào)用MessageBox函數(shù)為例,基于C++語(yǔ)言,生成CallApi函數(shù),通過(guò)該CallApi函數(shù),生成CallApi的函數(shù)閉包,將該CallApi函數(shù)添加至Lua語(yǔ)言的全局表,則該CallApi函數(shù)在Lua語(yǔ)言中可以使用。該函數(shù)閉包的上下文信息中保存了MessageBox的真實(shí)地址,貝U基于Lua語(yǔ)言調(diào)用該函數(shù)閉包,即可調(diào)用MessageBox函數(shù)。[0063]舉例來(lái)說(shuō),基于C++語(yǔ)言生成的CallApi函數(shù)可以如圖2b所示,Lua語(yǔ)言的代碼可以如圖2c所示。[0064]基于Lua語(yǔ)言調(diào)用API時(shí),程序中保存的是Lua字節(jié)碼,甚至可能是加密處理后的Lua字節(jié)碼,應(yīng)用反編譯工具很難反編譯Lua字節(jié)碼,且由于Lua語(yǔ)言的實(shí)現(xiàn)機(jī)制較為復(fù)雜,一個(gè)Lua指令需要上百個(gè)匯編指令執(zhí)行,應(yīng)用反編譯工具無(wú)法跟蹤調(diào)用的API,也無(wú)法分析出程序的行為,提高了破解難度。本發(fā)明實(shí)施例對(duì)該Lua語(yǔ)言不做限定。[0065]202、基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,從DLL的導(dǎo)出表中,獲取待調(diào)用的API地址,將該待調(diào)用的API地址存放在該指定調(diào)用函數(shù)的閉包中,當(dāng)調(diào)用API時(shí),基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,從該指定調(diào)用函數(shù)的閉包中,獲取待調(diào)用的API地址,根據(jù)該API地址,獲取該API在運(yùn)行時(shí)所需的參數(shù),將獲取到的API地址和參數(shù)壓入堆棧。[0066]獲取API地址的流程示意圖可以如圖2d所示,DLL的導(dǎo)出表中包括多個(gè)待調(diào)用的API地址,基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,從該DLL的導(dǎo)出表中獲取待調(diào)用的API地址,將該API地址存放在該指定調(diào)用函數(shù)的閉包中,則運(yùn)行該指定調(diào)用函數(shù)時(shí),可以獲取到該API地址,以根據(jù)該API地址進(jìn)行調(diào)用。[0067]調(diào)用API的流程示意圖可以如圖2e所示,具體地,在運(yùn)行該指定調(diào)用函數(shù)時(shí),基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,從該指定調(diào)用函數(shù)的閉包中,獲取待調(diào)用的API地址,根據(jù)該API地址,獲取該API在運(yùn)行時(shí)所需的參數(shù),將獲取到的API地址和參數(shù)壓入堆棧,則要基于Lua語(yǔ)言調(diào)用API時(shí),可以從該堆棧中獲取該API地址和該參數(shù)。[0068]可選地,將多個(gè)待調(diào)用的API地址集中到該指定調(diào)用函數(shù)的閉包中,無(wú)需為每個(gè)待調(diào)用的API地址實(shí)現(xiàn)一個(gè)指定調(diào)用函數(shù)。在運(yùn)行該指定調(diào)用函數(shù)時(shí),選取一個(gè)待調(diào)用的API地址,根據(jù)該選取的API地址進(jìn)行調(diào)用。[0069]203、基于Lua語(yǔ)言,從該堆棧中獲取該API地址和該參數(shù),基于該API地址、該參數(shù)和該全局表中的指定調(diào)用函數(shù),調(diào)用該API,得到該API的返回值,將該返回值壓入該堆棧。[0070]基于Lua語(yǔ)言,調(diào)用該API時(shí),得到該API的返回值,將該返回值壓入該堆棧,則基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,可以從該堆棧中獲取該返回值。[0071]204、基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,從該堆棧中獲取該返回值。[0072]在本發(fā)明實(shí)施例中,在運(yùn)行該指定調(diào)用函數(shù)時(shí),從該指定調(diào)用函數(shù)的閉包中獲取待調(diào)用的API地址,并依次獲取該API在運(yùn)行時(shí)所需的參數(shù)。采用內(nèi)聯(lián)匯編,將獲取到的API地址和參數(shù)壓入堆棧中,則根據(jù)該堆棧中的參數(shù),使用asmcall函數(shù)調(diào)用該API地址,即可從eax寄存器中獲取返回值。通過(guò)創(chuàng)建該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言與API之間的接口,實(shí)現(xiàn)了Lua語(yǔ)言調(diào)用API的功能。另外,由于API使用stdcall調(diào)用約定,約定函數(shù)調(diào)用在返回之前由被調(diào)用者清理堆棧,因此,從eax寄存器中獲取到返回值時(shí)無(wú)需清理堆棧。[0073]205、基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,定義一個(gè)結(jié)構(gòu)體,該結(jié)構(gòu)體包括一個(gè)內(nèi)存的指針和內(nèi)存長(zhǎng)度,并實(shí)現(xiàn)第一函數(shù)、第二函數(shù)和第三函數(shù),創(chuàng)建一個(gè)元表,將該第一函數(shù)、該第二函數(shù)和該第三函數(shù)添加至該元表。[0074]該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言具備創(chuàng)建內(nèi)存對(duì)象的功能,但原始的Lua語(yǔ)言并不具備創(chuàng)建內(nèi)存對(duì)象的功能,則可以基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,為L(zhǎng)ua語(yǔ)言實(shí)現(xiàn)創(chuàng)建內(nèi)存對(duì)象的功能。具體地,基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,定義一個(gè)結(jié)構(gòu)體,該結(jié)構(gòu)體包括一個(gè)內(nèi)存的指針和內(nèi)存長(zhǎng)度。實(shí)現(xiàn)第一函數(shù)、第二函數(shù)和第三函數(shù),該第一函數(shù)用于獲取該結(jié)構(gòu)體的內(nèi)存指針,該第二函數(shù)用于獲取該結(jié)構(gòu)體的內(nèi)存長(zhǎng)度,該第三函數(shù)用于釋放該結(jié)構(gòu)體。再基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,創(chuàng)建一個(gè)元表metatable,將該第一函數(shù)和該第二函數(shù)添加至該metatable的_index字段,將該第三函數(shù)添加至該metatable的_8(:字段,使得該元表具備獲取該結(jié)構(gòu)體的內(nèi)存指針、獲取內(nèi)存長(zhǎng)度以及釋放內(nèi)存的功能。當(dāng)然,還可以僅將該第一函數(shù)和該第二函數(shù)添加至該metatable,使得該元表具備獲取該結(jié)構(gòu)體的內(nèi)存指針和獲取內(nèi)存長(zhǎng)度的功能,本發(fā)明實(shí)施例對(duì)添加至該metatable的函數(shù)不做限定。[0075]206、基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,將該元表添加至Lua語(yǔ)言的全局表,使得Lua語(yǔ)言具備創(chuàng)建內(nèi)存對(duì)象的功能。[0076]207、基于Lua語(yǔ)言,創(chuàng)建一個(gè)指定程序段,將該全局表中的元表設(shè)置給該指定程序段,則該指定程序段用于創(chuàng)建內(nèi)存對(duì)象。[0077]具體地,基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,創(chuàng)建一個(gè)指定程序段,將該指定程序段指向該結(jié)構(gòu)體,將該元表metatable設(shè)置給該指定程序段,使得該指定程序段具備創(chuàng)建內(nèi)存對(duì)象的功能。其中,該指定程序段可以為userdata,創(chuàng)建一個(gè)userdata,將該userdata指向該結(jié)構(gòu)體,獲取該創(chuàng)建的metatable,將該metatable設(shè)置給該創(chuàng)建的userdata,返回該userdata,則該userdata具備了一塊帶長(zhǎng)度的原生內(nèi)存,即該userdata具備了創(chuàng)建內(nèi)存對(duì)象的功能,且可以自動(dòng)執(zhí)行垃圾回收。[0078]需要說(shuō)明的是,上述步驟205-207用于為L(zhǎng)ua語(yǔ)言實(shí)現(xiàn)創(chuàng)建內(nèi)存對(duì)象的功能,再為該Lua語(yǔ)言實(shí)現(xiàn)讀取內(nèi)存的功能和寫入內(nèi)存的功能,即可實(shí)現(xiàn)操作內(nèi)存的功能,本發(fā)明實(shí)施例在此不再贅述。[0079]在本發(fā)明實(shí)施例中,已將該指定調(diào)用函數(shù)和該元表添加至該Lua語(yǔ)言的全局表中,則該Lua語(yǔ)言具備了調(diào)用API和操作內(nèi)存的功能。當(dāng)基于該Lua語(yǔ)言,運(yùn)行該指定調(diào)用函數(shù)時(shí),可以調(diào)用相應(yīng)的API,而基于該Lua語(yǔ)言,將該元表設(shè)置給該指定程序段時(shí),該指定程序段具備操作內(nèi)存的功能,可以執(zhí)行相應(yīng)的內(nèi)存操作。其中,該內(nèi)存操作包括創(chuàng)建內(nèi)存的操作、讀取內(nèi)存的操作、寫入內(nèi)存的操作等等,本發(fā)明實(shí)施例對(duì)此不做限定。[0080]為了進(jìn)一步提高破解難度,增加安全性,在實(shí)現(xiàn)該目標(biāo)程序代碼之后,可以刪除該目標(biāo)程序代碼對(duì)應(yīng)的調(diào)試文件(debug文件),以去掉該目標(biāo)程序代碼的調(diào)試功能,由于該目標(biāo)程序代碼基于Lua語(yǔ)言實(shí)現(xiàn),刪除該Lua語(yǔ)言的調(diào)試文件后,即使破解者很熟悉Lua語(yǔ)言的反編譯過(guò)程,也很難逆向調(diào)試該Lua語(yǔ)言的機(jī)器碼。[0081]本發(fā)明實(shí)施例可以應(yīng)用于Windows系統(tǒng)或其他系統(tǒng)中,為該Lua語(yǔ)言實(shí)現(xiàn)了調(diào)用API和操作內(nèi)存的功能,當(dāng)基于該Lua語(yǔ)言開(kāi)發(fā)軟件的核心程序代碼時(shí),如校驗(yàn)機(jī)制、加密算法或者獲取核心數(shù)據(jù)的方法等,提高了軟件破解的難度,增強(qiáng)了軟件的安全性。[0082]本發(fā)明實(shí)施例提供的方法,通過(guò)為L(zhǎng)ua語(yǔ)言擴(kuò)展調(diào)用API的功能和創(chuàng)建內(nèi)存對(duì)象的功能,從而能夠基于Lua語(yǔ)言實(shí)現(xiàn)目標(biāo)程序代碼,則目標(biāo)程序代碼中將保存Lua語(yǔ)言編譯后的字節(jié)碼,Lua語(yǔ)言的字節(jié)碼的反編譯的難度較大,反編譯工具很難反編譯Lua語(yǔ)言的字節(jié)碼,提高了破解難度,避免了對(duì)用戶造成的損失。進(jìn)一步地,開(kāi)創(chuàng)了基于Lua語(yǔ)言開(kāi)發(fā)軟件的方法,提高了軟件破解的難度,增強(qiáng)了軟件的安全性。[0083]圖3是本發(fā)明實(shí)施例提供的一種基于Lua語(yǔ)言的編程裝置結(jié)構(gòu)示意圖,參見(jiàn)圖3,該裝置包括:[0084]第一功能實(shí)現(xiàn)模塊301,用于為L(zhǎng)ua語(yǔ)言實(shí)現(xiàn)調(diào)用應(yīng)用程序編程接口API的功能;[0085]第二功能實(shí)現(xiàn)模塊302,用于為L(zhǎng)ua語(yǔ)言實(shí)現(xiàn)創(chuàng)建內(nèi)存對(duì)象的功能;[0086]代碼實(shí)現(xiàn)模塊303,用于基于具備調(diào)用API功能和創(chuàng)建內(nèi)存對(duì)象功能的Lua語(yǔ)言,實(shí)現(xiàn)目標(biāo)程序代碼。[0087]本發(fā)明實(shí)施例提供的裝置,通過(guò)為L(zhǎng)ua語(yǔ)言擴(kuò)展調(diào)用API的功能和創(chuàng)建內(nèi)存對(duì)象的功能,從而能夠基于Lua語(yǔ)言實(shí)現(xiàn)目標(biāo)程序代碼,則目標(biāo)程序代碼中將保存Lua語(yǔ)言編譯后的字節(jié)碼,Lua語(yǔ)言的字節(jié)碼的反編譯的難度較大,反編譯工具很難反編譯Lua語(yǔ)言的字節(jié)碼,提高了破解難度,避免了對(duì)用戶造成的損失。[0088]可選地,該第一功能實(shí)現(xiàn)模塊301包括:[0089]調(diào)用函數(shù)生成單元,用于基于預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,生成指定調(diào)用函數(shù),該指定調(diào)用函數(shù)用于調(diào)用不同的應(yīng)用程序編程接口API,該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言具備調(diào)用API的功能;[0090]全局表添加單元,用于基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,將該指定調(diào)用函數(shù)添加至Lua語(yǔ)言的全局表,使得Lua語(yǔ)言具備調(diào)用API的功能;[0091]調(diào)用單元,用于根據(jù)該全局表中的指定調(diào)用函數(shù),基于Lua語(yǔ)言調(diào)用API。[0092]可選地,該調(diào)用單元包括:[0093]第一地址獲取子單元,用于基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,從動(dòng)態(tài)鏈接庫(kù)DLL的導(dǎo)出表中,獲取待調(diào)用的API地址,將該待調(diào)用的API地址存放在該指定調(diào)用函數(shù)的閉包中;[0094]第二地址獲取子單元,用于基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,從該指定調(diào)用函數(shù)的閉包中,獲取待調(diào)用的API地址,根據(jù)該API地址,獲取該API在運(yùn)行時(shí)所需的參數(shù),將獲取到的API地址和參數(shù)壓入堆棧;[0095]調(diào)用子單元,用于基于Lua語(yǔ)言,從該堆棧中獲取該API地址和該參數(shù),基于該API地址、該參數(shù)和該全局表中的指定調(diào)用函數(shù),調(diào)用該API,得到該API的返回值,將該返回值壓入該堆棧;[0096]返回值獲取子單元,用于基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,從該堆棧中獲取該返回值。[0097]可選地,該第二功能實(shí)現(xiàn)模塊302包括:[0098]結(jié)構(gòu)體定義單元,用于基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,定義一個(gè)結(jié)構(gòu)體,該結(jié)構(gòu)體包括一個(gè)內(nèi)存的指針和內(nèi)存長(zhǎng)度;[0099]第一函數(shù)實(shí)現(xiàn)單元,用于基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,實(shí)現(xiàn)第一函數(shù)和第二函數(shù),該第一函數(shù)用于獲取該結(jié)構(gòu)體的內(nèi)存指針,該第二函數(shù)用于獲取該結(jié)構(gòu)體的內(nèi)存長(zhǎng)度;[0100]元表創(chuàng)建單元,用于基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,創(chuàng)建一個(gè)元表,將該第一函數(shù)和該第二函數(shù)添加至該元表,使得該元表具備獲取該結(jié)構(gòu)體的內(nèi)存指針和內(nèi)存長(zhǎng)度的功能;[0101]元表全局添加單元,用于將該元表添加至Lua語(yǔ)言的全局表,使得Lua語(yǔ)言具備創(chuàng)建內(nèi)存對(duì)象的功能;[0102]其中,該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言具備創(chuàng)建內(nèi)存對(duì)象的功能。[0103]可選地,該第二功能實(shí)現(xiàn)模塊302還包括:[0104]第二函數(shù)實(shí)現(xiàn)單元,用于基于該預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,實(shí)現(xiàn)第三函數(shù),該第三函數(shù)用于釋放該結(jié)構(gòu)體;[0105]該元表創(chuàng)建單元,還用于將該第一函數(shù)、該第二函數(shù)和該第三函數(shù)添加至該元表。[0106]可選地,該裝置還包括:[0107]指定程序段創(chuàng)建模塊,用于基于Lua語(yǔ)言,創(chuàng)建一個(gè)指定程序段;[0108]設(shè)置模塊,用于基于Lua語(yǔ)言,將該全局表中的元表設(shè)置給該指定程序段,則該指定程序段用于創(chuàng)建內(nèi)存對(duì)象。[0109]可選地,該裝置還包括:[0110]調(diào)試文件刪除模塊,用于刪除該目標(biāo)程序代碼對(duì)應(yīng)的調(diào)試文件,以去除該目標(biāo)程序代碼的調(diào)試功能。[0111]上述所有可選技術(shù)方案,可以采用任意結(jié)合形成本發(fā)明的可選實(shí)施例,在此不再--贅述。[0112]需要說(shuō)明的是:上述實(shí)施例提供的基于Lua語(yǔ)言的編程裝置在基于Lua語(yǔ)言進(jìn)行編程時(shí),僅以上述各功能模塊的劃分進(jìn)行舉例說(shuō)明,實(shí)際應(yīng)用中,可以根據(jù)需要而將上述功能分配由不同的功能模塊完成,即將設(shè)備的內(nèi)部結(jié)構(gòu)劃分成不同的功能模塊,以完成以上描述的全部或者部分功能。另外,上述實(shí)施例提供的基于Lua語(yǔ)言的編程裝置與基于Lua語(yǔ)言的編程方法實(shí)施例屬于同一構(gòu)思,其具體實(shí)現(xiàn)過(guò)程詳見(jiàn)方法實(shí)施例,這里不再贅述。[0113]本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述實(shí)施例的全部或部分步驟可以通過(guò)硬件來(lái)完成,也可以通過(guò)程序來(lái)指令相關(guān)的硬件完成,所述的程序可以存儲(chǔ)于一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中,上述提到的存儲(chǔ)介質(zhì)可以是只讀存儲(chǔ)器,磁盤或光盤等。[0114]以上所述僅為本發(fā)明的較佳實(shí)施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)?!緳?quán)利要求】1.一種基于Lua語(yǔ)言的編程方法,其特征在于,所述方法包括:為L(zhǎng)ua語(yǔ)言實(shí)現(xiàn)調(diào)用應(yīng)用程序編程接口API的功能;為L(zhǎng)ua語(yǔ)言實(shí)現(xiàn)創(chuàng)建內(nèi)存對(duì)象的功能;基于具備調(diào)用API功能和創(chuàng)建內(nèi)存對(duì)象功能的Lua語(yǔ)言,實(shí)現(xiàn)目標(biāo)程序代碼。2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述為L(zhǎng)ua語(yǔ)言實(shí)現(xiàn)調(diào)用應(yīng)用程序編程接口API的功能包括:基于預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,生成指定調(diào)用函數(shù),所述指定調(diào)用函數(shù)用于調(diào)用不同的應(yīng)用程序編程接口API,所述預(yù)設(shè)開(kāi)發(fā)語(yǔ)言具備調(diào)用API的功能;基于所述預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,將所述指定調(diào)用函數(shù)添加至Lua語(yǔ)言的全局表,使得Lua語(yǔ)言具備調(diào)用API的功能;根據(jù)所述全局表中的指定調(diào)用函數(shù),基于Lua語(yǔ)言調(diào)用API。3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述根據(jù)所述全局表中的指定調(diào)用函數(shù),基于Lua語(yǔ)言調(diào)用API包括:基于所述預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,從動(dòng)態(tài)鏈接庫(kù)DLL的導(dǎo)出表中,獲取待調(diào)用的API地址,將所述待調(diào)用的API地址存放在所述指定調(diào)用函數(shù)的閉包中;基于所述預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,從所述指定調(diào)用函數(shù)的閉包中,獲取待調(diào)用的API地址,根據(jù)所述API地址,獲取所述API在運(yùn)行時(shí)所需的參數(shù),將獲取到的API地址和參數(shù)壓入堆棧;基于Lua語(yǔ)言,從所述堆棧中獲取所述API地址和所述參數(shù),基于所述API地址、所述參數(shù)和所述全局表中的指定調(diào)用函數(shù),調(diào)用所述API,得到所述API的返回值,將所述返回值壓入所述堆棧;基于所述預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,從所述堆棧中獲取所述返回值。4.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述為L(zhǎng)ua語(yǔ)言實(shí)現(xiàn)創(chuàng)建內(nèi)存對(duì)象的功能包括:基于所述預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,定義一個(gè)結(jié)構(gòu)體,所述結(jié)構(gòu)體包括一個(gè)內(nèi)存的指針和內(nèi)存長(zhǎng)度;基于所述預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,實(shí)現(xiàn)第一函數(shù)和第二函數(shù),所述第一函數(shù)用于獲取所述結(jié)構(gòu)體的內(nèi)存指針,所述第二函數(shù)用于獲取所述結(jié)構(gòu)體的內(nèi)存長(zhǎng)度;基于所述預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,創(chuàng)建一個(gè)元表,將所述第一函數(shù)和所述第二函數(shù)添加至所述元表,使得所述元表具備獲取所述結(jié)構(gòu)體的內(nèi)存指針和內(nèi)存長(zhǎng)度的功能;將所述元表添加至Lua語(yǔ)言的全局表,使得Lua語(yǔ)言具備創(chuàng)建內(nèi)存對(duì)象的功能;其中,所述預(yù)設(shè)開(kāi)發(fā)語(yǔ)言具備創(chuàng)建內(nèi)存對(duì)象的功能。5.根據(jù)權(quán)利要求4所述的方法,其特征在于,所述為L(zhǎng)ua語(yǔ)言實(shí)現(xiàn)創(chuàng)建內(nèi)存對(duì)象的功能還包括:基于所述預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,實(shí)現(xiàn)第三函數(shù),所述第三函數(shù)用于釋放所述結(jié)構(gòu)體;將所述第一函數(shù)、所述第二函數(shù)和所述第三函數(shù)添加至所述元表。6.根據(jù)權(quán)利要求4所述的方法,其特征在于,所述方法還包括:基于Lua語(yǔ)言,創(chuàng)建一個(gè)指定程序段;基于Lua語(yǔ)言,將所述全局表中的元表設(shè)置給所述指定程序段,則所述指定程序段用于創(chuàng)建內(nèi)存對(duì)象。7.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述基于具備調(diào)用API功能和創(chuàng)建內(nèi)存對(duì)象功能的Lua語(yǔ)言,實(shí)現(xiàn)目標(biāo)程序代碼之后,所述方法還包括:刪除所述目標(biāo)程序代碼對(duì)應(yīng)的調(diào)試文件,以去除所述目標(biāo)程序代碼的調(diào)試功能。8.一種基于Lua語(yǔ)言的編程裝置,其特征在于,所述裝置包括:第一功能實(shí)現(xiàn)模塊,用于為L(zhǎng)ua語(yǔ)言實(shí)現(xiàn)調(diào)用應(yīng)用程序編程接口API的功能;第二功能實(shí)現(xiàn)模塊,用于為L(zhǎng)ua語(yǔ)言實(shí)現(xiàn)創(chuàng)建內(nèi)存對(duì)象的功能;代碼實(shí)現(xiàn)模塊,用于基于具備調(diào)用API功能和創(chuàng)建內(nèi)存對(duì)象功能的Lua語(yǔ)言,實(shí)現(xiàn)目標(biāo)程序代碼。9.根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述第一功能實(shí)現(xiàn)模塊包括:調(diào)用函數(shù)生成單元,用于基于預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,生成指定調(diào)用函數(shù),所述指定調(diào)用函數(shù)用于調(diào)用不同的應(yīng)用程序編程接口API,所述預(yù)設(shè)開(kāi)發(fā)語(yǔ)言具備調(diào)用API的功能;全局表添加單元,用于基于所述預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,將所述指定調(diào)用函數(shù)添加至Lua語(yǔ)言的全局表,使得Lua語(yǔ)言具備調(diào)用API的功能;調(diào)用單元,用于根據(jù)所述全局表中的指定調(diào)用函數(shù),基于Lua語(yǔ)言調(diào)用API。10.根據(jù)權(quán)利要求9所述的裝置,其特征在于,所述調(diào)用單元包括:第一地址獲取子單元,用于基于所述預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,從動(dòng)態(tài)鏈接庫(kù)DLL的導(dǎo)出表中,獲取待調(diào)用的API地址,將所述待調(diào)用的API地址存放在所述指定調(diào)用函數(shù)的閉包中;第二地址獲取子單元,用于基于所述預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,從所述指定調(diào)用函數(shù)的閉包中,獲取待調(diào)用的API地址,根據(jù)所述API地址,獲取所述API在運(yùn)行時(shí)所需的參數(shù),將獲取到的API地址和參數(shù)壓入堆棧;調(diào)用子單元,用于基于Lua語(yǔ)言,從所述堆棧中獲取所述API地址和所述參數(shù),基于所述API地址、所述參數(shù)和所述全局表中的指定調(diào)用函數(shù),調(diào)用所述API,得到所述API的返回值,將所述返回值壓入所述堆棧;返回值獲取子單元,用于基于所述預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,從所述堆棧中獲取所述返回值。11.根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述第二功能實(shí)現(xiàn)模塊包括:結(jié)構(gòu)體定義單元,用于基于所述預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,定義一個(gè)結(jié)構(gòu)體,所述結(jié)構(gòu)體包括一個(gè)內(nèi)存的指針和內(nèi)存長(zhǎng)度;第一函數(shù)實(shí)現(xiàn)單元,用于基于所述預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,實(shí)現(xiàn)第一函數(shù)和第二函數(shù),所述第一函數(shù)用于獲取所述結(jié)構(gòu)體的內(nèi)存指針,所述第二函數(shù)用于獲取所述結(jié)構(gòu)體的內(nèi)存長(zhǎng)度;元表創(chuàng)建單元,用于基于所述預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,創(chuàng)建一個(gè)元表,將所述第一函數(shù)和所述第二函數(shù)添加至所述元表,使得所述元表具備獲取所述結(jié)構(gòu)體的內(nèi)存指針和內(nèi)存長(zhǎng)度的功倉(cāng)泛;元表全局添加單元,用于將所述元表添加至Lua語(yǔ)言的全局表,使得Lua語(yǔ)言具備創(chuàng)建內(nèi)存對(duì)象的功能;其中,所述預(yù)設(shè)開(kāi)發(fā)語(yǔ)言具備創(chuàng)建內(nèi)存對(duì)象的功能。12.根據(jù)權(quán)利要求11所述的裝置,其特征在于,所述第二功能實(shí)現(xiàn)模塊還包括:第二函數(shù)實(shí)現(xiàn)單元,用于基于所述預(yù)設(shè)開(kāi)發(fā)語(yǔ)言,實(shí)現(xiàn)第三函數(shù),所述第三函數(shù)用于釋放所述結(jié)構(gòu)體;所述元表創(chuàng)建單元,還用于將所述第一函數(shù)、所述第二函數(shù)和所述第三函數(shù)添加至所述元表。13.根據(jù)權(quán)利要求11所述的裝置,其特征在于,所述裝置還包括:指定程序段創(chuàng)建模塊,用于基于Lua語(yǔ)言,創(chuàng)建一個(gè)指定程序段;設(shè)置模塊,用于基于Lua語(yǔ)言,將所述全局表中的元表設(shè)置給所述指定程序段,則所述指定程序段用于創(chuàng)建內(nèi)存對(duì)象。14.根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述裝置還包括:調(diào)試文件刪除模塊,用于刪除所述目標(biāo)程序代碼對(duì)應(yīng)的調(diào)試文件,以去除所述目標(biāo)程序代碼的調(diào)試功能?!疚臋n編號(hào)】G06F9/45GK104298534SQ201410571641【公開(kāi)日】2015年1月21日申請(qǐng)日期:2014年10月23日優(yōu)先權(quán)日:2014年10月23日【發(fā)明者】黃俊申請(qǐng)人:廣州華多網(wǎng)絡(luò)科技有限公司