首页
社区
课程
招聘
[原创]我也来一个crackme
发表于: 2009-7-24 14:34 8651

[原创]我也来一个crackme

2009-7-24 14:34
8651
菜鸟也来写一个crackme,写的不是很好
这个crackme没有SMC技术,也没有高级的算法
希望给位大侠给我提点写crackme的技巧,大家一起提高嘛!!^_^

crackme.rar
我对字符串进行了加密,不能在数据窗口中轻易找到成功的标志,
出一个修改版

修订版.rar

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 358
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
/*401BE1*/  TEST EDX,EDX
这里 把edx改为9   即可

算法长懒得看啦
2009-7-24 17:27
0
雪    币: 418
活跃值: (63)
能力值: ( LV12,RANK:260 )
在线值:
发帖
回帖
粉丝
3
1,用万能断点法可以得到密码验证地址的断点.(API 的plugins加trace也可以得到,用DEDE的话就更简单了)
2,输入用户名为zenghw   注册码为5705312,分析如下

00401B7A   .  50            push    eax
00401B7B   .  E8 44FDFFFF   call    004018C4                                ;  //跟进去后得到用户名zenghw 各个字符除以10的余数和 这里==0x13
00401B80   .  59            pop     ecx
00401B81   .  8BF0          mov     esi, eax
00401B83   .  8D45 B0       lea     eax, dword ptr [ebp-50]                 ;  //password
00401B86   .  50            push    eax
00401B87 > .  E8 F8620500   call    00457E84                                ;  //获得password长度
00401B8C   .  59            pop     ecx
00401B8D   .  8BD0          mov     edx, eax
00401B8F   .  33DB          xor     ebx, ebx
00401B91   .  8D45 B0       lea     eax, dword ptr [ebp-50]
00401B94   >  0FBE08        movsx   ecx, byte ptr [eax]
00401B97   .  83F9 30       cmp     ecx, 30                                 ;  //判断password各字符是否 >=0 ,即password是否为数字
00401B9A   .  7C 09         jl      short 00401BA5
00401B9C   .  83F9 39       cmp     ecx, 39                                 ;  //是否 <=9
00401B9F   .  7F 04         jg      short 00401BA5
00401BA1   .  43            inc     ebx
00401BA2   .  40            inc     eax
00401BA3   .^ EB EF         jmp     short 00401B94
00401BA5   >  3BDA          cmp     ebx, edx
00401BA7   .  0F85 89000000 jnz     00401C36
00401BAD   .  85D2          test    edx, edx
00401BAF   .  0F84 81000000 je      00401C36
00401BB5   .  83FA 07       cmp     edx, 7                                  ;  //判断password长度是否 >=7
00401BB8   .  7C 7C         jl      short 00401C36
00401BBA   .  66:C745 E0 08>mov     word ptr [ebp-20], 8
00401BC0   .  66:C745 E0 2C>mov     word ptr [ebp-20], 2C                   ;  
00401BC6   .  8B45 F4       mov     eax, dword ptr [ebp-C]                  ;  //password
00401BC9 > .  E8 8E090100   call    0041255C                                ;  //这个函数把十进制的password转换为十六进制
00401BCE   .  50            push    eax
00401BCF   .  E8 2CFDFFFF   call    00401900                                ;  //或上5201314 后值== 1853C2
00401BD4   .  59            pop     ecx
00401BD5   .  56            push    esi                                     ;  //用户zenghw除以10的余数和
00401BD6   .  50            push    eax                                     ;  //或上5201314的值 == 1853C2
00401BD7   .  E8 34FDFFFF   call    00401910                                ;  //关键CALL
00401BDC   .  83C4 08       add     esp, 8
00401BDF   .  8BD0          mov     edx, eax
00401BE1   .  85D2          test    edx, edx                                ;  
00401BE3   .  7C 05         jl      short 00401BEA
00401BE5   .  83FA 0F       cmp     edx, 0F
00401BE8   .  7E 02         jle     short 00401BEC
00401BEA   >  33D2          xor     edx, edx
00401BEC   >  A1 24694600   mov     eax, dword ptr [466924]
00401BF1   .  6A 00         push    0
00401BF3   .  8B0CD5 902146>mov     ecx, dword ptr [edx*8+462190]           ;  //对话框标题字符串,字符串与EDX地址相关
00401BFA   .  8B14D5 8C2146>mov     edx, dword ptr [edx*8+46218C]
00401C01   .  8B00          mov     eax, dword ptr [eax]
00401C03 > .  E8 14F50500   call    0046111C                                ;  //显示窗口

