欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

『凌云邮神』之算法分析篇 (6千字)

『凌云邮神』之算法分析篇 (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 了!
  唉……也不知对不对,还望大侠们赐教!头昏眼花,不写了!!

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功