【文章标题】: Cyclogs's KeyGenMe的算法分析
【文章作者】: bxm
【作者邮箱】: bxm78@163.com
【加壳方式】: 无壳
【保护方式】: name、serial
【编写语言】: Microsoft Visual C++ 6.0
【使用工具】: OD、VC++
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
00401564 . E8 29030000 call <jmp.&MFC42.#3098_CWnd::GetDlgItemTex>
00401569 . 8D4C24 0C lea ecx, [esp+C]
0040156D . 6A 0A push 0A
0040156F . 51 push ecx
00401570 . 68 E9030000 push 3E9
00401575 . 8BCF mov ecx, edi
00401577 . E8 16030000 call <jmp.&MFC42.#3098_CWnd::GetDlgItemTex>
0040157C . BE 3C314000 mov esi, 0040313C
00401581 . 8D4424 18 lea eax, [esp+18]
00401585 > 8A10 mov dl, [eax]
00401587 . 8A1E mov bl, [esi]
00401589 . 8ACA mov cl, dl
0040158B . 3AD3 cmp dl, bl
0040158D . 75 1E jnz short 004015AD
0040158F . 84C9 test cl, cl
00401591 . 74 16 je short 004015A9
00401593 . 8A50 01 mov dl, [eax+1]
00401596 . 8A5E 01 mov bl, [esi+1]
00401599 . 8ACA mov cl, dl
0040159B . 3AD3 cmp dl, bl
0040159D . 75 0E jnz short 004015AD
0040159F . 83C0 02 add eax, 2
004015A2 . 83C6 02 add esi, 2
004015A5 . 84C9 test cl, cl
004015A7 .^ 75 DC jnz short 00401585
004015A9 > 33C0 xor eax, eax
004015AB . EB 05 jmp short 004015B2
004015AD > 1BC0 sbb eax, eax
004015AF . 83D8 FF sbb eax, -1
004015B2 > 85C0 test eax, eax
004015B4 . 0F84 A1000000 je 0040165B ; 测试name是否为空
004015BA . BE 3C314000 mov esi, 0040313C
004015BF . 8D4424 0C lea eax, [esp+C]
004015C3 > 8A10 mov dl, [eax]
004015C5 . 8A1E mov bl, [esi]
004015C7 . 8ACA mov cl, dl
004015C9 . 3AD3 cmp dl, bl
004015CB . 75 1E jnz short 004015EB
004015CD . 84C9 test cl, cl
004015CF . 74 16 je short 004015E7
004015D1 . 8A50 01 mov dl, [eax+1]
004015D4 . 8A5E 01 mov bl, [esi+1]
004015D7 . 8ACA mov cl, dl
004015D9 . 3AD3 cmp dl, bl
004015DB . 75 0E jnz short 004015EB
004015DD . 83C0 02 add eax, 2
004015E0 . 83C6 02 add esi, 2
004015E3 . 84C9 test cl, cl
004015E5 .^ 75 DC jnz short 004015C3
004015E7 > 33C0 xor eax, eax
004015E9 . EB 05 jmp short 004015F0
004015EB > 1BC0 sbb eax, eax
004015ED . 83D8 FF sbb eax, -1
004015F0 > 85C0 test eax, eax
004015F2 . 74 67 je short 0040165B ; 检查Serial是否为空
004015F4 . 8D4424 0C lea eax, [esp+C]
004015F8 . 50 push eax
004015F9 . E8 B2FEFFFF call 004014B0 ; 测试serial是否符合规范,即不能有大于"f"的字符
004015FE . 83C4 04 add esp, 4
00401601 . 85C0 test eax, eax
00401603 . 74 66 je short 0040166B
00401605 . 8D4C24 0C lea ecx, [esp+C]
00401609 . 51 push ecx
0040160A . E8 21FFFFFF call 00401530 ; 把serial的后8位转换成十六进制数,如我的“780328051”,转成数80328051
0040160F . 8D5424 1C lea edx, [esp+1C]
00401613 . 8BF0 mov esi, eax
00401615 . 52 push edx
00401616 . E8 55FEFFFF call 00401470 ; 对name进行运算,我的返回值为2786A
0040161B . 05 8F020000 add eax, 28F ; EAX+28F
00401620 . B9 34120000 mov ecx, 1234 ; 1234入ECX
00401625 . 99 cdq ; 符号扩展
00401626 . F7F9 idiv ecx ; EAX/ECX
00401628 . B9 01000100 mov ecx, 10001 ; 10001入ECX
0040162D . 83C4 08 add esp, 8
00401630 . 8BC2 mov eax, edx ; EAX为name的最终运算结果,我的为1011,记为A
00401632 . 0FAFC6 imul eax, esi ; EAX*ESI(即转化后的serial)
00401635 . 99 cdq
00401636 . F7F9 idiv ecx ; EAX/ECX
00401638 . B8 01000000 mov eax, 1 ; 1入EAX
0040163D . 2BC2 sub eax, edx ; EAX-EDX
0040163F . 75 2A jnz short 0040166B ; 不等于0跳向失败
从00401632句开始分析,上面都是正向计算比较简单,很容易翻译成高级语言,就略去了。
设name最终计算结果为A,转换后的serial为B,则A*B/0x10001的余数必须为1,据此我写了部分注册机源码。
#include<iostream.h>
#include<iomanip.h>
void main()
{
long int A=0x1011; //name运算后的最终结果
int i=1;
while((0x10001L*i+1)%A!=0)
i++;
cout<<"Serial is "<<hex<<(0x10001L*i+1)/A<<endl;
}
可用的一组数据:
name:bxm78
serial:a551
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年09月22日 上午 9:12:04
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
上传的附件: