金年会 金字招牌诚信至上,金年会 金字招牌诚信至上,金年会 金字招牌诚信至上,金年会 金字招牌诚信至上

 找回密碼
 注冊

QQ登錄

只需一步,快速開(kāi)始

查看: 936|回復: 2
打印 上一主題 下一主題

[轉貼] 軟件破解新手進(jìn)化篇

跳轉到指定樓層
1#
極目楚天 發(fā)表于 2008-12-15 20:54:04 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式 來(lái)自 中國福建龍巖

馬上注冊,結交更多好友,享用更多功能。

您需要 登錄 才可以下載或查看,沒(méi)有帳號?注冊

x
1.軟件怎么判斷我們是否注冊了?

不要忘了,軟件最終是按照人的思維做的,我們回到自身來(lái),“如果是你,你怎么判斷別人是否注冊了呢”,“我要別人輸入用戶(hù)名和注冊碼啊”,聰明的想法,很多軟件也是這樣做的,如豪杰超級解霸。(但是不是所以的軟件,方法太多了,友情提示:這個(gè)世界沒(méi)有完全通用的東西,除了你聰明的大腦)

具體一點(diǎn)呢??????????
我們把用戶(hù)名按照某種方法運算得到一個(gè)真正的注冊碼和用戶(hù)輸入的進(jìn)行比較不就知道了嗎?Yeah,也就是
真正的注冊碼  =  f(用戶(hù)名)
和Y  =  f(x) 是一樣的
然后就是很經(jīng)典的比較了,為什么說(shuō)經(jīng)典呢?
因為大概有60%的軟件是這么做的,到底是什么比較呢,看看

請注意這里會(huì )有錯誤處理的噢,在這之前呢,就是經(jīng)典比較啊,如果這里的錯誤處理提示我們諸如:注冊錯誤之類(lèi)的東西,我們就很容易定位到經(jīng)典比較了。

那么上面的流程在匯編語(yǔ)言里面是怎么實(shí)現的呢? 比較有2種方式,直接和間接,直接就是用:
    cmp x, y   
    je (jne) label
這里的x和y只是一個(gè)符號,實(shí)際上可能是寄存器和存儲器
間接的呢?調用一個(gè)子程序比較,如下面的代碼
if (strcmp(&x, & y))  //如果strcmp返回值是1
  printf(“right”);
else……………..//當然是錯誤拉
這里的strcmp也只是一個(gè)符號,現實(shí)可能有變化
用匯編語(yǔ)言描述呢?
  push &y;
  push &x;
  call strcmp;
  test ax,ax  ;判斷返回值(也就是出口參數,也可以在子程序里判斷)
  je……

2.為什么可以調試可執行程序呢

可能很多菜鳥(niǎo)有我這樣的疑問(wèn),呵呵
調試可執行程序的理論基礎:
我們都知道在匯編語(yǔ)言里面可以用debug來(lái)調試程序。但是為什么可以?
其實(shí)和簡(jiǎn)單,因為機器只識別的是0和1(準確的說(shuō)你高電平和底電平,你可以簡(jiǎn)單的理解為燈泡亮和黑),我們稱(chēng)之為機器碼,而我們的匯編語(yǔ)言與機器碼是一一對應的,所以我們可以根據機器碼得到對應的匯編代碼,也可以反過(guò)來(lái)通過(guò)匯編代碼得到對應的機器碼,
如:在debug下我們可以看到
用debug測試一下:
-a
1370:0100 mov ax,bx
1370:0102
-u100     
1370:0100 89D8          MOV     AX,BX
這里的89D8就是MOV     AX,BX的機器碼

3.破解教程都告訴我們,找到錯誤提示上面的第一個(gè)有條件跳轉,改掉就可以爆破,為什么呢?

因為程序是順序執行的,只要我們找到提示出錯的地方,那么在此之前必定已經(jīng)比較完了,所以再往前面找找就看到了關(guān)鍵的比較,關(guān)鍵的地方就是上面的比較,如果我們改變的判斷條件呢?如果改成不相等就注冊成功,那么。。(嘿嘿,某同志傳來(lái)不懷好意的笑聲),那么不管我們輸入什么都是“正版”的了,沒(méi)有交錢(qián)的“正版”,這就是我們改變跳轉的原因,也就是改變改變的判斷條件

