日本有码中文字幕视频,在线能看三级网站,日本妇乱子伦视频免费的,中文字幕一页在线

      首頁要聞資訊>內(nèi)容

      怎么破解(怎么制作破解版軟件)

      時(shí)間:2022-10-26 18:55:56來源:
      導(dǎo)讀首先,我們要明確一點(diǎn):理論上沒有破解不了的軟件,但不代表破解軟件比開發(fā)容易一萬倍。反破解的目的不是做一個(gè)無法破解的軟件,而是讓破解軟件的成本遠(yuǎn)大于購買軟件的成本

      首先,我們要明確一點(diǎn):

      理論上沒有破解不了的軟件,但不代表破解軟件比開發(fā)容易一萬倍。

      反破解的目的不是做一個(gè)無法破解的軟件,而是讓破解軟件的成本遠(yuǎn)大于購買軟件的成本。

      現(xiàn)在,筆者簡單展示幾種有代表性的軟件破解。當(dāng)然,要理解下面的內(nèi)容,需要有一點(diǎn)C語言的編程基礎(chǔ)。

      先說最簡單的軟件破解。假設(shè)我們寫了一個(gè)軟件,它的注冊方法代碼如下

      #include"stdio.h"#include"string.h"int main(){char Key哦,不,結(jié)束了。我還是被抓住了。;printf("請輸入注冊碼:");gets(Key);if (strcmp(Key,"abc123456")==0)printf("注冊成功");elseprintf("注冊失敗");}

      把他編譯成exe運(yùn)行。

      我該怎么破解?超級簡單。你可以把這個(gè)程序的后綴改成txt,打開,搜索注冊碼,然后翻看密鑰就可以找到了。

      不要笑,即使在今天,仍然有大量的軟件使用這種軟件保護(hù)機(jī)制,但這些軟件大多不是很有價(jià)值,比如xx管理系統(tǒng)、計(jì)算器等等,或者軟件作者別有用心。你可能會(huì)問,有什么問題?這種保護(hù)機(jī)制的問題是,目前大多數(shù)編譯器會(huì)直接在可執(zhí)行文件結(jié)構(gòu)中存儲(chǔ)字符串常量,所以如果你硬編碼了密鑰,那么上面的破解方法

      然后,我們進(jìn)入防破解2.0時(shí)代為了與時(shí)俱進(jìn),我們對上面的代碼稍作改動(dòng)。

      #include"stdio.h"#include"string.h"#include"windows.h"#include"math.h"int main(){char iKey[32];char Key[32];char ID[32];int iID=0xabc1d3f;sprintf(Key,"%x",iID*8 123456);printf("你的機(jī)器碼是%x\n",iID);printf("請輸入注冊碼:");gets(iKey);if (strcmp(Key,iKey)==0)MessageBoxA(0,"注冊成功","",MB_OK);elseMessageBoxA(0,"注冊失敗","",MB_OK);}

      現(xiàn)在“TXT”破解方法已經(jīng)沒用了。看,鑰匙找不到了。

      這個(gè)保護(hù)手段怎么樣?是不是很熟悉的公式?這個(gè)機(jī)器碼可以根據(jù)網(wǎng)卡MAC、CPU型號(hào)、內(nèi)存大小等生成。當(dāng)然密鑰算法也可以用MD5,SHA等來做。而不是簡單的8加123456相乘??傊畯臋C(jī)器碼到注冊碼都可以玩算法。

      然而,這有什么用呢?打開ollydbg,打破MessageBoxA(即彈出窗口的功能)。

      然后輸入錯(cuò)誤的注冊碼,命中斷點(diǎn)。很快,我們就來到了邏輯處理碼,判斷注冊碼是否正確。

      猜猜如果我們?yōu)榱伺袛嘧源a是否正確(nop指令填充)而刪除這段代碼會(huì)發(fā)生什么

      你會(huì)發(fā)現(xiàn),捧草,無論我輸入什么,都是注冊成功。

      那么問題出在哪里?你發(fā)現(xiàn)萬惡之源始于MessageBox函數(shù)。正是這個(gè)功能讓我們找到了注冊碼判斷碼。今天,非常非常大的一部分軟件仍然在使用這種二三十年前使用的保護(hù)方法。每年MessageBox被破解的軟件都死掉,可以繞地球三圈。這種保護(hù)機(jī)制讓所謂的軟件在發(fā)布后十分鐘就被破解,悲劇收場。

      這時(shí)候你吸取慘痛的經(jīng)驗(yàn),mmp,還有一顆痣。由于MessageBox不好用,我就是不用,所以你把代碼改成下面這樣

      #include"stdio.h"#include"string.h"#include"windows.h"#include"math.h"int main(){char iKey[32];char Key[32];char ID[32];int iID=0xabc1d3f;sprintf(Key,"%x",iID*8 123456);printf("你的機(jī)器碼是%x\n",iID);printf("請輸入注冊碼:");gets(iKey);if (strcmp(Key,iKey)==0)printf("注冊成功");elseexit(0);}

      看,嘖嘖。只要你沒有輸入正確的注冊碼,我就直接退出軟件(或者跳轉(zhuǎn)到別的地方),看你怎么辦。

      不幸的是,“注冊成功”這個(gè)詞每年都會(huì)背叛你。打開ollydbg,查找字符串引用,然后雙擊。

      [32]

      你注意到在這樣的地方判斷注冊碼確實(shí)不靠譜,于是你改變了策略,把檢查注冊碼的代碼復(fù)制N遍,或者一個(gè)字符一個(gè)字符的檢查注冊碼的準(zhǔn)確性。有的人把注冊成功之類的話加密或者混淆,需要的時(shí)候再拿出來。

      #include"stdio.h"#include"string.h"#include"windows.h"#include"math.h"int main(){char iKey[32];char Key[32];char ID[32];int iID=0xabc1d3f;sprintf(Key,"%x",iID*8 123456);printf("你的機(jī)器碼是%x\n",iID);printf("請輸入注冊碼:");gets(iKey);if (strcmp(Key,iKey)==0)printf("注冊成功");elseexit(0);if (strcmp(Key,iKey)==0)printf("注冊成功");elseexit(0);if (strcmp(Key,iKey)==0)printf("注冊成功");elseexit(0);if (strcmp(Key,iKey)==0)printf("注冊成功");elseexit(0);if (strcmp(Key,iKey)==0)printf("注冊成功");elseexit(0);if (strcmp(Key,iKey)==0)printf("注冊成功");elseexit(0);if (strcmp(Key,iKey)==0)printf("注冊成功");elseexit(0);if (strcmp(Key,iKey)==0)printf("注冊成功");elseexit(0);}

      放心吧,不管你抄多少遍,發(fā)現(xiàn)只是時(shí)間問題,吃棗就破解了。同時(shí),只要你想用明文字符串,遲早都要解密。這種方法類似于添加upx壓縮shell,只需等待數(shù)據(jù)解壓,一切又會(huì)是明文。所以及時(shí)解密比較明智,使用后立即擦除明文,可能會(huì)耽誤更長時(shí)間。但這還是時(shí)間問題。

      你開始發(fā)現(xiàn),主動(dòng)出擊不如找出內(nèi)奸,就是我們出名是為了解決問題而不是解決問題。最后你開始攻擊調(diào)試器,然后你成功進(jìn)化到反破解V2.5時(shí)代。

      這個(gè)時(shí)候就不得不介紹一個(gè)古老卻非常有名的函數(shù)了。

      IsDebugPresent

      你可能有點(diǎn)困惑。這個(gè)功能是做什么用的?簡單來說,當(dāng)我們破解一個(gè)程序時(shí),大多數(shù)情況下,我們會(huì)打開一個(gè)叫調(diào)試器的東西,對軟件進(jìn)行反編譯和分析。呃,這才是重點(diǎn)。IsDebugPresent函數(shù)可以檢測我們的程序是否被調(diào)試器附加了。想想吧。一般情況下,我們在使用軟件的時(shí)候會(huì)用到調(diào)試器。如果你給我附上調(diào)試器,你肯定會(huì)想干壞事。

      所以,你開始像這樣寫代碼:

      #include"stdio.h"#include"string.h"#include"windows.h"#include"math.h"int main(){char iKey[32];char Key[32];char ID[32];int iID=0xabc1d3f;if (IsDebuggerPresent()){MessageBoxA(NULL,"小樣,就你還破解我的程序,回家喝奶去吧","",MB_OK);return 0;}sprintf(Key,"%x",iID*8 123456);printf("你的機(jī)器碼是%x\n",iID);printf("請輸入注冊碼:");gets(iKey);if (strcmp(Key,iKey)==0)printf("注冊成功");elseexit(0);}

      因此,下次ollydbg加載并調(diào)試您的程序時(shí),將會(huì)出現(xiàn)以下場景。

      很長一段時(shí)間(包括現(xiàn)在)很多軟件或者加密殼都會(huì)檢查自己是否有調(diào)試器調(diào)試。例如,tls段將在加載時(shí)執(zhí)行。如果他們檢查到正在被調(diào)試和破解,就會(huì)設(shè)置一個(gè)標(biāo)簽,讓程序運(yùn)行到無用的地方或者干脆退出重啟。也有辦法通過使用變形的PE頭讓調(diào)試器無法加載。

      可惜還是沒用。例如,IsDebugPresent可以通過修改FS寄存器的標(biāo)志位使其完全不點(diǎn)火。同樣的手段包括但不限于檢查int 3軟中斷、Raw調(diào)用、查詢PEB、檢查調(diào)試權(quán)限和父進(jìn)程等等。有辦法繞過它。

      暗樁,只要插上,總能一根一根拔出來。

      好吧,我們還能做什么?不,別擔(dān)心。一只腳比另一只高?,F(xiàn)在我們正處于最流行的3.0版VMP時(shí)代。

      首先澄清一下,這里的VMP不是VMP殼。它被稱為虛擬機(jī)保護(hù)。簡單來說,為什么我們對破解軟件如此熟悉?不僅僅是因?yàn)槲覀兲煜86 x64 arm的匯編指令集。如果我們自己發(fā)明一套指令集,然后用這套指令集編寫程序,在自己的虛擬機(jī)上運(yùn)行,那么,當(dāng)破解者進(jìn)來的時(shí)候,我們看到的就是一臉的傻樣。

      遺憾的是,VM的運(yùn)行機(jī)制決定了它可能會(huì)造成幾十倍甚至上百倍的性能損失。因此,必須使用VMP來保護(hù)不是性能瓶頸的關(guān)鍵代碼,否則您的軟件將像

      那么,VMP保護(hù)機(jī)制是否完善?當(dāng)然不是。說白了,VMP只能延長分析時(shí)間。如果你讓VMP變得足夠復(fù)雜,足以讓一個(gè)破解者喝醉,但如果這個(gè)時(shí)間足夠長,你的軟件足夠有價(jià)值,足以讓人們想要破解它,他們?nèi)匀豢梢猿浞址治瞿愕腣M的運(yùn)行機(jī)制。等你的VM運(yùn)行機(jī)制搞清楚了,軟件離倒下也就不遠(yuǎn)了。

      不過你放心,分析VM機(jī)的執(zhí)行機(jī)制比自己寫VM機(jī)麻煩多了。畢竟一個(gè)是你需要通過代碼去猜測別人的想法,一個(gè)是你自己的想法轉(zhuǎn)化成代碼。因此,基于此,可以說:

      破解軟件比做軟件簡單。很多時(shí)候是不存在的!

      你可能會(huì)問為什么市面上那么多軟件,那么多游戲,那么多聽起來那么牛逼的防護(hù)軟件,結(jié)果卻被破解了。它們在發(fā)出后僅僅一天就被破解了。

      其實(shí)大問題在于這種商業(yè)保護(hù)軟件(比如保護(hù)殼),因?yàn)檫@些保護(hù)殼大部分都會(huì)賣給大量的軟件開發(fā)者。在叫樹有一種說法,這就像流行的VMP保護(hù)機(jī)制。之所以能受到保護(hù),是因?yàn)樗倪\(yùn)行機(jī)制不明確。如果你自己用這個(gè)軟件,而你的軟件又不值錢,除非大boss 空寂寞冷。不然誰有那個(gè)閑工夫分析你的虛擬機(jī)是怎么運(yùn)行的,但是商業(yè)保護(hù)殼就不一樣了。不管它采用什么樣的保護(hù)機(jī)制,只要分析清楚,使用這種保護(hù)機(jī)制的軟件幾乎都會(huì)倒下,而且在灰色行業(yè)。這種破解甚至是相當(dāng)賺錢的,只要這個(gè)保護(hù)機(jī)制不更新,一次投入,長期回報(bào)。所以只能說,第一次分析要花很長時(shí)間,然后只會(huì)花很長時(shí)間。

      所以,其實(shí)買一個(gè)商業(yè)保護(hù)殼的保護(hù)效果并沒有想象中的那么強(qiáng),很可能在灰色行業(yè)是無效的。就算是有防反基礎(chǔ)的碼農(nóng)也可能自己寫,效果更好。當(dāng)然,一個(gè)軟件被破解的概率并不高,還是我之前說的那句話:反破解不是讓軟件無法破解,而是讓破解軟件的成本遠(yuǎn)大于購買軟件的成本。

      畢竟你說你的軟件開源了沒人喜歡用,你還整天琢磨怎么防止被破解。

      然后你會(huì)開始問,有沒有更強(qiáng)大的防破解技術(shù)?看來我們之前說的無非是拖延時(shí)間。呃,我們必須正確對待這件事。不管是加密還是解密,其實(shí)說白了,最終都是在拖延時(shí)間??纯茨切┘用芩惴?。根據(jù)他們的數(shù)學(xué)理論,如果你要解密他們,他們的計(jì)算量就算把全世界所有的計(jì)算機(jī)加起來,也足夠你計(jì)算三個(gè)末日了。

      不過不用擔(dān)心,還有更厲害的方法。想想吧。為什么之前說那么多軟件都被破解了?最關(guān)鍵的原因之一是我們可以得到代碼。即使這個(gè)代碼已經(jīng)是一堆編譯好的匯編指令,只要我們有了這堆代碼,遲早還是能搞清楚這個(gè)程序是怎么回事,然后對癥下藥干壞事。

      就像給你一袋面粉,程序就是面包機(jī)。你往面包機(jī)里塞面粉做面包。有一天,你很好奇。面包機(jī)是怎么做出一片面包的?你把面包機(jī)拆開,然后你就知道面包機(jī)是怎么回事了。

      那么有什么方法可以讓用戶不知道我們的代碼是什么樣的呢?就像你給面包師面粉做面包,這個(gè)面包是怎么做出來的?你只能希望看到面包師是否有心情告訴你。

      為此,有請一個(gè)相當(dāng)普及和通用的早期游戲反破解工具(物理)。

      現(xiàn)在你可能看起來像個(gè)問號(hào),但我不是在跟你開玩笑。在2000年,大多數(shù)游戲都在光盤上運(yùn)行,但盜版也很容易。一旦拷貝了光盤里的數(shù)據(jù),就可以拷貝一萬張盜版光盤,于是游戲廠商想辦法,就想到了錘子。

      操作方法很簡單。拿個(gè)錘子和釘子,在光盤上釘幾道劃痕,造成人為的壞磁道,然后把數(shù)據(jù)刻錄到正確的扇區(qū)。這樣雖然程序還能正確運(yùn)行,但是光頭在讀取光盤的時(shí)候,就無法讀取了,所以你會(huì)發(fā)現(xiàn)打開光盤后,沒有關(guān)鍵文件,無法復(fù)制游戲或者程序,同時(shí)會(huì)標(biāo)記壞軌的位置。這個(gè)標(biāo)記在游戲運(yùn)行的時(shí)候也會(huì)被檢查,所以如果你想盜版,你得拿起錘子,在CD的相同位置打出相同的劃痕。當(dāng)然,這幾乎是不可能的。

      這種技術(shù)當(dāng)年也叫防盜環(huán)技術(shù),但不管名字多高大上,本質(zhì)上和錘釘子是一回事。遺憾的是,虛擬光盤出現(xiàn)后,也有辦法重現(xiàn)光盤的所有數(shù)據(jù)(包括壞軌)。所以,這種技術(shù)在今天毫無用處,但還是給了我們足夠的啟發(fā)。

      現(xiàn)在讓我們進(jìn)入防破解V3.x時(shí)代之所以不叫V4.0,是因?yàn)檫@種技術(shù)已經(jīng)存在很久了,比VMP保護(hù)的普及要早得多,可能是最新的理論上無法破解的防破解手段。

      首先,我們談到了加密狗或Ukey保護(hù),即要運(yùn)行軟件,你需要在電腦中插入一個(gè)類似u盤的東西。其實(shí)這個(gè)UKey就是一個(gè)微型計(jì)算機(jī),軟件的一些關(guān)鍵算法和代碼都在這個(gè)Ukey芯片里。當(dāng)我們PC上的軟件運(yùn)行時(shí),當(dāng)我們需要執(zhí)行這樣的關(guān)鍵算法時(shí),我們會(huì)將數(shù)據(jù)傳輸?shù)竭@個(gè)UKey,然后Ukey會(huì)計(jì)算出結(jié)果。將其回歸到PC的軟件中,避免用戶直接逆向獲取關(guān)鍵算法代碼,無法破解。這就是為什么今天,Ukey保護(hù)仍然非常受歡迎。

      不幸的是,UKey保護(hù)仍然有許多限制。第一,帶Ukey賊麻煩。如果Ukey丟了,補(bǔ)辦起來很麻煩,跑軟件插UKey也很麻煩。同時(shí),UKey的性能決定了它可能無法執(zhí)行一些消耗性能和內(nèi)存過多的代碼空,數(shù)據(jù)交互也會(huì)因?yàn)閹捄屯ㄐ叛舆t造成性能損失,所以和VMP保護(hù)機(jī)制一樣。也不是省油的燈,開發(fā)者水平也不到位。該保護(hù)的代碼沒有保護(hù),一堆已經(jīng)保護(hù)的無用代碼也會(huì)給破解者帶來機(jī)會(huì)。再說了,只要你的軟件足夠值錢,你是不是太看不起我華強(qiáng)北了?

      把Ukey拆開,用某種“藥水”剝開外層找到內(nèi)部芯片,連接上融合的“讀針”(有的芯片甚至省去這一步,直接用熱風(fēng)槍讀取ROM),然后讀出芯片的代碼。

      因此,UKey protection也宣告隕落。

      你發(fā)現(xiàn)只要把實(shí)體的東西交給用戶,遲早會(huì)有問題。所以在大多數(shù)情況下,這種Ukey保護(hù)就變成了一種帶有數(shù)字證書的網(wǎng)絡(luò)認(rèn)證方式。這種關(guān)鍵代碼是從Ukey傳到服務(wù)器的,數(shù)據(jù)交互是通過網(wǎng)絡(luò)完成的。其實(shí)這個(gè)保護(hù)機(jī)制和Ukey保護(hù)原理是一樣的,沒有本質(zhì)區(qū)別。但考慮到網(wǎng)絡(luò)帶寬的延遲,也有一定的性能損失和設(shè)計(jì)缺陷。

      需要強(qiáng)調(diào)的是,這種網(wǎng)絡(luò)保護(hù)手段必須經(jīng)過專門設(shè)計(jì),以保護(hù)程序中一系列關(guān)鍵的“功能性”代碼,而不是“防破解”代碼(如代碼解密和注冊驗(yàn)證),因?yàn)楹笳呷匀豢梢郧宄胺榔平狻贝a或轉(zhuǎn)儲(chǔ)代碼或偽造本地服務(wù)器來實(shí)現(xiàn)破解。

      那么你期待什么樣的X盾呢?x寶可以一勞永逸的保護(hù)程序,程序必須由專業(yè)的碼農(nóng)專門設(shè)計(jì),而不是彩筆,才能達(dá)到應(yīng)有的保護(hù)效果。

      但現(xiàn)實(shí)情況是,由于用戶離線操作和性能延遲的瓶頸,這種網(wǎng)絡(luò)保護(hù)設(shè)計(jì)往往存在很大缺陷。所以,不是說這個(gè)東西不好,而是理想很豐滿,現(xiàn)實(shí)很骨氣,所以沒什么可做的。

      當(dāng)然,代碼保護(hù)的手段很多,花樣也很多。本文僅簡單介紹幾種有代表性的開裂和防開裂手段。如果你感興趣,你想學(xué)習(xí):

      標(biāo)簽: