首页
社区
课程
招聘
[原创]有趣的逻辑计算(适合新手)
发表于: 2006-9-3 17:18 8227

[原创]有趣的逻辑计算(适合新手)

2006-9-3 17:18
8227

【文章标题】: 有趣的逻辑
【文章作者】: coldpine
【软件名称】: m&m's crkme.exe
【软件大小】: 127kb
【下载地址】:http://www.crackmes.de/users/haiklr/mms_crackme/
【加壳方式】: 无
【编写语言】: masm
【使用工具】: od & xp计算器
【操作平台】: win XP
【作者声明】:十分有趣的逻辑计算,看似无法逆向求解,仔细想想,又能找到
      
用peid查壳,无壳,masm语言,OD加载,查到取字符
串函数GetDlgItemTextA,对它下断点,输入heminrui
点击eatme很容易来到这里:

00401004  |.  6A 32         PUSH    32                               ; /Count = 32 (50.)
00401006  |.  68 CC304000   PUSH    m&m's_cr.004030CC                ; |Buffer = m&m's_cr.004030CC
0040100B  |.  68 D0070000   PUSH    7D0                              ; |ControlID = 7D0 (2000.)
00401010  |.  FF75 08       PUSH    DWORD PTR SS:[EBP+8]             ; |hWnd
00401013  |.  E8 B2070000   CALL    <JMP.&user32.GetDlgItemTextA>    ; \GetDlgItemTextA   
//取字符串函数
00401018  |.  8D05 CC304000 LEA     EAX, DWORD PTR DS:[4030CC]
//字符串地址送到eax中
0040101E  |.  33DB          XOR     EBX, EBX
00401020  |.  33C9          XOR     ECX, ECX             //腾出两个位置
00401022  |>  8A18          /MOV     BL, BYTE PTR DS:[EAX]     
//取字符串每个字母的ascii码值存在al中
00401024  |.  80FB 00       |CMP     BL, 0             
00401027  |.  74 08         |JE      SHORT m&m's_cr.00401031    
00401029  |.  C1C3 08       |ROL     EBX, 8             //将每个ascii码值循环右移八位等于移到了ah中
0040102C  |.  03CB          |ADD     ECX, EBX            //累加右移之后的值
0040102E  |.  40            |INC     EAX               //取第二个字符
0040102F  |.^ EB F1         \JMP     SHORT m&m's_cr.00401022      //循环
00401031  |>  51            PUSH    ECX                              ; /<%X> 
00401032  |.  68 0E304000   PUSH    m&m's_cr.0040300E                ; |%x
00401037  |.  68 CC304000   PUSH    m&m's_cr.004030CC                ; |s = m&m's_cr.004030CC
0040103C  |.  E8 77070000   CALL    <JMP.&user32.wsprintfA>          ; \wsprintfA
//格式化输出函数
00401041  |.  83C4 0C       ADD     ESP, 0C
00401044  |.  0FB605 CF3040>MOVZX   EAX, BYTE PTR DS:[4030CF]      //取上述结果第四位字符的ascii码值计算eax=x,ebx=y
0040104B  |.  05 A4000000   ADD     EAX, 0A4               //x=x+4
00401050  |.  8BD8          MOV     EBX, EAX                             //y=x
00401052  |.  C1E3 03       SHL     EBX, 3                               //将y左移三位
00401055  |.  03D8          ADD     EBX, EAX              //y=左移三位的y+x
00401057  |.  C1E3 02       SHL     EBX, 2                                //y再左移二位
0040105A  |.  03D8          ADD     EBX, EAX               //y=左移两位y+x
0040105C  |.  0FCB          BSWAP EBX         
   //交换32位寄存器里字节的顺序
0040105E  |.  81FB 00001EC9 CMP     EBX, C91E0000      
   //和这个固定的数字比较,反向思考求得第四位结果必须
