首页
社区
课程
招聘
[原创]xiaojiam丢下的CrackMe简要分析
发表于: 2009-3-2 22:22 6168

[原创]xiaojiam丢下的CrackMe简要分析

2009-3-2 22:22
6168

  既然大家这么希望看到我的破文,我就出下丑吧 ,我是一菜鸟,若有不足或错误之处,希望大家批评指证,本人也将虚心接受。
    1、运行KGMe,发现已经有机器码了,要求我们输入CODE,随便输入"abcde",出现"please input your Number!的窗口,说明程序要求我们输入数字!
  2、PEID查壳,发现为Borland Delphi 6.0 - 7.0,DeDe载入!找到Register对应按钮起始位置为: 00467C30
    3、OD载入,CTR+G直接到00467C30处下断,F9运行,输入123456789,点击断下,开始分析!
    00467C6C  |.  8B45 FC       mov     eax, dword ptr [ebp-4]           ;  取假码
    00467C6F  |.  E8 6CB3F9FF   call    00402FE0                         ;  将假码转化为浮点数123456789.0
    00467C74  |.  DD5D F0       fstp    qword ptr [ebp-10]         ; 将假码保存在[EBP-10]中
    00467C77  |.  9B            wait
    00467C78  |.  837D E4 00    cmp     dword ptr [ebp-1C], 0
    00467C7C  |.  0F85 D0000000 jnz     00467D52
    00467C82  |.  8D55 E0       lea     edx, dword ptr [ebp-20]
    00467C85  |.  8B83 00030000 mov     eax, dword ptr [ebx+300]
  00467C8B  |.  E8 B0B0FCFF   call    00432D40
  00467C90  |.  8B45 E0       mov     eax, dword ptr [ebp-20]          ;  取机器码
  00467C93  |.  E8 F81AFAFF   call    00409790                         ;  将机器码转为浮点数
  00467C98  |.  83C4 F8       add     esp, -8
  00467C9B  |.  DD1C24        fstp    qword ptr [esp]
  00467C9E  |.  9B            wait
  00467C9F  |.  E8 D0FCFFFF   call    00467974                         ;  此处为机器码处理部分,F7进入
  
  进入后来到这里:
  
  00467974  /$  55            push    ebp
  00467975  |.  8BEC          mov     ebp, esp
  00467977  |.  83C4 DC       add     esp, -24
  0046797A  |.  33C0          xor     eax, eax
  0046797C  |.  8945 EC       mov     dword ptr [ebp-14], eax
  0046797F  |.  8945 E8       mov     dword ptr [ebp-18], eax
  00467982  |.  8945 DC       mov     dword ptr [ebp-24], eax
  
  前面是进行一些变量的初始化工作,继续向下看:
  
  00467993  |.  DD45 08       fld     qword ptr [ebp+8]                ;  加载机器码
  00467996  |.  D825 407A4600 fsub    dword ptr [467A40]               ;  机器码-常数9527.0
  0046799C  |.  DD5D 08       fstp    qword ptr [ebp+8]                ;  保存差
  0046799F  |.  9B            wait
  004679A0  |.  DD45 08       fld     qword ptr [ebp+8]                ;  加载差
  004679A3  |.  D835 447A4600 fdiv    dword ptr [467A44]               ;  差除以常数139.0,即(机器码-  9527.0)/139.0
  004679A9  |.  DD5D F0       fstp    qword ptr [ebp-10]               ;  保存结果到[EBP-10]
  004679AC  |.  9B            wait
  004679AD  |.  8D45 E8       lea     eax, dword ptr [ebp-18]
  004679B0  |.  50            push    eax                              ; /Arg1
  004679B1  |.  0FB705 20BC46>movzx   eax, word ptr [46BC20]           ; |EAX=0D79h=十进制2009
  004679B8  |.  8945 E0       mov     dword ptr [ebp-20], eax          ; |
  004679BB  |.  C645 E4 00    mov     byte ptr [ebp-1C], 0             ; |
  004679BF  |.  8D55 E0       lea     edx, dword ptr [ebp-20]          ; |
  004679C2  |.  33C9          xor     ecx, ecx                         ; |
  004679C4  |.  A1 08BC4600   mov     eax, dword ptr [46BC08]          ; |"%d"
  004679C9  |.  E8 2E16FAFF   call    00408FFC                         ; \KGMe.00408FFC
  004679CE  |.  FF75 E8       push    dword ptr [ebp-18]               ;  将数字2009转化为字串"2009"并入栈
  004679D1  |.  FF35 04BC4600 push    dword ptr [46BC04]               ;  月份字串"03"
  004679D7  |.  DD05 FCBB4600 fld     qword ptr [46BBFC]               ;  保存当前日期-1的数字
  004679DD  |.  83C4 F4       add     esp, -0C
  004679E0  |.  DB3C24        fstp    tbyte ptr [esp]                  ; |
  004679E3  |.  9B            wait                                     ; |
  004679E4  |.  8D45 DC       lea     eax, dword ptr [ebp-24]          ; |
  004679E7  |.  E8 441DFAFF   call    00409730                         ; \KGMe.00409730
  004679EC  |.  FF75 DC       push    dword ptr [ebp-24]
  004679EF  |.  8D45 EC       lea     eax, dword ptr [ebp-14]
  004679F2  |.  BA 03000000   mov     edx, 3
  004679F7  |.  E8 A4CCF9FF   call    004046A0                         ;  计算,取当前日期-1字串"2009031"
   004679FC  |.  8B45 EC       mov     eax, dword ptr [ebp-14]          ;  EAX=当前日期-1字串
  004679FF  |.  E8 8C1DFAFF   call    00409790                         ;  将字串转化为浮点数,2009031.0
  00467A04  |.  DC45 F0       fadd    qword ptr [ebp-10]               ;  (机器码-9527.0)/139.0+当前日期-1
  00467A07  |.  DD5D F8       fstp    qword ptr [ebp-8]                ;  保存上面计算结果=10753849.971223020920
  00467A0A  |.  9B            wait
  00467A0B  |.  33C0          xor     eax, eax
  00467A0D  |.  5A            pop     edx
  00467A0E  |.  59            pop     ecx
  00467A0F  |.  59            pop     ecx
  00467A10  |.  64:8910       mov     dword ptr fs:[eax], edx
  00467A13  |.  68 357A4600   push    00467A35
  00467A18  |>  8D45 DC       lea     eax, dword ptr [ebp-24]
  00467A1B  |.  E8 00C9F9FF   call    00404320
  00467A20  |.  8D45 E8       lea     eax, dword ptr [ebp-18]
  00467A23  |.  BA 02000000   mov     edx, 2
  00467A28  |.  E8 17C9F9FF   call    00404344
  00467A2D  \.  C3            retn
  00467A2E   .^ E9 C9C2F9FF   jmp     00403CFC
  00467A33   .^ EB E3         jmp     short 00467A18
  00467A35   .  DD45 F8       fld     qword ptr [ebp-8]                ;  将机器码计算结果载入
  00467A38   .  8BE5          mov     esp, ebp
  00467A3A   .  5D            pop     ebp
  00467A3B   .  C2 0800       retn    8
  
  到这里,我们就知道机器码的计算方法是:(机器码-9527.0)/139.0+当前日期-1,然后走出此CALL,继续下面分析:
    
    ......
    00467C9F  |.  E8 D0FCFFFF   call    00467974                         ;  此处为机器码处理部分,F7进入
    00467CA4  |.  DD5D E8       fstp    qword ptr [ebp-18]               ;  将机器码计算结果保存到[EBP-18]中
    00467CA8  |.  8D45 D8       lea     eax, dword ptr [ebp-28]

    下面的两个CALL与计算机器码的一样,都是些格式化操作,不必理会:
    00467CA7  |.  9B            wait
    00467CA8  |.  8D45 D8       lea     eax, dword ptr [ebp-28]
  00467CAB  |.  50            push    eax                              ; /Arg1
  00467CAC  |.  0FB705 20BC46>movzx   eax, word ptr [46BC20]           ; |
  00467CB3  |.  8945 D0       mov     dword ptr [ebp-30], eax          ; |
  00467CB6  |.  C645 D4 00    mov     byte ptr [ebp-2C], 0             ; |
  00467CBA  |.  8D55 D0       lea     edx, dword ptr [ebp-30]          ; |
  00467CBD  |.  33C9          xor     ecx, ecx                         ; |
  00467CBF  |.  A1 08BC4600   mov     eax, dword ptr [46BC08]          ; |
  00467CC4  |.  E8 3313FAFF   call    00408FFC                         ; \KGMe.00408FFC
  00467CC9  |.  FF75 D8       push    dword ptr [ebp-28]
  00467CCC  |.  FF35 04BC4600 push    dword ptr [46BC04]
  00467CD2  |.  8D45 CC       lea     eax, dword ptr [ebp-34]
  00467CD5  |.  50            push    eax                              ; /Arg1
  00467CD6  |.  0FB705 26BC46>movzx   eax, word ptr [46BC26]           ; |
  00467CDD  |.  8945 D0       mov     dword ptr [ebp-30], eax          ; |
  00467CE0  |.  C645 D4 00    mov     byte ptr [ebp-2C], 0             ; |
  00467CE4  |.  8D55 D0       lea     edx, dword ptr [ebp-30]          ; |
  00467CE7  |.  33C9          xor     ecx, ecx                         ; |
  00467CE9  |.  A1 08BC4600   mov     eax, dword ptr [46BC08]          ; |
  00467CEE  |.  E8 0913FAFF   call    00408FFC                         ; \KGMe.00408FFC
  00467CF3  |.  FF75 CC       push    dword ptr [ebp-34]
  00467CF6  |.  8D45 DC       lea     eax, dword ptr [ebp-24]
  00467CF9  |.  BA 03000000   mov     edx, 3
  00467CFE  |.  E8 9DC9F9FF   call    004046A0                         ;  取当前日期字串
  00467D03  |.  8B45 DC       mov     eax, dword ptr [ebp-24]          ;  保存当前日期"2009032"
  00467D06  |.  E8 851AFAFF   call    00409790                         ;  将日期字串转化为浮点数2009032.0
  00467D0B  |.  DC6D F0       fsubr   qword ptr [ebp-10]               ;  当前日期-输入的假码
  00467D0E  |.  DB7D C0       fstp    tbyte ptr [ebp-40]               ;  将差保存到[EBP-40]中
  00467D11  |.  9B            wait
  00467D12  |.  DD45 E8       fld     qword ptr [ebp-18]               ;  取机器码计算的结果
  00467D15  |.  E8 92AFF9FF   call    00402CAC                         ;  将机器码的计算结果转为整数->EAX中
  00467D1A  |.  8945 D0       mov     dword ptr [ebp-30], eax          ;  保存机器码计算的整数结果
  00467D1D  |.  8955 D4       mov     dword ptr [ebp-2C], edx
  00467D20  |.  DF6D D0       fild    qword ptr [ebp-30]               ;  加载机器码计算的整数结果
  00467D23  |.  DB6D C0       fld     tbyte ptr [ebp-40]               ;  加载当前日期-假码的结果
  00467D26  |.  DED9          fcompp                                   ;  比较这两个结果是否相同
  00467D28  |.  DFE0          fstsw   ax
  00467D2A  |.  9E            sahf
  00467D2B  |.  74 0E         je      short 00467D3B                   ;  关键跳,如果结果相等,则跳,出现“Please restart again!"窗口 

  综上所述,设输入的注册码为X,则应该满足: 
    (机器码-9527.0)/139.0+当前日期-1 = 当前日期 - x
    当等式的左边比当前日期大的时候,会出现x为负,通过补码的计算方法可得:
  x = [(机器码-9527.0)/139.0+当前日期-1]+当前日期

    比如,机器码=1215539086,则 x =[(1215539086-9527)/139+2009031]+2009032 = 12762879


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

