『凌云邮神』之算法分析篇 (6千字)
『凌云邮神』之算法分析篇软件:凌云邮神 ( http://fang_public.myetang.com/Dewnload/LYMail.zip 267 KB )
简介:支持国内绝大多数邮件服务器,支持附件发送,可发送无限个附件;支持SMTP身份验证;速度奇快。可以设置优先级。本软件区别于其他邮件群发软件的最大特点就是在收信地址正确的情况下只须发送次邮件的时间即可发完全部邮件,极大地缩短了上网时间。
加密:一机一码,非明码比较
工具:SoftICE 4.05 334
************************************************************************************************
原文再续书接上一回,上回在注册码破解篇我们说到……(怎么象个说书人?:) )
:0046F2C0 E88BFEFFFF call 0046F150
:0046F2C5 8BD8 mov ebx, eax //注意,eax的值变为 2547 了,并保存到ebx
:0046F2C7 8B45F4 mov eax, dword ptr [ebp-0C]
:0046F2CA E89990F9FF call 00408368
:0046F2CF 03D8 add ebx, eax //来到这里,eax 就是你输入的注册码,ebx 的值为 2547 ,eax + ebx ,结果保存到 ebx
:0046F2D1 81FBBAAA9404 cmp ebx, 0494AABA //ebx 与 0494AABA 的值比较
:0046F2D7 7504 jne 0046F2DD //不等则跳
:0046F2D9 C645FF01 mov [ebp-01], 01 //不跳你就成功了!
很明显,0046F2C0 有重大的作案嫌疑,嘻……因为一到 0046F2C5 eax 的值变成 2547 了,当然,这是我的序列号计算出的,你的当然不是了。我们就进入去看看,看看 2547 这个数是怎么来的,呵……还有,我试过在不同的电脑上,0494AABA的值都是固定的。
各位看官,请进……
* Referenced by a CALL at Address:
|:0046F2C0
|
:0046F150 55 push ebp
:0046F151 8BEC mov ebp, esp
:0046F153 83C4D8 add esp, FFFFFFD8
:0046F156 53 push ebx
:0046F157 56 push esi
:0046F158 57 push edi
:0046F159 8945FC mov dword ptr [ebp-04], eax //将参数保存到变量[ebp-04]
:0046F15C 8B45FC mov eax, dword ptr [ebp-04]
:0046F15F E86C4DF9FF call 00403ED0
:0046F164 33C0 xor eax, eax
:0046F166 55 push ebp
:0046F167 68F2F14600 push 0046F1F2
:0046F16C 64FF30 push dword ptr fs:[eax]
:0046F16F 648920 mov dword ptr fs:[eax], esp
:0046F172 33C0 xor eax, eax
:0046F174 8945F8 mov dword ptr [ebp-08], eax //变量[ebp-08]赋初值为0
:0046F177 8D45E3 lea eax, dword ptr [ebp-1D]
:0046F17A 8B55FC mov edx, dword ptr [ebp-04]
:0046F17D E88E95F9FF call 00408710
:0046F182 8B45FC mov eax, dword ptr [ebp-04]
:0046F185 E8924BF9FF call 00403D1C //取序列号长度
:0046F18A 8BF8 mov edi, eax //edi 记录序列号长度
:0046F18C 85FF test edi, edi
:0046F18E 7E49 jle 0046F1D9 //当然不能为空
:0046F190 BB01000000 mov ebx, 00000001
:0046F195 8D75E3 lea esi, dword ptr [ebp-1D] //esi 指向序列号的字符
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046F1D7(C)
|
:0046F198 895DDC mov dword ptr [ebp-24], ebx
:0046F19B DB45DC fild dword ptr [ebp-24] //浮点运算,被除数进栈
:0046F19E D83504F24600 fdiv dword ptr [0046F204] //除以一个数
:0046F1A4 E87B37F9FF call 00402924 //结果转换成整数
:0046F1A9 895DD8 mov dword ptr [ebp-28], ebx
:0046F1AC DB45D8 fild dword ptr [ebp-28] //浮点运算,被除数进栈
:0046F1AF D83504F24600 fdiv dword ptr [0046F204] //除以一个数
:0046F1B5 DED9 fcompp //比较两个浮点数
:0046F1B7 DFE0 fstsw ax //将状态字写入 ax
:0046F1B9 9E sahf //状态字放入 FLAG 寄存器
:0046F1BA 750D jne 0046F1C9 //是否相等?
看到这里,可能有人会问,这是啥呀?其实,上面从0046F198 - 0046F1BA 是验证你取序列号的位数是奇数还是偶数,奇数则跳转,EBX 记录你所取序列号的位数。不信?你试试!
继续……
①当所取序列号的位数为偶数时,会来到这里……
:0046F1BC 33C0 xor eax, eax
:0046F1BE 8A06 mov al, byte ptr [esi] //取ESI指向的字符到EAX中
:0046F1C0 F7EB imul ebx //和EBX相乘
:0046F1C2 03C3 add eax, ebx //加EBX
:0046F1C4 0145F8 add dword ptr [ebp-08], eax //加到变量[ebp-08]
:0046F1C7 EB0B jmp 0046F1D4 //无条件跳转
②当所取序列号位数为奇数时,会跳到这里……
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046F1BA(C)
|
:0046F1C9 33C0 xor eax, eax
:0046F1CB 8A06 mov al, byte ptr [esi] //取ESI指向的字符到EAX
:0046F1CD F7EB imul ebx //和EBX相乘
:0046F1CF 2BC3 sub eax, ebx //减去EBX
:0046F1D1 0145F8 add dword ptr [ebp-08], eax //放到变量[ebp-08]
无论所取序列号的位数是奇数还是偶数,每步计算完毕都会来到这里……
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046F1C7(U)
|
:0046F1D4 43 inc ebx //EBX 递增
:0046F1D5 46 inc esi //ESI 递增
:0046F1D6 4F dec edi //EDI 递减
:0046F1D7 75BF jne 0046F198 //EDI为0,循环结束,就是看你的序列号是否已经取完,未取完则继续循环,依此类推……真烦!!!!!!!
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046F18E(C)
|
:0046F1D9 8B5DF8 mov ebx, dword ptr [ebp-08]
:0046F1DC 33C0 xor eax, eax
:0046F1DE 5A pop edx
:0046F1DF 59 pop ecx
:0046F1E0 59 pop ecx
:0046F1E1 648910 mov dword ptr fs:[eax], edx
:0046F1E4 68F9F14600 push 0046F1F9
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046F1F7(U)
|
:0046F1E9 8D45FC lea eax, dword ptr [ebp-04]
:0046F1EC E8AB48F9FF call 00403A9C
:0046F1F1 C3 ret
如此这般……经过一番折腾,出来时 EAX 值就变成 2547 了!
唉……也不知对不对,还望大侠们赐教!头昏眼花,不写了!!
