易語(yǔ)言代碼中嵌入?yún)R編/機(jī)器碼方法
很多朋友在編寫(xiě)易語(yǔ)言里要混合插入?yún)R編語(yǔ)言等,如何解決呢?我們來(lái)看下
我們都知道,C++或Delphi的程序源代碼中可以嵌入?yún)R編代碼,以達(dá)到某些特定目的。易語(yǔ)言作為實(shí)用而又功能強(qiáng)大的編程語(yǔ)言,也允許在代碼中嵌入?yún)R編,——當(dāng)然嚴(yán)格來(lái)說(shuō),是嵌入機(jī)器指令代碼。借助“特殊功能支持庫(kù)”中的“置入代碼”命令,可以完成這項(xiàng)功能。(liigo 2009.03.20補(bǔ)記:自易語(yǔ)言4.12版本起,“置入代碼”已被移入核心支持庫(kù)。)
為什么要在易語(yǔ)言中“置入代碼”呢?
- 一是完成易語(yǔ)言不好直接完成的工作(例如,調(diào)用子程序,取變量地址,取對(duì)象方法地址,等等,當(dāng)然,“置入代碼”也不是唯一途徑,通過(guò)外部支持庫(kù)往往也能完成)
- 二是提高代碼執(zhí)行效率(這個(gè)容易理解,不多說(shuō)了)。
使用“置入代碼”對(duì)程序員有什么要求?要熟悉匯編,會(huì)寫(xiě)匯編代碼;會(huì)使用至少一種基于匯編的調(diào)試器(如Ollydbg);要了解或會(huì)分析易語(yǔ)言編譯器生成的機(jī)器代碼;要對(duì)易語(yǔ)言底層技術(shù)有所了解,如文本、字節(jié)集、數(shù)組等數(shù)據(jù)格式,參數(shù)傳遞方式,命令調(diào)用約定等?!爸萌氪a”在易語(yǔ)言中屬于“高級(jí)命令”,是專(zhuān)門(mén)為具有一定編程能力的高級(jí)程序員特別是熟悉匯編編程的專(zhuān)業(yè)人士提供的。一般初學(xué)者,如果半懂不懂,最好不要涉及,直接使用別人寫(xiě)好的模塊或支持庫(kù)比較好,畢竟易語(yǔ)言的功能已經(jīng)足夠強(qiáng)大,很多問(wèn)題都已經(jīng)有了現(xiàn)成的解決方案。
“置入代碼”的原理。其實(shí)質(zhì)是,在易語(yǔ)言編譯過(guò)程中,編譯器將“置入代碼”的參數(shù)所指定的機(jī)器指令數(shù)據(jù),直接輸出到EXE/DLL中。因?yàn)檫@個(gè)動(dòng)作是在編譯時(shí)進(jìn)行的,所以參數(shù)指定的機(jī)器碼只能是常量,而不能是變量。同樣,因?yàn)槭蔷幾g時(shí)處理,運(yùn)行時(shí)并不執(zhí)行,因而程序執(zhí)行時(shí)并不依賴(lài)支持庫(kù)(即程序發(fā)布時(shí)不需攜帶特殊支持庫(kù)spec.fne文件)。
使用“置入代碼”都有什么步驟?
- 寫(xiě)出匯編代碼;
- 通過(guò)匯編器將匯編代碼編譯為機(jī)器碼;
- 將機(jī)器碼轉(zhuǎn)換為易語(yǔ)言字節(jié)集常量數(shù)據(jù),并作為參數(shù)傳入“置入代碼”。
第一步?jīng)]什么好說(shuō)的,是考驗(yàn)匯編功力的地方,是硬功夫,沒(méi)有技巧的。
第二步,我們可以借助“Ollydbg”等匯編器完成(當(dāng)然也可以通過(guò)查詢(xún)Intel x86 指令手冊(cè),純手工將匯編代碼編譯為機(jī)器指令碼,除非變態(tài)或超級(jí)牛叉的人不會(huì)采用)。首先啟動(dòng)Ollydbg,打開(kāi)任意一個(gè)EXE程序,在匯編代碼區(qū)雙擊任意一行,在彈出的匯編窗口中,輸入第一步寫(xiě)好的第一行匯編代碼,回車(chē),就可以在機(jī)器指令區(qū)域(匯編代碼區(qū)域左側(cè))看到相應(yīng)的機(jī)器指令了,如此循環(huán),逐行輸入所有匯編代碼,就可以得到相應(yīng)的機(jī)器指令代碼了。
第三步也相對(duì)容易,主要工作可能就是將Ollydbg生成的16進(jìn)制指令代碼轉(zhuǎn)換為10進(jìn)制。如果代碼不長(zhǎng),借助“計(jì)算器”純手工操作也行。一般來(lái)說(shuō),通常會(huì)用易語(yǔ)言寫(xiě)一個(gè)小程序,解析從Ollydbg中復(fù)制出的文本,提取其中的機(jī)器指令代碼,進(jìn)行數(shù)制轉(zhuǎn)換,生成易語(yǔ)言字節(jié)集數(shù)據(jù)的文本格式。這種小程序很容易寫(xiě),我想“置入代碼”的使用者中很多人(據(jù)我了解不下10個(gè))都寫(xiě)過(guò)類(lèi)似的程序,我(liigo)也寫(xiě)過(guò)一個(gè)。說(shuō)實(shí)話(huà),這種小程序自己用,寫(xiě)的簡(jiǎn)陋些沒(méi)關(guān)系,反正只是輔助程序,還可以隨時(shí)調(diào)整嘛,但想發(fā)布的話(huà),就要考慮通用性易用性,麻煩很多,況且用戶(hù)也不多,所以發(fā)布此類(lèi)程序的人很少,但是論壇上也確實(shí)有人發(fā)過(guò)。
感謝大家對(duì)腳本之家的支持
相關(guān)文章
易語(yǔ)言修改IE協(xié)議頭留言手機(jī)版網(wǎng)頁(yè)
在本篇文章中小編給大家分享了關(guān)于易語(yǔ)言 修改IE協(xié)議頭模擬手機(jī)瀏覽網(wǎng)頁(yè)相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們參考下。2018-11-11易語(yǔ)言將進(jìn)度條當(dāng)前進(jìn)度顯示出來(lái)的方法
今天小編就為大家分享一篇關(guān)于易語(yǔ)言將進(jìn)度條當(dāng)前進(jìn)度顯示出來(lái)的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-11-11易語(yǔ)言編寫(xiě)的算術(shù)題程序?qū)嵗a
在本篇文章中我們給大家分享了一個(gè)關(guān)于易語(yǔ)言編寫(xiě)的算術(shù)題程序,有興趣的朋友們可以跟著參考下。2018-11-11易語(yǔ)言將指定數(shù)據(jù)類(lèi)型轉(zhuǎn)換為字節(jié)集類(lèi)型
今天小編就為大家分享一篇關(guān)于易語(yǔ)言將指定數(shù)據(jù)類(lèi)型轉(zhuǎn)換為字節(jié)集類(lèi)型,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-11-11