00401064      0F85 D9000000 JNZ     m&m's_cr.00401143
0040106A  |.  803D D3304000>CMP     BYTE PTR DS:[4030D3], 46         //比较最后一位,是不是F,不是的话,就跳向失败
00401071      0F85 CC000000 JNZ     m&m's_cr.00401143      
00401077  |.  0FB605 D13040>MOVZX   EAX, BYTE PTR DS:[4030D1]    //比较第六位,将第六位的ascii码值和66异或
0040107E  |.  83F0 66       XOR     EAX, 66             //左移两位加eax
00401081  |.  8BD8          MOV     EBX, EAX           
00401083  |.  C1E3 02       SHL     EBX, 2              
00401086  |.  03D8          ADD     EBX, EAX         
00401088  |.  C1CB 07       ROR     EBX, 7            
 //循环右移七位加eax
0040108B  |.  81FB 0300003E CMP     EBX, 3E000003                
//比较,综合推之,应该是数字5的ascii码值     
00401091      0F85 AC000000 JNZ     m&m's_cr.00401143
00401097  |.  803D CC304000>CMP     BYTE PTR DS:[4030CC], 38    
//直接比较第一位是不是数字8
0040109E      0F85 9F000000 JNZ     m&m's_cr.00401143
004010A4  |.  803D D0304000>CMP     BYTE PTR DS:[4030D0], 46      
//直接比较第五位是不是F
004010AB      0F85 92000000 JNZ     m&m's_cr.00401143
004010B1  |.  0FB605 CD3040>MOVZX   EAX, BYTE PTR DS:[4030CD]      
//比较第二位是不是数字0
004010B8  |.  69C0 98000000 IMUL    EAX, EAX, 98
004010BE  |.  8BD8          MOV     EBX, EAX
004010C0  |.  C1EB 08       SHR     EBX, 8
004010C3  |.  33D8          XOR     EBX, EAX
004010C5  |.  81FB 9C1C0000 CMP     EBX, 1C9C
004010CB      75 76         JNZ     SHORT m&m's_cr.00401143
004010CD  |.  803D CE304000>CMP     BYTE PTR DS:[4030CE], 44            //比较第三位是不是D
004010D4      75 6D         JNZ     SHORT m&m's_cr.00401143
004010D6  |.  0FB605 D23040>MOVZX   EAX, BYTE PTR DS:[4030D2]          //比较第七位是不是5
004010DD  |.  C1C0 07       ROL     EAX, 7
004010E0  |.  F7D0          NOT     EAX
004010E2  |.  3D 7FE5FFFF   CMP     EAX, -1A81
004010E7      75 5A         JNZ     SHORT m&m's_cr.00401143
004010E9  |.  8D05 00304000 LEA     EAX, DWORD PTR DS:[403000]     
//后面都是计算要输出的字符串
004010EF  |.  B3 4D         MOV     BL, 4D
004010F1  |.  8818          MOV     BYTE PTR DS:[EAX], BL
004010F3  |.  B3 26         MOV     BL, 26
004010F5  |.  FEC0          INC     AL
004010F7  |.  8818          MOV     BYTE PTR DS:[EAX], BL
004010F9  |.  80C3 27       ADD     BL, 27
004010FC  |.  FEC0          INC     AL
004010FE  |.  8818          MOV     BYTE PTR DS:[EAX], BL
00401100  |.  B3 27         MOV     BL, 27
00401102  |.  FEC0          INC     AL
00401104  |.  8818          MOV     BYTE PTR DS:[EAX], BL
00401106  |.  B3 73         MOV     BL, 73
00401108  |.  FEC0          INC     AL
0040110A  |.  8818          MOV     BYTE PTR DS:[EAX], BL
0040110C  |.  80EB 53       SUB     BL, 53
0040110F  |.  FEC0          INC     AL
00401111  |.  8818          MOV     BYTE PTR DS:[EAX], BL
00401113  |.  B3 6F         MOV     BL, 6F
00401115  |.  FEC0          INC     AL
00401117  |.  8818          MOV     BYTE PTR DS:[EAX], BL
00401119  |.  80C3 08       ADD     BL, 8
0040111C  |.  FEC0          INC     AL
0040111E  |.  8818          MOV     BYTE PTR DS:[EAX], BL
00401120  |.  80EB 09       SUB     BL, 9
00401123  |.  FEC0          INC     AL
00401125  |.  8818          MOV     BYTE PTR DS:[EAX], BL
00401127  |.  B3 65         MOV     BL, 65
00401129  |.  FEC0          INC     AL
0040112B  |.  8818          MOV     BYTE PTR DS:[EAX], BL
0040112D  |.  80EB 01       SUB     BL, 1
00401130  |.  FEC0          INC     AL
00401132  |.  8818          MOV     BYTE PTR DS:[EAX], BL
00401134  |.  B3 20         MOV     BL, 20
00401136  |.  FEC0          INC     AL
00401138  |.  8818          MOV     BYTE PTR DS:[EAX], BL
0040113A  |.  80C3 01       ADD     BL, 1
0040113D  |.  FEC0          INC     AL
0040113F  |.  8818          MOV     BYTE PTR DS:[EAX], BL
00401141  |.  EB 4D         JMP     SHORT m&m's_cr.00401190
00401143  |>  8D05 00304000 LEA     EAX, DWORD PTR DS:[403000]
00401149  |.  B3 54         MOV     BL, 54
0040114B  |.  8818          MOV     BYTE PTR DS:[EAX], BL
0040114D  |.  B3 72         MOV     BL, 72
0040114F  |.  FEC0          INC     AL
00401151  |.  8818          MOV     BYTE PTR DS:[EAX], BL
00401153  |.  80C3 07       ADD     BL, 7
00401156  |.  FEC0          INC     AL
00401158  |.  8818          MOV     BYTE PTR DS:[EAX], BL
0040115A  |.  B3 20         MOV     BL, 20
0040115C  |.  FEC0          INC     AL
0040115E  |.  8818          MOV     BYTE PTR DS:[EAX], BL
00401160  |.  B3 61         MOV     BL, 61
00401162  |.  FEC0          INC     AL
00401164  |.  8818          MOV     BYTE PTR DS:[EAX], BL
00401166  |.  80C3 06       ADD     BL, 6
00401169  |.  FEC0          INC     AL
0040116B  |.  8818          MOV     BYTE PTR DS:[EAX], BL
0040116D  |.  B3 61         MOV     BL, 61
0040116F  |.  FEC0          INC     AL
00401171  |.  8818          MOV     BYTE PTR DS:[EAX], BL
00401173  |.  80C3 08       ADD     BL, 8
00401176  |.  FEC0          INC     AL
00401178  |.  8818          MOV     BYTE PTR DS:[EAX], BL
0040117A  |.  80C3 05       ADD     BL, 5
0040117D  |.  FEC0          INC     AL
0040117F  |.  8818          MOV     BYTE PTR DS:[EAX], BL
00401181  |.  B3 20         MOV     BL, 20
00401183  |.  FEC0          INC     AL
00401185  |.  8818          MOV     BYTE PTR DS:[EAX], BL
00401187  |.  80C3 01       ADD     BL, 1
0040118A  |.  FEC0          INC     AL
0040118C  |.  8818          MOV     BYTE PTR DS:[EAX], BL
0040118E  |.  EB 00         JMP     SHORT m&m's_cr.00401190
00401190  |>  68 00304000   PUSH    m&m's_cr.00403000                ; /Text = ""
00401195  |.  68 D0070000   PUSH    7D0                              ; |ControlID = 7D0 (2000.)
0040119A  |.  FF75 08       PUSH    DWORD PTR SS:[EBP+8]             ; |hWnd
0040119D  |.  E8 3A060000   CALL    <JMP.&user32.SetDlgItemTextA>    ; \SetDlgItemTextA
004011A2  |.  61            POPAD
004011A3  |.  C9            LEAVE
004011A4  \.  C2 0400       RET     4

