欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

代碼擾亂以及通過仿真來控制處理器的制作方法

文檔序號:6494960閱讀:153來源:國知局
專利名稱:代碼擾亂以及通過仿真來控制處理器的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及產(chǎn)生擾亂的目標(biāo)代碼的方法、以目標(biāo)代碼形式的可執(zhí)行程序、產(chǎn)生其上具有安全的可執(zhí)行程序的存儲介質(zhì)的方法、以及其上具有安全的可執(zhí)行程序的存儲介質(zhì)。本發(fā)明還涉及控制處理器運行程序的方法。
背景技術(shù)
通常,這個發(fā)明涉及軟件安全性。眾所周知,軟件可以是有價值的,并且,有人和組織試圖繞過用來保護(hù)軟件的任何安全措施。
以諸如C和Fortran的高級語言編寫程序。然后將它們編譯成為目標(biāo)代碼,其可為機(jī)器語言,或者可被轉(zhuǎn)換成機(jī)器語言。例如編譯器的設(shè)備可以用來進(jìn)行從源代碼到目標(biāo)代碼的變換(translation)。機(jī)器語言是二進(jìn)制數(shù)字流,其將包括用于可執(zhí)行程序的指令,但是還可以包括各種安全部件,例如,用來確保僅可運行程序的真正副本。破解者(cracker)試圖獲得清楚的代碼,以便他們可以繞過任何安全部件,并且,例如,由于可得到將從二進(jìn)制流產(chǎn)生源代碼的反向編譯器,所以,他們會在這方面獲得幫助。
已經(jīng)建議了填充目標(biāo)代碼,即增加冗余的附加代碼來隱藏或擾亂(obfuscate)起作用的(functional)目標(biāo)代碼,但是,已經(jīng)證實破解者熟練于識別和除去填充。還已建議了加密目標(biāo)代碼。然而,當(dāng)運行程序時需要能夠得到加密密鑰,以便可以解密指令。顯然,一旦破解者找到了密鑰,便提供了對未加密的代碼的訪問。

