能力值:
( LV6,RANK:90 )
|
-
-
2 楼
怎么一点check it就出错了啊?有长度限制还是防破解措施?
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
能不能告诉一下注册成功是什么样子?
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
经过我的分析,终于发现原来作者是自定义WIN消息来计算注册码的。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
弹出正确提示,
验证很简单的,几乎没有固定算法,正好大家练练手,同时也是互相提高
|
能力值:
( LV9,RANK:180 )
|
-
-
6 楼
06AL0C0506
|
能力值:
( LV13,RANK:760 )
|
-
-
7 楼
凌晨两点多了还能爬,真是精力过人啊!
|
能力值:
( LV9,RANK:180 )
|
-
-
8 楼
我妈叫我做完这题再睡觉
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
和我自己调试的CODE,一模一样
|
能力值:
( LV9,RANK:180 )
|
-
-
10 楼
结拜吧. 你当老大.
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
S 大 技术牛,为人还挺风趣幽默的
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
晕了,不知道为什么我的OD里没有显示“YOU ARE RIGHT”
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
因为代码段没有显示调用这个数据的地址,所以你通过串参考是找不到的。
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
有sendmessage就是自定义消息吗,能多提示一点这个creakme的破解过程吗?
|
能力值:
(RANK:860 )
|
-
-
15 楼
我提示一点
004011B4 . 8D85 00FFFFFF lea eax, dword ptr [ebp-100]
004011BA . 66:8B18 mov bx, word ptr [eax]
004011BD . 2AFB sub bh, bl
004011BF . 0FB6DF movzx ebx, bh
004011C2 . 81C3 BD070000 add ebx, 7BD
004011C8 . A3 1E314000 mov dword ptr [40311E], eax
004011CD . C705 1A314000>mov dword ptr [40311A], 0
004011D7 . 891D 16314000 mov dword ptr [403116], ebx
004011DD . 8B5D 08 mov ebx, dword ptr [ebp+8]
004011E0 . 891D 12314000 mov dword ptr [403112], ebx
004011E6 . 68 57134000 push 00401357
004011EB . 40 inc eax
004011EC . 40 inc eax
004011ED . A3 1E314000 mov dword ptr [40311E], eax
004011F2 . 66:8B18 mov bx, word ptr [eax]
004011F5 . 2AFB sub bh, bl
004011F7 . 0F8F 96010000 jg 00401393
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
已经找到这里了,这里好像就是把第3位和第4位做个比较,再跳转嘛!
|
能力值:
( LV8,RANK:130 )
|
-
-
17 楼
win32 啊.....
|
能力值:
( LV4,RANK:50 )
|
-
-
18 楼
注册码:17bm6806
前面两个比较必须是
先发送msg==7c3,再发送msg==7b8 (因为可见字符十六进制大小加减限制)
过了这两个message比较,后面会算出一个you are right 字符串的偏移,之后就可以直接发送msg==744,然后弹成功对话框了
注册码长度也是可变的,可以最短8个字符~~
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
太牛了,你的注册码直接让程序崩溃了!
|
能力值:
( LV4,RANK:50 )
|
-
-
20 楼
不好意思,刚才计算有误,已经改过来了
注册码可以是
17bm6806 06al6806 28CN68AG 等等等~~~
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
还是很牛啊,稍微写一下破解过程吧!!
|
能力值:
( LV4,RANK:50 )
|
-
-
22 楼
我用的比较笨的方法,程序刚开始获取函数地址等全部无视
1.
直接来到这里:
00401558 . 6A 00 push 0 ; /lParam = NULL
0040155A . 68 5B114000 push 0040115B ; |DlgProc = CrackMe_.0040115B
0040155F . 6A 00 push 0 ; |hOwner = NULL
00401561 . 68 E8030000 push 3E8 ; |pTemplate = 3E8
00401566 . FF35 00304000 push dword ptr [403000] ; |hInst = NULL
0040156C . E8 01000000 call <jmp.&user32.DialogBoxParamA> ; \DialogBoxParamA
这里可以得到对话框消息处理过程地址:0040115B
2.
再看点击按钮处的代码
0040116A . 3D 11010000 cmp eax, 111 ; Switch (cases 10..7C3)
0040116F . 0F85 92000000 jnz 00401207
00401175 . 8B45 08 mov eax, dword ptr [ebp+8] ; Case 111 of switch 0040116A
00401178 . A3 B0304000 mov dword ptr [4030B0], eax
0040117D . 8B45 10 mov eax, dword ptr [ebp+10]
00401180 . 66:3D EC03 cmp ax, 3EC
004011A0 . 50 push eax ; 得到输入的字符存放到局部变量[ebp-100] 012FA70
004011A1 . 68 E9030000 push 3E9
004011A6 . FF75 08 push dword ptr [ebp+8]
004011A9 . 68 B4114000 push 004011B4
004011AE .- FF25 4D304000 jmp dword ptr [40304D] ; user32.GetDlgItemTextA
004011B4 . 8D85 00FFFFFF lea eax, dword ptr [ebp-100] ; 字符串指针入eax
004011BA . 66:8B18 mov bx, word ptr [eax] ; 字符串第一个字入bx
004011BD . 2AFB sub bh, bl ; 字符串第一个字高8位减低8位,入bh
004011BF . 0FB6DF movzx ebx, bh ; bh零扩展传送ebx
004011C2 . 81C3 BD070000 add ebx, 7BD ; ebx加7bd
004011C8 . A3 1E314000 mov dword ptr [40311E], eax ; 字串指针入全局变量
004011CD . C705 1A314000>mov dword ptr [40311A], 0
004011D7 . 891D 16314000 mov dword ptr [403116], ebx ; ebx入全局变量
004011DD . 8B5D 08 mov ebx, dword ptr [ebp+8]
004011E0 . 891D 12314000 mov dword ptr [403112], ebx ; 窗口句柄入全局变量
004011E6 . 68 57134000 push 00401357
004011EB . 40 inc eax
004011EC . 40 inc eax ; eax加2.指向字串的第三个字节
004011ED . A3 1E314000 mov dword ptr [40311E], eax ; 指向字串的第三个字节指针入全局变量
004011F2 . 66:8B18 mov bx, word ptr [eax] ; 字串第二个字入bx
004011F5 . 2AFB sub bh, bl ; 字串第二个字高低字节相减入bh
004011F7 . 0F8F 96010000 jg 00401393 ; 注册码第四个字节若大于第三个字节则跳
3.
可以看到得到字符串后程序经过一些计算会向对话框发送消息,这个时候看对话框过程中会处理哪些消息,除了一些系统消息和command消息外,有以下可疑消息需要处理:
0x74a
0x7c3
0x7b8
0x744
0x745
最后试着构造相应输入的字符串能够到这些消息处理的地方,便能看出端倪~~
说了这么多也差不多了
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
原来这就是对话框事件和自定义消息。
楼上已经说得比教清楚了,我再说得具体一点,就是在注册码是8位的情况下,要求2位-1位=6,4位-3位=B,5位+6位=6E,8位-7位=6。
谢谢楼上的各位,特别是blackwhite对我的提示!!
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
处理流程:1.bp dispatchmessagew函数,设条件断点[[esp+4]+4]==WM_LBUTTONUP,拦截鼠标单击消息(虽然程序里用了牛逼的方法隐藏函数调用,比如sendmessage,但是这个dispatchmessage可是没办法隐藏的,所以一下就能断到了)。
2.
00401558 . 6A 00 push 0 ; /lParam = NULL
0040155A . 68 5B114000 push 0040115B ; |DlgProc = CrackMe_.0040115B
0040155F . 6A 00 push 0 ; |hOwner = NULL
00401561 . 68 E8030000 push 3E8 ; |pTemplate = 3E8
00401566 . FF35 00304000 push dword ptr [403000] ; |hInst = NULL
0040156C . E8 01000000 call <jmp.&user32.DialogBoxParamA> ; \DialogBoxParamA
这段代码中很明显地给出了消息处理函数的地址DlgProc = CrackMe_.0040115B
3.来到0040115B处,经过几次的消息拦截,感觉到WM_COMMAND,即消息号为111h的消息就是处理注册码验证的消息,跟下去,验证算法应该就有了,具体是如何的俺没分析
请高手指正:)
|
能力值:
( LV2,RANK:10 )
|
-
-
25 楼
agal7<7<ag
从消息7BD开始,接下来消息分别是7C3,7B8,745,74A,744
构造字符串走以上的顺序即可。
|
|
|