【破解作者】 blue_devil_bomb[BCG]
【作者邮箱】 [email]ninesunnine@sina.com[/email]
【使用工具】 peid OllyDbg1.09 regsnap
【破解平台】 Win9x/NT/2000/XP
【软件名称】 我爱背单词7.0(wabdc2004)
【下载地址】 feiyue网站
【软件简介】 欢迎使用北京角斗士软件技术有限公司的著名产品《我爱背单词7.0》。经过8年七个版本的发展,《我爱背单词7.0》已经不再仅仅是个背单词软件,而是个背单词集成平台! 即使您不想在电脑前背单词,她也能帮您的大忙!可以说《我爱背单词7.0》达到了国内教学软件前所未有的高度!
【软件大小】 91.9M
【加壳方式】 未加壳
【破解声明】 不为破解而破解,只为学习而破解
--------------------------------------------------------------------------------
【破解内容】
由于本人要学习英语便在网上找到此软件,需要注册如果未注册则只能学习前10页的内容,我也想注册,可苦于囊中羞涩,不得已而为之。假如我有100万,我就不用在学习英语了,我有吗?我没有。所以我得学!假如我有100万,我真的会拿出我的钱来注册,我有吗?我没有。所以我没掏钱去注册!
敢问路在何?路在破解!!
闲话不扯,只入主题。我们输入试炼码(10位)注册下断在028a685d处,Why?why?why?你或许会问为什么要设断点于此呢?笨呀!只需要下端点到对话框弹出的常用端点(此处设.rtcMsgBox ),再往上找就可以到这里了,哈哈,简单吧!还有也可以设置断点:vbaSetSystemError这样的断点来到这里!
028A685D 50 PUSH EAX ; 输入的试炼码
028A685E E8 65E3B8FD CALL wabdc200.00434BC8 ; 注册码判断函数正确注册码eax=1;否则eax=0;
028A6863 EB 08 JMP SHORT wabdc200.028A686D
028A6865 FFD3 CALL EBX
028A6867 50 PUSH EAX
028A6868 E8 13E3B8FD CALL wabdc200.00434B80
028A686D 8B3D 7C104000 MOV EDI,DWORD PTR DS:[<&MSVBVM60.__vbaSe>; VBVM60.__vbaSetSystemError
028A6873 8985 58FFFFFF MOV DWORD PTR SS:[EBP-A8],EAX ;注册成功标志,1成功,0未成功
028A6879 FFD7 CALL EDI
028A687B 8B4D E0 MOV ECX,DWORD PTR SS:[EBP-20] ;试炼码存入ECX
028A687E 8D46 4C LEA EAX,DWORD PTR DS:[ESI+4C]
028A6881 51 PUSH ECX
028A6882 50 PUSH EAX
028A6883 FF15 80114000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrTo>; MSVBVM60.__vbaStrToUnicode
028A6889 8D4D E0 LEA ECX,DWORD PTR SS:[EBP-20]
028A688C FF15 D4124000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeS>; MSVBVM60.__vbaFreeStr
028A6892 8B85 58FFFFFF MOV EAX,DWORD PTR SS:[EBP-A8] ;判断注册成功与否重要条件
028A6898 85C0 TEST EAX,EAX
028A689A 75 28 JNZ SHORT wabdc200.028A68C4 ;eax=0不转,
028A689C B9 04000280 MOV ECX,80020004
028A68A1 B8 0A000000 MOV EAX,0A
028A68A6 894D A4 MOV DWORD PTR SS:[EBP-5C],ECX
028A68A9 8945 9C MOV DWORD PTR SS:[EBP-64],EAX
028A68AC 894D B4 MOV DWORD PTR SS:[EBP-4C],ECX
028A68AF 8945 AC MOV DWORD PTR SS:[EBP-54],EAX
028A68B2 894D C4 MOV DWORD PTR SS:[EBP-3C],ECX
028A68B5 8945 BC MOV DWORD PTR SS:[EBP-44],EAX
028A68B8 C745 94 3CDD4300 MOV DWORD PTR SS:[EBP-6C],wabdc200.0043D>
028A68BF E9 2A010000 JMP wabdc200.028A69EE ;跳到注册失败提示框
028A68C4 E8 53E5B8FD CALL wabdc200.00434E1C
028A68C9 FFD7 CALL EDI
028A68CB 8B46 40 MOV EAX,DWORD PTR DS:[ESI+40] ;试炼码放入EAX
028A68CE 50 PUSH EAX
028A68CF 8985 3CFFFFFF MOV DWORD PTR SS:[EBP-C4],EAX
028A68D5 FF15 D8124000 CALL DWORD PTR DS:[<&MSVBVM60.#581>] ; MSVBVM60.rtcR8ValFromBstr
028A68DB 8B0D C0E39002 MOV ECX,DWORD PTR DS:[290E3C0]
028A68E1 83EC 08 SUB ESP,8
028A68E4 8D55 E0 LEA EDX,DWORD PTR SS:[EBP-20]
028A68E7 DD1C24 FSTP QWORD PTR SS:[ESP]
028A68EA 51 PUSH ECX
028A68EB 52 PUSH EDX
028A68EC FFD3 CALL EBX
028A68EE 50 PUSH EAX
028A68EF E8 ACDEB8FD CALL wabdc200.004347A0 ;调用VcGetDiskSerialInt注册码与硬盘序列号的运算.及其它一些运算来改变EAX的值
028A68F4 8985 58FFFFFF MOV DWORD PTR SS:[EBP-A8],EAX ;又一次判断的标志
028A68FA FFD7 CALL EDI
028A68FC 8B45 E0 MOV EAX,DWORD PTR SS:[EBP-20]
028A68FF 50 PUSH EAX
028A6900 68 C0E39002 PUSH wabdc200.0290E3C0
028A6905 FF15 80114000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrTo>; MSVBVM60.__vbaStrToUnicode
028A690B 8D4D E0 LEA ECX,DWORD PTR SS:[EBP-20]
028A690E FF15 D4124000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeS>; MSVBVM60.__vbaFreeStr
028A6914 8B85 58FFFFFF MOV EAX,DWORD PTR SS:[EBP-A8] ;此处改为MOV EAX,1即可达到成功爆破.
028A691A 33C9 XOR ECX,ECX
028A691C 83F8 FF CMP EAX,-1 ;比较判断
028A691F 0F95C1 SETNE CL ;eax不等于-1注册成功
028A6922 F7D9 NEG ECX
028A6924 66:85C9 TEST CX,CX
028A6927 0F84 77010000 JE wabdc200.028A6AA4 ;
028A692D C705 0CE49002 22>MOV DWORD PTR DS:[290E40C],34ED22
028A6937 E8 28E5B8FD CALL wabdc200.00434E64
028A693C FFD7 CALL EDI
028A693E 8B76 48 MOV ESI,DWORD PTR DS:[ESI+48]
028A6941 85F6 TEST ESI,ESI
028A6943 75 14 JNZ SHORT wabdc200.028A6959
028A6945 6A 01 PUSH 1
10004020 > 83EC 28 SUB ESP,28
10004023 83C9 FF OR ECX,FFFFFFFF
10004026 33C0 XOR EAX,EAX
10004028 53 PUSH EBX
10004029 55 PUSH EBP
1000402A 56 PUSH ESI
1000402B 8B7424 38 MOV ESI,DWORD PTR SS:[ESP+38]
1000402F 57 PUSH EDI
10004030 8BFE MOV EDI,ESI
10004032 F2:AE REPNE SCAS BYTE PTR ES:[EDI]
10004034 F7D1 NOT ECX
10004036 49 DEC ECX ;试炼码长度:
10004037 83F9 0A CMP ECX,0A ;试炼码长度与A比较
1000403A 74 0C JE SHORT gwcomm20.10004048 ;相等成功进行试炼码运算,否则错误长度提示框
1000403C 5F POP EDI
1000403D 5E POP ESI
1000403E 5D POP EBP
1000403F 33C0 XOR EAX,EAX
10004041 5B POP EBX
10004042 83C4 28 ADD ESP,28
10004045 C2 0400 RETN 4
10004048 33C9 XOR ECX,ECX
检验试炼码有效性的重要函数
10004048 33C9 XOR ECX,ECX ;置循环起点为0
1000404A 8D5424 10 LEA EDX,DWORD PTR SS:[ESP+10]
1000404E 0FBE0431 MOVSX EAX,BYTE PTR DS:[ECX+ESI] ;第ECX个试炼油码
10004052 83C0 D0 ADD EAX,-30
10004055 85C0 TEST EAX,EAX ;第ECX个试炼油码是大于0的数吗?
10004057 8902 MOV DWORD PTR DS:[EDX],EAX
10004059 ^7C E1 JL SHORT gwcomm20.1000403C
1000405B 83F8 09 CMP EAX,9
1000405E ^7F DC JG SHORT gwcomm20.1000403C ;第ECX个试炼油码是小于9的数吗?
10004060 41 INC ECX ;ECX++取下一个试炼码的指针
10004061 83C2 04 ADD EDX,4
10004064 83F9 0A CMP ECX,0A
10004067 ^7C E5 JL SHORT gwcomm20.1000404E
10004069 8B5C24 2C MOV EBX,DWORD PTR SS:[ESP+2C]
1000406D 8B7C24 28 MOV EDI,DWORD PTR SS:[ESP+28]
10004071 33F6 XOR ESI,ESI ;ESI=0;
10004073 33C9 XOR ECX,ECX ;ecx=0;
10004075 85C9 TEST ECX,ECX
10004077 7E 41 JLE SHORT gwcomm20.100040BA
10004079 83F9 07 CMP ECX,7
1000407C 7D 3A JGE SHORT gwcomm20.100040B8
1000407E 8BC1 MOV EAX,ECX
10004080 BD 05000000 MOV EBP,5
10004085 99 CDQ ;eax的最高位为1则EDX=0xffffffff;
;eax的最高位为0则EDX=0;
10004086 F7FD IDIV EBP ;edx=eax%ebp;eax=eax/ebp;
10004088 8B7C8C 0C MOV EDI,DWORD PTR SS:[ESP+ECX*4+C];取试炼码的第ECX个数
1000408C BD 0D000000 MOV EBP,0D
10004091 8BC2 MOV EAX,EDX
10004093 0FAFC7 IMUL EAX,EDI ;乘法运算
10004096 99 CDQ
10004097 F7FD IDIV EBP
10004099 8B448C 10 MOV EAX,DWORD PTR SS:[ESP+ECX*4+10];取试炼码的第ECX+1个数
1000409D 8D4441 01 LEA EAX,DWORD PTR DS:[ECX+EAX*2+1] ;eax=ecx+eax*2+1;
100040A1 0FAFC1 IMUL EAX,ECX ;eax*=ecx;
100040A4 03D0 ADD EDX,EAX ;edx+=eax;
100040A6 8B448C 14 MOV EAX,DWORD PTR SS:[ESP+ECX*4+14];取试炼码的第ECX+2个数
100040AA 0FAFC7 IMUL EAX,EDI ;试炼码的第ECX+2个数与试炼码的第ECX个数相乘
100040AD 8B7C24 28 MOV EDI,DWORD PTR SS:[ESP+28] ;试炼码的第7个数放入EDI
100040B1 03C6 ADD EAX,ESI ;EAX+=ESI;
100040B3 8D3410 LEA ESI,DWORD PTR DS:[EAX+EDX] ;ESI=EAX+EDX;
100040B6 EB 3A JMP SHORT gwcomm20.100040F2
100040B8 85C9 TEST ECX,ECX
100040BA 75 0D JNZ SHORT gwcomm20.100040C9
100040BC 8B5424 14 MOV EDX,DWORD PTR SS:[ESP+14] ;试炼码的第2个数
100040C0 0FAF5424 10 IMUL EDX,DWORD PTR SS:[ESP+10] ;试炼码的第1个数乘以试炼码的第二个数
100040C5 03F2 ADD ESI,EDX ;将中间结果贮存到ESI
100040C7 EB 29 JMP SHORT gwcomm20.100040F2
100040C9 83F9 07 CMP ECX,7
100040CC 75 24 JNZ SHORT gwcomm20.100040F2
100040CE 8D47 02 LEA EAX,DWORD PTR DS:[EDI+2] ;EAX=EDI+2;
100040D1 BD 15000000 MOV EBP,15
100040D6 0FAFC7 IMUL EAX,EDI ;EAX*=EDI;
100040D9 99 CDQ
100040DA F7FD IDIV EBP ;EDX=EAX%EBP;EAX=EAX/EBP;
100040DC 8BC3 MOV EAX,EBX
100040DE 0FAFC3 IMUL EAX,EBX ;EAX*=EBX;
100040E1 83C0 0F ADD EAX,0F ;EAX+=0xF;
100040E4 8D2CC5 00000000 LEA EBP,DWORD PTR DS:[EAX*8] ;EBP=EAX*8;
100040EB 2BE8 SUB EBP,EAX ;EBP-=EAX(注:EBP=EAX*7)
100040ED 03EE ADD EBP,ESI ;EBP+=ESI;
100040EF 8D342A LEA ESI,DWORD PTR DS:[EDX+EBP] ;ESI=EDX+EBP;
100040F2 41 INC ECX ;ECX++进入下一次循环
100040F3 83F9 08 CMP ECX,8 ;ecx与8比较来判断循环是否终止
100040F6 ^0F8C 79FFFFFF JL gwcomm20.10004075
100040FC 8BC6 MOV EAX,ESI
100040FE 33D2 XOR EDX,EDX
10004100 B9 0A000000 MOV ECX,0A
10004105 F7F1 DIV ECX ;EDX=EAX%ECX;EAX=EAX/ECX;
10004107 395424 30 CMP DWORD PTR SS:[ESP+30],EDX ;试炼码的第9个数与EDX比较
1000410B 74 0C JE SHORT gwcomm20.10004119 ;相等则试炼码有效条件一成功
1000410D 5F POP EDI
1000410E 5E POP ESI
1000410F 5D POP EBP
10004110 33C0 XOR EAX,EAX ;试炼码无效时置EAX=0
10004112 5B POP EBX
10004113 83C4 28 ADD ESP,28
10004116 C2 0400 RETN 4
10004119 33DB XOR EBX,EBX ;EBX=0;
1000411B 33C9 XOR ECX,ECX ;ECX=0;
1000411D 895C24 3C MOV DWORD PTR SS:[ESP+3C],EBX ;贮存EBX值,带记忆的记忆值。
10004121 8D7C24 10 LEA EDI,DWORD PTR SS:[ESP+10] ;试炼码的起始地址
10004125 8B37 MOV ESI,DWORD PTR DS:[EDI] ;将EDI指向的试炼码值传送给ESI
10004127 85C9 TEST ECX,ECX ;ECX<=0吗?
10004129 7E 30 JLE SHORT gwcomm20.1000415B
1000412B 8BC1 MOV EAX,ECX
1000412D BD 05000000 MOV EBP,5
10004132 99 CDQ
10004133 F7FD IDIV EBP
10004135 BD 11000000 MOV EBP,11
1000413A 8BC2 MOV EAX,EDX
1000413C 0FAF47 FC IMUL EAX,DWORD PTR DS:[EDI-4] ;EAX乘当前试炼码的前一个试炼码
10004140 03C6 ADD EAX,ESI
10004142 0FAF77 FC IMUL ESI,DWORD PTR DS:[EDI-4] ;ESI乘当前试炼码的前一个试炼码
10004146 0FAFC1 IMUL EAX,ECX
10004149 99 CDQ
1000414A F7FD IDIV EBP
1000414C 8D41 01 LEA EAX,DWORD PTR DS:[ECX+1] ;EAX=ECX+1;
1000414F 0FAFC1 IMUL EAX,ECX
10004152 03D0 ADD EDX,EAX
10004154 03F3 ADD ESI,EBX
10004156 8D1C16 LEA EBX,DWORD PTR DS:[ESI+EDX] ;EBX=ESI+EDX;
10004159 EB 2B JMP SHORT gwcomm20.10004186
1000415B 8D140E LEA EDX,DWORD PTR DS:[ESI+ECX] ;ECX=0时运行至此:EDX=ESI+ECX;
1000415E 8BC1 MOV EAX,ECX
10004160 BB 05000000 MOV EBX,5
10004165 8D6C56 03 LEA EBP,DWORD PTR DS:[ESI+EDX*2+3];EBP=ESI+EDX*2+3
10004169 99 CDQ
1000416A 0FAFE9 IMUL EBP,ECX ;EBP*=ECX;
1000416D F7FB IDIV EBX ;EDX=EAX%EBX;EAX=EAX/EBX;
1000416F BB 0D000000 MOV EBX,0D
10004174 8BC2 MOV EAX,EDX
10004176 0FAFC6 IMUL EAX,ESI
10004179 99 CDQ
1000417A F7FB IDIV EBX
1000417C 8B5C24 3C MOV EBX,DWORD PTR SS:[ESP+3C] ;将记忆的值赋给EBX
10004180 03EA ADD EBP,EDX
10004182 2BEE SUB EBP,ESI
10004184 03DD ADD EBX,EBP
10004186 41 INC ECX
10004187 83C7 04 ADD EDI,4 ;移到下一个试炼码的起始地址
1000418A 83F9 09 CMP ECX,9
1000418D 895C24 3C MOV DWORD PTR SS:[ESP+3C],EBX ;EBX的值赋给记忆值
10004191 ^7C 92 JL SHORT gwcomm20.10004125 ;ECX<9时继续循环
10004193 8BC3 MOV EAX,EBX
10004195 33D2 XOR EDX,EDX
10004197 B9 0A000000 MOV ECX,0A
1000419C 5F POP EDI
1000419D F7F1 DIV ECX
1000419F 8B4C24 30 MOV ECX,DWORD PTR SS:[ESP+30] ;试炼码的第10个数值
100041A3 33C0 XOR EAX,EAX
100041A5 5E POP ESI
100041A6 5D POP EBP
100041A7 5B POP EBX
100041A8 3BCA CMP ECX,EDX ;试炼码的第10个数值与ECX比较
100041AA 0F94C0 SETE AL ;ECX=EDX时AL=1,否则AL=0;
100041AD 83C4 28 ADD ESP,28
100041B0 C2 0400 RETN 4
至此我们已对该软件的注册算法有了较为详细的了解,算法描述如下:
1、Zcm[10];代表10个注册码数值
2、F1(Zcm)=A;
3、Cmp(A,Zcm[8])等则转4、否则失败。
4、F2(Zcm)=B;
5、Cmp(B,Zcm[9])等则成功,否则失败。
由于算法不可逆,只能在穷尽求取注册码:算法注册机(C)
#define M 100 //一次求取有效注册码的个数
void CWabdc70Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
//m_Ctrledit1.GetWindowText(m_Vedit1);
int zcm[11],i;
m_Vedit1="";
unsigned long eax,ebx,ecx,edx,ebp,edi,esi;
unsigned j,k,l=0;
CString str;
for(j=0;j<=99999;j++)
for(k=0;k<=99999;k++)
{
str.Format("%05d%05d",j,k);
for(i=0;i<10;i++)
zcm[i]=str.GetAt(i)-'0';
ebx=zcm[7];
edi=zcm[6];
esi=0;
ecx=0;
edx=zcm[1];
edx=edx*zcm[0];
esi=esi+edx;
for(i=1;i<7;i++)
{
ecx=i;
eax=ecx;
ebp=5;
if((eax>>31&1)) edx=0xffffffff;
else edx=0;
edx=eax%ebp;
eax=eax/ebp;
edi=zcm[i-1];
ebp=0xd;
eax=edx;
eax=eax*edi;
if((eax>>31&1)) edx=0xffffffff;
else edx=0;
edx=eax%ebp;
eax=eax/ebp;
eax=zcm[i];
eax=ecx+2*eax+1;
eax=eax*ecx;
edx=edx+eax;
eax=zcm[i+1];
eax=eax*edi;
edi=zcm[6];////?
eax=eax+esi;
esi=eax+edx;
}
for(;i<8;i++)
{
ecx=i;
eax=edi+2;
ebp=0x15;
eax=eax*edi;
if((eax>>31&1)) edx=0xffffffff;
else edx=0;
edx=eax%ebp;
eax=eax/ebp;
eax=ebx;
eax=eax*ebx;
eax=eax+0xf;
ebp=eax*8;
ebp=ebp-eax;
ebp=ebp+esi;
esi=edx+ebp;
}
eax=esi;
edx=0;
ecx=0xa;
edx=eax%ecx;
eax=eax/ecx;
if(zcm[8]==edx)
{
ebx=0;
ecx=0;
unsigned save=ebx;
esi=zcm[0];
edx=zcm[0];
eax=ecx;
ebx=5;
ebp=esi+edx*2+3;
if((eax>>31&1)) edx=0xffffffff;
else edx=0;
ebp*=ecx;
edx=eax%ebx;
eax=eax/ebx;
ebx=0xd;
eax=edx;
eax=eax*esi;
if((eax>>31&1)) edx=0xffffffff;
else edx=0;
edx=eax%ebx;
eax=eax/ebx;
ebx=save;
ebp+=edx;
ebp-=esi;
ebx+=ebp;
ecx++;
save=ebx;
for(i=ecx;i<9;i++)
{
esi=zcm[i];
eax=ecx;
ebp=5;
if((eax>>31&1)) edx=0xffffffff;
else edx=0;
edx=eax%ebp;
eax=eax/ebp;
ebp=0x11;
eax=edx;
eax=eax*zcm[i-1];
eax+=esi;
esi*=zcm[i-1];
eax*=ecx;
if((eax>>31&1)) edx=0xffffffff;
else edx=0;
edx=eax%ebp;
eax=eax/ebp;
eax=ecx+1;
eax=eax*ecx;
edx+=eax;
esi+=ebx;
ebx=esi+edx;
save=ebx;
ecx++;
}
eax=ebx;
edx=0;
ecx=0xa;
edx=eax%ecx;
eax=eax/ecx;
ecx=zcm[9];
eax=0;
if(ecx==edx) //SETE AL;
{
str.Format("%05d%05d",j,k);
l++;
m_Vedit1+=str;
m_Vedit1+="\n";
if(l==M) goto LL;
}
}
}
LL:
m_Ctrledit1.SetWindowText(m_Vedit1);
}
该算法可以求出M(自己定)个有效的注册码,如果想要更多有效的注册码,只需将M的定义值改为你
想要的数值即可!!
--------------------------------------------------------------------------------
【破解总结】
该软件的注册与以前wabdc2003有相同点,都是对试炼码进行运算得到一个值,然后对这个值进行
判断,如果为1则注册成功,否则注册失败,该类注册算法极易被爆破,不管它的注册算法有多么复杂。
由于本人水平有限,见笑了,哈哈!
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整,且注名[BCG]字样,谢谢!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)