能力值:
( LV2,RANK:10 )
|
-
-
2 楼
自己顶下~~
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
不要浮躁 看到取注册名 就开始一点一点分析了 一直到比较判断
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
帖子写的很详细,不过也是很值得分析的,必须有耐心。
0046C729 . E8 02F6FFFF call 0046BD30 ; 计算
跟进call
0046BDC5 |. 8B45 E8 |mov eax, dword ptr [ebp-18] ; 三位三位取
0046BDC8 |. E8 ABC6F9FF |call 00408478 ; 792算出318
跟进CALL看怎么算出318
00402DAE |> 80EB 30 /sub bl, 30 ; 取出来的三位的第一位减30,如果是数字,比如7,ASCII值37减去30正好是7; Default case of switch 00402D83
00402DB1 |. |80FB 09 |cmp bl, 9
00402DB4 |. |77 25 |ja short 00402DDB
00402DB6 |. |39F8 |cmp eax, edi
00402DB8 |. |77 21 |ja short 00402DDB
00402DBA |. |8D0480 |lea eax, dword ptr [eax+eax*4] ; 初始eax为0
00402DBD |. |01C0 |add eax, eax ; 自身相加也就是*2
00402DBF |. |01D8 |add eax, ebx ; 与ebx相加,也就是上面的bl,具体说就是7
00402DC1 |. |8A1E |mov bl, byte ptr [esi] ; 取出来的三位的第二位放入bl
00402DC3 |. |46 |inc esi
00402DC4 |. |84DB |test bl, bl
00402DC6 |.^\75 E6 \jnz short 00402DAE ; 跳上去循环
这样就是帖子上的了
第一次(0+0*4)*2+7=7
第二次(7+7*4)*2+9=4F
第三次(4F+4F*4)*2+2=318
运算出call,到
0046BDF0 |. 3345 E0 |xor eax, dword ptr [ebp-20] ; 算出的318与b的ASCII值XOR
0046BDF3 |. 8945 DC |mov dword ptr [ebp-24], eax ; 37A
其余的一样,
第一次是用户名密码计算,然后在下面与zzh比较
0046C729 . E8 02F6FFFF call 0046BD30 ; 计算
0046C766 . BA 38CA4600 mov edx, 0046CA38 ; zzh
0046C76B . E8 147DF9FF call 00404484 ;比较
第二次是序列号密码计算,然后在下面与序列号比较
0046C7BB . E8 70F5FFFF call 0046BD30 ; 计算
0046C7DA . 8B55 C4 mov edx, dword ptr [ebp-3C] ; 序列号放入
0046C7DE . E8 A17CF9FF call 00404484 ;序列号密码计算结果与序列号比较
其实唯一的困难就是怎么确定是哪三个数运算完末两位符合要求
倒推能推出末两位,但是三个数要算出来末两位和要求的还得稍微分析找出规律,希望对你有帮助。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
取到用户名会存放到内存中
对该段内存下访问断点
总会跟到算法的地方去
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
哈哈,,谢谢了,,在看雪真的是获益匪浅哦
|
|
|