首页
社区
课程
招聘
[原创]一个Crackme, 新手试试
发表于: 2008-9-18 01:02 10263

[原创]一个Crackme, 新手试试

2008-9-18 01:02
10263
一个Crackme, 算法很简单 新手试试

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (30)
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
2
9/18 2:00前下载的人请重下, 有超级大bug.
2008-9-18 01:07
0
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
3
原来是注册码跳转,等楼下分析
2008-9-18 02:32
0
雪    币: 199
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
观战。。。。。
2008-9-18 10:18
0
雪    币: 1151
活跃值: (4232)
能力值: ( LV5,RANK:69 )
在线值:
发帖
回帖
粉丝
5
找不到注册码  郁闷  
上传的附件:
2008-9-18 12:00
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
6
新手试试. 注册码算法非常简单.
不要想得太难
2008-9-18 12:02
0
雪    币: 557
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
感觉有些地方是阴人的~~

楼主给出一组正确的来参考一下
2008-9-18 12:03
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我也找不到注册码 期待分析
上传的附件:
2008-9-18 13:29
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
以后不玩爆破了....

一门心思研究算法....
2008-9-18 15:11
0
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
10
没有明白,等楼主分析了!

user:beijihu
sn :7356257

输入这样的字符会没有提示!不管是对还是错都不知道! 应该属于是失败了吧!前面几位是改跳转的!

分析出一个简单算法!但是可能不是真的!
for(i=0;i<strlen(username);i++)
sum+=(int)username[i]*(0x270F-(i+1));

估计被楼主耍了!呵呵!
2008-9-18 16:11
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
11
若注册号正确是会显示 Good 没错
不过上面几个都是用爆的
2008-9-18 19:29
0
雪    币: 295
活跃值: (11)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
应该是要触发好几个异常的
2008-9-18 19:31
0
雪    币: 210
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
好像很多暗坑.
2008-9-18 20:03
0
雪    币: 237
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
汗,加过花的,转晕了
说下我的思路,坐板凳等大侠解释。
Delphi的程序,但是DeDe未遂。
看了下应该是MessageBox的提示 ,但是MessageBox,MessageBoxEx,MessageBoxIndirect均未断下来,估计是被HOOK了。
用CCASM反汇编,找Error,顺便也看到了Good,看程序当中出现的位置,随便举个例子
00428E17 MOV EAX,428EAC \->: Error
00428E1C CALL 00426CD0
                           
这是Error的
004294B2 MOV EAX,429528 \->: Good
004294B7 CALL 00426CD0
                           
这是Good的
可以看出是 00426CD0显示出来的那个MessageBox。在来看00426CD0
::00426CD0:: 83C9 FF OR ECX,FFFFFFFF \:BYCALL
::00426CD3:: 83CA FF OR EDX,FFFFFFFF
::00426CD6:: E8 01000000 CALL 00426CDC
                        
用OD根了下果然如此。就在此处弹出了MessageBox,看了看能转到这里的地方有好多,于是复制出来编辑成一个ODbgScript脚本,省的自己一个一个下断。
贴出来
bp 00428E1C
bp 00428E35
bp 00428E4B
bp 00428E57
bp 004290E8
bp 00429101
bp 00429117
bp 00429123
bp 0042922A
bp 0042928C
bp 00429305
bp 0042937B
bp 00429488
bp 004294A1
bp 004294B7
bp 004294C3
bp 00429604
bp 0042961D
bp 00429633
bp 0042963F

运行,然后断在0042928C,我们离目标又近了1步。
向上看到00429268断下来。
在向上看到00429190断下来。此时估计断点是到位了。

后面跑了三次,无功而返,算法偶功力还差的远,不过连爆破点都没找见,就有点那个......
2008-9-18 22:05
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
15
无Hook , 无加花
标准Compiler , 标准程序
2008-9-18 22:12
0
雪    币: 237
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
多谢提示
还小白的厉害

见到过好几处连续JMP,我以为是加花的
调整下思路在看看
2008-9-18 22:27
0
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
17
if(a)
  if(aa)
    if(aaa)
      ...
      Good
else if(b)
  if(bb)
    if(bbb)
      ...
      Good