关键CALL里面为浮点运算,我还没搞明白,太晚了,明天继续搞!
当运行到00401BF3   行时,按ENTER键,得到其地址数据为"加油啊,兄弟",上下拉动,也可以找到牛啊,成功的字符串,其中"成功"的字符串为004622F3,再从004621D8地址知道,其数据指向字符串004622F3(因为ds:[00462190]=00462259,所以再翻到00462190即可看到004622E9数据的地址 ), 那么 (0X004621D8 - 0X00462190) / 0X8 =0X09, 因此EDX应该为0x09。
以上只是破解分析,那个关键CALL我还没搞懂,望大牛指点一二!
2009-7-25 01:29
0
雪    币: 318
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
楼上的都是高手呀,我最后的成功与否的标志老是处理不好
请各位高手指点一下,小弟万分感激
2009-7-25 08:14
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我的代码和地址和上面的不一样,为什么,是不是要先解密?我的是vista系统

明白了,我,晕
2009-7-26 11:34
0
雪    币: 246
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我不明白啊,我的代码也不一样啊,我很差劲谁能教教,谢谢
2009-7-26 15:50
0
雪    币: 388
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
爆破了 奇怪和LZ得图不一样 正确时显示绿色?
上传的附件:
  • 1.png (10.69kb,122次下载)
2009-7-26 17:53
0
雪    币: 418
活跃值: (63)
能力值: ( LV12,RANK:260 )
在线值:
发帖
回帖
粉丝
8
显示绿色是因为他把整个白色设置成绿色啦。。。
跟破解时颜色无关,
听说你保护视力,哈哈。。
2009-7-26 19:24
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
终结吧,修改前和修改后 2 个版本,其实压根不是算法长短的问题
上传的附件:
  • 2.jpg (14.16kb,109次下载)
  • 3.jpg (14.21kb,110次下载)