算法总结:思路简单,适合新手
一,通过对输入的字符的计算,计算一个序列号
二,然后将计算出来的序列号和真序列号逐位比较
  真序列号是80D1F55F
心得:在逻辑计算的过程中,像本文中的计算第二,四,六,七位的序列号的时候,
   开始感觉无处下手,因为反向推导的时候,变量太多,感觉不可逆,
   后来发现利用小学学习的一种加法填空计算的方法,对位计算,恰好可以算出.
   也许我说的不够清楚,但是对于新手推荐去跟踪看看.
   至于上面对输入字符的计算,由于下面的逻辑弄昏了头,懒得去想了,
   如果有人能弄清楚,怎么反向求出输入的字符串,请你一定要告诉我,多谢了.


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (7)
雪    币: 256
活跃值: (10)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
2
不好意思,应该是这样的图,



请斑竹帮我删除楼上文章下的那个图
多谢了!!!!!
2006-9-3 17:32
0
雪    币: 433
活跃值: (176)
能力值: ( LV13,RANK:1250 )
在线值:
发帖
回帖
粉丝
3
汇编啊,汇编写的啊……
又抢偶的饭碗

不过开学了,偶的重心也要转移到发表论文上去了,破解这只铜饭碗交给你们也无所谓,发论文才是真正的金饭碗
2006-9-3 18:26
0
雪    币: 256
活跃值: (10)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
4
呵呵,哪是主,哪是次要分清楚的啊!!
等写好了论文,找到了好工作,再一起来
研究这些东东吧!:)
2006-9-4 06:39
0
雪    币: 214
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你说 上面的1EC9这个值反算的?