...
...
...
Error
不知道对不对
2008-9-19 07:14
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
18
不懂你的意思.
你是说注册码要输入多次吗? (这会被人揍吧)
不需要, 跟一般的CM一样.
2008-9-19 14:26
0
雪    币: 425
活跃值: (205)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
作者用了3次seh,呵呵!

上传的附件:
2008-9-19 16:00
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
20
这一题主要是anti破解心态.
当1'2次追到正确的注册码而依然无效时, 大多数的人会换个思路
包括往更里面钻' 重追SN的流向' 重用万用断点, 甚至往更不可能的方向去研究

这里主要的目的是造成 "正确的注册码无效", 例外2层只是一种模糊手段
相信大家都曾停在这里: (按钮.OnMouseUp内)
00429277   .  E8 B8C2FDFF   call    00405534
0042927C   .  8B55 FC       mov     edx, [ebp-4]
0042927F   .  3B82 D4010000 cmp     eax, [edx+1D4]
00429285   .  74 0A         je      short 00429291
00429287   .  B8 D0934200   mov     eax, 004293D0      ;  ASCII "Error"
0042928C   .  E8 3FDAFFFF   call    00426CD0
00429291   >  33C0          xor     eax, eax
00429293   .  5A            pop     edx
00429294   .  59            pop     ecx
也是前面说的找不到爆破点, 实事上在这段函式里并没有点可爆
爆了变成是硬改流程了.

上面的 call 00405534 是 StrToInt函式, 若你输入的不是纯整数则会例外

例外会来到这里:
004292E6   .  8D0440        lea     eax, [eax+eax*2]
004292E9   .  35 B7000000   xor     eax, 0B7
004292EE   .  50            push    eax
004292EF   .  8BC3          mov     eax, ebx
004292F1   .  5A            pop     edx
004292F2   .  8BCA          mov     ecx, edx
004292F4   .  99            cdq
004292F5   .  F7F9          idiv    ecx
004292F7   .  8B55 FC       mov     edx, [ebp-4]
004292FA   .  8982 C8010000 mov     [edx+1C8], eax
00429300   .  B8 D0934200   mov     eax, 004293D0      ;  ASCII "Error"
00429305   .  E8 C6D9FFFF   call    00426CD0
0042930A   .  33C0          xor     eax, eax
0042930C   .  5A            pop     edx

上面的 idiv ecx 若不让ecx=0, 则会显示 Error
所以该试着让他例外, 只要注册码第一个字为 '=' 即可

例外会来到这里:
 OnDivZero例外:
  00429346   .  3B82 D4010000 cmp     eax, [edx+1D4]
  0042934C   .  75 32         jnz     short 00429380
  0042934E   .  8B45 FC       mov     eax, [ebp-4]
  00429351   .  8B80 BC010000 mov     eax, [eax+1BC]
  00429357   .  8B55 FC       mov     edx, [ebp-4]
  0042935A   .  8990 9C000000 mov     [eax+9C], edx
  00429360   .  C780 98000000>mov     dword ptr [eax+98], 00428EC4
  0042936A   .  E8 759CFDFF   call    00402FE4

 其它例外: ShowMessage('Error');

源程序码为
    if InputSN == CorrectSN 
      sbReg.OnClick:= sbReg_Click;

来看这 sbReg.OnClick:= sbReg_Click
若注册码正确, 则插上 OnClick 事件接头
(若注册码不正确则不会插上接头)
所以在离开 CrackMe 到系统后, win系统会呼叫 sbReg_Click();

sbReg_Click()  (函式头为00428EC4)
00428EF4   .  8B80 CC010000 mov     eax, [eax+1CC]
00428EFA   .  35 E180829D   xor     eax, 9D8280E1
00428EFF   .  50            push    eax
00428F00   .  8B45 FC       mov     eax, [ebp-4]
00428F03   .  8B80 D0010000 mov     eax, [eax+1D0]
00428F09   .  5A            pop     edx
00428F0A   .  8BCA          mov     ecx, edx
00428F0C   .  99            cdq
00428F0D   .  F7F9          idiv    ecx
00428F0F   .  8B55 FC       mov     edx, [ebp-4]
00428F12   .  8982 C8010000 mov     [edx+1C8], eax
00428F18   .  33C0          xor     eax, eax
00428F1A   .  5A            pop     edx
00428F1B   .  59            pop     ecx

