能力值:
( LV9,RANK:180 )
2 楼
9/18 2:00前下载的人请重下, 有超级大bug.
能力值:
( LV2,RANK:10 )
4 楼
观战。。。。。
能力值:
( LV8,RANK:130 )
7 楼
感觉有些地方是阴人的~~
楼主给出一组正确的来参考一下
能力值:
(RANK:300 )
10 楼
没有明白,等楼主分析了!
user:beijihu
sn :7356257
输入这样的字符会没有提示!不管是对还是错都不知道! 应该属于是失败了吧!前面几位是改跳转的!
分析出一个简单算法!但是可能不是真的!
for(i=0;i<strlen(username);i++)
sum+=(int)username[i]*(0x270F-(i+1));
估计被楼主耍了!呵呵!
能力值:
( 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断下来。此时估计断点是到位了。
后面跑了三次,无功而返,算法偶功力还差的远,不过连爆破点都没找见,就有点那个......
能力值:
( LV9,RANK:180 )
15 楼
无Hook , 无加花
标准Compiler , 标准程序
能力值:
(RANK:210 )
17 楼
if(a)
if(aa)
if(aaa)
...
Good
else if(b)
if(bb)
if(bbb)
...
Good
...
...
...
Error
不知道对不对
能力值:
( LV9,RANK:180 )
18 楼
不懂你的意思.
你是说注册码要输入多次吗? (这会被人揍吧)
不需要, 跟一般的CM一样.
能力值:
( 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的手段, 以后有时间再写给大家玩玩.
能力值:
( LV9,RANK:180 )
21 楼
请问一下大大...
你是试了直接执行 exe 才发现注册号原来是可以用的
还是你没设软体断点 ? 还是你用 SoftICE ?
因为你没提到OnPaint的自我校验+OnClick接头
能力值:
( 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才是真的异常处理程序。
请问这是怎么回事????