『壹』 蒙古大軍橫掃歐亞大陸, 為何小小的越南卻能偏安一隅
13世紀,一支強大的游牧民族出現在了世界的舞台上。蒙古彪悍的騎兵像狼群般狂飆過漠北草原與中原大地之後,終於來到了遙遠的南方,令人意想不到的是,在小小的安南(今越南),蒙古大軍卻接連三次沉沙折戟??
1252年,蒙古軍隊從甘肅出發,途經川西高原遠征大理。這些從北方乾燥的草原上來的將士和馬,居然能夠抱著吹足了氣的革囊,伏在被急流沖得起伏不定的筏子上,勝利渡過了水流湍急的金沙江進入雲南。戰爭本身是不值一提的,翌年,大將兀良合台就率軍擒獲大理國王段智興。雲南自唐朝天寶年間起脫離中原政府管轄的局面結束了。
攻滅大理是蒙古帝國對最頑強的敵人——南宋——形成戰略合圍的重大步驟,在雲南被納入蒙古版圖之後,南宋在陸上已經陷入C形包圍,只剩下了與安南的邊界尚不在蒙古人的掌控之中。也正因此,安南成為蒙古軍隊的下一個目標,在遣使勸降被拒之後,1257年兀良合台率軍三萬入侵安南,揭開了蒙古帝國與安南陳朝激戰的序幕。
這是安南軍隊首次在戰場面對全世界最強大的蒙古軍隊,雖然擺出了步象騎兵的混合陣勢,仍被兀良合台擊潰。蒙軍趁勢進入安南首都升龍(今河內),卻只得到一座空城,僅呆了九天,以暑熱難耐兼之糧食已盡,被迫撤軍,路上又遭到安南地方豪族武裝的襲擊而大敗,沿途疲憊不堪,所到之處亦不敢劫掠,故人們稱之為「佛賊」。這對小小的陳朝而言,當然是一次巨大的勝利,後世的陳仁宗為此寫詩雲:「白發老頭兵,常談元豐事。」
隨後二十多年裡,蒙古(元)忙於對宋作戰,無暇顧及僻處一隅的安南。等到滅亡南宋統一中國之後,忽必烈決心兼並安南。1285年初,元軍兵分六路進攻陳朝。鑒於第一次戰爭的經驗,部隊中增加了一些曾參加過征服南宋和習慣於在中國南方作戰的高級將領,比如崖山之戰時擔任張弘范副手的李恆這次亦在主帥鎮南王脫歡(忽必烈第九子)帳下。元軍的人數也大大增加,據《大越史記全書》載為五十萬人(這當然是誇大其詞)。正面戰場上,元軍再次擊潰陳朝軍隊,佔領升龍,但安南軍「雖數敗散,然增兵轉多」,元「軍睏乏,死傷亦眾,蒙古軍馬亦不能施其技」,脫歡遂於當年五月撤兵,歸途又遇安南軍隊伏擊,李恆膝中毒箭,歸國後毒發身亡;脫歡本人則是鑽在銅管里,讓士兵抬著,才免於一死。
忽必烈不甘失敗,又集中江淮、江西、湖廣三省蒙漢軍7萬,附船500艘和雲南兵6000人、黎族兵1.5萬人卷土重來。1287年12月,元軍由脫歡率領,分兵三路第三次進犯安南。兩路是從廣西、雲南來的步兵和騎兵,此外還增加了一支水兵,從海路沿著白藤江(鄰近越南北部下龍灣的入海口)進犯。陳朝軍隊再次放棄升龍,堅壁清野,迫使元軍於次年三月糧盡而退。
白藤江,陳朝軍隊事先從森林裡砍伐樹木,削尖後插入江中,當元軍戰船魚貫而入白藤江時,潮水正在下落,陳軍出其不意地猛烈進攻,把元軍船隻驅至暗樁水域,當潮水下落時,元軍的船多數撞沒於木樁上,全殲元軍水軍,是為白藤江大捷,陳朝大儒張漢超在越南漢賦名篇《白藤江賦》中稱之為「再造之功,千古稱美」。而到了2016年3月初,根據越南媒體報道,越南總理阮晉勇日前也批准了在這里建設白藤江戰役遺跡保護區的議案。
白藤江戰役具有決定性的意義:小小的安南再次擊敗了龐大的大陸帝國。元軍戰敗的消息甚至傳到了遙遠的波斯,伊兒汗國的史學家拉施特在《史集》中記載,「他們(陳朝)的軍隊突然從海上、森林裡和山上的埋伏中出來了,擊潰了正忙於搶劫的脫歡的軍隊。」
對於蒙古(元朝)而言,陳朝實在是個難纏的敵手。陳朝朝廷甚至下令「凡國內郡縣假有外寇至,當死戰;或力不敵,許於山澤逃竄,不得迎降」。雖然也出現過一些叛降蒙元者,比如陳仁宗的一個弟弟及《安南志略》的作者黎?。???宥?猿魯?持渭?諾牡摯掛庵臼羌??岫ǖ模?負蹩捎臚?皇逼詰娜氈玖?幟桓??V徊還?,「元寇襲來」時的鐮倉幕府更多依仗的是從天而降的「神風」不戰而勝,陳朝卻更多的需要在戰場上真刀真槍地與蒙古軍較量。
陳朝本身是作為外戚篡奪了原本屬於李朝的皇位,影響至今的一個結果是強令越南李姓者盡改姓「阮」,使後者成為越南第一大姓。為防止自己重蹈覆轍,陳太宗(1218年-1277年)規定宰相和重臣都由宗室擔任,確保了宗室對皇帝的忠誠。在眾建諸侯的體制下,擁有領地的皇室貴族們不僅僅是為了他們的國家,也為了他們自己的封疆而需要努力驅除外來入侵者。
除去陳朝本身的抗戰,可以說蒙古軍隊也輸掉了天時、地利、人和。連西方史家都發現了這一點,《多桑蒙古史》記載,第一次入侵時,元朝軍由於「熱不能堪,班師」;第二次入侵時「盛夏霖潦,軍中疾作,死傷者眾」;第三次入侵時又是「軍中將士多被疫不能進」。安南屬熱帶季風氣候,氣溫高,濕度大,風雨多,旱、雨季明顯,大部分地區5月至10月為雨季,11月至次年4月為旱季。元軍士兵多來自北方,故元軍出兵多在下半年,正值安南為冬天旱季的時候。一旦被拖至雨季,瘟疫肆虐,蒙(元)軍隊實在是在「鬼天氣」里吃夠了苦頭。雖然不能說蒙古軍隊是完全敗給了天氣,畢竟此前已經征服了同樣有暑雨並流行瘴癘的嶺南地區,但入侵安南,某種程度上的確是在逆「天」而行。
另一方面,安南的地形復雜,山地、高原、河流互相交織在一起,很少有一馬平川的大平原。連元朝將領自己都意識到,這樣的地形「蒙古軍馬亦不能施其技」,使得遠征安南的元軍已不是單一的騎兵,而是以步兵為主。對安南的戰爭,也更多是傳統中原式樣的戰爭:既無依靠隨行羊馬和狩獵解決給養的條件,也不能靠「因糧於敵」之法獲取給養。軍隊給養只能靠國內供應,勢必「兵馬未動,糧草先行」,而不能「羊馬隨行,不用運餉」。漫長而脆弱的補給線也確實成為入侵安南的「阿喀琉斯之踵」。
所謂「天時不如地利,地利不如人和」。忽必烈「內用聚斂之臣,視民財如圖苜,外興無名之師,戕民命如草芥」,實在是窮兵黷武,殘民已極。常年對外作戰使得「老兵飽嘗征戰味,聽說安南愁滿面」;兵糧多聚,征丁從軍更導致田地無人耕種,江南一帶「群生愁嘆,四民廢業,貧者棄子以偷生,富者鬻產而應役,倒懸之苦,日甚一日」。至元二十年(1283年),江南「相挺而起」的起義「凡二百餘所」,到至元二十六年(1289年),激增為「四百餘處」,幾乎遍及整個長江以南。面對如此之多的起義叛亂,元廷不得不抽調一部分軍力進行鎮壓,從而削弱了元軍南征的力量,因此,雖然忽必烈仍不甘心,先後三次圖謀再征安南,但終於無法如願,國內反對聲浪卻日甚一日。當1294年忽必烈去世後,元廷立即下詔停止征討安南。
『貳』 美國暗樁什麼意思
暗樁釋義為.本意:一端插入地里或水中,不能或不容易直接看到的木棍或石柱。2.引申義:事先預設或打入的在敵對方的諜報人員和其他地下工作人員。
美國暗樁也就是美國事先預設的在別國或敵對方的諜報人員。
『叄』 張小敬為什麼要殺了自己的暗樁小乙
為了得知龍波的消息。
在《長安十二時辰》里,張小敬他們找到了一塊恩客牌,為了得到狼衛的下落,於是張小敬來到平康坊。但能夠找出牌子主人的只有葛老,他是平康坊的老大,而且他還欠了張小敬一個人情,於是葛老很快就找到了這個牌子的主人,這個姑娘叫做瞳兒,而在半年之前她就已經認識了龍波。而葛老從來不幫人做免費的事,他想張小敬告訴他一個暗樁的名字,然後才能告訴他龍波的下落。
他這么做完全是為了長安百姓。
『肆』 朝鮮 朝鮮驚人表態看中俄究竟誰是老大
1、中國不是朝鮮大哥。中國只是把朝鮮當成牽制美國、韓國、日本的工具。
2、俄羅斯不是朝鮮大哥,俄羅斯也是把朝鮮當做牽制美國、韓國、日本的工具,不過在最後,俄羅斯也把朝鮮當做惡 心中國的工具。
3、中國一樣,雖然跟俄羅斯是盟友,但是在北方四島問題是支持日本的,因為島嶼是俄羅斯佔領的。
4、朝鮮也好不到哪去,在圖們江入海口事件中,俄羅斯是沒有明擺著的意見,有意見的就是朝鮮,朝鮮把圖們江口全打上暗樁,防止中國偷偷溜進日本海。
個人與個人之間,關系會非常緊密,但是國家間,只有利益!
『伍』 俄羅斯的「斷網暗樁」是什麼意思呢
就是整個國家的網路與外界互聯網斷開了,有情報人員平時用的轉接設備被查出了
『陸』 易語言反破解教程說信息框用自定義窗口就是自己新建窗口,請問新建窗口怎麼做到程序等待或者系統等待效果
4.隨機驗證
隨機驗證很重要,例如你的一處驗證是一直存在的,奸人就很容易地下斷點跟蹤了。因此在軟體啟動時進行一次正常驗證外,其他情況下的驗證最好是隨機的,用30分之一或50分之一的機會進行驗證,這樣奸人會不停地試你的軟體在哪一處進行了驗證,因此破解的時間會相當地長。
加密第14定理:足夠多的隨機驗證足以讓破解者累死。
隨機驗證包括隨機進入不同的驗證子程序。
或隨機中的最大數大一些,只有30分之一的機會驗證。
或在窗口中放上一些顏色與底圖一樣的圖片框,這樣奸人不一定會點擊這里,但用戶萬一點中了,就會觸發驗證。
我們假設所有軟體都能被破解,包括易語言在內,那麼如果他破解的速度跟不上你發布新軟體的速度,那麼他永遠在破最新版而累死。或者說他破解的時間比你寫一個軟體的代價大,這時還不如他直接寫這個軟體來得合算。
反破解的任務之一就是讓奸人累死,或浪費他的生命。
下面的辦法也可以使用:你可以在讀到待驗證的注冊碼、公鑰、注冊文件後,通過定義10000個數組,存入上述同樣的內容以備以後進行驗證,這最多浪費一些內存。驗證時隨機使用其中的一個進行驗證,由於奸人不知你用的是數組中的哪一個進行的比對,而且是隨機的,每次驗證的值都不一樣,不讓奸人吐血才怪呢。
計次循環首(10000,計次)
數組[計次] = 「123456」 』 復制一萬個公開注冊碼或公鑰,破解者知道也無所謂。
計次循環尾
數組[取隨機數(1,10000)]
你不要立刻檢查注冊碼,10000份拷貝你只要以後隨機找一份用就行了,破解的人不知道你正在用的是那一個,同時你可以事先編好且運行時不斷使用一些假的讀取注冊碼數組的調用干擾破解者。這種方法對程序的性能影響微不足到,只是浪費一點內存。因為Debug對內存下斷點的局限,這種情況他要下斷點,累死的就是破解的人了。
5.不同許可權驗證
在啟動時進行一次驗證是非常必要的,這樣讓奸人知道確實是驗證了,以讓他心理放鬆警惕,而這次的驗證只是一部分驗證,並沒有完全驗證。
還有的建議在啟動時將注冊信息讀入後不要進行驗證,保不定在哪裡進行驗證,個人認為這樣讓破解者提高了警惕性,會認為軟體作者很有經驗。麻痹敵人也很重要呀。
例如,在啟動時驗證通過一次,驗證級別加強一級,然後再在其他的地方再進行驗證就可以了。
下面代碼是確認了一個級別
計次循環首(到數值(驗證1),)
已注冊 = 1
計次循環尾()
……
……
在另一個觸發子程序中再通過這個級別再驗證:
計次循環首(已注冊)
計次循環首(到數值(驗證2),)
已注冊 = 2
跳出循環()
計次循環尾()
跳出循環()
計次循環尾()
在其他觸發子程序中再通過這個級別再驗證:
計次循環首(已注冊)
計次循環首(到數值(驗證3),)
已注冊 =3
跳出循環()
計次循環尾()
跳出循環()
計次循環尾()
有時也可以將級別降一降,怎麼降,當然是不考慮級別直接驗證了:
6.忽悠型的GHOFFICE過濾詞語驗證代碼
前面已講過花指令的原理,在程序中人為地再放一些GHOFFICE過濾詞語代碼以忽悠奸人也是一個好辦法。GHOFFICE過濾詞語代碼就是一些假的驗證代碼,基本上是明文的,這樣的代碼上百上千,足以讓奸人累死。
其實對付那些「根據跳轉指令的爆破」高手來說,一個辦法就夠他們頭疼的了,就是你在程序中不明顯加入與判斷是否正版有關的語句,也不做任何提示,以免讓他們順藤摸瓜,而是在判斷為盜版後,跳轉到另一個看似很合理的分支,而那個分支和正版的分支代碼差不多,只是在計算公式或其它演算法上稍動一下,使其運算結果不正確,這樣,他們就在機器碼級別上就分不清哪個是對的,哪個是錯的了,即使他們認為破解成功,其實運行時,得的結果錯誤百出,他們就沒興趣了,呵呵,算損的吧!!!
加密第15定理:大量添加GHOFFICE過濾詞語代碼雖然是無奈之舉,但很管用。
作業1:製作一個常量****器
要求:製作一個常量代碼自動生成器。可隨機生成成百上千個易語言源代碼形式,可直接拷貝到易語言中成為常量。變數也可以這樣製作。
寫好這樣一個程序後,就可以自動生成GHOFFICE過濾詞語代碼,然後復制,粘貼到易語言的常量表中即可。如下圖所示:
變數也可以這樣生成,不過生成的變數可以任意拷貝為全局變數,或程序集變數,或局部變數。製作時的名稱可以為中文名稱,直接編譯後不會在EXE文件中找到同名的中文名稱。因此您可以放心地將這些名稱定義為:「GHOFFICE過濾詞語常量1」、「GHOFFICE過濾詞語變數1」等等以示與正常代碼進行區別。
作業2:製作一個代碼迷亂器
本次作業性質同上,也是自動生成易語言的一些無用GHOFFICE過濾詞語代碼,以迷亂奸人的破解,讓他找到的全是GHOFFICE過濾詞語代碼,從而大大延長了破解時間。
通過直接拷貝編輯框中的內容,粘貼到您的代碼中,可自動完成任務,如下圖所示:
上圖所生成的是一些明文的加密方法的GHOFFICE過濾詞語代碼,讓奸人去研究這些GHOFFICE過濾詞語吧。
上述子程序名稱最好也有時調用一下,反正不會真正產生作用的,用多線程調用最好。
或者您平時注意多收集一些別人用於加密時的子程序,拷貝到一個易語言程序中,保存,這樣的代碼作為GHOFFICE過濾詞語代碼放在你有用的程序中,雖然增加了一些程序的體積,但安全性是大大提高了。並且基本上沒有犧牲軟體性能與穩定性。
7.偽驗證技術
還是先舉一個例子說明吧,易表軟體在10.0版本前已發現有大量的注冊機存在,於是易表作者其後改變了加密方式,易表10.0推出後還是出現了注冊機,並且這種注冊機注冊過的軟體可以使用。於是有些用戶用注冊機取得的注冊碼使用了,過了一段時間,當盜版用戶將重要數據存入易表後,突然有一天資料庫被鎖定了,於是只好注冊易表,並且讓易表作者為資料庫解鎖。
從這里可以基本上判定易表新版本採用了偽驗證技術,即在較為明顯的地方提供了一級驗證,這種驗證方式沒有經過太強的加密,而二級驗證在一定的條件下才觸發,而這個條件是檢查到了用戶輸入了重要的數據,或大量的數據,或使用次數較多。
基本原理是注冊文件由前後兩個注冊碼拼接而成。一般情況下只進行第一個注冊碼的驗證,而當條件成熟時進行第二個注冊碼驗證。
這是一種雙贏的策略,易表作者即收到了注冊費,付費的人還會道歉,並且感謝易表作者。哈哈,大家要學習這招哦。
但本辦法對於資料庫應用及數據量大時檢查最好,而對於一些沒有生成數據的用戶無效。
發布軟體的時候發布自己編寫的注冊機,弄個假破解版,那麼想破解的就可能不來了,即使有真的破解,誰會有自己給自己寫假破解快啊!可能假破解版中只破解一半,等用戶使用了,有數據了再鎖定,讓他們注冊後再給解鎖,付了錢還要謝謝你,哈哈,損招,但有用!
加密第16定理:偽驗證可以迷惑一般破解者,甚至自己發布一個偽注冊機。
8.定時驗證、延時驗證、客戶數據集累驗證
過一段時間後再驗證,如你在2005年1月發布一個軟體,那麼就內定2005年6月後觸發驗證機會。
或您的軟體是一個資料庫產品,那麼您可以在程序中設置如果資料庫大於5MB時就進行驗證,並且最好您能確定這些數據是不重復的,刻意加入的。
如易表設置了偽驗證,這時市場上出現了新的注冊機,當用戶用這個注冊機後,提示是注冊成功了,但當用戶輸入重要數據後的某個日子,突然打不開資料庫了,用戶很著急,因為以為是破解成功了,所以將重要的資料輸入了,只能拿錢向易表作者進行注冊了。而且還千恩萬謝,後悔自己不該用破解。哈哈,一舉兩得呀。
這個方法對於資料庫應用軟體來說是絕好的辦法。
作業:製作一個演算法程序放在你的資料庫軟體中,這個子程序可以統計你的資料庫軟體使用時,用戶輸入的是否是拷貝的東西,還是正常的數據。當統計到1000時觸發驗證。方法思路為:可以通過查看用戶有沒有使用復制與粘貼快捷鍵,或資料進行排序,如果有大量重復的,就說明是奸人在拷貝數據破解,否則是一個資料一個資料的輸入的,說明是正常使用的重要資料,這時進行對比就好了。
本方法對有資料的破解使用者有極好的控製作用,通過第6條的偽驗證技術與本技術結合,那麼就可以知道是不是正版用戶,並且可以鎖定資料庫,等他注冊後再給他解鎖。
加密第17定理:加密的結果應該是雙贏,偽驗證是一個上策。
9.驗證與專業知識相結合技術
將驗證與專業知識相結合,讓奸人必須學習專業知識後才能真正去破解,這樣所花的功夫比自己寫一個軟體的代價還要大,而有的專業知識不是專家是不知道的,因此是一個較好的加密方法。
前述中採用了「到數值(驗證1())」這樣的代碼返回的是0或1兩者之間的一個數,可以用乘法進行混合計算,如:
音量 = 播放位置X到數值(驗證1())
當驗證正確時返回的是1,這時的結果是正確的,否則返回0,這時的結果為0,是錯誤的。
這樣的代碼可以混合到您的專業知識中,如:算命軟體可將天乾地支、生辰八字中的某個地方進行此類計算,計算類軟體可以將某種特殊的計算過程如此結合計算,繪圖類軟體可將繪圖中的演算法部分加入此類計算,音響設計類、機床設計軟體……
加密第18定理:你知道的專業知識,破解者不一定了解哦。讓專業知識與驗證相結合吧。
10.偽裝,用易語言寫自有支持庫
大家可以將DLL文件的擴展名改為易語言的支持庫文件FNE擴展名,這樣進行非獨立編譯後,與其他FNE文件混合在一起,甚至您可以用易語言寫一個支持庫,將其中一部分作為驗證部分。
易語言的支持庫文件FNE文件其實就是一個DLL文件,只不過擴展名改變了而已,用易語言寫支持庫的方法金眼睛已發過一篇貼子,進行過說明,請大家在易語言論壇上搜索金眼睛的貼子就可以找到了。
作業:找到金眼睛關於用易語言寫支持庫的貼子,並且自己寫一個支持庫。
11.絕妙的暗樁設置
應該想到的用代碼實現的暗樁前面都講了不少,下面是一些特別的暗樁供奸人品味的。
大家可以在一些不起眼的地方再放一些暗樁,如:在窗口最小化事件中隨機驗證,如在某個組件滑鼠被移動事件中驗證,
有時需要將數據完整性驗證放在更高一級的驗證中,不要一上來就檢查文件是否被更改。
同一驗證可以使用多次,這樣奸人認為你已經驗證過了,沒有必要會再驗證一次,而相反這時又產生了驗證,讓奸人防不勝防。如啟動時就立即檢查程序完整性,如果發現被更改,那就立即退出程序,而在一些子程序中也隨機放這樣的驗證。
更多的暗樁大家自己設計最好。
加密第19定理:加密重要的是暗樁的設置,破解不完全就是一個無效破解。
12.發布不完整版本
有的軟體作者在發布共享軟體時,放在外面的是不完整版本,將更多的數據資料在注冊後提供。這樣做也可以,只是麻煩一些而已。如有的圖形製作軟體,將圖片資源另外打包,用戶注冊後再給完全版的圖片。
也有的將DLL文件中的驗證部分作了空處理,而在注冊後提供真正的注冊DLL文件及注冊碼。還有的直接將KEY文件放在了DLL文件中另外提供。
加密第20定理:不要發布完整版本,以靜制動。
13.程序、數據結合加密技術
把程序運行所必需要的資源放到一個資料庫文件中,給這個資料庫設密碼,密碼是主程序的數據摘要變換後的結果。程序運行是先驗證有沒有注冊,如果已經注冊,就對運行程序本身(取執行文件名())取數據摘要,用自己設計的演算法多次變換後形成一個字串,用該字串作為資料庫的密碼打開資料庫文件。如果打開資料庫失敗,就說明主程序被人修改了,終止程序運行即可。(不終止也沒戲,程序找不到運行所需的資源。)
另外設計一個程序,用同樣的演算法算出資料庫密碼,然後給資料庫加密即可。
密碼形成演算法建議使用大數支持庫。但如果是匯編高手用匯編寫注冊機的話,會直接將支持庫的所有反匯編碼抄進去就可以了,問題是他們有沒有時間搞。
14.自定義演算法
前面講過採用RSA與數值計算支持庫交叉計算的辦法,這就是一種自有的演算法,如果能用上數值計算支持庫中的矩陣、傅麗葉變換等高級功能就更好了。
多重RSA交叉打亂:大家也可以多用一些RSA密鑰,如用5個,10個都無所謂,重要的是將這些注冊碼都打亂,讓奸人哭死。打亂的方法就是你自己獨創的方法了。
更多的自有演算法就要靠大家自己去研究了。祝大家好運。
加密第21定理:加密不反對古怪和變態的方法,鼓勵哦。
15.加密框圖
下面給出一個加密的設計框圖,大家可以根據自己的實際情況改變加密的策略:
圖中主程序外圍進行了花指令編譯,並且用加普通殼進行保護。脫殼了也無所謂,因為設置了暗樁,隨機檢查。
圖中表示主程序運行後,首先進行了常規的注冊碼第一次驗證,找有沒有注冊文件。如果這個被破解,注冊碼應該是一個短的RSA,而真正的注冊碼是三個RSA的疊加。會生成偽注冊機也無所謂。
主程序中用暗樁的形式對窗口標題、版權信息進行驗證,這是考慮到如果一啟動就驗證這些很容易被奸人看出來從而會跳過去。因此用一些隨機,或分級,或條件法取得不固定的驗證。
主程序中用暗樁的方式對加殼後主程序的完整性進行校驗,這個也不要放在常規的驗證中,否則很容易被跳過去。可以查文件長度,MD5或CRC32都可以上。
主程序中用暗樁的方式加入了反調試模塊。
主程序中布滿GHOFFICE過濾詞語驗證代碼。並且源代碼有備注,不會搞錯的。
主程序在某個條件下隨機進行第二級驗證,從注冊碼中取第二段數據,如果注冊碼長度不夠且取不到第二段數據,那麼就說明已使用了偽注冊機,將用戶的資料庫鎖定,等他付錢來注冊。
主程序在一個條件下再激活驗證,從注冊碼文件中取第三段數據,如果注冊碼長度不夠,且取不到第三段數據,那麼就說明已使用了偽注冊機,將用戶的資料庫鎖定,等他付錢來注冊。
編程中還注意將加密的字元串攪亂且分不同地方存放,用吳氏加密命令加密重要數據,也可加入數值計算支持庫的演算法,也可以加入一些懲罰手段,也可以再加入自己的一些演算法。
以下是一些人的編程體會摘錄,基本未改其中的內容,在此表示感謝!
附錄1加密已形成密碼學
我引用《應用密碼學》作者的話:
世界上有兩種密碼:一種是防止你的小妹妹看你的文件;另一種是防止奸人閱讀你的文件資料。
如果把一封信鎖在保險櫃中,把保險櫃藏在紐約的某個地方…,然後告訴你去看這封信。這並不是安全,而是隱藏。相反,如果把一封信鎖在保險櫃中,然後把保險櫃及其設計規范和許多同樣的保險櫃給你,以便你和世界上最好的開保險櫃的專家能夠研究鎖的裝置。而你還是無法打開保險櫃去讀這封信,這樣才是安全的。
意思是說,一個密碼系統的安全性只在於密鑰的保密性,而不在演算法的保密性。
對純數據的加密的確是這樣。對於你不願意讓他看到這些數據(數據的明文)的人,用可靠的加密演算法,只要破解者不知道被加密數據的密碼,他就不可解讀這些數據。
但是,軟體的加密不同於數據的加密,它只能是「隱藏」。不管你願意不願意讓他(合法用戶,或 Cracker)看見這些數據(軟體的明文),軟體最終總要在機器上運行,對機器,它就必須是明文。既然機器可以「看見」這些明文,那麼 Cracker,通過一些技術,也可以看到這些明文。
於是,從理論上,任何軟體加密技術都可以破解。只是破解的難度不同而已。有的要讓最高明的 Cracker 忙上幾個月,有的可能不費吹灰之力,就被破解了。
所以,反盜版的任務(技術上的反盜版,而非行政上的反盜版)就是增加 Cracker 的破解難度。讓他們花費在破解軟體上的成本,比他破解這個軟體的獲利還要高。這樣 Cracker 的破解變得毫無意義——誰會花比正版軟體更多的錢去買盜版軟體 ?
然而,要做到「難破解」,何嘗容易? Sony 曾宣稱的超強反盜版(Key 2 Audio音樂 CD反盜版),使用了很尖端的技術,然而最近卻被一枝記號筆破解了,成為人們的飯後笑料!
所以,很多看上去很好的技術,可能在 Cracker 面前的確不堪一擊。就像馬其諾防線一樣,Cracker 不從你的防線入手,而是「繞道」。這樣,讓你的反盜版技術在你做夢也想不到的地方被 Crack 了。
為什麼會這樣呢 ?歸根到底是因為軟體在機器上運行,並且軟體和機器是分離的——這一點是關鍵,如果軟體和硬體完全綁定,不能分離,是可以做到象 IDEA 之類幾乎不可破解的系統的。這將在後面談傳統軟體保護技術時詳細說明。
對我的這個解決方案,我不能保證Crack高手在幾天之內不能破解它,我只能說:「在這個軟體中,我盡量堵住了當前破解者普遍使用的方法以及「我想得到」的可能的缺口。」但是我相信,傾注了我三個月心血的反盜版軟體,決不是一個「玩具式」的反盜版軟體。
附錄2《如何用簡單方法防止破解》
北極異型
在Debug的手冊里可以看到Debug工具的局限:第一個局限是只能下4個內存區域的斷點,每個斷點不能控制超過兩個位元組,這樣內存斷點不能控制超過16個位元組的區域;第二個局限是對多線程只能同時跟蹤一個線程。
假設你的注冊部分有300行,你可以分成30個子程序調用或重復的func1(),func2()... func30()。將他們隨意放到程序的各個部分,一定不能放在一起(自己能找到就行了)。不要用Memcpy等常用系統調用拷貝注冊碼,盡可能自己寫,像Memcpy很好寫,性能差點無所謂。經過編譯後inline函數展開,注冊部分和其他代碼混在一起,他要寫出注冊機就像大海里撈針,在幾十萬甚至上百萬匯編代碼里找出有用的注冊部分。
利用Debug的第一個局限最重要的一點是:注冊碼也不要放在一起,假設你的注冊碼是12位,千萬不要用一個12位的數組放注冊碼,你可以在程序的不同位置定義12個全局字元變數,每個放一位,這樣注冊碼在內存就不連續了。最好再加密處理一下(簡單的字元異或就可以),驗證時再解密。也不要用連續內存保存驗證用到的變數,盡量將用到的驗證臨時變數分散定義在程序的不同處,再在驗證中,不斷轉移一些值到其他變數中,對付暴力和Loader會比較有效。
沒有必要用復雜的加密演算法,更容易成為追蹤的目標。只要你將注冊部分隱藏的足夠好,也沒有漏洞,你花1天寫的加密演算法,破解者可能會花100-1000倍的時間破解。大部分人都會放棄。
你將注冊做在一起,就像將你的財寶放在現代保險箱里,雖然非常堅固難以解密,對於開鎖高手兩分鍾就打開了。
而古代海盜用的方法是將財寶埋在海島上,這樣沒有藏寶圖,對所有高手和低手都只有一條路,拿一把鐵撬挖,可能要挖一生。程序有那麼多代碼,反編譯出來可能超過百萬行,你將注冊部分藏在裡面,藏的好就如同將財寶埋在海島里。那些所謂的Crackme只是給高手玩兒的現代保險箱而已,用原始的方法可以達到同樣效果。