發(fā)明內(nèi)容
本發(fā)明試圖提供使軟件安全的新的且改進(jìn)的方法。
依據(jù)本發(fā)明的第一方面,提供了一種產(chǎn)生擾亂的目標(biāo)代碼的方法,該方法包括以下步驟用變量的選定函數(shù)代替源代碼中的變量;以及編譯該源代碼,以產(chǎn)生目標(biāo)代碼,該選定函數(shù)使變量作為一系列操作而存在于編譯后的目標(biāo)代碼中。
因為將變量編譯成一系列操作,所以增加了目標(biāo)代碼的大小,并且這本身就起到隱藏或擾亂有用的代碼的作用。然而,提供一系列操作來呈現(xiàn)一個變量與填充代碼相比具有這樣的優(yōu)勢,即全部產(chǎn)生的代碼看起來都是有用的,從而使破解者更難以確定他們需要哪些目標(biāo)代碼。
在優(yōu)選實施例中,利用其呈現(xiàn)變量的一系列操作由算術(shù)和/或邏輯操作組成,并且這一系列操作被布置為當(dāng)運行目標(biāo)代碼時提供該變量。另外和/或作為選擇,利用其呈現(xiàn)變量的一系列操作包含求補操作,其被布置為當(dāng)目標(biāo)代碼運行時提供該變量。
在這方面,目標(biāo)代碼的長度大大地增加了,并且由此通過例如將變量呈現(xiàn)為一系列算術(shù)或其它操作,來擾亂目標(biāo)代碼。
在實施例中,在源代碼的模板中定義選定函數(shù)。
例如,源代碼的模板定義了多個函數(shù),所述多個函數(shù)各自被布置為進(jìn)行編譯,以將變量呈現(xiàn)為一系列操作,并且該方法還包含選擇函數(shù)之一來代替源代碼中的變量。
優(yōu)選地,不同的鍵與模板中的每個函數(shù)相關(guān)聯(lián),并且該方法還包含用該模板來代替源代碼中的變量,并且通過選擇與模板中的一個函數(shù)相關(guān)聯(lián)的鍵來選擇所述一個函數(shù)。
提供多個函數(shù)、其中每個都可被選擇來代替變量,這允許以多種不同的方法來編譯特定變量。這對于其中一個源產(chǎn)生許多不同的軟件應(yīng)用是非常有幫助的。例如,CD的制造商將生產(chǎn)具有不同的標(biāo)題和內(nèi)容的CD,但是將保持格式和安全措施在所有標(biāo)題上都是共用的。在許多現(xiàn)有技術(shù)的安全性解決方案中,破解者只需破解在一個標(biāo)題上的保護(hù),就能夠通過重復(fù)所進(jìn)行的動作來破解全部標(biāo)題。
如上面所定義的,提供多個函數(shù),允許為每個不同的標(biāo)題、為相同的變量而選擇不同的函數(shù)。因此,如果破解者的確設(shè)法訪問了一個CD標(biāo)題的內(nèi)容,則也對破解者訪問另一個CD標(biāo)題的內(nèi)容的努力沒有幫助。此外,使用鍵方法來選擇函數(shù)允許使軟件安全的處理的某些自動化。
在實施例中,源代碼涉及存儲的數(shù)組和模板,并使用指針來定位這些數(shù)組和模板。
優(yōu)選地,源代碼是標(biāo)準(zhǔn)的編程語言。例如,源代碼是C++。
本發(fā)明還擴(kuò)展到以目標(biāo)代碼形式的可執(zhí)行程序,該程序已從源代碼編譯,其中,源代碼中的變量已被編譯為作為一系列操作而存在于目標(biāo)代碼中,借此擾亂目標(biāo)代碼。
利用其呈現(xiàn)變量的一系列操作可以由算術(shù)和/或邏輯操作組成,并且這一系列操作被布置為當(dāng)運行目標(biāo)代碼時提供該變量。另外和/或作為選擇,利用其呈現(xiàn)變量的一系列操作可以包含求補操作,其被布置為當(dāng)目標(biāo)代碼運行時提供該變量。
被布置為當(dāng)運行目標(biāo)代碼時提供該變量的一系列操作的使用允許目標(biāo)代碼的指令、或從目標(biāo)代碼中轉(zhuǎn)換的指令運行程序,而不需要解密、或者解釋擾亂的目標(biāo)代碼。
在實施例中,已通過用選定函數(shù)代替源代碼中的變量而產(chǎn)生了一系列操作,該選定函數(shù)被布置為使變量作為一系列操作而存在于編譯后的目標(biāo)代碼中。
例如,在源代碼的模板中定義了選定函數(shù)。
優(yōu)選地,源代碼的模板已定義了多個函數(shù),每個函數(shù)都被布置為進(jìn)行編譯,以將變量呈現(xiàn)為一系列操作,并且已經(jīng)選擇了函數(shù)之一來代替源代碼中的變量。
依據(jù)本發(fā)明的進(jìn)一步方面,提供了一種產(chǎn)生其上具有安全的可執(zhí)行程序的存儲介質(zhì)的方法,該方法包括以下步驟通過將可執(zhí)行程序與被布置為控制對可執(zhí)行程序的訪問的安全程序相關(guān)聯(lián),來使該可執(zhí)行程序安全;以及將安全的可執(zhí)行程序應(yīng)用于存儲介質(zhì)。并且,該方法還包含擾亂該安全程序的目標(biāo)代碼,其中,已經(jīng)通過用變量的選定函數(shù)代替源代碼中的變量、并編譯該源代碼以產(chǎn)生目標(biāo)代碼,來擾亂該安全程序的目標(biāo)代碼,該選定函數(shù)使變量作為一系列操作而存在于已編譯的目標(biāo)代碼中。
在實施例中,利用其呈現(xiàn)變量的一系列操作由算術(shù)和/或邏輯操作組成,并且其中該系列的操作被布置為當(dāng)運行目標(biāo)代碼時提供該變量。另外和/或作為選擇,利用其呈現(xiàn)變量的一系列操作包含求補操作,其被布置為當(dāng)目標(biāo)代碼運行時提供該變量。
優(yōu)選地,可執(zhí)行程序和安全程序在目標(biāo)代碼級別上相關(guān)聯(lián)。
提供控制對可執(zhí)行程序的訪問的安全程序可以是任何適當(dāng)?shù)陌踩绦?。例如,安全程序可以被布置為加密該可?zhí)行程序,和/或可以把可執(zhí)行程序中的塊移入安全程序中,和/或安全程序可以被布置為需要驗證程序的運行。
在實施例中,在源代碼的模板中定義在安全程序的源代碼中的選定函數(shù)。
例如,所述安全程序源代碼的模板定義了多個函數(shù),每個函數(shù)都被布置為進(jìn)行編譯,以將變量呈現(xiàn)為一系列操作,并且,該方法還包含選擇函數(shù)之一來代替源代碼中的變量。
優(yōu)選地,不同的鍵與模板中的每一個函數(shù)相關(guān)聯(lián),并且該方法還包含用該模板來代替源代碼中的變量,并且,通過選擇與一個函數(shù)相關(guān)聯(lián)的鍵來選擇模板中的所述一個函數(shù)。
在實施例中,安全程序的源代碼涉及存儲的數(shù)組和模板,并使用指針來定位這些數(shù)組和模板。
安全程序的源代碼優(yōu)選為標(biāo)準(zhǔn)編程語言,如C++。
優(yōu)選地,其上應(yīng)用了安全的可執(zhí)行程序的存儲介質(zhì)是光盤,并且,例如,安全的可執(zhí)行程序通過激光束編碼而應(yīng)用于光盤上。
作為選擇,其上應(yīng)用了安全的可執(zhí)行程序的存儲介質(zhì)是服務(wù)器、計算機(jī)和/或其它處理部件中的存儲器或者與這些部件相關(guān)聯(lián)的存儲器。例如,存儲介質(zhì)可以是計算機(jī)中、或者連接到計算機(jī)的硬盤。
本發(fā)明還擴(kuò)展到其上具有安全的可執(zhí)行程序的存儲介質(zhì),其中通過讓安全程序與其相關(guān)聯(lián)來使可執(zhí)行程序安全,該安全程序被布置為控制對可執(zhí)行程序的訪問,并且,其中,安全程序處于已被擾亂的目標(biāo)代碼中,該安全程序已經(jīng)從源代碼編譯,并且,安全程序的源代碼中的變量已被編譯為作為一系列操作而存在于目標(biāo)代碼中,借此已擾亂了目標(biāo)代碼。
例如,利用其呈現(xiàn)變量的一系列操作由算術(shù)和/或邏輯操作組成,并且其中,該系列的操作被布置為當(dāng)運行目標(biāo)代碼時提供該變量。另外和/或作為選擇,利用其呈現(xiàn)變量的一系列操作包含求補操作,其被布置為當(dāng)目標(biāo)代碼運行時提供該變量。
在實施例中,已通過用被布置為使變量作為一系列操作而存在于編譯的目標(biāo)代碼中的選定函數(shù)代替源代碼中的變量,而產(chǎn)生了一系列操作。
例如,在源代碼的模板中定義了選定函數(shù)。
在實施例中,源代碼的模板已經(jīng)定義了多個函數(shù),其中,所述多個函數(shù)各自被布置為進(jìn)行編譯,以將變量呈現(xiàn)為一系列操作,并且,已經(jīng)選擇了函數(shù)之一來代替源代碼中的變量。
優(yōu)選地,可執(zhí)行程序和安全程序在目標(biāo)代碼級別上相關(guān)聯(lián)。
可以在存儲介質(zhì)上加密可執(zhí)行程序,并且,隨后,相關(guān)聯(lián)的安全程序被布置為允許可執(zhí)行程序的解密。
另外和/或作為選擇,可以已經(jīng)在安全程序內(nèi)重定位來自可執(zhí)行程序的塊。
另外和/或作為選擇,安全程序可以被布置為需要驗證程序的運行。
在安全程序被布置為例如需要驗證程序的運行的情況中,將也在存儲介質(zhì)上提供驗證程序。讓安全程序合并驗證程序?qū)⑹强赡艿?,但是?dāng)前通常優(yōu)選為安全程序指向驗證程序。
在實施例中,存儲介質(zhì)是其上編碼了可執(zhí)行程序和安全程序的光盤。例如,光盤是CD、CD-ROM、或DVD。
在替換實施例中,存儲介質(zhì)是在服務(wù)器、計算機(jī)和/或其它處理部件中的存儲器或者與這些部件相關(guān)聯(lián)的存儲器,并且其上存儲了可執(zhí)行程序和安全程序。例如,存儲介質(zhì)可以是計算機(jī)中,或連接到計算機(jī)的硬盤。
可執(zhí)行程序是游戲程序、和/或視頻程序、和/或音頻程序、和/或其它軟件。
在后面的這個方面中,應(yīng)當(dāng)理解上面定義的安全方法通??蓱?yīng)用于全部的軟件應(yīng)用。在存儲介質(zhì)上提供的可執(zhí)行程序可以包含游戲程序和/或視頻程序、和/或音頻程序和/或任何其它多媒體格式。
如上面所定義的那樣,一種產(chǎn)生擾亂的目標(biāo)代碼的方法、和/或一種以目標(biāo)代碼形式的可執(zhí)行程序、和/或一種產(chǎn)生其上具有安全的可執(zhí)行程序的存儲介質(zhì)的方法可以各自單獨地使用、或者結(jié)合如下面所定義的那樣的控制處理器以運行程序的方法、和/或其上具有安全的可執(zhí)行程序的存儲介質(zhì)來使用。
依據(jù)本發(fā)明的再一個方面,提供了一種控制處理器運行程序的方法,該方法包括以下步驟把來自程序的指令變換為所述處理器不對其響應(yīng)的精簡指令集格式,使已變換了的指令被施加到響應(yīng)于該精簡指令集格式的虛擬處理器,以及使虛擬處理器運行對其施加的指令,并且,將處理器響應(yīng)的一系列簡單的指令施加到該處理器。
通常,來自應(yīng)用于例如CPU的處理器的程序的指令是清楚的,并且有可能讓破解者在程序的運行期間訪問這些指令,以獲得對程序的訪問。利用本發(fā)明中的方法,施加到作為以軟件配置的處理器的虛擬處理器的已變換的指令不是通常使用的標(biāo)準(zhǔn)指令,并且,因此對于破解者來說是沒有用的。此外,施加到處理器的一系列簡單指令數(shù)量上大于常用的數(shù)量,并且,因此擾亂了這些指令。
在優(yōu)選實施例中,該方法還包含加密要施加到虛擬處理器的已變換的指令,并且允許虛擬處理器響應(yīng)于該加密的指令,而不用對它們進(jìn)行解密。
加密技術(shù)的一個弱點是必須提供密鑰或其它設(shè)備以允許解密。破解者具有識別這樣的密鑰的經(jīng)驗。然而,本發(fā)明中的方法不需要虛擬處理器解密所變換的指令以便運行這些指令,以便不提供密鑰。通過在虛擬處理器中提供允許虛擬處理器理解每條加密的指令的信息并且讓虛擬處理器響應(yīng)于此而產(chǎn)生適當(dāng)動作,可以避免解密。這樣,虛擬處理器從不利用可能由破解者訪問的清楚指令而工作。
還建議提供以精簡指令集格式的、多于一個系列的指令,這些系列指令可以代替來自程序的每條指令。每個系列的指令是不同的,由此各個虛擬處理器可以接收與由其它虛擬處理器接收的那些指令不同的、變換后的指令。這可以通過模板的使用來實現(xiàn)。
因此,在優(yōu)選實施例中,該方法還包含利用模板來變換和加密指令,選定模板為來自程序的每條指令提供了以精簡指令集格式的一系列指令。
例如,該模板定義用于程序中的指令的、以精簡指令集格式的多個指令系列,該方法還包含選擇所述多個指令系列之一,作為所述指令的變換。
優(yōu)選地,不同的鍵與模板中以精簡指令集格式的多個系列指令中的每一個相關(guān)聯(lián),并且,該方法還包含選擇與所述多個系列指令之一相關(guān)聯(lián)的鍵,并且,將程序中的指令變換為與選定鍵相關(guān)聯(lián)的所述多個系列指令之一。
如先前所述,鍵的使用允許執(zhí)行該方法所需要的編程中的某些自動化。
應(yīng)當(dāng)理解如果使用了這種控制方法用于例如運行游戲程序,那么,在來自程序的變換了的指令上起作用、然后向處理器提供大量簡單指令的虛擬處理器的使用將增加不可接受的延遲。因此,建議僅讓程序中的部分經(jīng)受虛擬處理器的處理。
一種如上面所定義的那樣的控制處理器的方法,可以單獨使用或者可以結(jié)合如上面定義的那樣的產(chǎn)生擾亂的目標(biāo)代碼的方法、和/或以目標(biāo)代碼形式的可執(zhí)行程序、和/或產(chǎn)生其上具有安全的可執(zhí)行程序的存儲介質(zhì)的方法、和/或其上具有安全的可執(zhí)行程序的存儲介質(zhì)使用。
本發(fā)明還擴(kuò)展到其上具有安全的可執(zhí)行程序的存儲介質(zhì),其中,通過讓安全程序以及仿真程序與其相關(guān)聯(lián),來使可執(zhí)行程序安全,該安全程序被布置為控制對可執(zhí)行程序的訪問,并且,該仿真程序使可執(zhí)行程序的預(yù)定函數(shù)或例程在由所述仿真程序提供的虛擬處理器上運行,其中,該仿真程序被布置為將來自可執(zhí)行程序的指令變換成為精簡指令集格式,以使變換的指令施加到虛擬處理器,以及使該虛擬處理器運行對其施加的指令,并且輸出一系列簡單的指令,用于施加到處理器。


