【文章标题】: echap511破文
【文章作者】: xitian
【作者邮箱】: luotuo512@163.com
【作者主页】: hi.baidu.com\luotuo512
【作者QQ号】: 253269872
【软件名称】: echap511
【软件大小】: 4k
【下载地址】: 自己搜索下载
【加壳方式】: 无
【保护方式】: 序列号
【编写语言】: masm
【使用工具】: OD 计算器
【操作平台】: winxp sp2
【软件介绍】: 《加密解密》后附带的习题
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
找到关键子函数如下
004010C9 /$ 56 PUSH ESI ; echap511.00401041
004010CA |. 57 PUSH EDI
004010CB |. 51 PUSH ECX
004010CC |. 33F6 XOR ESI,ESI
004010CE |. 33FF XOR EDI,EDI
004010D0 |. B9 08000000 MOV ECX,8
004010D5 |. BE 44304000 MOV ESI,echap511.00403044 ; ASCII "123456"
004010DA |> 8036 32 /XOR BYTE PTR DS:[ESI],32
004010DD |. 46 |INC ESI
004010DE |.^ E2 FA \LOOPD SHORT echap511.004010DA
004010E0 |. BE 44304000 MOV ESI,echap511.00403044 ; ASCII "123456"
004010E5 |. B9 04000000 MOV ECX,4
004010EA |> 8A06 /MOV AL,BYTE PTR DS:[ESI]
004010EC |. 8A5E 01 |MOV BL,BYTE PTR DS:[ESI+1]
004010EF |. 32C3 |XOR AL,BL
004010F1 |. 8887 4C304000 |MOV BYTE PTR DS:[EDI+40304C],AL
004010F7 |. 83C6 02 |ADD ESI,2
004010FA |. 47 |INC EDI
004010FB |.^ E2 ED \LOOPD SHORT echap511.004010EA
004010FD |. BE 4C304000 MOV ESI,echap511.0040304C
00401102 |. 8A06 MOV AL,BYTE PTR DS:[ESI]
00401104 |. 8A5E 01 MOV BL,BYTE PTR DS:[ESI+1]
00401107 |. 32C3 XOR AL,BL
00401109 |. 8A5E 02 MOV BL,BYTE PTR DS:[ESI+2]
0040110C |. 8A4E 03 MOV CL,BYTE PTR DS:[ESI+3]
0040110F |. 32D9 XOR BL,CL
00401111 |. 32C3 XOR AL,BL
00401113 |. B9 08000000 MOV ECX,8
00401118 |. BE 44304000 MOV ESI,echap511.00403044 ; ASCII "123456"
0040111D |> 3006 /XOR BYTE PTR DS:[ESI],AL
0040111F |. 46 |INC ESI
00401120 |.^ E2 FB \LOOPD SHORT echap511.0040111D
00401122 |. B9 08000000 MOV ECX,8
00401127 |. BE 44304000 MOV ESI,echap511.00403044 ; ASCII "123456"
0040112C |. BF 08304000 MOV EDI,echap511.00403008
00401131 |> 8A06 /MOV AL,BYTE PTR DS:[ESI]
00401133 |. 3A07 |CMP AL,BYTE PTR DS:[EDI]
00401135 |. 75 1D |JNZ SHORT echap511.00401154
00401137 |. 46 |INC ESI
00401138 |. 47 |INC EDI
00401139 |.^ E2 F6 \LOOPD SHORT echap511.00401131
0040113B |. 6A 40 PUSH 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
0040113D |. 68 35304000 PUSH echap511.00403035 ; |Title = "Crackme 1.0"
00401142 |. 68 10304000 PUSH echap511.00403010 ; |Text = "Good Work Cracker"
00401147 |. FF35 54304000 PUSH DWORD PTR DS:[403054] ; |hOwner = 00010430 ('Pusillus Crackme
1.0',class='#32770')
0040114D |. E8 3C000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
00401152 |. EB 17 JMP SHORT echap511.0040116B
00401154 |> 6A 30 PUSH 30 ; /Style =
MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
00401156 |. 68 35304000 PUSH echap511.00403035 ; |Title = "Crackme 1.0"
0040115B |. 68 22304000 PUSH echap511.00403022 ; |Text = "Bad Serial, Sorry!"
00401160 |. FF35 54304000 PUSH DWORD PTR DS:[403054] ; |hOwner = 00010430 ('Pusillus Crackme
1.0',class='#32770')
00401166 |. E8 23000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
0040116B |> 5F POP EDI
0040116C |. 5E POP ESI
0040116D |. 59 POP ECX
0040116E \. C3 RETN
观察可以发现,输入的最好是8个字符,虽然输入少于8个多于8个都不会报错,多于8个时缓冲区里只能存9个字符。所以这个crackme有多个序列号。只要前八个正确即可。
计算过程:
输入12345678即 31 32 33 34 35 36 37 38 字符串1
每个字符与32异或得到03 00 01 06 07 04 05 0A 字符串2
这八个字符按顺序两两异或得到03 07 03 0F 字符串3
这四个字符两两异或得到04 0c分别放入al和bl中。
al和bl异或得到08放入al中
al与字符串2中的每个字符异或得到0B 08 09 0E 0F 0C 0D 02 字符串4
程序中有静态字符串 71 18 59 1B 79 42 45 4C 字符串5
字符串4与字符串5比较,不等,失败。
写注册机过程:
我还真是不会写,我在网上找了一下,找到了这个。
#include
void main()
{
char middle_1[4];
char middle_2[2];
char b[8]={0x71,0x18,0x59,0x1B,0x79,0x42,0x45,0x4C} ;
middle_1[0]=b[0]^b[1];
middle_1[1]=b[2]^b[3];
middle_1[2]=b[4]^b[5];
middle_1[3]=b[6]^b[7];
cout<<middle_1[0]<<middle_1[1]<<middle_1[2]<<middle_1[3]<<endl;
middle_2[0]=middle_1[0]^middle_1[1];
middle_2[1]=middle_1[2]^middle_1[3];
char al=middle_2[0]^middle_2[1];
cout<<al<<endl;
for(int i=0;i<=8;i++)
{
b[i]=b[i]^al;
b[i]=b[i]^0x32;
cout<<b[i]<<' ';
}
}
可是我怎么都看不懂,怎么办,加密过程我已经分析出来了,解密不就是加密的逆过程吗,能难倒我吗?
一步一步来吧。设正确序列号为a1a2……a8.数据块中的静态字符串为c1c2……c8,al即计算过程中al的字符。
字符串c已知,求字符串a。这不就解方程吗。九个方程,九个未知数,可解。
解法:
首先要了解异或算符的特点。
任何数与其自身异或:结果为0;
任何数与 1 异或:求反;
任何数与 0 异或:保持不变。
异或运算可以将指定位求反而不影响其它位。
异或运算可用于判断两个操作数是否相等
异或运算可用于将数据清零。
字符1与字符2异或,然后再与字符2异或,可以还原成字符1.
异或符合分配律,交换律,结合律。
根据以上性质,第九个方程中32为8个,所以 式1
方程1可以写为: 式2
代入上一个方程为: 式4
字符串c为71 18 59 1B 79 42 45 4C
所以al=19.
代入前八个方程得字符串a为:5A 33 72 30 52 69 6E 67
以上是字符串的asc码,还原为字符即:式3
Z3r0Ring
验证正确。
现在搞清楚了原理,我可以开始写注册机了。
把上面那个程序改进了一下。
#include <stdio.h>
#include <conio.h>
void main()
{
int i;
char c[8]={0x71,0x18,0x59,0x1B,0x79,0x42,0x45,0x4C};
char a[8];
char b=0;
for(i=0;i<8;i++)
b^=c[i];
for(i=0;i<8;i++)
{
a[i]=c[i]^b^0x32;
printf("%c",a[i]);
}
getch();
}
写的过程中犯了一个错误,a[i]=c[i]^b^0x32;,我写成了a[i]=c[i]^b^32,debug了好几遍才发现这个错误,真是惭愧惭愧。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2008年06月08日 0:43:53
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课