能力值:
( LV2,RANK:10 )
4 楼
跳过退出程序后 出错 进入异常处理链 最后
1.eax=0
2.eax=1
3.未知
不是出错就是死循环 望高手解惑
能力值:
( LV13,RANK:260 )
5 楼
现提供一组:
00000000
BC@ANOLM
互相学习。。。菜菜刚来看雪。。。
能力值:
( LV3,RANK:20 )
6 楼
我直接从按钮点击开始把所有的call跟了一遍,
还好算法不太复杂,就是把序列号和密码都加密然后比较,
今天学校网速相当的慢,打开看雪论坛都用了十多分钟
#include <stdio.h>
#include <conio.h>
/******************************************
第一个加密函数,用于加密序列号
输入参数a:依次取序列号各位字母大写的ASCII编码
输出为ASCII编码
*******************************************/
int func1(int a)
{
int result = 1;
for(int i=0;i<27;i++)
{
result*=a;
result=result%182;
}
return result;
}
/*********************************************
第二个加密函数,用于加密密码,由于是异或,
所以加密跟解密是一样的
输入和输出均为ASCII编码
*********************************************/
int func2(int b)
{
int s;
static int i=0;
s=52+i;
b=s^b;
i++;
return b;
}
int main()
{
/*序列号和密码均为8位,这里随便取序列号为bbbbbbbb,对应ASCII编码为66*/
printf("bbbbbbbb对应的密码为:\n");
for(int i=0;i<8;i++)
{
int t=66;
int asc=func2(func1(t));
putchar(asc);
}
//输出结果密码为BC@ANOLM
getch();
return 0;
}
能力值:
( LV13,RANK:260 )
7 楼
不错哈。。。。不一定为8位。。大于8位的都可以的。。。你们学校网速还能打开看雪,我这边都打不开。。呵呵。。
能力值:
( LV3,RANK:20 )
8 楼
刚准备写写,发现注册已经被人写了。过几天看看
能力值:
( LV2,RANK:10 )
9 楼
没办法,只看过CCDebug的几篇Ollydbg的教程,目前只会爆破.....
能力值:
( LV3,RANK:20 )
10 楼
学习C写注册机。补全一下sltpgm兄的注册机
有的注册名好像注册不了的。晕!不是所有的都能注册!
#include <stdio.h> #include <conio.h> int func1(int a) { int result = 1; int i; for(i=0;i<27;i++) { result*=a; result=result%182; } return result; } int func2(int b) { int s; static int i=0; s=52+i; b=s^b; i++; return b; } int main() { int asc,i; char a[9]; puts("Name must be 8 letters!"); gets(a); printf("Code is: "); for(i=0;i<8;i++) { asc=func2(func1(a-0x20)); putchar(asc); } getch(); return 0; }
能力值:
( LV13,RANK:260 )
11 楼
不好意思 最近一直在考试。。没时间 细细看 只看了 它的那对 bbbbb。。。可以注册。。注册机没细看。。。
能力值:
( LV3,RANK:20 )
12 楼
明白fairynull的意思,
你的算法好像不能保证所有的ascii编码都是有效字符吧,就是说不是随便输入一个序列号都可以得到有效的密码的,比如41h对应字符a,77h就写不出来字符了
fairynull就添加了一个输入序列号的功能,我把算法都跟出来了,因为反正又不能对所有用户名有效所有就直接用bbbbbb了
既然有人回复就顺便说一下过程吧,
打开随便输入个密码点确定直接退出了,我开始以为是ExitProcess,后来才发现是用c语言的exit函数退出的
如果密码正确应该是弹出消息框吧,bpx MessageBoxA,只有一个,应该就是这里了
这样可以知道密码正确就弹出一个merry christmas了,然后call <_mbscmp>就是比较部分了,
00401C55 . 75 49 jnz short 00401CA0 就是关键跳了,nop掉就爆破了。。。
00401C49 . E8 F0810000 call <_mbscmp> ; 比较
00401C4E . 83C4 08 add esp, 8
00401C51 . 85C0 test eax, eax
00401C53 . 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
00401C55 . 75 49 jnz short 00401CA0 ; |
00401C57 . 68 F8C04200 push 0042C0F8 ; |good gift
00401C5C . 68 E8C04200 push 0042C0E8 ; |merry christmas
00401C61 . 6A 00 push 0 ; |hOwner = NULL
00401C63 . FF15 3C344200 call dword ptr [<&USER32.MessageBoxA>>; \MessageBoxA
爆破完成...
**************************************
再往前面就是关键算法部分了,注释当然是后来加上去的
00401C11 . E8 9A000000 call <序列号加密>
00401C16 . 51 push ecx
00401C17 . 8D56 6C lea edx, dword ptr [esi+6C]
00401C1A . 8BCC mov ecx, esp
00401C1C . 896424 14 mov dword ptr [esp+14], esp
00401C20 . 52 push edx
00401C21 . C74424 24 000>mov dword ptr [esp+24], 0
00401C29 . E8 4E620100 call <operator =>
00401C2E . 8D4424 0C lea eax, dword ptr [esp+C]
00401C32 . 8BCE mov ecx, esi
00401C34 . 50 push eax
00401C35 . E8 26010000 call <密码加密>
00401C3A . 8B4C24 08 mov ecx, dword ptr [esp+8]
00401C3E . 8B5424 0C mov edx, dword ptr [esp+C]
00401C42 . 51 push ecx
00401C43 . 52 push edx
00401C44 . C64424 24 01 mov byte ptr [esp+24], 1
00401C49 . E8 F0810000 call <_mbscmp> ; 加密后的比较 反正是小程序而且这是我第一次玩cm,就接着看看算法吧,从输入文本开始跟,可以发现获取了文本和长度,后来还有两三处验证了长度要8位以上,我当时调试是用的abcdef,不够8位,所以都直接修改0标志位了
0041D8EB |. 56 push esi ; /hWnd
0041D8EC |. FF15 10334200 call dword ptr [<&USER32.GetWindowTextLengthA>] ; \获取text长度
0041D8F2 |. 8D48 01 lea ecx, dword ptr [eax+1]
0041D8F5 |. 51 push ecx
0041D8F6 |. 8B4D 10 mov ecx, dword ptr [ebp+10]
0041D8F9 |. 50 push eax
0041D8FA >|. E8 2CAAFFFF call 0041832B ; GetBufferSetLength
0041D8FF |. 50 push eax ; |Buffer
0041D900 |. 56 push esi ; |hWnd
0041D901 |. FF15 14334200 call dword ptr [<&USER32.GetWindowTextA>] ; \GetWindowTextA 这里比较了长度,长度小于8位就exit,
00401CE0 |. 83F8 08 cmp eax, 8 ; 长度大于8
00401CE3 |. 7D 07 jge short 00401CEC
00401CE5 |. 6A 00 push 0
00401CE7 |. E8 5F800000 call 00409D4B ; exit
00401CEC |> 56 push esi
00401CED |. 33F6 xor esi, esi
00401CEF |> 8B4C24 20 mov ecx, dword ptr [esp+20]
00401CF3 |. 68 B6000000 push 0B6
00401CF8 |. 6A 1B push 1B
00401CFA |. 8A040E mov al, byte ptr [esi+ecx] ; 取一位字符
00401CFD |. 8BCF mov ecx, edi
00401CFF |. 0FBED0 movsx edx, al
00401D02 |. 52 push edx
00401D03 |. E8 98FEFFFF call <func1 > ; 运算
最后的call加密序列号的,跟进去是这样的,这个很简单,我就对照着翻译成了C语言,就是我写的func1
00401BA0 >/$ 8B4C24 08 mov ecx, dword ptr [esp+8]
00401BA4 |. B8 01000000 mov eax, 1
00401BA9 |. 85C9 test ecx, ecx
00401BAB |. 7E 17 jle short 00401BC4
00401BAD |. 56 push esi
00401BAE |. 8B7424 10 mov esi, dword ptr [esp+10]
00401BB2 |. 57 push edi
00401BB3 |. 8B7C24 0C mov edi, dword ptr [esp+C]
00401BB7 |> 0FAFC7 /imul eax, edi
00401BBA |. 99 |cdq
00401BBB |. F7FE |idiv esi
00401BBD |. 49 |dec ecx
00401BBE |. 8BC2 |mov eax, edx
00401BC0 |.^ 75 F5 \jnz short 00401BB7
00401BC2 |. 5F pop edi
00401BC3 |. 5E pop esi
00401BC4 \> C2 0C00 retn 0C
后面不远处又有看到了密码的加密,感觉算法也跟上面差不多,就是一个循环,C语言表示就是我写的func2
00401D97 |> 8B4C24 1C mov ecx, dword ptr [esp+1C]
00401D9B |. |8AD3 mov dl, bl
00401D9D |. |80C2 34 add dl, 34
00401DA0 |. |8A040B mov al, byte ptr [ebx+ecx] ; 逐位取密码
00401DA3 |. |8D4C24 1C lea ecx, dword ptr [esp+1C]
00401DA7 |. |32D0 xor dl, al ; 与34h+dl异或
2个加密算法都出来了,这样就破解完了,
******************************************
把绝大部分的call我都给分析出来了,
就00401DD8 |. E8 2A630100 call 00418107
这个call没弄明白是什么,而且出现了多次,我觉得可能是个mfc的函数吧,可是在mfc的源码里面看了看都不像,大概作用是返回字符串的地址
00418107 <C>/$ 56 push esi
00418108 |. 8BF1 mov esi, ecx
0041810A |. 8B06 mov eax, dword ptr [esi]
0041810C |. 8D48 F4 lea ecx, dword ptr [eax-C]
0041810F |. 3B0D 7CC44200 cmp ecx, dword ptr [42C47C] ; cmp ecx,0xffffff
00418115 |. 74 18 je short 0041812F
00418117 |. 83C0 F4 add eax, -0C
0041811A |. 50 push eax ; /pVar
0041811B |. FF15 2C324200 call dword ptr [<&KERNEL32.InterlockedDecrement>] ; \InterlockedDecrement
00418121 |. 85C0 test eax, eax
00418123 |. 7F 0A jg short 0041812F
00418125 |. 8B0E mov ecx, dword ptr [esi]
00418127 |. 83E9 0C sub ecx, 0C
0041812A |. E8 C7FEFFFF call 00417FF6
0041812F |> 5E pop esi
00418130 \. C3 retn
00418131 /$ A1 78C44200 mov eax, dword ptr [42C478]
00418136 |. 53 push ebx
00418137 |. 8B5C24 08 mov ebx, dword ptr [esp+8]
0041813B |. 56 push esi
0041813C |. 8BF1 mov esi, ecx
0041813E |. 57 push edi
0041813F |. 85DB test ebx, ebx
00418141 |. 8906 mov dword ptr [esi], eax
00418143 |. 74 36 je short 0041817B
00418145 |. 8BC3 mov eax, ebx
00418147 |. C1E8 10 shr eax, 10
0041814A |. 66:85C0 test ax, ax
0041814D |. 75 0B jnz short 0041815A
0041814F |. 0FB7C3 movzx eax, bx
00418152 |. 50 push eax
00418153 |. E8 1C300000 call 0041B174
00418158 |. EB 21 jmp short 0041817B
0041815A |> 53 push ebx ; /String
0041815B |. FF15 28324200 call dword ptr [<&KERNEL32.lstrlenA>] ; \lstrlenA
00418161 |. 8BF8 mov edi, eax
00418163 |. 85FF test edi, edi
00418165 |. 74 14 je short 0041817B
00418167 |. 57 push edi
00418168 |. 8BCE mov ecx, esi
0041816A |. E8 05FEFFFF call 00417F74
0041816F |. 57 push edi
00418170 |. 53 push ebx
00418171 |. FF36 push dword ptr [esi]
00418173 |. E8 D822FFFF call 0040A450
00418178 |. 83C4 0C add esp, 0C
0041817B |> 8BC6 mov eax, esi
0041817D |. 5F pop edi
0041817E |. 5E pop esi
0041817F |. 5B pop ebx
00418180 \. C2 0400 retn 4
能力值:
( LV2,RANK:10 )
14 楼
呵呵,拿来练练手