4.下面我們開(kāi)始實(shí)戰演習

雖然這只是一個(gè)簡(jiǎn)單的用S-Demo做的動(dòng)畫(huà),但是看完了下面的文章你還是會(huì )收獲很多,不相信,我暈,把簡(jiǎn)單的事情做到極限就成功了,呵呵

(1).爆破
這個(gè)很簡(jiǎn)單就不多講了,運行程序,隨便輸入密碼,確定,提示:“password wrong”,
用ollydbg載入這個(gè)動(dòng)畫(huà),查找程序用到的字符串,找到password wrong,下個(gè)斷點(diǎn),還記得前面的理論嗎?
再向前找找就可以找到比較的關(guā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:[<&MSVCRT._stricmp>]   ; \_stricmp    //這里看到了什么,stricmp,難道這就是傳說(shuō)中的關(guān)鍵比較嗎?
但是比較之后沒(méi)有跳轉啊,是嗎?仔細看看,比較之后的結果放在那里,eax !
下面不是有一個(gè)je嗎?
0040203A  |. 83C4 20        ADD ESP,20  ;平衡堆棧
0040203D  |. 85C0           TEST EAX,EAX    ;測試返回值
0040203F  |. 74 15          JE SHORT test.00402056
修改為jne,保存,運行,ok,搞定,請你再次回顧前面的流程圖

(2).尋尋覓覓找密碼
還記得前面的流程圖嗎?如果我們在程序比較的時(shí)候中斷程序會(huì )有什么發(fā)現呢?呵呵,這個(gè)時(shí)候會(huì )看到真正的密碼,重新用ollydbg載入這個(gè)動(dòng)畫(huà),下斷點(diǎn)00402034
為什么要在這里下斷點(diǎn)?好問(wèn)題,因為這里看到了call DWORD PTR DS:[<&MSVCRT._stricmp>],看看流程圖,明白了嗎,呵呵
這里我們在堆棧區域可以看到我們輸入試煉碼和真正的密碼,為什么在堆棧區域,因為在windows下通過(guò)堆棧傳遞參數。請看上面的簡(jiǎn)單分析,破解補丁的編寫(xiě)

(3).文件補丁的編寫(xiě)(c語(yǔ)言簡(jiǎn)單實(shí)現)
前面我們把je改成了jne,隨便輸入密碼都可以了,實(shí)質(zhì)是把機器碼由74h改成75h,因為機器碼和匯編指令是一一對應的,那么我們只要寫(xiě)個(gè)小東西,修改就可以了。我已經(jīng)寫(xiě)好了,很短,很好懂。Crack.c,我們分析一下
#include <stdio.h>
#include <string.h>
int main(void)
{
  FILE *fp_out;  //要寫(xiě)入的文件
  printf("\n\t\t\t\t Copy Right by ngaut\n");
  printf("Cracking......\n");
//打開(kāi)文件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);        //寫(xiě)入數據0x75,也就是把機器碼74改為75,
//匯編則是 je 改為了jne
    fclose(fp_out);

這里 0x203f = 0x0040203F – 0x00400000

(4).讓程序自動(dòng)彈出正確的密碼
頭像被屏蔽
2#
帶風(fēng)去看雪 發(fā)表于 2008-12-16 12:03:32 | 只看該作者 來(lái)自 中國河北邢臺
提示: 作者被禁止或刪除 內容自動(dòng)屏蔽
3#
ぁゼ=ㄞ 發(fā)表于 2009-5-1 11:48:20 | 只看該作者 來(lái)自 中國北京
看不懂。。。!
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規則

快速回復 返回頂部 返回列表
招远市| 行唐县| 防城港市| 开封市| 马公市| 含山县| 莲花县| 攀枝花市| 峨眉山市| 三穗县| 平果县| 黄石市| 蚌埠市| 泽州县| 龙里县| 杭州市| 咸阳市| 天长市| 靖远县| 丹巴县| 收藏| 忻城县| 浦江县| 全州县| 水城县| 林芝县| 清镇市| 马山县| 石城县| 霞浦县| 民勤县| 祁东县| 玉田县| 武汉市| 江孜县| 新民市| 南昌县| 湖南省| 临颍县| 延寿县| 五家渠市|