在下文中,將通過示例并參考附圖而描述本發(fā)明的實施例,附圖中圖1示意性地示出了高級源代碼到機(jī)器語言的變換,并圖解了編譯器對模板的使用;圖2示意性地圖解了具有安全的可執(zhí)行程序的光盤的產(chǎn)生;以及圖3圖解了在本發(fā)明的控制處理器的方法中的虛擬處理器的使用。
具體實施例方式
以下通過參考在諸如CD-ROM或DVD的光盤上提供的例如游戲程序的可執(zhí)行程序,而描述和說明本發(fā)明的實施例。然而,應(yīng)當(dāng)理解,本發(fā)明不局限于所給出的具體示例,并且,尤其可應(yīng)用于全部軟件、以及用于存儲軟件的任何存儲介質(zhì)。
例如,本發(fā)明可以與存儲在個人計算機(jī)和/或服務(wù)器和/或其它處理部件中的存儲器上或與這些部件相關(guān)聯(lián)的存儲器上的軟件、和/或用于被布置為下載到計算機(jī)的軟件一起使用。尤其應(yīng)當(dāng)注意到可以結(jié)合數(shù)字權(quán)限管理軟件而使用本發(fā)明。
圖1示出了在2處所指示的源代碼到在4處所指示的作為二進(jìn)制數(shù)字序列的機(jī)器語言的變換。如所示出的,通常為例如C、C++、或者Fortran的高級語言的源代碼2通過編譯器8而被變換成目標(biāo)代碼6。
在一些實例中,取決于源代碼2的語言以及編譯器8的屬性,目標(biāo)代碼6與機(jī)器語言4相同、或者基本上相似。在圖1中圖解的實施例中,由匯編器10變換該目標(biāo)代碼6,以提供機(jī)器語言4。
可與源代碼2的類型無關(guān)地應(yīng)用在圖1中圖解的方法,但是,通過進(jìn)一步具體參考C++源代碼2來對其進(jìn)行描述和說明。C++是非常靈活的語言,這是因為如圖1所示,其使用通常在12、14和16處指示的模板和陣列。已將圖1中的模板14指示為CValue,并且,這是要在本發(fā)明中使用、以擾亂從源代碼2產(chǎn)生的目標(biāo)代碼6的類模板(class template)。
為了給出非常簡單的示例,以C編寫的程序可以設(shè)置變量值,例如,如下所述的int i和int jint i=5int j=i+6如在圖1中可以看出的,模板CValue為鍵(key)k0,k1...到kn中的每一個提供了相關(guān)聯(lián)的變量函數(shù),即函數(shù)f(int0),f(int1)....f(intn)。這些函數(shù)中的每個是不同的,并且各自涉及例如一系列的算術(shù)或者邏輯操作。
當(dāng)使用所說明的方法時,程序員用來自CValue模板14的指定函數(shù)替換源代碼中的變量值。因此,并不是int i=5,源代碼將指定CValue<key,int>i=5。因此,在編譯源代碼2以形成目標(biāo)代碼6的期間,要被設(shè)置為5的變量inti將由通過選擇鍵k0、k1...kn之一而從CValue模板14中確定的適當(dāng)函數(shù)f(int0)、f(int1)....f(intn)所定義的一系列操作來替換。
如上所述,源代碼中的變量已經(jīng)由例如一系列數(shù)學(xué)操作所替換。這使所得到的目標(biāo)代碼6晦澀或擾亂。因此,并不是將int i設(shè)置為5,例如,f(int0)可以指定以下的操作序列m=5+keyn=6+keyp=m+nl=p-(2×key)int l=i.
用這樣的方式,以一系列操作的方式將變量i設(shè)置為5。在由編譯器8輸出的目標(biāo)代碼6中,所有指示的操作看起來將是有用的,使得破解者將在掌握出現(xiàn)擾亂的位置時遇到困難。當(dāng)然,因為這些操作最終導(dǎo)致所需變量的正確值,所以,可以由處理器直接運行目標(biāo)代碼6、或從其匯編的機(jī)器語言4,而不需要任何解密或解碼。
通常,以這樣的方式對變量執(zhí)行的操作將比上面所述的那些操作更復(fù)雜。此外,并不是使用諸如加、除、減和乘的一系列簡單算術(shù)運算符,它通常將優(yōu)選使用可以可靠地將變量返回到其指定值的諸如異或(XOR)的函數(shù)。在這方面,在實踐中可以使用如下所述的技術(shù)。
這個技術(shù)使用C++模板來實現(xiàn)Vq,其中q=T_MANGLE_SEED_VALUE_N XOR T_MANGLE_SEED_VALUE_Mtemplate<class T,int x=0,int z=0>
struct V{Toperator()(Tx,Tv,Tz){Ty=x^z;return(T)(v^y);}Toperator()(Tv){Ty=x^z;return(T)(v^y);}};int main(int argc,char*argv[]){int z=T_MANGLE_SEED_VALUE_M;int y=T_MANGLE_SEED_VALUE_N;if(12345678==argc){//這從不會發(fā)生z=T_MANGLE_SEED_VALUE_O;y=T_MANGLE_SEED_VALUE_P;}inta=V<int,T_MANGLE_SEED_VALUE_N,T_MANGLE_SEED_VALUE_M>()(argc);
//這里a==Vqint b=a;return=V<int>()(y,b,z);}查看所生成的代碼,我們看到,q的分量(N和M)用于弄亂該值,然后在運行時間使用q來恢復(fù)(unmangle)該值。這是不對稱的,這是由于在加密/解密循環(huán)中沒有使用單個值。
由上,顯然,該方法使源代碼中的變量作為一系列操作而存在于目標(biāo)代碼中。這增加了目標(biāo)代碼的復(fù)雜度和晦澀程度,并提供了對抗破解者的保護(hù)。
此外,提供可以通過相關(guān)聯(lián)的鍵的選擇而選擇的不同函數(shù)允許生成不同的目標(biāo)代碼,以執(zhí)行相同的函數(shù)。因此,游戲的一個標(biāo)題(title)可以以相同的格式作為第二標(biāo)題提供。然而,每個標(biāo)題可以具有不同的目標(biāo)代碼。因此,如果破解者設(shè)法破解了第一標(biāo)題的代碼,這將不會對第二標(biāo)題的破解提供幫助。
圖2示意性地示出了將安全的游戲應(yīng)用于CD-ROM 30的方法。在這方面,并且如上面所指出的那樣,僅通過參考存儲在光盤上的游戲程序而例示本發(fā)明。本發(fā)明可用來使存儲在任何介質(zhì)上的任何軟件安全。因此,例如,本發(fā)明可以用來使存儲在服務(wù)器、計算機(jī)和/或其它處理部件中、或者與這些處理部件相關(guān)聯(lián)的存儲器上的可執(zhí)行程序安全。在希望例如使用權(quán)限管理軟件下載可執(zhí)行程序、以確保僅授權(quán)的用戶才具有到安全的可執(zhí)行程序的訪問權(quán)、和/或以控制用戶訪問安全的可執(zhí)行程序的程度或方式的情況中,本發(fā)明尤其有用。
在圖2所示的實施例中,游戲包含游戲程序game.exe 20,并且這將與適當(dāng)?shù)陌踩浖黄饝?yīng)用于CD-ROM 30。在這方面,軟件工具包22提供了保護(hù)游戲程序20所必需的程序。工具包22包括安全應(yīng)用程序SECPREP.DLL 24,其起到訪問要與游戲程序20一起捆綁的適當(dāng)?shù)陌踩绦?8的作用。在這方面,安全應(yīng)用程序24訪問恰當(dāng)?shù)卮鎯υ诖鎯ζ?6中的很多安全程序SECSERV.DLL 28之一。每個單獨的安全程序與相應(yīng)的鍵32相關(guān)聯(lián),并且安全應(yīng)用程序24隨機(jī)地選擇鍵32之一,借此選擇對應(yīng)的安全程序28。此后,將所選的安全程序28與游戲程序20、以及任何其它安全措施一起封裝,以形成可執(zhí)行程序文件34,然后存儲該文件,也就是說,在這個例子中,通過適當(dāng)?shù)木幋a部件(未示出)而應(yīng)用于CD-ROM 30。
在圖2中圖解的實施例中,工具包22不僅將游戲程序20與安全程序28一起封裝,并且它還提供了驗證程序36。
安全程序28起到游戲程序20和驗證程序36的封裝器(wrapper)的作用。因此,當(dāng)由將該CD-ROM 30放入到計算機(jī)的驅(qū)動器中的用戶訪問可執(zhí)行應(yīng)用文件34時,安全程序28需要運行驗證程序36。例如,并且以已知的方式,驗證程序36可以查找盤30上的已知錯誤,其中該錯誤將已經(jīng)在如上所述的生產(chǎn)過程期間放置在盤30上。如果找到預(yù)期的錯誤,則將斷言該盤是真的,并且在那種情況下,安全程序28隨后將允許游戲程序20的加載和運行。在這方面,每當(dāng)安全程序28正在運行目標(biāo)代碼時,如上所述,它產(chǎn)生的結(jié)果將是被擾亂的,從而使破解者難以識別和除去安全程序28。這防止破解者獲得對游戲程序20的訪問。
例如,可以通過將例如在38處指示的編程塊從游戲程序中取出、并將它們并入安全程序28中,來增強(qiáng)由安全程序28提供的安全性。在游戲程序20中提供指向塊38的指針40。通過這種技術(shù),還通過擾亂的代碼而向破解者隱藏游戲程序本身的一些部分,其中當(dāng)在安全程序28內(nèi)運行塊38時產(chǎn)生擾亂的代碼。由軟件工具包22在可執(zhí)行程序文件34的產(chǎn)生期間進(jìn)行塊38從游戲程序20到安全程序28的移動。
應(yīng)當(dāng)理解除了圖2中描述和說明的那些措施之外的安全措施可以經(jīng)由軟件工具包22而并入。例如,還可以加密游戲程序20。
上述用于擾亂代碼的技術(shù)可以單獨使用來保密軟件,或者可以結(jié)合以下的仿真技術(shù)使用?,F(xiàn)在將參考圖3而描述和說明的仿真技術(shù)可以結(jié)合其它安全技術(shù)使用,或它可以被單獨使用。
應(yīng)當(dāng)理解,對例如以C++語言形式的程序進(jìn)行編譯以產(chǎn)生用于應(yīng)用于處理器的指令集。如果破解者可以獲取對例如游戲的指令集的清楚的訪問權(quán),則可以執(zhí)行該游戲的逆向工程(engineering)。圖3圖解了可用來向破解者隱藏指令的仿真技術(shù)。
如圖3所示,將源代碼2施加到編譯器50以產(chǎn)生在52處指示的指令集。然而,編譯器50被布置為加密編譯的指令,并且還被布置為以精簡指令集格式、而不是更常用的自然指令,來提供指令。
如圖3所示,編譯器50具有模板58的庫54,如上面參考圖1所描述的,模板58可以有選擇地提供在52處的很多指令集之一。在這方面,編譯器50被布置為選擇很多鍵56之一,由此選擇對應(yīng)的模板58,以便在指令集52的產(chǎn)生中使用。還通過仿真器編譯器64、使用選定鍵,以軟件的形式來配置虛擬處理器或仿真器60。這允許仿真器60對指令集52中的指令起作用而不需要解密它們。
例如,通過使用具有鍵0的模板58而獲得的指令集可以通過向每個變量值添加值+3而被加密。因此,仿真器60可以理解每個變量必須被減3,并且,因此,可以執(zhí)行所述指令。因此,例如,如果MOV指令應(yīng)該為0、且仿真器接收到變量3,則它可以理解對于這個指令集,要將3設(shè)置為MOV、并相應(yīng)地起作用。因此,通過這種手段,沒有清楚和未加密的指令集輸入到仿真器60中。
此外,仿真器60被布置為為每個真正的指令產(chǎn)生一個大的指令系列,并且將這個大的指令系列施加到CPU 62。例如,并不是指示CPU 62加3,仿真器60可以發(fā)出指令串a(chǎn)dd 10,subtract 7,divide by 1,multiply by 1.
這增加了要送到CPU 62的指令的復(fù)雜度,并且這個復(fù)雜度也起使代碼令破解者困惑的作用。
應(yīng)當(dāng)理解使用所描述的仿真器60將增加處理所需要的實際時間,并且,因此,它不適合于用這樣的方式在CPU 62上運行游戲程序。相反,僅使用這種技術(shù)向破解者隱藏部分程序。例如,如果這種技術(shù)結(jié)合上述技術(shù)的使用,則可能包括來自游戲程序20的塊38的安全程序28可以經(jīng)受這種仿真技術(shù)。
由上應(yīng)當(dāng)理解如果在編譯期間選擇了不同的鍵56,則指令集52和仿真器60將改變。這種在不同的盤上使用不同的指令集和仿真器的能力增加了更進(jìn)一步的安全級別,這是因為它允許由同一個制造商出版的不同盤具有不同的安全性。指令集52保持加密也是重要的,這是因為這確保沒有可能由破解者使用的清楚指令集可用。
應(yīng)當(dāng)理解可在所附權(quán)利要求的范圍之內(nèi),對所描述和說明的發(fā)明作出改變和修改。
權(quán)利要求
1.一種產(chǎn)生擾亂的目標(biāo)代碼的方法,該方法包括以下步驟用變量的選定函數(shù)代替源代碼中的變量;以及編譯該源代碼以產(chǎn)生目標(biāo)代碼,該選定函數(shù)使變量作為一系列操作而存在于編譯的目標(biāo)代碼中。
2.如權(quán)利要求1所述的方法,其中,利用其呈現(xiàn)變量的操作系列由算術(shù)和/或邏輯操作組成,并且其中該操作系列被布置為當(dāng)運行目標(biāo)代碼時提供該變量。
3.如權(quán)利要求1或者2所述的方法,其中,利用其呈現(xiàn)變量的操作系列包含求補操作,其被布置為當(dāng)目標(biāo)代碼運行時提供該變量。
4.如任一先前權(quán)利要求所述的方法,其中,在源代碼的模板中定義選定函數(shù)。
5.如權(quán)利要求4所述的方法,其中,該源代碼的模板定義多個函數(shù),其中,每個函數(shù)都被布置為進(jìn)行編譯,以將變量呈現(xiàn)為一系列操作,并且該方法還包含選擇函數(shù)之一來代替源代碼中的變量。
6.如權(quán)利要求5所述的方法,其中,不同的鍵與模板中的每一個函數(shù)相關(guān)聯(lián),并且該方法還包含用該模板來代替源代碼中的變量,并且通過選擇與模板中的一個函數(shù)相關(guān)聯(lián)的鍵來選擇所述一個函數(shù)。
7.如任一先前權(quán)利要求所述的方法,其中,源代碼涉及存儲數(shù)組和模板,并使用指針來定位這些數(shù)組和模板。
8.如任一先前權(quán)利要求所述的方法,其中,源代碼是標(biāo)準(zhǔn)的編程語言。
9.如權(quán)利要求8所述的方法,其中,源代碼是C++。
10.一種以目標(biāo)代碼形式的可執(zhí)行程序,該程序已經(jīng)從源代碼中編譯,其中在源代碼中的變量已被編譯為作為一系列目標(biāo)代碼而存在于目標(biāo)代碼中,以借此擾亂目標(biāo)代碼。
11.如權(quán)利要求10所述的可執(zhí)行程序,其中,利用其呈現(xiàn)變量的操作系列由算術(shù)和/或邏輯操作組成,并且,其中該操作系列被布置為當(dāng)運行目標(biāo)代碼時提供該變量。
12.如權(quán)利要求10或權(quán)利要求11所述的可執(zhí)行程序,其中,利用其呈現(xiàn)變量的操作系列包含求補操作,其被布置為當(dāng)目標(biāo)代碼運行時提供該變量。
13.如權(quán)利要求10到12中的任何一個所述的可執(zhí)行程序,其中已通過用選定函數(shù)代替源代碼中的變量而產(chǎn)生了一系列操作,其中該選定函數(shù)被布置為使變量作為一系列操作而存在于編譯后的目標(biāo)代碼中。
14.如權(quán)利要求13所述的可執(zhí)行程序,其中,在源代碼的模板中定義了選定函數(shù)。
15.如權(quán)利要求14所述的可執(zhí)行程序,其中,源代碼的模板已定義了多個函數(shù),每個函數(shù)都被布置為進(jìn)行編譯,以將變量呈現(xiàn)為一系列操作,并且已經(jīng)選擇了所述函數(shù)之一來代替源代碼中的變量。
16.一種產(chǎn)生其上具有安全的可執(zhí)行程序的存儲介質(zhì)的方法,該方法包括以下步驟通過將可執(zhí)行程序與被布置為控制對可執(zhí)行程序的訪問的安全程序相關(guān)聯(lián),來使該可執(zhí)行程序安全;以及將安全的可執(zhí)行程序應(yīng)用于該存儲介質(zhì),并且,該方法還包含擾亂該安全程序的目標(biāo)代碼,其中已經(jīng)通過用變量的選定函數(shù)代替源代碼中的該變量、并編譯該源代碼以產(chǎn)生目標(biāo)代碼,來擾亂該安全程序的目標(biāo)代碼,該選定函數(shù)使變量作為一系列操作而存在于已編譯的目標(biāo)代碼中。
17.如權(quán)利要求16所述的產(chǎn)生其上具有安全的可執(zhí)行程序的存儲介質(zhì)的方法,其中,利用其呈現(xiàn)變量的操作系列由算術(shù)和/或邏輯操作組成,并且其中該操作系列被布置為當(dāng)運行目標(biāo)代碼時提供該變量。
18.如權(quán)利要求16或權(quán)利要求17所述的產(chǎn)生其上具有安全的可執(zhí)行程序的存儲介質(zhì)的方法,其中,利用其呈現(xiàn)變量的操作系列包含求補操作,其被布置為當(dāng)目標(biāo)代碼運行時提供該變量。
19.如權(quán)利要求16到18中的任何一個所述的產(chǎn)生其上具有安全的可執(zhí)行程序的存儲介質(zhì)的方法,其中,可執(zhí)行程序和安全程序在目標(biāo)代碼級別上相關(guān)聯(lián)。
20.如權(quán)利要求16到19中的任何一個所述的產(chǎn)生其上具有安全的可執(zhí)行程序的存儲介質(zhì)的方法,其中,該安全程序被布置為加密該可執(zhí)行程序。
21.如權(quán)利要求16到20中的任何一個所述的產(chǎn)生其上具有安全的可執(zhí)行程序的存儲介質(zhì)的方法,還包含將可執(zhí)行程序中的塊移出該可執(zhí)行程序,并在安全程序中重定位這些塊。
22.如權(quán)利要求16到21中的任何一個所述的產(chǎn)生其上具有安全的可執(zhí)行程序的存儲介質(zhì)的方法,其中,該安全程序被布置為需要驗證程序的運行。
23.如權(quán)利要求16到22中的任何一個所述的產(chǎn)生其上具有安全的可執(zhí)行程序的存儲介質(zhì)的方法,其中,在源代碼的模板中定義在安全程序源代碼中的選定函數(shù)。
24.如權(quán)利要求23所述的產(chǎn)生其上具有安全的可執(zhí)行程序的存儲介質(zhì)的方法,其中,安全程序源代碼的所述模板定義多個函數(shù),每個函數(shù)都被布置為進(jìn)行編譯,以將變量呈現(xiàn)為一系列操作,該方法還包含選擇所述函數(shù)之一來代替源代碼中的變量。
25.如權(quán)利要求24所述的產(chǎn)生其上具有安全的可執(zhí)行程序的存儲介質(zhì)的方法,其中,不同的鍵與模板中的每一個函數(shù)相關(guān)聯(lián),并且該方法還包含用該模板來代替源代碼中的變量,并且,通過選擇與模板中的一個函數(shù)相關(guān)聯(lián)的鍵來選擇所述一個函數(shù)。
26.如權(quán)利要求16到25中的任何一個所述的產(chǎn)生其上具有安全的可執(zhí)行程序的存儲介質(zhì)的方法,其中,安全程序的源代碼涉及存儲的數(shù)組和模板,并使用指針來定位這些數(shù)組和模板。
27.如權(quán)利要求16到26中的任何一個所述的產(chǎn)生其上具有安全的可執(zhí)行程序的存儲介質(zhì)的方法,其中,安全程序的源代碼是標(biāo)準(zhǔn)編程語言。
28.如權(quán)利要求27所述的產(chǎn)生其上具有安全的可執(zhí)行程序的存儲介質(zhì)的方法,其中,源代碼是C++。
29.如權(quán)利要求16到28中的任何一個所述的產(chǎn)生其上具有安全的可執(zhí)行程序的存儲介質(zhì)的方法,其中,其上應(yīng)用了安全的可執(zhí)行程序的存儲介質(zhì)是光盤。
30.如權(quán)利要求29所述的產(chǎn)生其上具有安全的可執(zhí)行程序的存儲介質(zhì)的方法,其中,通過激光束編碼將安全的可執(zhí)行程序應(yīng)用于光盤上。
31.如權(quán)利要求16到28中的任何一個所述的產(chǎn)生其上具有安全的可執(zhí)行程序的存儲介質(zhì)的方法,其中,其上應(yīng)用了安全的可執(zhí)行程序的存儲介質(zhì)是服務(wù)器、計算機(jī)和/或其它處理部件中的存儲器、或與這些部件相關(guān)聯(lián)的存儲器。
32.一種其上具有安全的可執(zhí)行程序的存儲介質(zhì),其中,通過將安全程序與其相關(guān)聯(lián)來使可執(zhí)行程序安全,該安全程序被布置為控制對可執(zhí)行程序的訪問,并且其中,安全程序處于已被擾亂的目標(biāo)代碼的形式,該安全程序已被從源代碼編譯,并且,安全程序的源代碼中的變量已被編譯為作為一系列操作而存在于目標(biāo)代碼中,借此已擾亂了目標(biāo)代碼。
33.如權(quán)利要求32所述的其上具有安全的可執(zhí)行程序的存儲介質(zhì),其中,利用其呈現(xiàn)變量的操作系列由算術(shù)和/或邏輯操作組成,并且其中,該操作系列被布置為當(dāng)運行目標(biāo)代碼時提供該變量。
34.如權(quán)利要求32或權(quán)利要求33所述的其上具有安全的可執(zhí)行程序的存儲介質(zhì),其中,利用其呈現(xiàn)變量的操作系列包含求補操作,其被布置為當(dāng)目標(biāo)代碼運行時提供該變量。
35.如權(quán)利要求32到34中的任一個所述的其上具有安全的可執(zhí)行程序的存儲介質(zhì),其中,通過用選定函數(shù)代替源代碼中的變量,已經(jīng)產(chǎn)生了一系列操作,其中,該選定函數(shù)被布置為使變量作為一系列操作而存在于編譯的目標(biāo)代碼中。
36.如權(quán)利要求35所述的其上具有安全的可執(zhí)行程序的存儲介質(zhì),其中,在源代碼的模板中定義了選定函數(shù)。
37.如權(quán)利要求36所述的其上具有安全的可執(zhí)行程序的存儲介質(zhì),其中,源代碼的模板已定義了多個函數(shù),每個函數(shù)都被布置為進(jìn)行編譯,以將變量呈現(xiàn)為一系列操作,并且,已選擇了所述函數(shù)之一來代替源代碼中的變量。
38.如權(quán)利要求32到37中的任一個所述的其上具有安全的可執(zhí)行程序的存儲介質(zhì),其中,可執(zhí)行程序和安全程序在目標(biāo)代碼級別上相關(guān)聯(lián)。
39.如權(quán)利要求32到38中的任一個所述的其上具有安全的可執(zhí)行程序的存儲介質(zhì),其中,在存儲介質(zhì)上加密可執(zhí)行程序,并且相關(guān)聯(lián)的安全程序允許可執(zhí)行程序的解密。
40.如權(quán)利要求32到39中的任一個所述的其上具有安全的可執(zhí)行程序的存儲介質(zhì),其中,已在安全程序內(nèi)重定位了來自可執(zhí)行程序的塊。
41.如權(quán)利要求32到40中的任一個所述的其上具有安全的可執(zhí)行程序的存儲介質(zhì),其中,安全程序被布置為需要驗證程序的運行。
42.如權(quán)利要求32到41中的任一個所述的其上具有安全的可執(zhí)行程序的存儲介質(zhì),其中,存儲介質(zhì)是其上編碼了可執(zhí)行程序和安全程序的光盤。
43.如權(quán)利要求42所述的其上具有安全的可執(zhí)行程序的存儲介質(zhì),其中,該光盤是CD、CD-ROM、或DVD。
44.如權(quán)利要求32到41中的任一個所述的其上具有安全的可執(zhí)行程序的存儲介質(zhì),其中,存儲介質(zhì)是在服務(wù)器、計算機(jī)和/或其它處理部件中的存儲器或者與這些部件相關(guān)聯(lián)的存儲器,并且,其上存儲了可執(zhí)行程序和安全程序。
45.如權(quán)利要求32到44中的任一個所述的其上具有安全的可執(zhí)行程序的存儲介質(zhì),其中,可執(zhí)行程序是游戲程序、和/或視頻程序、和/或音頻程序、和/或其它軟件。
46.一種控制處理器運行程序的方法,包括以下步驟把來自程序的指令變換為所述處理器不對其響應(yīng)的精簡指令集格式;使該變換了的指令被施加到對該精簡指令集格式響應(yīng)的虛擬處理器;以及使虛擬處理器運行對其施加的指令,并施加該處理器響應(yīng)的一系列簡單的指令到該處理器。
47.如權(quán)利要求46所述的控制處理器運行程序的方法,還包含加密要施加到虛擬處理器的已變換了的指令;以及允許虛擬處理器響應(yīng)于所述加密的指令,而不用對它們進(jìn)行解密。
48.如權(quán)利要求46或權(quán)利要求47所述的控制處理器運行程序的方法,還包含使用模板來變換和加密這些指令,其中選定模板為來自程序的每條指令提供了以精簡指令集格式的一系列指令。
49.如權(quán)利要求48所述的控制處理器運行程序的方法,其中,所述模板定義用于程序中的指令的以精簡指令集格式的多個指令系列,該方法還包含選擇所述多個指令系列之一,作為所述指令的變換。
50.如權(quán)利要求49所述的控制處理器運行程序的方法,其中,不同的鍵與模板中以精簡指令集格式的多個系列指令中的每一個相關(guān)聯(lián),并且其中,該方法還包含選擇與所述多個系列指令中的一個相關(guān)聯(lián)的鍵,并且將程序中的指令變換為所述多個系列指令中的與選定鍵相關(guān)聯(lián)的一個。
51.如權(quán)利要求50所述的控制處理器運行程序的方法,其中,虛擬處理器能夠響應(yīng)于所述多個系列指令中的所述一個。
52.如權(quán)利要求46到51中的任一個所述的控制處理器運行程序的方法,其中,僅變換執(zhí)行預(yù)定函數(shù)或者例程的來自程序的指令,并將這些指令施加到虛擬處理器。
53.如權(quán)利要求46到51中的任一個所述的控制處理器運行程序的方法,其中,來自程序的指令處于目標(biāo)代碼中,或者已經(jīng)從目標(biāo)代碼中轉(zhuǎn)換得到,并且其中已經(jīng)通過如權(quán)利要求1到9中的任何一個所述的方法擾亂該目標(biāo)代碼。
54.如權(quán)利要求46到53中的任一個所述的控制處理器運行程序的方法,其中,指令來自于如權(quán)利要求10到15中任一個所述的以目標(biāo)代碼形式的可執(zhí)行程序。
55.如權(quán)利要求46到52中的任一個所述的控制處理器運行程序的方法,其中,指令來自于在存儲介質(zhì)上的安全的可執(zhí)行程序,其中該存儲介質(zhì)由權(quán)利要求16到31中的任一個所述的方法所產(chǎn)生。
56.如權(quán)利要求46到54中的任一個所述的控制處理器運行程序的方法,其中,指令來自于在如權(quán)利要求32到45中的任一個所述的存儲介質(zhì)上的安全的可執(zhí)行程序。
57.一種其上具有安全的可執(zhí)行程序的存儲介質(zhì),其中,通過讓安全程序以及仿真程序與此相關(guān)聯(lián)來使可執(zhí)行程序安全,該安全程序被布置為控制對可執(zhí)行程序的訪問,并且,該仿真程序使可執(zhí)行程序的預(yù)定函數(shù)或者例程在由所述仿真程序提供的虛擬處理器上運行,其中,仿真程序被布置為將來自可執(zhí)行程序的指令變換成為精簡指令集格式,以使所變換的指令被施加到虛擬處理器,并且使該虛擬處理器運行對其施加的指令、并輸出一系列簡單的指令,用于施加到處理器。
58.如權(quán)利要求57所述的其上具有安全的可執(zhí)行程序的存儲介質(zhì),其中,存儲介質(zhì)是其上編碼了可執(zhí)行程序、安全程序和仿真程序的光盤。
59.如權(quán)利要求57或權(quán)利要求58所述的其上具有安全的可執(zhí)行程序的存儲介質(zhì),其中,光盤是CD、CD-ROM、或DVD。
60.如權(quán)利要求57所述的其上具有安全的可執(zhí)行程序的存儲介質(zhì),其中,存儲介質(zhì)是在服務(wù)器、計算機(jī)和/或其它處理部件中的存儲器或者與這些部件相關(guān)聯(lián)的存儲器,并且其上存儲了安全程序和仿真程序。
61.如權(quán)利要求57到60中的任一個所述的其上具有安全的可執(zhí)行程序的存儲介質(zhì),其中,可執(zhí)行程序是游戲程序、和/或視頻程序、和/或音頻程序、和/或其它軟件。
62.一種產(chǎn)生擾亂的目標(biāo)代碼的方法,其實質(zhì)上如在上文中參考附圖所述。
63.一種以目標(biāo)代碼形式的可執(zhí)行程序,其實質(zhì)上如在上文中參考附圖所述。
64.一種產(chǎn)生其上具有安全的可執(zhí)行程序的存儲介質(zhì)的方法,其實質(zhì)上如在上文中參考附圖所述。
65.一種其上具有安全的可執(zhí)行程序的存儲介質(zhì),其實質(zhì)上如在上文中參考附圖所述。
66.一種控制處理器運行程序的方法,其實質(zhì)上如在上文中參考附圖所述。
全文摘要
通過相應(yīng)的鍵(32)隨機(jī)地選擇各個安全程序(28),然后將其與游戲程序(20)封裝在一起以提供要應(yīng)用于例如光盤(30)的存儲介質(zhì)的可執(zhí)行程序文件(34)。每當(dāng)運行安全程序(28)時,它產(chǎn)生的目標(biāo)代碼是擾亂的,以使得難以通過識別和除去安全程序來克服該保護(hù)。通過用變量函數(shù)來代替源代碼中的變量來產(chǎn)生擾亂的目標(biāo)代碼。當(dāng)編譯該源代碼以產(chǎn)生目標(biāo)代碼時,該函數(shù)使變量作為一系列操作而存在于編譯的目標(biāo)代碼中。
文檔編號G06F21/14GK1856759SQ200480027216
公開日2006年11月1日 申請日期2004年8月19日 優(yōu)先權(quán)日2003年8月20日
發(fā)明者艾倫·W·斯蒂門斯, 馬丁·C·格雷, 克里斯托弗·E·薩利 申請人:麥克羅維西恩歐洲公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
额尔古纳市| 茂名市| 汪清县| 岳阳市| 雷山县| 凤冈县| 九龙城区| 武功县| 沈阳市| 墨竹工卡县| 山西省| 长岛县| 莱州市| 浙江省| 玛曲县| 东台市| 镇原县| 阜平县| 阳谷县| 岐山县| 法库县| 绥棱县| 沂水县| 东光县| 丹东市| 故城县| 宜川县| 翁源县| 玉田县| 怀远县| 泸州市| 高陵县| 锡林郭勒盟| 尚义县| 余江县| 买车| 垦利县| 蕉岭县| 大冶市| 梓潼县| 镇赉县|