史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 程式語言討論區
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2006-01-19, 03:40 PM   #1
mini
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:97 | 在線時長:9858小時 | 升級還需:138小時級別:97 | 在線時長:9858小時 | 升級還需:138小時級別:97 | 在線時長:9858小時 | 升級還需:138小時級別:97 | 在線時長:9858小時 | 升級還需:138小時級別:97 | 在線時長:9858小時 | 升級還需:138小時級別:97 | 在線時長:9858小時 | 升級還需:138小時級別:97 | 在線時長:9858小時 | 升級還需:138小時
註冊日期: 2002-12-07
文章: 13341
精華: 0
現金: 26444 金幣
資產: 3024304 金幣
預設 密碼輸入破解教學

因為放假的關係
所以最近都沒有人提問題的說... (好無聊在yahoo混也只能一天回8則)
因此
這裡來一篇最簡單的
密碼輸入破解教學

使用的工具有:
. OllyDbg v1.10、
. 自己用 C++寫的一個 密碼Pass判斷程式、
. Windows XP小算盤,請切換到工程模式、
. Dev-C++

C++程式如下
PHP 語法:
#include <cstdlib>
#include <stdio.h>
#include <conio.h>

using namespace std;

int main(int argcchar *argv[])
{
unsigned int c1c2;

do {
c2=0;
system("cls");            //清除畫面

for(int i=i<i++){    //做 5碼密碼的判斷
    
while(!kbhit());    //直到 鍵盤有按下之動作才往下
    
c1 getch();        //繼上∼當按下後讀入KeyCode值放到 c1變數中
    
if(c1>=48 && c1<=57){    //c1限制在 "0"~"9"
        
c1=c1-48;    //將字元 轉成 數值 "0"的ASCII碼是 48,所以轉成數值是減 48
        
c2=c2*10+c1;    //用c2做堆疊暫存
        
printf("*");    //印出 "*"號
    
}
}
}while(
c2!=25518);        //密碼是 25518,不符合則重新輸入

printf("\nPass word is %d\n",c2);

    
system("PAUSE");
    return 
EXIT_SUCCESS;

開始實做:
.先將上述C++編譯成 .exe檔
.接著開啟 OllyDbg(以下用OD簡稱OllyDbg) 將 .exe檔拖進去
在此先做簡單的 OD介紹
可以看到一些 OD所分析出的 迴圈 結構
(如:圖一 之 綠色框框 皆是)
好∼接著不多說
我們按下播放鍵(也就是執行鍵或 鍵盤F9)執行一次
如預料中(程式設計成)
你可鍵入5個數字鍵密碼
不是 password就會清除畫面要求重新輸入

此時我們再鍵入一次 4個數字鍵的密碼
回到 OD 按下暫停鍵(或著 鍵盤F12)

.接著按住 F8或 F7 來步進執行
(兩著差別在 F8:反光條所指的指令到此已執行完成,F7:則是反光條所指的指令 還未執行)
可以看到程式一直在執行並跳來跳去
其中可發現有一個指令為 RETN
這是一個 "返回" 的動作
通常表示離開 副程式
所以我們就一直押著 F8 直到沒有出現 RETN 為止
(有一定的可能性 我們會碰到程式始終有 RETN 的情形,端看程式設計者的寫法而定
但在此我們不會碰到,所以不已討論例外情形)

此時會發現程式一直在一個圈子裡打鑽
判斷這很有可能是因為我們未完成程式所應達成的要求

比如 需輸入5個字但我們只輸入4個字,
還有一個可能就是 鍵盤等待輸入中(一般輸入密碼的裝置都是鍵盤)

在此教學實例中是在 以下四行中打鑽
語法:
004012DA  E8 51050000    CALL <JMP.&msvcrt._kbhit>             ; [_kbhit
004012DF  85C0           TEST EAX,EAX
004012E1  75 02          JNZ SHORT main.004012E5
004012E3  EB F5          JMP SHORT main.004012DA
要跳脫這個迴圈就表示會執行到下一行
語法:
004012E5  E8 36050000    CALL <JMP.&msvcrt._getch>              ; |[_getch
所以我們在這一行設置程式中斷點 (請對這一行按 F2)

.接著按播放鍵繼續完成執行動作
也就是完成輸入 5個數字鍵密碼
如之前所猜測的一般:
程式跑到我們設的中斷點而自行 "暫停"
此時我們就改以按 F8
步進執行之

.一直執行下發現又回到剛剛的小迴圈了
此時看一下程式畫面果然密碼錯誤被清空了
所以我們需要放棄剛剛的中斷點 (對著該行再按一次 F2)

在此之前
先同上執行一次直到程式被中斷
此時取消剛剛的中斷點

.接著以一次按一下 F8方式
慢慢的看程式是如何回到 "小迴圈"的
經一行行的觀察下
主要是因為
語法:
0040132D  EB 8B          JMP SHORT main.004012BA
這一行而跳回上面的程式開頭
進而程式從上而下依序
一步步的跑回 "小迴圈"中
那為何會執行到這行呢?

JMP 是無條件跳躍,所以我們往上看到周遭幾行
發現一個比較指令 (及條件跳躍指令)
語法:
00401324  817D F8 AE6300 CMP DWORD PTR SS:[EBP-8],63AE
0040132B  74 02          JE SHORT main.0040132F
翻譯過來就是
記憶體位址 SS:[EBP-8]內的內容 與 63AE 比較
如果 等於
則跳到 main程式之 0040132F這個記憶體位址
執行
那我們就看到該位址後的程式段落
語法:
0040132F  8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]             ; ||
00401332  894424 04      MOV DWORD PTR SS:[ESP+4],EAX             ; ||
00401336  C70424 0630400 MOV DWORD PTR SS:[ESP],main.00403006     ;  ASCII 0A,"Pass word "
0040133D  E8 6E050000    CALL <JMP.&msvcrt.printf>
00401342  C70424 1830400 MOV DWORD PTR SS:[ESP],main.00403018     ;  ASCII "PAUSE"
00401349  E8 72050000    CALL <JMP.&msvcrt.system>
0040134E  B8 00000000    MOV EAX,0
00401353  C9             LEAVE
00401354  C3             RETN
發現註解行有 "Pass word " 等字串顯示
又有
00401353 C9 LEAVE

00401354 C3 RETN
程式結束返回等用語 (不一定會有LEAVE啦)
所以大膽假設到此
密碼判斷Pass通過而結束程式

.所以會過頭來
CMP DWORD PTR SS:[EBP-8],63AE
就是在比對密碼
在此設置中斷點 (並清除之前的中斷點)
按下播放鍵
輸入 12345 之密碼
接著程式如我們所預料的在此中斷暫停了
借由 OD所標示
(即為圖一之白框註解所在地)
SS:[EBP-8] 內容是 00003039
恰巧是我們剛才輸入的值
(請用Windows XP小算盤輸入 12345 再按 "十六進位"即可得到 3039)
所以 63AE 就是密碼嘍
用小算盤翻成十進位是 25518

.當然最後就驗證看看 (為了順暢可以把中斷點清除掉)
按播放鍵
輸入 25518 ∼的確成功放行了

到此是一個簡單的密碼組合語言追蹤實驗
雖然講了很多
其實做過一次會發現一點都不難

當然在實驗外
想試著實作破解
並不是都會這麼順利
但這裡方法會了
有了觀念就只剩靈巧應用的問題了

因為是自己破自己的程式
所以不涉及市售軟體破解的衍伸問題
所以也不接受任何 軟體破解 的請求與討論
只針對這個例子作答覆
希望各位會喜歡

~END~

附件: (圖一 + main.exe + main.cpp)
http://d.turboupload.com/d/290521/pa...ugtest.7z.html
至於 OllyDbg v1.10 請至 WWW(google) 或 emule 等搜得 (或使用其他 除錯軟體)
mini 目前線上  
送花文章: 2013, 收花文章: 8001 篇, 收花: 26805 次
回覆時引用此帖
向 mini 送花的會員:
chungwen (2007-08-17)
感謝您發表一篇好文章
舊 2006-01-27, 04:38 PM   #2 (permalink)
註冊會員
榮譽勳章
UID - 79625
在線等級: 級別:13 | 在線時長:235小時 | 升級還需:17小時級別:13 | 在線時長:235小時 | 升級還需:17小時級別:13 | 在線時長:235小時 | 升級還需:17小時
註冊日期: 2003-06-21
VIP期限: 2009-10
文章: 60
精華: 0
現金: 5588 金幣
資產: 10588 金幣
預設

謝謝大大的教學
獲益良多
cocoking 目前離線  
送花文章: 74, 收花文章: 1 篇, 收花: 1 次
回覆時引用此帖
發文 回覆



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 08:36 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1