2009-7-26 23:42
0
雪    币: 136
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
00401ABC   .  55            push    ebp                        ;  入口(_TForm1_btnRegClick)
00401ABD   .  8BEC          mov     ebp, esp                   ;  栈指针给帧指针
00401ABF   .  81C4 00FEFFFF add     esp, -200                  ;  开辟局部变量空间
00401AC5   .  53            push    ebx                        ;  入栈
00401AC6   .  56            push    esi                        ;  ESI入栈
00401AC7   .  57            push    edi                        ;  EDI入栈
00401AC8   .  8BD8          mov     ebx, eax                   ;  EAX赋值给EBX
00401ACA   .  B8 30244600   mov     eax, 00462430              ;  地址00462430给EAX
00401ACF   .  E8 38670500   call    0045820C                   ;  调用__InitExceptBlockLDTC
00401AD4   .  BE DC214600   mov     esi, 004621DC              ;  将地址004621DC给ESI
00401AD9   .  8DBD 40FEFFFF lea     edi, dword ptr [ebp-1C0]   ;  将EBP-1C0 地址传递给DDI
00401ADF   .  B9 64000000   mov     ecx, 64                    ;  100 给ECX
00401AE4   .  F3:A5         rep     movs dword ptr es:[edi], d>;  将ESI得数据复制到EDI中,长度0X64
00401AE6   .  66:C745 E0 14>mov     word ptr [ebp-20], 14      ;  将0x14填入局部空间EBP-20处
00401AEC   .  33C0          xor     eax, eax                   ;  EAX清0
00401AEE   .  8945 F8       mov     dword ptr [ebp-8], eax     ;  局部变量2清 0(存放用户名指针)
00401AF1   .  8D55 F8       lea     edx, dword ptr [ebp-8]     ;  局部变量2地址给EDX
00401AF4   .  FF45 EC       inc     dword ptr [ebp-14]         ;  将EBP-14内容加1
00401AF7   .  8B83 F8020000 mov     eax, dword ptr [ebx+2F8]   ;  将EBX+258 地址单位内容给EAX
00401AFD   .  E8 6EA00400   call    0044BB70                   ;  调用TControl::GetText(void)取得用户名
00401B02   .  66:C745 E0 08>mov     word ptr [ebp-20], 8       ;  将8 填入 EBP-20地址单元
00401B08   .  66:C745 E0 20>mov     word ptr [ebp-20], 20      ;  将20填入EBP-20 地址单元
00401B0E   .  33D2          xor     edx, edx                   ;  EDX清0
00401B10   .  8955 F4       mov     dword ptr [ebp-C], edx     ;  将局部变量3 清0(存放注册码首地址指针)
00401B13   .  8D55 F4       lea     edx, dword ptr [ebp-C]     ;  将变量3地址给EDX
00401B16   .  FF45 EC       inc     dword ptr [ebp-14]         ;  将EBP-14内容加1
00401B19   .  8B83 FC020000 mov     eax, dword ptr [ebx+2FC]   ;  将EBX+2FC 地址单位内容给EAX
00401B1F   .  E8 4CA00400   call    0044BB70                   ;  调用TControl::GetText(void) 取得注册码
00401B24   .  66:C745 E0 08>mov     word ptr [ebp-20], 8       ;  将8 填入 EBP-20地址单元
00401B2A   .  BE 6C234600   mov     esi, 0046236C              ;  将0046236C给ESI
00401B2F   .  8DBD 20FEFFFF lea     edi, dword ptr [ebp-1E0]   ;  将EBP-1E0值给EDI
00401B35   .  B9 07000000   mov     ecx, 7                     ;  ECX赋值为7
00401B3A   .  F3:A5         rep     movs dword ptr es:[edi], d>;  将ESI为源地址 EDI为目标地址 长度为7的DWORD数据进行复制
00401B3C   .  66:A5         movs    word ptr es:[edi], word pt>;  在复制最后一个WORD
00401B3E   .  BE 8A234600   mov     esi, 0046238A              ;  将0046238A给ESI
00401B43   .  8DBD 00FEFFFF lea     edi, dword ptr [ebp-200]   ;  将EBP-200值给EDI
00401B49   .  B9 07000000   mov     ecx, 7                     ;  ECX赋值为7
00401B4E   .  F3:A5         rep     movs dword ptr es:[edi], d>;  将ESI为源地址 EDI为目标地址 长度为7的DWORD数据进行复制
00401B50   .  66:A5         movs    word ptr es:[edi], word pt>;  在复制最后一个WORD
00401B52   .  837D F4 00    cmp     dword ptr [ebp-C], 0       ;  比较局部变量3是否为0
00401B56   .  74 05         je      short 00401B5D             ;  等于 0 则跳转00401b5d
00401B58   .  8B45 F4       mov     eax, dword ptr [ebp-C]     ;  这里EAX实际上是注册码首地址
00401B5B   .  EB 05         jmp     short 00401B62             ;  无条件跳到00401B62
00401B5D   >  B8 AC234600   mov     eax, 004623AC              ;  将004623AC给EAX
00401B62   >  8BF8          mov     edi, eax                   ;  将注册码给EDI
00401B64   .  33C0          xor     eax, eax                   ;  EAX清0
00401B66   .  83C9 FF       or      ecx, FFFFFFFF              ;  ECX给FFFFFFFF
00401B69   .  8DB5 20FEFFFF lea     esi, dword ptr [ebp-1E0]   ;  将EBP-1E0值给ESI
00401B6F   .  F2:AE         repne   scas byte ptr es:[edi]
00401B71   .  F7D1          not     ecx                        ;  实际上取得注册码长度
00401B73   .  2BF9          sub     edi, ecx                   ;  将EDI指针复原到首地址
00401B75   .  8BD1          mov     edx, ecx                   ;  将长度ECX复制给EDX
00401B77   .  87F7          xchg    edi, esi                   ;  交换ESI 和EDI内容
00401B79   .  C1E9 02       shr     ecx, 2                     ;  逻辑右移2位 其实是除以4
00401B7C   .  8BC7          mov     eax, edi                   ;  EDI给EAX
00401B7E   .  F3:A5         rep     movs dword ptr es:[edi], d>;  实际上将注册码复制到EDI为首地址的内存单元里面
00401B80   .  8BCA          mov     ecx, edx                   ;  长度给ECX
00401B82   .  83E1 03       and     ecx, 3                     ;  与3
00401B85   .  F3:A4         rep     movs byte ptr es:[edi], by>
00401B87   .  837D F8 00    cmp     dword ptr [ebp-8], 0       ;  判断局部变量是否为0
00401B8B   .  74 05         je      short 00401B92             ;  等于0 则跳转00401B92
00401B8D   .  8B45 F8       mov     eax, dword ptr [ebp-8]     ;  这里实际将注册码首地址给EAX
00401B90   .  EB 05         jmp     short 00401B97             ;  无条件跳转00401B97
00401B92   >  B8 AD234600   mov     eax, 004623AD              ;  将004623AD给EAX
00401B97   >  8BF8          mov     edi, eax                   ;  将用户名首地址给EDI
00401B99   .  33C0          xor     eax, eax                   ;  EAX清0
00401B9B   .  83C9 FF       or      ecx, FFFFFFFF              ;  ECX复制为FFFFFFFF
00401B9E   .  8DB5 00FEFFFF lea     esi, dword ptr [ebp-200]   ;  将EBP-100值给ESI
00401BA4   .  F2:AE         repne   scas byte ptr es:[edi]
00401BA6   .  F7D1          not     ecx                        ;  实际上求用户名的长度
00401BA8   .  2BF9          sub     edi, ecx                   ;  恢复EDI为用户名首地址
00401BAA   .  8BD1          mov     edx, ecx                   ;  长度给EDX
00401BAC   .  87F7          xchg    edi, esi                   ;  将EDI ESI内容交换
00401BAE   .  C1E9 02       shr     ecx, 2                     ;  逻辑右移
00401BB1   .  8BC7          mov     eax, edi                   ;  将EDI给EAX
00401BB3   .  F3:A5         rep     movs dword ptr es:[edi], d>;  将EDI复制到ESI中
00401BB5   .  8BCA          mov     ecx, edx
00401BB7   .  8D85 00FEFFFF lea     eax, dword ptr [ebp-200]   ;  复制原则是按DWORD位单位来高速复制
00401BBD   .  83E1 03       and     ecx, 3
00401BC0   .  F3:A4         rep     movs byte ptr es:[edi], by>;  实际上复制剩余的字符
00401BC2   .  50            push    eax                        ;  用户名压栈
00401BC3   .  E8 10FDFFFF   call    004018D8                   ;  调用模块004018D8
00401BC8   .  59            pop     ecx                        ;  将用户名首地址弹出给ECX 这时EAX是1A
00401BC9   .  8BF0          mov     esi, eax                   ;  将用户名字符串首地址给ESI
00401BCB   .  8D85 20FEFFFF lea     eax, dword ptr [ebp-1E0]   ;  将注册码首地址给EAX
00401BD1   .  50            push    eax                        ;  注册码首地址压栈
00401BD2   .  E8 F9630500   call    00457FD0                   ;  调用模块00457FD2(strlen) 长度存放EAX
00401BD7   .  59            pop     ecx                        ;  将注册码首地址给ECX
00401BD8   .  8BD8          mov     ebx, eax                   ;  长度给EBX
00401BDA   .  33C9          xor     ecx, ecx                   ;  ECX清0
00401BDC   .  8D85 20FEFFFF lea     eax, dword ptr [ebp-1E0]   ;  实际上将注册码首地址给EAX
00401BE2   >  0FBE10        movsx   edx, byte ptr [eax]
00401BE5   .  83FA 30       cmp     edx, 30                    ;  这里比较是否是数字
00401BE8   .  7C 09         jl      short 00401BF3
00401BEA   .  83FA 39       cmp     edx, 39
00401BED   .  7F 04         jg      short 00401BF3
00401BEF   .  41            inc     ecx
00401BF0   .  40            inc     eax
00401BF1   .^ EB EF         jmp     short 00401BE2             ;  这里循环扫描是否数字
00401BF3   >  3BCB          cmp     ecx, ebx
00401BF5   .  0F85 48010000 jnz     00401D43                   ;  如果里面有一位不是数字则 跳转00401D43
00401BFB   .  85DB          test    ebx, ebx
00401BFD   .  0F84 40010000 je      00401D43                   ;  等于0 跳00401D43
00401C03   .  83FB 07       cmp     ebx, 7                     ;  比较注册码是否小于7
00401C06   .  0F8C 37010000 jl      00401D43                   ;  如果小于则跳转00401D43
00401C0C   .  66:C745 E0 08>mov     word ptr [ebp-20], 8       ;  将8赋值给EBP-20地址单元
00401C12   .  66:C745 E0 2C>mov     word ptr [ebp-20], 2C      ;  将2C赋值给EBP-20
00401C18   .  8B45 F4       mov     eax, dword ptr [ebp-C]     ;  将注册码首地址给EAX
00401C1B   .  E8 880A0100   call    004126A8                   ;  实际上这里调用了StrToInt,将字符转换为整形,结果存入EAX
00401C20   .  50            push    eax                        ;  将用户输入的注册码压栈
00401C21   .  E8 EEFCFFFF   call    00401914                   ;  调用模块00401914(实际上是将0X4F5DA2于注册码转换成整数的结果相与)
00401C26   .  59            pop     ecx                        ;  将注册码弹给ECX
00401C27   .  56            push    esi
00401C28   .  50            push    eax                        ;  这里存放与0X4F5DA2后结果
00401C29   .  E8 F6FCFFFF   call    00401924                   ;  这里进行了一堆运算(pow)
00401C2E   .  83C4 08       add     esp, 8                     ;  栈平衡
00401C31   .  8BD8          mov     ebx, eax                   ;  结果送入EBX
00401C33   .  53            push    ebx                        ;  EBX压栈
00401C34   .  E8 A3FDFFFF   call    004019DC
00401C39   .  8BD8          mov     ebx, eax
00401C3B   .  59            pop     ecx                        ;  结果存入ECX
00401C3C   .  BE A0214600   mov     esi, 004621A0
00401C41   .  8B849D 40FEFF>mov     eax, dword ptr [ebp+ebx*4->;  跟到这里飞了 ??? 难道安装了SEH?
//跟到上面进入了系统函数DLL空间,请大牛指点迷津,谢谢
00401C48   .  8BF8          mov     edi, eax
00401C4A   .  33C0          xor     eax, eax
00401C4C   .  83C9 FF       or      ecx, FFFFFFFF
00401C4F   .  F2:AE         repne   scas byte ptr es:[edi]
00401C51   .  F7D1          not     ecx
00401C53   .  2BF9          sub     edi, ecx
00401C55   .  8BD1          mov     edx, ecx
00401C57   .  87F7          xchg    edi, esi
00401C59   .  C1E9 02       shr     ecx, 2
00401C5C   .  8BC7          mov     eax, edi
00401C5E   .  F3:A5         rep     movs dword ptr es:[edi], d>
00401C60   .  8BCA          mov     ecx, edx
00401C62   .  83E1 03       and     ecx, 3
00401C65   .  F3:A4         rep     movs byte ptr es:[edi], by>
00401C67   .  33C0          xor     eax, eax
00401C69   .  A3 D4214600   mov     dword ptr [4621D4], eax
2009-7-27 00:27
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
你那取地址空白,能不飞掉啊 ? 不过它在下面有一段承接的代码,如果代码到那处,不管三 七 二十一 就
直接解出 失败 字符串

看我的注册码跟一下你就明白了
2009-7-27 00:37
0
雪    币: 136
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
00401C41   .  8B849D 40FEFF>mov     eax, dword ptr [ebp+ebx*4-1C0]        ;  跟到这里EBX是个相当大的数字,然后PTR指向地址很大 ,就飞入异常函数。
2009-7-27 00:44
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
就是它

就是上面这条代码出卖了结果   ebp = 12f5c8 + ebx( 如果是 0x16) * 4 - 1c0 = 12f460

看堆栈

0012F460   0046218C  修订版.0046218C    这个 46218c dword 内存数据是  B0 C8 BD A7                                      叭涧..

对应的解码 key 是  3 1 4 1

也就是成功的字符串

现在有对于的 KEY 很容易找到答案了
早些时后,懒得分析了,写了个脚本来直接穷举他们的注册码
2009-7-27 00:54
0
雪    币: 238
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
向楼上的高手学习。
2009-7-27 10:03
0
雪    币: 246
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
ebp = 12f5c8 + ebx( 如果是 0x16) * 4 - 1c0 = 12f460

看堆栈

0012F460   0046218C  修订版.0046218C    这个 46218c dword 内存数据是  B0 C8 BD A7                                      叭涧..

对应的解码 key 是  3 1 4 1

怎么知道12F460里是成功的字符串,我很差劲···
2009-7-27 14:37
0
雪    币: 388
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
嘿嘿 咱视力不行 需要保护保护
2009-7-27 18:33
0
雪    币: 318
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
由于第一版的时候,出现了很明显的成功标志,
我又没有对字符串进行加密的经历,处理的不是很好,还望各位高手多多指点
这里是不是不应该对错误信息加密(只对成功信息进行加密,如果成功了,才解码)???而且不应该把成功的信息和错误信息放在一起(这样好像你就不好穷举了)
高手能不能把你写的那个脚本给我看一下,我也学习一下(小弟学破解的时间不长,很多东西都不懂,还望给位高手多多提携)
2009-7-27 21:41
0
游客
登录 | 注册 方可回帖
返回
//