呵~前些时间写了软件的算法分析!!!
没有写总结也没有写算法注意机~~今天刚好有时间就做个总结~也把注册源码发了上~~~供大家
英汉互译王V2007算法分析!!!!!!!
1.一款快速高效的英汉翻译软件,不仅可以实现英汉互译,还可实现繁简互译。并伴有语音朗读功能。您在平时学习英语的过程中、上网浏览英文站点时、看英文原版书籍时、或是在做翻译工作时。你需要一个工具帮助您,从而使语言不再成为你前进的障碍,体验异彩纷呈的精神文明和文化世界,我们推荐您使用《英汉互译王》。她将是您工作、学习、网上生活的理想小伴侣。娃娃软件,科技开创美丽生活,祝您使用愉快。
2.用到的软件是PEID OD。
3。我从看雪论坛精华9看到《英汉互译王V2007 算法分析之“联想分析法”》文章.大家可以看看它是怎么做的。我觉的可以,但我觉得要想了解软件算法,就要认认真真的去分析软件的算法CALL,才能比较完整的了解软件的算法。不是仅凭一些联想就可以找软件的算精要的。
4。因此有这个算法分析。希望可以给大家一点启示。
004A974C /$ 55 PUSH EBP
004A974D |. 8BEC MOV EBP,ESP
004A974F |. 51 PUSH ECX
004A9750 |. B9 07000000 MOV ECX,7
004A9755 |> 6A 00 /PUSH 0
004A9757 |. 6A 00 |PUSH 0
004A9759 |. 49 |DEC ECX
004A975A |.^ 75 F9 \JNZ SHORT Ectk.004A9755
004A975C |. 874D FC XCHG DWORD PTR SS:[EBP-4],ECX
004A975F |. 53 PUSH EBX
004A9760 |. 56 PUSH ESI
004A9761 |. 57 PUSH EDI
004A9762 |. 894D F8 MOV DWORD PTR SS:[EBP-8],ECX
004A9765 |. 8955 FC MOV DWORD PTR SS:[EBP-4],EDX ; 放入固定字符
004A9768 |. 8BD8 MOV EBX,EAX ; 机器码
004A976A |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004A976D |. E8 C6ADF5FF CALL Ectk.00404538
004A9772 |. 33C0 XOR EAX,EAX
004A9774 |. 55 PUSH EBP
004A9775 |. 68 4E994A00 PUSH Ectk.004A994E
004A977A |. 64:FF30 PUSH DWORD PTR FS:[EAX]
004A977D |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
004A9780 |. 8D55 F4 LEA EDX,DWORD PTR SS:[EBP-C]
004A9783 |. 8BC3 MOV EAX,EBX
004A9785 |. E8 26FFFFFF CALL Ectk.004A96B0 ; 把机器码转化为16进制数
004A978A |. 8D55 F0 LEA EDX,DWORD PTR SS:[EBP-10]
004A978D |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004A9790 |. E8 1BFFFFFF CALL Ectk.004A96B0 ; 把固定字符4k6d8r转化为16进制数
004A9795 |. 8D45 EC LEA EAX,DWORD PTR SS:[EBP-14]
004A9798 |. 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
004A979B |. E8 80A9F5FF CALL Ectk.00404120
004A97A0 |. 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10] ; 把固定字符4k6d8r转化为16进制数给EAX
004A97A3 |. E8 A0ABF5FF CALL Ectk.00404348 ; 算出把固定字符4k6d8r转化为16进制数的位数
004A97A8 |. D1F8 SAR EAX,1 ; 算出EAX=12算术右移1位EAX=6
004A97AA |. 79 03 JNS SHORT Ectk.004A97AF
004A97AC |. 83D0 00 ADC EAX,0
004A97AF |> 85C0 TEST EAX,EAX
004A97B1 |. 0F8E 54010000 JLE Ectk.004A990B
004A97B7 |. 8945 E0 MOV DWORD PTR SS:[EBP-20],EAX ; 把EAX=6给SS:[EBP-20]。
004A97BA |. BE 01000000 MOV ESI,1
004A97BF |> 83FE 01 /CMP ESI,1
004A97C2 |. 74 0B |JE SHORT Ectk.004A97CF
004A97C4 |. 8D45 EC |LEA EAX,DWORD PTR SS:[EBP-14]
004A97C7 |. 8B55 E8 |MOV EDX,DWORD PTR SS:[EBP-18]
004A97CA |. E8 51A9F5FF |CALL Ectk.00404120
004A97CF |> 8D45 E8 |LEA EAX,DWORD PTR SS:[EBP-18]
004A97D2 |. E8 B1A8F5FF |CALL Ectk.00404088
004A97D7 |. 8B45 EC |MOV EAX,DWORD PTR SS:[EBP-14]
004A97DA |. E8 69ABF5FF |CALL Ectk.00404348 ; 算出字符位数是40位的
004A97DF |. 8BF8 |MOV EDI,EAX ; 给EDI
004A97E1 |. D1FF |SAR EDI,1 ; 算出EAX=40算术右移1位EAX=20
004A97E3 |. 79 03 |JNS SHORT Ectk.004A97E8
004A97E5 |. 83D7 00 |ADC EDI,0
004A97E8 |> 85FF |TEST EDI,EDI
004A97EA |. 0F8E 11010000 |JLE Ectk.004A9901
004A97F0 |. BB 01000000 |MOV EBX,1 ; EBX置1
004A97F5 |> BA 5C994A00 |/MOV EDX,Ectk.004A995C
004A97FA |. 8D45 D8 ||LEA EAX,DWORD PTR SS:[EBP-28] ; EAX
004A97FD |. E8 2E94F5FF ||CALL Ectk.00402C30 ; EAX置2 ECX清0 SS:[EBP-28]存入0124
004A9802 |. 8D45 D4 ||LEA EAX,DWORD PTR SS:[EBP-2C] ; 堆栈地址=0012ECC4
004A9805 |. 8BD3 ||MOV EDX,EBX
004A9807 |. 03D2 ||ADD EDX,EDX ; EDX+EDX
004A9809 |. 8B4D EC ||MOV ECX,DWORD PTR SS:[EBP-14] ; SS:[EBP-14]中存入的是一个40位数的字符串
004A980C |. 8A5411 FE ||MOV DL,BYTE PTR DS:[ECX+EDX-2] ; 循环取字任符的奇数位给DL,字符取出是EDI控制的
004A9810 |. 8850 01 ||MOV BYTE PTR DS:[EAX+1],DL ; DL给DS:[EAX+1]
004A9813 |. C600 01 ||MOV BYTE PTR DS:[EAX],1 ; DS:[EAX]置1
004A9816 |. 8D55 D4 ||LEA EDX,DWORD PTR SS:[EBP-2C]
004A9819 |. 8D45 D8 ||LEA EAX,DWORD PTR SS:[EBP-28]
004A981C |. B1 02 ||MOV CL,2
004A981E |. E8 DD93F5FF ||CALL Ectk.00402C00
004A9823 |. 8D55 D8 ||LEA EDX,DWORD PTR SS:[EBP-28]
004A9826 |. 8D45 D0 ||LEA EAX,DWORD PTR SS:[EBP-30]
004A9829 |. E8 0294F5FF ||CALL Ectk.00402C30
004A982E |. 8D45 D4 ||LEA EAX,DWORD PTR SS:[EBP-2C]
004A9831 |. 8BD3 ||MOV EDX,EBX
004A9833 |. 03D2 ||ADD EDX,EDX
004A9835 |. 8B4D EC ||MOV ECX,DWORD PTR SS:[EBP-14] ; SS:[EBP-14]中存入的是一个40位数的字符串
004A9838 |. 8A5411 FF ||MOV DL,BYTE PTR DS:[ECX+EDX-1] ; 循环取字任符的偶数位给DL,字符取出是EDI控制的
004A983C |. 8850 01 ||MOV BYTE PTR DS:[EAX+1],DL
004A983F |. C600 01 ||MOV BYTE PTR DS:[EAX],1
004A9842 |. 8D55 D4 ||LEA EDX,DWORD PTR SS:[EBP-2C]
004A9845 |. 8D45 D0 ||LEA EAX,DWORD PTR SS:[EBP-30]
004A9848 |. B1 03 ||MOV CL,3
004A984A |. E8 B193F5FF ||CALL Ectk.00402C00
004A984F |. 8D55 D0 ||LEA EDX,DWORD PTR SS:[EBP-30]
004A9852 |. 8D45 DC ||LEA EAX,DWORD PTR SS:[EBP-24]
004A9855 |. E8 92AAF5FF ||CALL Ectk.004042EC
004A985A |. 8B45 DC ||MOV EAX,DWORD PTR SS:[EBP-24]
004A985D |. E8 BEEFF5FF ||CALL Ectk.00408820
004A9862 |. 8845 E7 ||MOV BYTE PTR SS:[EBP-19],AL ; 把取的字符存到SS;[EBP—19]中
004A9865 |. BA 5C994A00 ||MOV EDX,Ectk.004A995C
004A986A |. 8D45 D8 ||LEA EAX,DWORD PTR SS:[EBP-28]
004A986D |. E8 BE93F5FF ||CALL Ectk.00402C30
004A9872 |. 8D45 D4 ||LEA EAX,DWORD PTR SS:[EBP-2C]
004A9875 |. 8BD6 ||MOV EDX,ESI ; 只有完成一个大的循环才会加ESI加1
004A9877 |. 03D2 ||ADD EDX,EDX
004A9879 |. 8B4D F0 ||MOV ECX,DWORD PTR SS:[EBP-10] ; SS:[EBP-10]存放的是固定字符转化的16进制数
004A987C |. 8A5411 FE ||MOV DL,BYTE PTR DS:[ECX+EDX-2] ; 循环取字任符的奇数位给DL,字符取出是esi控制的
004A9880 |. 8850 01 ||MOV BYTE PTR DS:[EAX+1],DL
004A9883 |. C600 01 ||MOV BYTE PTR DS:[EAX],1
004A9886 |. 8D55 D4 ||LEA EDX,DWORD PTR SS:[EBP-2C]
004A9889 |. 8D45 D8 ||LEA EAX,DWORD PTR SS:[EBP-28]
004A988C |. B1 02 ||MOV CL,2
004A988E |. E8 6D93F5FF ||CALL Ectk.00402C00
004A9893 |. 8D55 D8 ||LEA EDX,DWORD PTR SS:[EBP-28]
004A9896 |. 8D45 D0 ||LEA EAX,DWORD PTR SS:[EBP-30]
004A9899 |. E8 9293F5FF ||CALL Ectk.00402C30
004A989E |. 8D45 D4 ||LEA EAX,DWORD PTR SS:[EBP-2C]
004A98A1 |. 8BD6 ||MOV EDX,ESI ; 只有完成一个大的循环才会加ESI加1
004A98A3 |. 03D2 ||ADD EDX,EDX
004A98A5 |. 8B4D F0 ||MOV ECX,DWORD PTR SS:[EBP-10] ; SS:[EBP-10]存放的是固定字符转化的16进制数12位固定数
004A98A8 |. 8A5411 FF ||MOV DL,BYTE PTR DS:[ECX+EDX-1] ; 循环取字任符的奇数位给DL,字符取出是esi控制的
004A98AC |. 8850 01 ||MOV BYTE PTR DS:[EAX+1],DL
004A98AF |. C600 01 ||MOV BYTE PTR DS:[EAX],1
004A98B2 |. 8D55 D4 ||LEA EDX,DWORD PTR SS:[EBP-2C]
004A98B5 |. 8D45 D0 ||LEA EAX,DWORD PTR SS:[EBP-30]
004A98B8 |. B1 03 ||MOV CL,3
004A98BA |. E8 4193F5FF ||CALL Ectk.00402C00
004A98BF |. 8D55 D0 ||LEA EDX,DWORD PTR SS:[EBP-30]
004A98C2 |. 8D45 CC ||LEA EAX,DWORD PTR SS:[EBP-34]
004A98C5 |. E8 22AAF5FF ||CALL Ectk.004042EC
004A98CA |. 8B45 CC ||MOV EAX,DWORD PTR SS:[EBP-34]
004A98CD |. E8 4EEFF5FF ||CALL Ectk.00408820
004A98D2 |. 3245 E7 ||XOR AL,BYTE PTR SS:[EBP-19] ; 把40位数足的2位数和12位固定数的2位进行逻辑或运算
004A98D5 |. 8845 E6 ||MOV BYTE PTR SS:[EBP-1A],AL ; 把结果存到SS:[EBP-1A]中
004A98D8 |. 8D45 C4 ||LEA EAX,DWORD PTR SS:[EBP-3C]
004A98DB |. 8A55 E6 ||MOV DL,BYTE PTR SS:[EBP-1A]
004A98DE |. E8 8DA9F5FF ||CALL Ectk.00404270
004A98E3 |. 8B45 C4 ||MOV EAX,DWORD PTR SS:[EBP-3C]
004A98E6 |. 8D55 C8 ||LEA EDX,DWORD PTR SS:[EBP-38]
004A98E9 |. E8 C2FDFFFF ||CALL Ectk.004A96B0
004A98EE |. 8B55 C8 ||MOV EDX,DWORD PTR SS:[EBP-38]
004A98F1 |. 8D45 E8 ||LEA EAX,DWORD PTR SS:[EBP-18]
004A98F4 |. E8 57AAF5FF ||CALL Ectk.00404350
004A98F9 |. 43 ||INC EBX
004A98FA |. 4F ||DEC EDI
004A98FB |.^ 0F85 F4FEFFFF |\JNZ Ectk.004A97F5
004A9901 |> 46 |INC ESI
004A9902 |. FF4D E0 |DEC DWORD PTR SS:[EBP-20]
004A9905 |.^ 0F85 B4FEFFFF \JNZ Ectk.004A97BF
004A990B |> 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
004A990E |. 8B55 E8 MOV EDX,DWORD PTR SS:[EBP-18]
004A9911 |. E8 C6A7F5FF CALL Ectk.004040DC
004A9916 |. 33C0 XOR EAX,EAX
004A9918 |. 5A POP EDX
004A9919 |. 59 POP ECX
004A991A |. 59 POP ECX
004A991B |. 64:8910 MOV DWORD PTR FS:[EAX],EDX
004A991E |. 68 55994A00 PUSH Ectk.004A9955
004A9923 |> 8D45 C4 LEA EAX,DWORD PTR SS:[EBP-3C]
004A9926 |. BA 03000000 MOV EDX,3
004A992B |. E8 7CA7F5FF CALL Ectk.004040AC
004A9930 |. 8D45 DC LEA EAX,DWORD PTR SS:[EBP-24]
004A9933 |. E8 50A7F5FF CALL Ectk.00404088
004A9938 |. 8D45 E8 LEA EAX,DWORD PTR SS:[EBP-18]
004A993B |. BA 04000000 MOV EDX,4
004A9940 |. E8 67A7F5FF CALL Ectk.004040AC
004A9945 |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
004A9948 |. E8 3BA7F5FF CALL Ectk.00404088
004A994D \. C3 RETN
004A994E .^ E9 39A1F5FF JMP Ectk.00403A8C
004A9953 .^ EB CE JMP SHORT Ectk.004A9923
004A9955 . 5F POP EDI
004A9956 . 5E POP ESI
004A9957 . 5B POP EBX
004A9958 . 8BE5 MOV ESP,EBP
004A995A . 5D POP EBP
004A995B . C3 RETN
\\*********************************************************************************\\
也把算法做个总结:
1. 软件把机器位数(M)做为了控制内置的for 循环的控制参数!
2. 软件也把内置的字符串位(K)做为了外层for 循环的控制参数!
3. 作者把机器的每个字符ASCII与内字符串的第一个字符进行逻辑或运算把结果保存起!!总共循环M次。
4. 在把保存起的结果与内置字符串的下个字符进行逻辑或运算,总共循环K次。
5. 输出注册码时如果每次逻辑或运算的结果小于两位数。哪就在这个字符前用0进行填充。
6 这个算法注册机的的源码是用C++写的,通过了VC++6.0!!!如果想注册软件清VC++6.0编译!!
using namespace std;
void main()
{
char a[20]; //定义一个存放机器码的空字符串数组
char b[] = "4k6d8r"; //这这个是程内置的字符串
cout<<"清输入你的机器码: "<<endl;
cin>>a; //接收机器码
int i, j, k, n;
n = strlen(b); // 计算机器码的位数
k = strlen(a); //计算内置字符串的位数
for(i=0;i<n;i++) //这个for 循环是用来取内置字符的ASCII的
for(j=0;j<k;j++) //这个内置的for 循环是用来取字符数组a[j]
{
a[j] = a[j] ^ b[i]; //把字符数组A[J]中的ASCII XOR 内置字符数组中的ASCII把它们的结果
} //保存到A[J]数组中
for(j=0;j<k;j++) //这for 循环个是用来打出我们的注册码的
{
if(a[j]<10) //用来检查我们算出的数组中每个元素是否为个位是的话
{ // 就用0填充
printf("%X",0,a[j]);
}
printf("%X",a[j]);
}
printf("\n");
}
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!