能力值:
( LV2,RANK:10 )
|
-
-
2 楼
补充,这是我的
dzhsurf
[RGGU=M@<=GE<11?e7hde1/dYY)O_RNOYWNCCQ9I<8
设计加密算法真的真的很困难,现在这个,有些user是不存在对应的code的 = =
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
算法太长了,俺看着看着头晕了,先爆一个。。。。。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
左下角名字不对哦~貌似还有两个关键跳。
|
能力值:
( LV13,RANK:760 )
|
-
-
5 楼
算法搞得很繁复,其实一化简,也就很简单了
|
能力值:
( LV4,RANK:50 )
|
-
-
6 楼
00401588 . 8B15 44204100 mov edx, dword ptr [412044]
0040158E . 83C4 08 add esp, 8 ; 在栈中抛去空闲空间,大小为8字节(如EAX为双字,4字节)
00401591 . 8BF8 mov edi, eax ; EDI=0x3B1EC8
00401593 . 56 push esi ; /0x7进栈
00401594 . 57 push edi ; |0x3B1EC8进栈
00401595 . 52 push edx ; |0x1505DC进栈
00401596 . 897C24 24 mov dword ptr [esp+24], edi ; |
0040159A . FF15 D4D04000 call dword ptr [<&USER32.GetWindowTextA>] ; \GetWindowTextA
004015A0 . 33C0 xor eax, eax ; EAX=0,CF=0 //自身xor运算结果为0,CF=0
004015A2 . 85F6 test esi, esi ; ZF=0 //0x7&0x7=0x7
004015A4 . 7E 11 jle short 004015B7 ; 不跳 //ZF=0;当比较结果是小于或等于时,才跳
004015A6 > 8A4C24 1C mov cl, byte ptr [esp+1C]
004015AA . 8A1C38 mov bl, byte ptr [eax+edi]
004015AD . 02D9 add bl, cl ; BL=0xFB //BL=0x6B+0x90
004015AF . 881C38 mov byte ptr [eax+edi], bl
004015B2 . 40 inc eax ; EAX=(0x0)++
004015B3 . 3BC6 cmp eax, esi ; ZF=0 //EAX=0x1,ESI=0x7
004015B5 .^ 7C EF jl short 004015A6 ; 跳到004015A6 //ZF=0,SF!=OF
004015B7 > 55 push ebp ; 0x3B0800进栈
004015B8 . E8 941F0000 call 00403551 ; 程序内部调用函数 403551
004015BD . 8B5424 34 mov edx, dword ptr [esp+34]
004015C1 . 8B4424 30 mov eax, dword ptr [esp+30]
004015C5 . 83C4 04 add esp, 4 ; 在栈中抛去空闲空间,大小为4字节(如EAX为双字,4字节)
004015C8 . 8BEA mov ebp, edx ; EBP=0x3B1F98
004015CA > 8A18 mov bl, byte ptr [eax]
004015CC . 8ACB mov cl, bl ; CL=0x4E
004015CE . 3A5D 00 cmp bl, byte ptr [ebp]
004015D1 . 75 1C jnz short 004015EF ; 跳到004015EF //ZF=0
004015D3 . 84C9 test cl, cl
004015D5 . 74 14 je short 004015EB
004015D7 . 8A58 01 mov bl, byte ptr [eax+1]
004015DA . 8ACB mov cl, bl
004015DC . 3A5D 01 cmp bl, byte ptr [ebp+1]
004015DF . 75 0E jnz short 004015EF
004015E1 . 83C0 02 add eax, 2
004015E4 . 83C5 02 add ebp, 2
004015E7 . 84C9 test cl, cl
004015E9 .^ 75 DF jnz short 004015CA
004015EB > 33C0 xor eax, eax
004015ED . EB 05 jmp short 004015F4
004015EF > 1BC0 sbb eax, eax ; EAX=0x0 //EAX=EAX-EAX-CF
004015F1 . 83D8 FF sbb eax, -1 ; EAX=0x1; //EAX=EAX+1-CF
004015F4 > 85C0 test eax, eax ; ZF=0 //0x1&0x1=0x1
004015F6 75 47 jnz short 0040163F ; 跳到0040163F //ZF=0
004015F8 . 52 push edx
004015F9 . E8 62FBFFFF call 00401160
004015FE . 83C4 04 add esp, 4
00401601 . 33C9 xor ecx, ecx
00401603 . 85F6 test esi, esi
00401605 7E 0D jle short 00401614
00401607 > 8A1439 mov dl, byte ptr [ecx+edi]
0040160A . 2AD0 sub dl, al
0040160C . 881439 mov byte ptr [ecx+edi], dl
0040160F . 41 inc ecx
00401610 . 3BCE cmp ecx, esi
00401612 .^ 7C F3 jl short 00401607
00401614 > 8B15 3C204100 mov edx, dword ptr [41203C]
0040161A . 57 push edi ; /Text
0040161B . 52 push edx ; |hWnd => 001A069C ('==============',class='Static',parent=004604D8)
0040161C . FF15 D8D04000 call dword ptr [<&USER32.SetWindowTextA>] ; \SetWindowTextA
00401622 . 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
00401624 . 68 B8F04000 push 0040F0B8 ; |tips
00401629 . 8B4424 2C mov eax, dword ptr [esp+2C] ; |
0040162D . 68 ACF04000 push 0040F0AC ; |good job!
00401632 . 50 push eax ; |hOwner
00401633 . FF15 DCD04000 call dword ptr [<&USER32.MessageBoxA>] ; \MessageBoxA
真的很头晕。。。。。。。。
|
能力值:
( LV6,RANK:90 )
|
-
-
7 楼
楼上的都是2005年的老会员了,难倒还不懂什么是越爆越衰的道理吗?每次都以爆破为荣,在编程高手眼里你是最好整的,不怕你不暴一暴你的机子就马上挂掉,现在很多外挂都是这样的。暗庄特多,爆破只有一个关键点的地方。找去来不用3分钟,有意思吗?
|
能力值:
( LV4,RANK:50 )
|
-
-
8 楼
我也觉得没意思,关键是没人指导,虽然学了那么久了,但还是云里雾里,问人家人家也不回答,很郁闷。。。。。。。。。。。
虽然是2005年注册的,但那时候啥都看不懂,真正学习这个从去年年底才开始看汇编视频。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
大侠能分析一下算法吗?
|
能力值:
( LV13,RANK:760 )
|
-
-
10 楼
我只是个菜鸟,不要这样称呼。
这是个典型的f(user)=f(code)结构,虽然设计得十分繁复,但是只要知道这一点,就行了。
对username经过一系列的变换会得到一个3Eh长度的数组,设为s,根据上面的公式,那么
f(code)=s,再对s进行逆推就能推出code了。
作者虽然以后又对user 和 code进行再次运算,但这已经不重要了,直接忽略,因为只要第一次满足等式成立,那么后面的变换无论如何变换,都可以忽略了.......
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
哪位大侠能帮忙说明一下,右下角的那个东西是怎么出来的?那是个暗柱之类的吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
爆破的话还挺简单的,算法的就不懂啦.还请高人分析下.
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
右下角哪有什么,是左下角吧。那个地方也有个比较,没办法改了他。改成自己的注册名。
|
能力值:
( LV13,RANK:760 )
|
-
-
15 楼
无所谓左下角的字串,只要流程的最开始F(user)=f(code)成立,后面的都不用管了!
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
分析得很正确
原本是这么想的,后面有段验证的是当有人尝试暴破的时候会产生除0错误的,不过写着写着自己也彻底搞糊涂了,然后乱改代码另程序可以计算出正确代码就不管事了
|
能力值:
( LV4,RANK:50 )
|
-
-
17 楼
大侠你是咋看出这个来的。。。。。。。从哪里可以看出。
|
能力值:
( LV13,RANK:760 )
|
-
-
18 楼
前面对于username的计算和对于code的计算各自对应了一个密串,从这里可以联想到这是一个等式,而后面进一步地对两个密串分别加密并在最后进行验证可以看出这是一个函数:
F(user)=f(code),所以只要前面等式成立,后面一切都可以忽略了。
简化此CM后的注册机C++原代码如下,附注册机。
const CString s1="ijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefgh";
const CString s2="ponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA9876543210zyxwvutsrq";
//s1, s2分别对应对用户名和注册码加密的密串
CString str, EncUser, code; //EncUser指对Username加密后的字串,code指正确的注册码
int nLen, i, j, nindex, nCount=0;
GetDlgItemText(IDC_EDIT1, str);
//算法化简,fmv6是前面计算出来的固定字符串,所以计算过程亦省略,直接用明码。
str = "fmv6" + str;
nLen = str.GetLength();
for(i=0; i<0x3F; i++)
{
EncUser += s1.GetAt((str.GetAt(i%nLen)+i)%0x3E);
} //将此for循环中的代码可直接放入到下面的循环中去,亦能正确得解,但是可读性将降低。
for(i=0; i<0x3F; i++) //根据加密后的username串逆向出code串
{
nindex = s2.Find(EncUser.GetAt(i), 0);
//在s2串中查找加密后的UserName串中每位字符的index
for(j=0x30; j<=0x7A; j++) //从 0-z 中计算除以0x3E 余数=nindex的字符的值
{
if (nindex == j%0x3E)
{
code += j-nCount++;
break;
}
}
}
SetDlgItemText(IDC_EDIT2, code);
|
能力值:
( LV4,RANK:50 )
|
-
-
19 楼
牛。。。。。。。。。。。。。。。。。。。谢谢。。。
|
能力值:
( LV7,RANK:110 )
|
-
-
20 楼
LZ能不能给我一份源码!??
2130292@163.com
|
能力值:
( LV13,RANK:760 )
|
-
-
21 楼
已经写出来了啊,源码,随便建立1个MFC工程,复制到BUTTON按下的消息处理函数中去就行了。
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
爆一爆啊爆一爆
|