軟件破解新手進(jìn)化篇
互聯(lián)網(wǎng) 發(fā)布時(shí)間:2008-10-08 19:04:38 作者:佚名
我要評論

1.軟件怎么判斷我們是否注冊了?
不要忘了,軟件最終是按照人的思維做的,我們回到自身來,“如果是你,你怎么判斷別人是否注冊了呢”,“我要別人輸入用戶名和注冊碼啊”,聰明的想法,很多軟件也是這樣做的,如豪杰超級解霸。(但是不是所以的軟
1.軟件怎么判斷我們是否注冊了?
不要忘了,軟件最終是按照人的思維做的,我們回到自身來,“如果是你,你怎么判斷別人是否注冊了呢”,“我要別人輸入用戶名和注冊碼啊”,聰明的想法,很多軟件也是這樣做的,如豪杰超級解霸。(但是不是所以的軟件,方法太多了,友情提示:這個(gè)世界沒有完全通用的東西,除了你聰明的大腦)
具體一點(diǎn)呢??????????
我們把用戶名按照某種方法運(yùn)算得到一個(gè)真正的注冊碼和用戶輸入的進(jìn)行比較不就知道了嗎?Yeah,也就是
真正的注冊碼 = f(用戶名)
和Y = f(x) 是一樣的
然后就是很經(jīng)典的比較了,為什么說經(jīng)典呢?
因?yàn)榇蟾庞?0%的軟件是這么做的,到底是什么比較呢,看看
請注意這里會有錯(cuò)誤處理的噢,在這之前呢,就是經(jīng)典比較啊,如果這里的錯(cuò)誤處理提示我們諸如:注冊錯(cuò)誤之類的東西,我們就很容易定位到經(jīng)典比較了。
那么上面的流程在匯編語言里面是怎么實(shí)現(xiàn)的呢? 比較有2種方式,直接和間接,直接就是用:
cmp x, y
je (jne) label
這里的x和y只是一個(gè)符號,實(shí)際上可能是寄存器和存儲器
間接的呢?調(diào)用一個(gè)子程序比較,如下面的代碼
if (strcmp(&x, & y)) //如果strcmp返回值是1
printf(“right”);
else……………..//當(dāng)然是錯(cuò)誤拉
這里的strcmp也只是一個(gè)符號,現(xiàn)實(shí)可能有變化
用匯編語言描述呢?
push &y;
push &x;
call strcmp;
test ax,ax ;判斷返回值(也就是出口參數(shù),也可以在子程序里判斷)
je……
2.為什么可以調(diào)試可執(zhí)行程序呢
可能很多菜鳥有我這樣的疑問,呵呵
調(diào)試可執(zhí)行程序的理論基礎(chǔ):
我們都知道在匯編語言里面可以用debug來調(diào)試程序。但是為什么可以?
其實(shí)和簡單,因?yàn)闄C(jī)器只識別的是0和1(準(zhǔn)確的說你高電平和底電平,你可以簡單的理解為燈泡亮和黑),我們稱之為機(jī)器碼,而我們的匯編語言與機(jī)器碼是一一對應(yīng)的,所以我們可以根據(jù)機(jī)器碼得到對應(yīng)的匯編代碼,也可以反過來通過匯編代碼得到對應(yīng)的機(jī)器碼,
如:在debug下我們可以看到
用debug測試一下:
-a
1370:0100 mov ax,bx
1370:0102
-u100
1370:0100 89D8 MOV AX,BX
這里的89D8就是MOV AX,BX的機(jī)器碼
3.破解教程都告訴我們,找到錯(cuò)誤提示上面的第一個(gè)有條件跳轉(zhuǎn),改掉就可以爆破,為什么呢?
因?yàn)槌绦蚴琼樞驁?zhí)行的,只要我們找到提示出錯(cuò)的地方,那么在此之前必定已經(jīng)比較完了,所以再往前面找找就看到了關(guān)鍵的比較,關(guān)鍵的地方就是上面的比較,如果我們改變的判斷條件呢?如果改成不相等就注冊成功,那么。。(嘿嘿,某同志傳來不懷好意的笑聲),那么不管我們輸入什么都是“正版”的了,沒有交錢的“正版”,這就是我們改變跳轉(zhuǎn)的原因,也就是改變改變的判斷條件
4.下面我們開始實(shí)戰(zhàn)演習(xí)
雖然這只是一個(gè)簡單的用S-Demo做的動畫,但是看完了下面的文章你還是會收獲很多,不相信,我暈,把簡單的事情做到極限就成功了,呵呵
(1).爆破
這個(gè)很簡單就不多講了,運(yùn)行程序,隨便輸入密碼,確定,提示:“password wrong”,
用ollydbg載入這個(gè)動畫,查找程序用到的字符串,找到password wrong,下個(gè)斷點(diǎn),還記得前面的理論嗎?
再向前找找就可以找到比較的關(guān)鍵地方了(條件跳轉(zhuǎn)),好的,找到的地址是:0040203F
0040202A |. FFB6 A4000000 PUSH DWORD PTR DS:[ESI A4] ; /s2
下個(gè)斷點(diǎn),看看到底壓入了堆棧什么
00402030 |. 8D45 CC LEA EAX,DWORD PTR SS:[EBP-34] ; |
00402033 |. 50 PUSH EAX ; |s1
00402034 |. FF15 E0234100 CALL DWORD PTR DS:[] ; \_stricmp //這里看到了什么,stricmp,難道這就是傳說中的關(guān)鍵比較嗎?
但是比較之后沒有跳轉(zhuǎn)啊,是嗎?仔細(xì)看看,比較之后的結(jié)果放在那里,eax !
下面不是有一個(gè)je嗎?
0040203A |. 83C4 20 ADD ESP,20 ;平衡堆棧
0040203D |. 85C0 TEST EAX,EAX ;測試返回值
0040203F |. 74 15 JE SHORT test.00402056
修改為jne,保存,運(yùn)行,ok,搞定,請你再次回顧前面的流程圖
(2).尋尋覓覓找密碼
還記得前面的流程圖嗎?如果我們在程序比較的時(shí)候中斷程序會有什么發(fā)現(xiàn)呢?呵呵,這個(gè)時(shí)候會看到真正的密碼,重新用ollydbg載入這個(gè)動畫,下斷點(diǎn)00402034
為什么要在這里下斷點(diǎn)?好問題,因?yàn)檫@里看到了call DWORD PTR DS:[],看看流程圖,明白了嗎,呵呵
這里我們在堆棧區(qū)域可以看到我們輸入試煉碼和真正的密碼,為什么在堆棧區(qū)域,因?yàn)樵趙indows下通過堆棧傳遞參數(shù)。請看上面的簡單分析,破解補(bǔ)丁的編寫
(3).文件補(bǔ)丁的編寫(c語言簡單實(shí)現(xiàn))
前面我們把je改成了jne,隨便輸入密碼都可以了,實(shí)質(zhì)是把機(jī)器碼由74h改成75h,因?yàn)闄C(jī)器碼和匯編指令是一一對應(yīng)的,那么我們只要寫個(gè)小東西,修改就可以了。我已經(jīng)寫好了,很短,很好懂。Crack.c,我們分析一下
#include
#include
int main(void)
{
FILE *fp_out; //要寫入的文件
printf("\n\t\t\t\t Copy Right by ngaut\n");
printf("Cracking......\n");
//打開文件test.exe
if ((fp_out = fopen("test.exe", "r "))==NULL)
{
printf("error!!! Can not open test.exe!!!\n\n");
printf("Press any key to continue\n");
getchar();
exit(0);
}
//定位到要修改的地方,這里是 0x203f,為什么呢?下面給出回答
fseek(fp_out, 0x203f, SEEK_SET);
fputc(0x75, fp_out); //寫入數(shù)據(jù)0x75,也就是把機(jī)器碼74改為75,
//匯編則是 je 改為了jne
fclose(fp_out);
這里 0x203f = 0x0040203F – 0x00400000
(4).讓程序自動彈出正確的密碼
不要忘了,軟件最終是按照人的思維做的,我們回到自身來,“如果是你,你怎么判斷別人是否注冊了呢”,“我要別人輸入用戶名和注冊碼啊”,聰明的想法,很多軟件也是這樣做的,如豪杰超級解霸。(但是不是所以的軟件,方法太多了,友情提示:這個(gè)世界沒有完全通用的東西,除了你聰明的大腦)
具體一點(diǎn)呢??????????
我們把用戶名按照某種方法運(yùn)算得到一個(gè)真正的注冊碼和用戶輸入的進(jìn)行比較不就知道了嗎?Yeah,也就是
真正的注冊碼 = f(用戶名)
和Y = f(x) 是一樣的
然后就是很經(jīng)典的比較了,為什么說經(jīng)典呢?
因?yàn)榇蟾庞?0%的軟件是這么做的,到底是什么比較呢,看看
請注意這里會有錯(cuò)誤處理的噢,在這之前呢,就是經(jīng)典比較啊,如果這里的錯(cuò)誤處理提示我們諸如:注冊錯(cuò)誤之類的東西,我們就很容易定位到經(jīng)典比較了。
那么上面的流程在匯編語言里面是怎么實(shí)現(xiàn)的呢? 比較有2種方式,直接和間接,直接就是用:
cmp x, y
je (jne) label
這里的x和y只是一個(gè)符號,實(shí)際上可能是寄存器和存儲器
間接的呢?調(diào)用一個(gè)子程序比較,如下面的代碼
if (strcmp(&x, & y)) //如果strcmp返回值是1
printf(“right”);
else……………..//當(dāng)然是錯(cuò)誤拉
這里的strcmp也只是一個(gè)符號,現(xiàn)實(shí)可能有變化
用匯編語言描述呢?
push &y;
push &x;
call strcmp;
test ax,ax ;判斷返回值(也就是出口參數(shù),也可以在子程序里判斷)
je……
2.為什么可以調(diào)試可執(zhí)行程序呢
可能很多菜鳥有我這樣的疑問,呵呵
調(diào)試可執(zhí)行程序的理論基礎(chǔ):
我們都知道在匯編語言里面可以用debug來調(diào)試程序。但是為什么可以?
其實(shí)和簡單,因?yàn)闄C(jī)器只識別的是0和1(準(zhǔn)確的說你高電平和底電平,你可以簡單的理解為燈泡亮和黑),我們稱之為機(jī)器碼,而我們的匯編語言與機(jī)器碼是一一對應(yīng)的,所以我們可以根據(jù)機(jī)器碼得到對應(yīng)的匯編代碼,也可以反過來通過匯編代碼得到對應(yīng)的機(jī)器碼,
如:在debug下我們可以看到
用debug測試一下:
-a
1370:0100 mov ax,bx
1370:0102
-u100
1370:0100 89D8 MOV AX,BX
這里的89D8就是MOV AX,BX的機(jī)器碼
3.破解教程都告訴我們,找到錯(cuò)誤提示上面的第一個(gè)有條件跳轉(zhuǎn),改掉就可以爆破,為什么呢?
因?yàn)槌绦蚴琼樞驁?zhí)行的,只要我們找到提示出錯(cuò)的地方,那么在此之前必定已經(jīng)比較完了,所以再往前面找找就看到了關(guān)鍵的比較,關(guān)鍵的地方就是上面的比較,如果我們改變的判斷條件呢?如果改成不相等就注冊成功,那么。。(嘿嘿,某同志傳來不懷好意的笑聲),那么不管我們輸入什么都是“正版”的了,沒有交錢的“正版”,這就是我們改變跳轉(zhuǎn)的原因,也就是改變改變的判斷條件
4.下面我們開始實(shí)戰(zhàn)演習(xí)
雖然這只是一個(gè)簡單的用S-Demo做的動畫,但是看完了下面的文章你還是會收獲很多,不相信,我暈,把簡單的事情做到極限就成功了,呵呵
(1).爆破
這個(gè)很簡單就不多講了,運(yùn)行程序,隨便輸入密碼,確定,提示:“password wrong”,
用ollydbg載入這個(gè)動畫,查找程序用到的字符串,找到password wrong,下個(gè)斷點(diǎn),還記得前面的理論嗎?
再向前找找就可以找到比較的關(guān)鍵地方了(條件跳轉(zhuǎn)),好的,找到的地址是:0040203F
0040202A |. FFB6 A4000000 PUSH DWORD PTR DS:[ESI A4] ; /s2
下個(gè)斷點(diǎn),看看到底壓入了堆棧什么
00402030 |. 8D45 CC LEA EAX,DWORD PTR SS:[EBP-34] ; |
00402033 |. 50 PUSH EAX ; |s1
00402034 |. FF15 E0234100 CALL DWORD PTR DS:[] ; \_stricmp //這里看到了什么,stricmp,難道這就是傳說中的關(guān)鍵比較嗎?
但是比較之后沒有跳轉(zhuǎn)啊,是嗎?仔細(xì)看看,比較之后的結(jié)果放在那里,eax !
下面不是有一個(gè)je嗎?
0040203A |. 83C4 20 ADD ESP,20 ;平衡堆棧
0040203D |. 85C0 TEST EAX,EAX ;測試返回值
0040203F |. 74 15 JE SHORT test.00402056
修改為jne,保存,運(yùn)行,ok,搞定,請你再次回顧前面的流程圖
(2).尋尋覓覓找密碼
還記得前面的流程圖嗎?如果我們在程序比較的時(shí)候中斷程序會有什么發(fā)現(xiàn)呢?呵呵,這個(gè)時(shí)候會看到真正的密碼,重新用ollydbg載入這個(gè)動畫,下斷點(diǎn)00402034
為什么要在這里下斷點(diǎn)?好問題,因?yàn)檫@里看到了call DWORD PTR DS:[],看看流程圖,明白了嗎,呵呵
這里我們在堆棧區(qū)域可以看到我們輸入試煉碼和真正的密碼,為什么在堆棧區(qū)域,因?yàn)樵趙indows下通過堆棧傳遞參數(shù)。請看上面的簡單分析,破解補(bǔ)丁的編寫
(3).文件補(bǔ)丁的編寫(c語言簡單實(shí)現(xiàn))
前面我們把je改成了jne,隨便輸入密碼都可以了,實(shí)質(zhì)是把機(jī)器碼由74h改成75h,因?yàn)闄C(jī)器碼和匯編指令是一一對應(yīng)的,那么我們只要寫個(gè)小東西,修改就可以了。我已經(jīng)寫好了,很短,很好懂。Crack.c,我們分析一下
#include
#include
int main(void)
{
FILE *fp_out; //要寫入的文件
printf("\n\t\t\t\t Copy Right by ngaut\n");
printf("Cracking......\n");
//打開文件test.exe
if ((fp_out = fopen("test.exe", "r "))==NULL)
{
printf("error!!! Can not open test.exe!!!\n\n");
printf("Press any key to continue\n");
getchar();
exit(0);
}
//定位到要修改的地方,這里是 0x203f,為什么呢?下面給出回答
fseek(fp_out, 0x203f, SEEK_SET);
fputc(0x75, fp_out); //寫入數(shù)據(jù)0x75,也就是把機(jī)器碼74改為75,
//匯編則是 je 改為了jne
fclose(fp_out);
這里 0x203f = 0x0040203F – 0x00400000
(4).讓程序自動彈出正確的密碼
相關(guān)文章
- “CMOS密碼”就是通常所說的“開機(jī)密碼”,主要是為了防止別人使用自已的計(jì)算機(jī),設(shè)置的一個(gè)屏障2023-08-01
QQScreenShot之逆向并提取QQ截圖--OCR和其他功能
上一篇文章逆向并提取QQ截圖沒有提取OCR功能, 再次逆向我發(fā)現(xiàn)是可以本地調(diào)用QQ的OCR的,但翻譯按鈕確實(shí)沒啥用, 于是Patch了翻譯按鈕事件, 改為了將截圖用百度以圖搜圖搜索.2023-02-04- QQ截圖是我用過的最好用的截圖工具, 由于基本不在電腦上登QQ了, 于是就想將其提取出獨(dú)立版目前除了屏幕錄制功能其他都逆出來了, 在此分享一下2023-02-04
非系統(tǒng)分區(qū)使用BitLocker加密導(dǎo)致軟件無法安裝的解決方法
很多電腦用戶在考慮自己電腦磁盤分區(qū)安全時(shí)會采用 Windows 自帶的 BitLocker 加密工具對電腦磁盤分區(qū)進(jìn)行加密。但有些人加密后就會忘記自己設(shè)置的密碼從而導(dǎo)致在安裝其它軟2020-11-25防止離職員工帶走客戶、防止內(nèi)部員工泄密、避免華為員工泄密事件的發(fā)生
這篇文章為大家詳細(xì)介紹了如何才能防止離職員工帶走客戶、防止內(nèi)部員工泄密、避免華為員工泄密事件的發(fā)生,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-27徹底防止計(jì)算機(jī)泄密、重要涉密人員離職泄密、涉密人員離崗離職前防范舉
近些年企業(yè)商業(yè)機(jī)密泄漏的事件屢有發(fā)生,這篇文章主要教大家如何徹底防止計(jì)算機(jī)泄密、重要涉密人員離職泄密、告訴大家涉密人員離崗離職前的防范舉措,具有一定的參考價(jià)值,2017-06-27量子計(jì)算機(jī)輕松破解加密算法 如何破解加密算法?
最近有電腦用戶反應(yīng)量子計(jì)算機(jī)可以破解下載的所有的加密算法嗎?其實(shí)也不是不可以,下面虛擬就為大家講解買臺量子計(jì)算機(jī),如何分分鐘破解加密算法2016-09-26怎么破解Webshell密碼 Burpsuite破解Webshell密碼圖文教程
webshell是以asp、php、jsp或者cgi等網(wǎng)頁文件形式存在的一種命令執(zhí)行環(huán)境,一種網(wǎng)頁后門。黑客通常會通過它控制別人網(wǎng)絡(luò)服務(wù)器,那么怎么破解webshell密碼呢?一起來看看吧2016-09-19- 本文討論了針對Linux系統(tǒng)全盤加密的冷啟動攻擊,大家都認(rèn)為這種攻擊是可行的,但執(zhí)行這么一次攻擊有多難?攻擊的可行性有多少呢?需要的朋友可以參考下2015-12-28
防止泄露公司機(jī)密、企業(yè)數(shù)據(jù)防泄密軟件排名、電腦文件加密軟件排行
面對日漸嚴(yán)重的內(nèi)部泄密事件,我們?nèi)绾问刈o(hù)企業(yè)的核心信息,如何防止內(nèi)部泄密也就成了擺在各個(gè)企業(yè)領(lǐng)導(dǎo)面前的一大問題。其實(shí),針對內(nèi)網(wǎng)安全,防止內(nèi)部信息泄漏早已有了比較2015-12-17