我的第一篇破文,獻給看學學院的!^_^高手免進! (10千字)

看雪資料發表於2015-11-15

標 題:我的第一篇破文,獻給看學學院的!^_^高手免進! (10千字)

發信人:bbbsl

時 間:2002-6-20 15:56:04

詳細資訊:


Lemmy v4.4 註冊碼分析


作者:bbbsl

軟體介紹:這是一款在windows下模擬unix|linux下vi的一個工具,我們系沒有用unix|linux做實驗的條件,所以讓我們
用這玩意體驗一下,超級噁心!!!沒發現用它有什麼有意義的地方,但居然還有時間限制,所以,就拿它做個crackme吧!

平臺:    windows 2000 advanced server

所用工具:softice for nt 4.05,calc(window自帶計算器)



//執行lemmyreg後下斷點bpx getwindowtexta後,按F10一直走到這一段程式碼(當然,前提是你得先輸入了你的ID和SN^_^):

:0040178F 8B17                    mov edx, dword ptr [edi]
:00401791 50                      push eax            //你輸入的假註冊碼
:00401792 52                      push edx            //你的ID
:00401793 8D4E68                  lea ecx, dword ptr [esi+68]    //我一直不明白這個數是怎麼來的,程式中用它加14得到一個地址,用這個地址的數做運算,高手給指點指點吧
:00401796 E865020000              call 00401A00            //關鍵!!!
:0040179B 85C0                    test eax, eax            //正確否?
:0040179D 7457                    je 004017F6            //正確則跳過!
:0040179F 6A00                    push 00000000
:004017A1 6A30                    push 00000030

* Possible StringData Ref from Data Obj ->"Check the values supplied"
                                  |
:004017A3 68B0E04200              push 0042E0B0
:004017A8 E8FFD60100              call 0041EEAC

//下面是401A00的程式碼:

:00401A00 53                      push ebx
:00401A01 55                      push ebp
:00401A02 56                      push esi
:00401A03 57                      push edi
:00401A04 8BF9                    mov edi, ecx
:00401A06 6A08                    push 00000008
:00401A08 83CDFF                  or ebp, FFFFFFFF
:00401A0B E816650100              call 00417F26
:00401A10 8B74241C                mov esi, dword ptr [esp+1C]
:00401A14 83C404                  add esp, 00000004
:00401A17 8BD8                    mov ebx, eax
:00401A19 33D2                    xor edx, edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401A71(C)
|
:00401A1B 0FBE06                  movsx eax, byte ptr [esi]        //esi中是你是輸入的假註冊碼
:00401A1E 0FBE4E01                movsx ecx, byte ptr [esi+01]        //兩位兩位處理
:00401A22 83F830                  cmp eax, 00000030            //是數字否?
:00401A25 7C0A                    jl 00401A31                //如果小於‘0’則非數字..
:00401A27 83F839                  cmp eax, 00000039            
:00401A2A 7F05                    jg 00401A31                //如果大於‘9’則非數字..
:00401A2C 83E830                  sub eax, 00000030            //轉成16進位制中相應數字
:00401A2F EB11                    jmp 00401A42                //下一位判斷

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401A25(C), :00401A2A(C)
|
:00401A31 83F841                  cmp eax, 00000041            //不是數字,那是不是大寫字母A-F中的一個呢?
:00401A34 7C0A                    jl 00401A40                //小則清eax
:00401A36 83F846                  cmp eax, 00000046            //大也清eax
:00401A39 7F05                    jg 00401A40                
:00401A3B 83E837                  sub eax, 00000037            //如果是則轉成16進位制中相應字元
:00401A3E EB02                    jmp 00401A42

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401A34(C), :00401A39(C)
|
:00401A40 33C0                    xor eax, eax                

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401A2F(U), :00401A3E(U)
|
:00401A42 83F930                  cmp ecx, 00000030            //第二位判斷,以下均同第一位
:00401A45 7C0A                    jl 00401A51
:00401A47 83F939                  cmp ecx, 00000039
:00401A4A 7F05                    jg 00401A51
:00401A4C 83E930                  sub ecx, 00000030
:00401A4F EB11                    jmp 00401A62

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401A45(C), :00401A4A(C)
|
:00401A51 83F941                  cmp ecx, 00000041
:00401A54 7C0A                    jl 00401A60
:00401A56 83F946                  cmp ecx, 00000046
:00401A59 7F05                    jg 00401A60
:00401A5B 83E937                  sub ecx, 00000037
:00401A5E EB02                    jmp 00401A62

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401A54(C), :00401A59(C)
|
:00401A60 33C9                    xor ecx, ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401A4F(U), :00401A5E(U)
|
:00401A62 C0E004                  shl al, 04                //合併剛剛處理過的兩位假註冊碼
:00401A65 02C1                    add al, cl                //即你輸入的東西,假設為‘77’則變為16進位制數77放入al中
:00401A67 83C602                  add esi, 00000002            
:00401A6A 880413                  mov byte ptr [ebx+edx], al        //存入ebx所指向空間中
:00401A6D 42                      inc edx                //edx為計數器
:00401A6E 83FA08                  cmp edx, 00000008            //迴圈是否結束
:00401A71 7CA8                    jl 00401A1B                //不結束繼續。。
:00401A73 53                      push ebx                //儲存轉換過的東東所在地
:00401A74 8BCF                    mov ecx, edi                //就是剛才那個數
:00401A76 E8E5F5FFFF              call 00401060                //進一步處理,關鍵!!!
:00401A7B 8B542414                mov edx, dword ptr [esp+14]
:00401A7F 83C9FF                  or ecx, FFFFFFFF            //再往下是判斷你的ID和用註冊碼算出來的ID是否一致的一個CALL
:00401A82 8BFA                    mov edi, edx
:00401A84 33C0                    xor eax, eax
:00401A86 F2                      repnz
:00401A87 AE                      scasb
:00401A88 F7D1                    not ecx
:00401A8A 49                      dec ecx
:00401A8B 83F908                  cmp ecx, 00000008            //判斷名字的位數是否大於8
:00401A8E 7607                    jbe 00401A97                //是就繼續不是截斷
:00401A90 B908000000              mov ecx, 00000008
:00401A95 EB0C                    jmp 00401AA3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401A8E(C)
|
:00401A97 8BFA                    mov edi, edx
:00401A99 83C9FF                  or ecx, FFFFFFFF
:00401A9C 33C0                    xor eax, eax
:00401A9E F2                      repnz
:00401A9F AE                      scasb
:00401AA0 F7D1                    not ecx
:00401AA2 49                      dec ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401A95(U)
|
:00401AA3 85C9                    test ecx, ecx                //位數是否為零
:00401AA5 7E11                    jle 00401AB8
:00401AA7 51                      push ecx                //這是位數
:00401AA8 53                      push ebx                //這是用註冊碼推出來的ID
:00401AA9 52                      push edx                //這是你輸入的ID
:00401AAA E8515F0000              call 00407A00                //是否相同?
:00401AAF 83C40C                  add esp, 0000000C            
:00401AB2 85C0                    test eax, eax                
:00401AB4 7502                    jne 00401AB8                //如相同清ebp不然則相反,從而導致最後返回的eax值不同
:00401AB6 33ED                    xor ebp, ebp

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401AA5(C), :00401AB4(C)
|
:00401AB8 53                      push ebx
:00401AB9 E8A4640100              call 00417F62                
:00401ABE 83C404                  add esp, 00000004
:00401AC1 8BC5                    mov eax, ebp                //eax<==ebp
:00401AC3 5F                      pop edi
:00401AC4 5E                      pop esi
:00401AC5 5D                      pop ebp
:00401AC6 5B                      pop ebx
:00401AC7 C20800                  ret 0008


//下面是註冊碼的判斷過程:

:00401060 83EC08                  sub esp, 00000008
:00401063 8B54240C                mov edx, dword ptr [esp+0C]
:00401067 53                      push ebx
:00401068 56                      push esi
:00401069 57                      push edi
:0040106A 8A4204                  mov al, byte ptr [edx+04]            //edx中是剛才處理過的假註冊碼
:0040106D 8BF9                    mov edi, ecx                    //同樣兩位兩位處理
:0040106F 8A4A02                  mov cl, byte ptr [edx+02]            
:00401072 8844240C                mov byte ptr [esp+0C], al            //第五位放入第0位
:00401076 8A4207                  mov al, byte ptr [edx+07]            
:00401079 884C240D                mov byte ptr [esp+0D], cl            //第三位放入第1位
:0040107D 8A0A                    mov cl, byte ptr [edx]            
:0040107F 8844240E                mov byte ptr [esp+0E], al            //第八位放入第2位
:00401083 8A4206                  mov al, byte ptr [edx+06]            
:00401086 884C240F                mov byte ptr [esp+0F], cl            //第零位放入第3位
:0040108A 8A4A03                  mov cl, byte ptr [edx+03]            
:0040108D 88442410                mov byte ptr [esp+10], al            //第七位放入第4位
:00401091 8A4205                  mov al, byte ptr [edx+05]            
:00401094 884C2411                mov byte ptr [esp+11], cl            //第四位放入第5位
:00401098 8A4A01                  mov cl, byte ptr [edx+01]            
:0040109B 88442412                mov byte ptr [esp+12], al            //第六位放入第6位
:0040109F 8D74240C                lea esi, dword ptr [esp+0C]            //傳地址給esi
:004010A3 33C0                    xor eax, eax                    
:004010A5 884C2413                mov byte ptr [esp+13], cl            //第二位放入第7位
:004010A9 2BF2                    sub esi, edx                    //用edx作計數器

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004010BB(C)
|
:004010AB 8A4C3814                mov cl, byte ptr [eax+edi+14]            //開始將換過位的假註冊碼和edi+14中的數逐個異或
:004010AF 8A1C16                  mov bl, byte ptr [esi+edx]            //edi+14中的數為312ACF04C76BF4DA
:004010B2 32CB                    xor cl, bl
:004010B4 40                      inc eax
:004010B5 880A                    mov byte ptr [edx], cl            //異或出來的東東儲存
:004010B7 42                      inc edx                    
:004010B8 83F808                  cmp eax, 00000008                //是否已結束
:004010BB 7CEE                    jl 004010AB                    //否則繼續
:004010BD 5F                      pop edi
:004010BE 5E                      pop esi
:004010BF 5B                      pop ebx
:004010C0 83C408                  add esp, 00000008
:004010C3 C20400                  ret 0004


分析:
    其實已經很明顯了,這是一個用註冊碼推ID的軟體。它將我們輸入的註冊碼轉成16進位制數的形式,然後進行換位,這一步得到的東東再和
16進位制數31 2A CF 04 C7 6B F4 DA逐位異或,然後這個東東和你的ID比較,相同說明是正確的,否則就讓你檢查。
我們可以用計算器來推一個你自己的註冊碼,例如:我的ID為bbbsl,16進製為62 62 62 73 6c,假設註冊碼為陣列a[8],則經它折騰之後實際上陣列變為b[8]={
a[5],a[3],a[8],a[0],a[7],a[4],a[6],a[2]},若要讓推出來的ID前五位同bbbsl相同,就必須是陣列b前五位和31 2a cf 04 c7相異或後得到的東東==62 62 62
73 6c,so拿起計算器算算吧,62^31=53,62^2a=48,62^cf=AD,73^04=77,6c^c7=AB,即a[5]=53,a[3]=48,a[8]=AD,a[0]=77,a[7]=AB,其餘各位隨意,所以我的註冊碼為
id: bbbsl
sn: 770048005300ABAD

相關文章