收藏
免费 7
支持
分享
最新回复 (11)
雪    币: 295
活跃值: (11)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
为什么 我写的分析 不给精华  你一写 马上就精华了???
2009-3-2 22:36
0
雪    币: 261
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
呵呵!膜拜高手,我自己写的都还逆不出来惭愧啊!
2009-3-2 22:36
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
4
  晕,我还高手啊,我要撞墙了!
2009-3-2 22:44
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
5
由上往下一拉, 感觉较整齐
2009-3-2 22:45
0
雪    币: 2256
活跃值: (941)
能力值: (RANK:2210 )
在线值:
发帖
回帖
粉丝
6
分析的不错@
2009-3-3 12:38
0
雪    币: 10902
活跃值: (3288)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
7
crackme 的破文最好能尽量详细点,让初学者能够根据破文来动手实践最好!
同时希望能写出crackme的亮点,写出自己独特的破解思路,能够有总结 启发 意义为佳!

以上并不针对该破文!
2009-3-4 11:51
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
8
  小生何德何能,烦劳两位版主大驾!
2009-3-4 11:55
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
9
听说你欠一大餐
2009-3-4 11:55
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
10
嘿嘿,你来我这,我请你吃
2009-3-4 12:15
0
雪    币: 216
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
分析得不错,根据楼主的分析,我也得到结果了,呵呵!
机器码:1356817864;注册码:13779282
2009-3-6 14:53
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
好贴,看看,呵呵
2009-3-7 01:34
0
游客
登录 | 注册 方可回帖
返回
//