(((A SHL 3)+A) SHL 2) + A =1EC9
-------------------------------------------------
00401044  |.  0FB605 CF3040>MOVZX EAX,BYTE PTR DS:[4030CF]           ;  6
0040104B  |.  05 A4000000   ADD EAX,0A4   
00401050  |.  8BD8          MOV EBX,EAX
00401052  |.  C1E3 03       SHL EBX,3                            00401055  |.  03D8          ADD EBX,EAX                             00401057  |.  C1E3 02       SHL EBX,2                              0040105A  |.  03D8          ADD EBX,EAX                            0040105C  |.  0FCB          BSWAP EBX                               0040105E  |.  81FB 00001EC9 CMP EBX,C91E0000
----------------------------------------------------

我想后面的看都别看了.脑袋不好使了.
2006-9-4 16:21
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
很是郁闷,我是临时会员不能让我回复,只能自己建个帖子,希望coldpine不会见怪。。。
coldpine的帖子链接是http://bbs.pediy.com/showthread.php?threadid=31445

--------------------------------------------------------------------------------------------------------
00401000  /$  55            push    ebp                                     ;此处下断点
00401001  |.  8BEC          mov     ebp, esp
00401003  |.  60            pushad
00401004  |.  6A 32         push    32                               ; /Count = 32 (50.)
00401006  |.  68 CC304000   push    004030CC                         ; |Buffer = coldpine.004030CC
0040100B  |.  68 D0070000   push    7D0                              ; |ControlID = 7D0 (2000.)
00401010  |.  FF75 08       push    dword ptr [ebp+8]                ; |hWnd
00401013  |.  E8 B2070000   call    <jmp.&user32.GetDlgItemTextA>    ; \GetDlgItemTextA
00401018  |.  8D05 CC304000 lea     eax, dword ptr [4030CC]
0040101E  |.  33DB          xor     ebx, ebx
00401020  |.  33C9          xor     ecx, ecx
00401022  |>  8A18          /mov     bl, byte ptr [eax]                     ;关键算法,在后面分析
00401024  |.  80FB 00       |cmp     bl, 0
00401027  |.  74 08         |je      short 00401031
00401029  |.  C1C3 08       |rol     ebx, 8
0040102C  |.  03CB          |add     ecx, ebx
0040102E  |.  40            |inc     eax
0040102F  |.^ EB F1         \jmp     short 00401022
00401031  |>  51            push    ecx                              ; /<%X>
00401032  |.  68 0E304000   push    0040300E                         ; |Format = "%X"
00401037  |.  68 CC304000   push    004030CC                         ; |s = coldpine.004030CC
0040103C  |.  E8 77070000   call    <jmp.&user32.wsprintfA>          ; \wsprintfA
00401041  |.  83C4 0C       add     esp, 0C
00401044  |.  0FB605 CF3040>movzx   eax, byte ptr [4030CF]           ;  [4030cf]为31,不是则跳走
0040104B  |.  05 A4000000   add     eax, 0A4
00401050  |.  8BD8          mov     ebx, eax
00401052  |.  C1E3 03       shl     ebx, 3
00401055  |.  03D8          add     ebx, eax
00401057  |.  C1E3 02       shl     ebx, 2
0040105A  |.  03D8          add     ebx, eax
0040105C  |.  0FCB          bswap   ebx
0040105E  |.  81FB 00001EC9 cmp     ebx, C91E0000
00401064  |.  0F85 D9000000 jnz     00401143
0040106A  |.  803D D3304000>cmp     byte ptr [4030D3], 46            ;  [4030d3]为46,不是则跳走
00401071  |.  0F85 CC000000 jnz     00401143
00401077  |.  0FB605 D13040>movzx   eax, byte ptr [4030D1]           ;  [4030d1]为35,不是则跳走
0040107E  |.  83F0 66       xor     eax, 66
00401081  |.  8BD8          mov     ebx, eax
00401083  |.  C1E3 02       shl     ebx, 2
00401086  |.  03D8          add     ebx, eax
00401088  |.  C1CB 07       ror     ebx, 7
0040108B  |.  81FB 0300003E cmp     ebx, 3E000003
00401091  |.  0F85 AC000000 jnz     00401143
00401097  |.  803D CC304000>cmp     byte ptr [4030CC], 38            ;  [4030cc]为38,不是则跳走
0040109E  |.  0F85 9F000000 jnz     00401143
004010A4  |.  803D D0304000>cmp     byte ptr [4030D0], 46            ;  [4030d0]为46,不是则跳走
004010AB  |.  0F85 92000000 jnz     00401143
004010B1  |.  0FB605 CD3040>movzx   eax, byte ptr [4030CD]           ;  [4030cd]为30,不是则跳走
004010B8  |.  69C0 98000000 imul    eax, eax, 98
004010BE  |.  8BD8          mov     ebx, eax
004010C0  |.  C1EB 08       shr     ebx, 8
004010C3  |.  33D8          xor     ebx, eax
004010C5  |.  81FB 9C1C0000 cmp     ebx, 1C9C
004010CB  |.  75 76         jnz     short 00401143
004010CD  |.  803D CE304000>cmp     byte ptr [4030CE], 44            ;  [4030ce]为44,不是则跳走
004010D4  |.  75 6D         jnz     short 00401143
004010D6  |.  0FB605 D23040>movzx   eax, byte ptr [4030D2]           ;  [4030d2]为35,不是则跳走
004010DD  |.  C1C0 07       rol     eax, 7
004010E0  |.  F7D0          not     eax
004010E2  |.  3D 7FE5FFFF   cmp     eax, -1A81
004010E7  |.  75 5A         jnz     short 00401143