来看 xor eax, 9D8280E1 , 源码为 InputSN div (CheckSum xor $9d8280e1)
**这里的 InputSN 若改成 123 , 追码的难度会再提高
CheckSum xor $9d8280e1 应为 0, 让他产生除零例外, 下列是源码:

    try
      Temp:= InputSN div (CheckSum xor $9d8280e1);
    except
      i:= $F9EDEFA6 xor CheckSum;
      str:= 解出 'Good'
      Application.MessageBox(str','',MB_OK);
    end;

所以若 CheckSum 错误, 这 OnClick 会直接离开.

有没有注意到这用的是 Delphi 的 Application.MessageBox
而程序里到处可见的字符串显示用的则是 ShowMessage
成功的推掉了 14楼用的找全部Caller 的破解.

大家习惯用OD, 会导致引发Target的 OnPaint 事件
我在 Form.OnPaint 事件写了 (函式头为00429530)
  CheckSum:= 0;
  p:= TFORM1.sbReg_MouseUp;
  for i=0 to 190h 
    CheckSum= CheckSum + P^[i];
  
亦即由 OnMouseUp 函式起, len=190h*4, 之总合
(若用 Timer 来算Checksum则太明显了)

相信大家都在 OnMouseUp 里设了不少软件断点, 这里应是最多人设的 :
   0042927F   3B82 D4010000 cmp   eax, [edx+1D4]

软件断点将 3B 改成了 CC, 所以Checksum一定不对
OnClick事件里不可能除零, 而是直接离开.
达到了"正确的注册码无效"的目的, 让Cracker往其它地方去研究.

上面说:  **这里的 InputSN 若改成 123 , 追码的难度会再提高
因为若你有 bpmr InputSN 的话, 在注册码正确的情况下, 至少可断下来
若改成 123 , 就算有 bpmr InputSN 也没用了.
这CM的重点不是例外也不是自我校验而是一种antiCracker心态的手段

请直接执行 Crackme.exe 或拿掉 OD的断点, 试试吧. 其实你早追到注册码了.
这个CM用这个很温柔的手段来保护.
还有很多很BT的手段, 以后有时间再写给大家玩玩.
2008-9-19 17:36
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
21
请问一下大大...
你是试了直接执行 exe 才发现注册号原来是可以用的
还是你没设软体断点 ? 还是你用 SoftICE ?

因为你没提到OnPaint的自我校验+OnClick接头
2008-9-19 19:25
0
雪    币: 358
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
刚学破解两天。玩这个crackme时
有个问题不太明白。

第一个异常处理 是整数异常。

可异常处理程序地址  明明是 0042929e
为什么 在004292A3 也可以断下来?
而0042929e 却是一个大大的跳转 一下跳到上面好远。
并且 只有断到004292A3 才是正确的

不然 要是断到这里0042929e   就不知道走到什么地方了 感觉不是异常处理程序啊。

还有 第二个异常 就是除0那个异常

我看到 异常处理程序地址是00429321

可 00429321     JMP Crackme.00402D8C
还是一个大的跳转

正确的应该是断到下面一点

00429321   .^\E9 669AFDFF   JMP Crackme.00402D8C
00429326      02            DB 02
00429327      00            DB 00
00429328      00            DB 00
00429329      00            DB 00
0042932A   .  9C4E4000      DD Crackme.00404E9C
0042932E   .  3A934200      DD Crackme.0042933A
00429332      00            DB 00
00429333      00            DB 00
00429334      00            DB 00
00429335      00            DB 00
00429336   .  76934200      DD Crackme.00429376
0042933A   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]

也就是断到0042933a才是真的异常处理程序。

请问这是怎么回事????
2008-9-19 20:56
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
23
很多高阶语言都这样
他们会先接管例外做些判断处理再分配到你写的code
2008-9-19 21:48
0
雪    币: 2316
活跃值: (129)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
24
啊!session的crackme,支持下。漏过了。
学习下。
2008-9-19 22:04
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
25
虽然在别帖拜过了.
这帖再膜拜一下楼上开始走国际路线
2008-9-19 22:07
0
游客
登录 | 注册 方可回帖
返回
//