-------------------------------------------------------------------------------------------------------
算法分析:
容易得到真序列号是80D1F55F,记为x1x2x3x4(其中x1代表一个字节80,x2代表D1)
如果我输入yaojd,对应ASCII码为79,61,6F,6A,64,记为a,  b,  c,  d,  e   
计算过程如下
          a0
+         ab0
+        abc0
+        bcda
+        cdeb
=        x1x2x3x4

即        a+b=5F
        a+b+c=80
        a+b+c+d=D1
        a+b+c+d+e=F5
后三位cde就确定了一定是21,51,24.由于a+b=5F,我们可以随意取值,不如令a=2F,b=30.
故abcde对应的ASCII码:2F,30,21,51,24.算出了结果/0!Q$
上传的附件:
2010-5-15 11:12
0
雪    币: 449
活跃值: (112)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
挖坑来了,给一组key    _!Q$
2011-7-11 21:28
0
雪    币: 100
活跃值: (90)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
虽然帖子很久了,还是要回一下。
python破解脚本
#coding:utf-8

from  string  import  *

def  rol8(val):
        least8  =  val  &  0xFF000000
        val  <<=  8
        val  |=  (least8>>24)
        return  val

def  getit(lastvalue=0,summary=0,laststr='',deep=1):
        if  deep  ==  8:
                return
        else:
                for  i  in  digits+ascii_lowercase:
                        tmp  =  rol8((lastvalue  &  0xFFFFFF00)  |  ord(i))  &  0xFFFFFFFF
                        tmpsummary  =  summary
                        tmpsummary  +=  tmp
                        tmpsummary  &=  0xFFFFFFFF
                        if  tmpsummary  ==  0x80D1F55F:
                                print(laststr+i)
                        else:
                                getit(tmp,tmpsummary,laststr+i,deep+1)

if  __name__=="__main__":
        getit()
        print("stop")

/0!Q$
0/!Q$
都是可以的
2017-11-19 22:37
0
游客
登录 | 注册 方可回帖
返回
//