您的位置:首页精文荟萃破解文章 → SpamKiller 2.90 版的破解过程 算法分析

SpamKiller 2.90 版的破解过程 算法分析

时间:2004/10/15 0:55:00来源:本站整理作者:蓝点我要评论(0)

 

下载地址:http://www.onlinedown.net/spamkiller.htm
软件简介:McAfee公司出品的SpamKiller就是一个相当出色的垃圾邮件过滤软件,可以依照标题、寄件人、寄件国家、邮件内文甚至支援「布林字元(Boolean)」来过滤邮件!而且还有两道安全措施,防止重要邮件被误删。 SpamKiller能够复制所有自动过滤的邮件。它能够让你过滤邮件的任何部分,包括内文、文件头和国家代码。朋友列表(friends list)可让你选定想要的邮件。过滤精灵让你自订过滤规则更加简单,而注册的使用者则可收到线上更新。它还可让你自动回复抗议信函给乱寄垃圾邮件的人。它能够处理任何POP3及MAPI的邮件帐号。它也可以监督计算机的邮件地址,看看某人是否在线上,阻挡所有不在你的朋友列表上的人送来的讯息,并在你转寄邮件时删除原始文件头资料。SpamKiller支持Microsoft Network的电子邮件和扩充MAPI。


第一步:运行SpamKiller,在注册窗口中填入Name:Batman,Company:aaa,Serial number:8765-1234-654321, 按Ctrl+D,激活SoftICE,输入“bpx hmemcpy”(下断点)和“go”(继续执行程序),返回到“SpamKiller”程序领空。按下“ok”,SoftICE窗口被激活弹出。

第二步:bc *  取消中断,按F12数下,直到进入SpamKiller的程序领空,然后一直按F10,中断到如下代码:

0167:004CCD43  MOV      EDX,[EBX+0300]
0167:004CCD49  CALL     004980C0  // 关键CALL
0167:004CCD4E  TEST     AL,AL
0167:004CCD50  JNZ      004CCD63  // 不为0则跳
0167:004CCD52  MOV      EDX,EBX
0167:004CCD54  MOV      EAX,004CCE08
0167:004CCD59  CALL     0049FFEC  // 来到这里就跳出出错窗口
0167:004CCD5E  MOV      BYTE [ESI],00
0167:004CCD61  JMP      SHORT 004CCDAA

第三步:在004Cccd49处按F9设断,再按F8追入这个关键call,然后一直按F10,直到如下代码为止:

0167:00498109  CALL      00404068
0167:0049810E  MOV       [EBP-0C],EAX
0167:00498111  CMP       DWORD PTR [EBP-0C],10  // 比较注册码是否是16位
0167:00498115  JNZ       00498372  // 不是就跳转出错(不能跳)
0167:0049811B  MOV       EAX,[EBP-04]
0167:0049811E  CMP       BYTE PTR [EAX+04],2D  // 比较注册码第五位是否是“-”
0167:00498122  JNZ       00498372  // 不是就跳转出错(不能跳)
0167:00498128  MOV       EAX,[EBP-04]
0167:0049812B  CMP       BYTE PTR [EAX+09],2D  // 比较注册码第十位是否是“-”
0167:0049812F  JNZ       00498372  // 不是就跳转出错(不能跳)
0167:00498135  MOV       EBX,00000011
0167:0049813A  MOV       ESI,004EF4DC
0167:0049813F  LEA       EDX,[EBP-14]
0167:00498142  MOV       EAX,[ESI]
0167:00498144  CALL      00487CE4
0167:00498149  MOV       EDX,[EBP-14]
0167:0049814C  MOV       EAX,[EBP-04]
0167:0049814F  CALL      00404178  // 比较注册码是否是“003E-9124-7E3E39”(黑名单)
0167:00498154  JZ        00498372  // 是就跳转出错(不能跳)
0167:0049815A  ADD       ESI,04
0167:0049815D  DEC       EBX
0167:0049815E  JNZ       0049813F  // 反复跳转数次
0167:00498160  XOR       EDX,EDX
0167:00498162  PUSH      EBP
0167:00498163  PUSH      00498368
0167:00498168  PUSH      DWORD PTR FS:[EDX]
0167:0049816B  MOV       FS:[EDX],ESP
0167:0049816E  MOV       EBX,00000001
0167:00498173  JMP       00498191  // 向下跳转
0167:00498175  MOV       EAX,[EBP-04]
0167:00498178  CMP       BYTE PTR [EBX+EAX-01],2D
0167:0049817D  JNZ       00498190
0167:0049817F  LEA       EAX,[EBP-04]
0167:00498182  MOV       ECX,00000001
0167:00498187  MOV       EDX,EBX
0167:00498189  CALL      004042B0  // 这里的CALL去除注册码中的“-”
0167:0049818E  JMP       00498191
0167:00498190  INC       EBX
0167:00498191  MOV       EAX,[EBP-04]  // 跳到这里
0167:00498194  CALL      00404068
0167:00498199  CMP       EBX,EAX
0167:0049819B  JLE       00498175  // 反复跳转数次,以去除注册码中的“-”
0167:0049819D  MOV       EAX,[EBP-04]
0167:004981A0  CALL      00404068
0167:004981A5  MOV       [EBP-0C],EAX
0167:004981A8  CMP       DWORD PTR [EBP-0C],0E  // 比较去除“-”后的注册码是否是14位
0167:004981AC  JZ        004981BB  // 是就跳转(要跳)
0167:004981AE  XOR       EAX,EAX
0167:004981B0  POP       EDX
0167:004981B1  POP       ECX
0167:004981B2  POP       ECX
0167:004981B3  MOV       FS:[EAX],EDX
0167:004981B6  JMP       00498372
0167:004981BB  XOR       ECX,ECX  // 跳到这里,ECX清零(即ECX=0)
0167:004981BD  MOV       EAX,[EBP-0C]  // 将注册码的位数(即14)送给EAX(已去除“-”)
0167:004981C0  DEC       EAX  // EAX=14-1=13
0167:004981C1  TEST      EAX,EAX  // 测试EAX
0167:004981C3  JLE       004981D8
0167:004981C5  MOV       EBX,00000001  // 将01送给EBX(即EBX=01
0167:004981CA  MOV       EDX,[EBP-04]  // 将去除“-”的注册码送给EDX
0167:004981CD  MOVZX     EDX,BYTE PTR [EBX+EDX-01]  // 依次注册码字符的十六进制值给EDX
0167:004981D2  ADD       ECX,EDX  // ECX=ECX+EDX ,将注册码的前13位字符的十六进制值相加,结果存入ECX
0167:004981D4  INC       EBX  // EBX加1
0167:004981D5  DEC       EAX  // EAX-1
0167:004981D6  JNZ       004981CA  // 不相等则跳(反复跳转13次,也就是将注册码的前13位字符的十六进制值相加,结果存入ECX)
0167:004981D8  MOV       EAX,ECX  // 将注册码的前13位字符的十六进制值相加的值送给EAX
0167:004981DA  MOV       ECX,0000000A  // ECX=0A
0167:004981DF  CDQ
0167:004981E0  IDIV      ECX  // EAX除以ECX,余数放入DL
0167:004981E2  ADD       DL,30  // DL=DL(即余数)+30
0167:004981E5  MOV       EAX,[EBP-04]
0167:004981E8  MOV       ECX,[EBP-0C]
0167:004981EB  CMP       DL,[ECX+EAX-01]  // 比较DL中的字符与注册码的最后一位是否相等
0167:004981EF  JNZ       0049835E  // 不相等就跳转出错(不能跳)
0167:004981F5  XOR       ECX,ECX  //ECX=0
0167:004981F7  MOV       EBX,00000001  // EBX=1
0167:004981FC  MOV       EAX,[EBP-04]  // 将去除“-”的注册码送给EAX
0167:004981FF  MOVZX     EAX,BYTE PTR [EBX+EAX-01]  // 依次注册码字符的十六进制值给EAX
0167:00498204  ADD       ECX,EAX  // ECX=ECX+EAX ,将注册码的前5位字符的十六进制值相加,结果存入ECX
0167:00498206  INC       EBX  // EBX加1
0167:00498207  CMP       EBX,06  // 比较EBX与6是否相等
0167:0049820A  JNZ       004981FC  // 不相等则跳(反复跳转5次,也就是将注册码的前5位字符的十六进制值相加,结果存入ECX)
0167:0049820C  MOV       EAX,ECX // 将注册码的前5位字符的十六进制值相加的值送给EAX
0167:0049820E  MOV       ECX,0000000A  // ECX=0A
0167:00498213  CDQ
0167:00498214  IDIV      ECX  // EAX除以ECX,余数放入DL
0167:00498216  ADD       DL,30  // DL=DL(即余数)+30
0167:00498219  MOV       EAX,[EBP-04]
0167:0049821C  MOV       ECX,[EBP-0C]
0167:0049821F  CMP       DL,[ECX+EAX-02]  // 比较DL中的字符与注册码的最后第二位是否相等
0167:00498223  JNZ       0049835E  // 不相等就跳转出错(不能跳)
0167:00498229  LEA       EAX,[EBP-1C]
0167:0049822C  PUSH      EAX
0167:0049822D  MOV       ECX,00000003
0167:00498232  MOV       EDX,00000006
0167:00498237  MOV       EAX,[EBP-04]
0167:0049823A  CALL      00404270
0167:0049823F  MOV       ECX,[EBP-1C]
0167:00498242  LEA       EAX,[EBP-18]
0167:00498245  MOV       EDX,004983BC
0167:0049824A  CALL      004040B4
0167:0049824F  MOV       EAX,[EBP-18]
0167:00498252  CALL      00409878  // EAX中的是去掉“-”后注册码的第6、7、8位注册码组成的字符(如注册码是1234,那么EAX=1234)
0167:00498257  MOV       EBX,EAX  // 将这些字符给EBX
0167:00498259  MOV       CX,0012
0167:0049825D  MOV       DX,000C
0167:00498261  MOV       AX,07CC
0167:00498265  CALL      0040A9CC
0167:0049826A  CALL      00402B18
0167:0049826F  ADD       EBX,EAX  // EAX=8A59,EBX=去掉“-”后注册码的第6、7、8位注册码组成的字符 + 8A59
0167:00498271  MOV       CX,0001
0167:00498275  MOV       DX,000A
0167:00498279  MOV       AX,07CD
0167:0049827D  CALL      0040A9CC  // 下面要在SoftICE中下“WF”指令打开浮点窗口
0167:00498282  MOV       [EBP-20],EBX  // 将所得的值送给[EBP-20]
0167:00498285  FILD      DWORD PTR [EBP-20]  // 将该值的十进制值放入浮点寄存器ST0,这里原ST0中的值35704将移到ST1
0167:00498288  FCOMPP  // ST0与ST1中的值相比较
0167:0049828A  FSTSW   AX
0167:0049828C  SAHF
0167:0049828D  JBE       0049835E  // 小于、等于35704则跳转(不能跳)
0167:00498293  MOV       CX,0001
0167:00498297  MOV       DX,0001
0167:0049829B  MOV       AX,07DA
0167:0049829F  CALL      0040A9CC
0167:004982A4  MOV       [EBP-24],EBX  // 将所得的值送给[EBP-20]
0167:004982A7  FILD      DWORD PTR [EBP-24]  // 将该值的十进制值放入浮点寄存器ST0,这里原ST0中的值40179将移到ST1
0167:004982AA  FCOMPP  // ST0与ST1中的值相比较
0167:004982AC  FSTSW   AX
0167:004982AE  SAHF
0167:004982AF  JAE       0049835E  // 大于、等于40179则跳转(不能跳)
0167:004982B5  LEA       EAX,[EBP-2C]
0167:004982B8  PUSH      EAX
0167:004982B9  MOV       ECX,00000004
0167:004982BE  MOV       EDX,00000009
0167:004982C3  MOV       EAX,[EBP-04]
0167:004982C6  CALL      00404270
0167:004982CB  MOV       ECX,[EBP-2C]
0167:004982CE  LEA       EAX,[EBP-28]
0167:004982D1  MOV       EDX,004983BC
0167:004982D6  CALL      004040B4
0167:004982DB  MOV       EAX,[EBP-28]  // 将去除“-”的注册码的第9,10,11,12位的字符给EAX(如注册码是1234,那么EAX=1234)
0167:004982DE  CALL      00409878
0167:004982E3  PUSH      EAX
0167:004982E4  MOV       EAX,000081FA  // EAX=81FA
0167:004982E9  POP       EDX  // EDX就是注册码的第9,10,11,12位的字符
0167:004982EA  SUB       EAX,EDX  // EAX减去EDX,值放入EAX
0167:004982EC  CMP       EAX,01  比较EAX是否小于己于1
0167:004982EF  JL        0049835E  // 小于就跳转(不能跳)
0167:004982F1  CMP       EAX,00002710  // 比较EAX是否大于2710
0167:004982F6  JG        0049835E  // 大于就跳转(不能跳)
0167:004982F8  LEA       EAX,[EBP-34]
0167:004982FB  PUSH      EAX
0167:004982FC  MOV       ECX,00000005
0167:00498301  MOV       EDX,00000001
0167:00498306  MOV       EAX,[EBP-04]
0167:00498309  CALL      00404270
0167:0049830E  MOV       ECX,[EBP-34]  // 将去除“-”的注册码的第1,2,3,4,5位的字符给EAX(如注册码是12345,那么EAX=12345)
0167:00498311  LEA       EAX,[EBP-30]
0167:00498314  MOV       EDX,004983BC
0167:00498319  CALL      004040B4
0167:0049831E  MOV       EAX,[EBP-30]
0167:00498321  CALL      00409878
0167:00498326  MOV       EBX,EAX  // EBX=注册码的第1,2,3,4,5位的字符
0167:00498328  MOV       EAX,EBX  // EAX=注册码的第1,2,3,4,5位的字符
0167:0049832A  MOV       ECX,000003E8  // ECX=03E8
0167:0049832F  CDQ
0167:00498330  IDIV      ECX  // EAX除以ECX,商放入EAX
0167:00498332  MOV       ECX,EAX  // 将商送给ECX
0167:00498334  MOV       EAX,EBX  // EAX=注册码的第1,2,3,4,5位的字符
0167:00498336  MOV       EBX,000003E8  // ECX=03E8
0167:0049833B  CDQ
0167:0049833C  IDIV      EBX  // EAX除以EBX,余数放入EDX
0167:0049833E  MOV       EAX,EDX  // 将余数送给EAX
0167:00498340  DEC       ECX  // ECX减1
0167:00498341  SUB       ECX,45  // ECX减去45
0167:00498344  JB        0049834E  // 有进位则跳
0167:00498346  ADD       ECX,-0A
0167:00498349  SUB       ECX,0C
0167:0049834C  JAE       0049835E
0167:0049834E  CMP       EAX,64  // 比较余数是否小于或等于64
0167:00498351  JLE       0049835A  // 是就跳转(可以跳转)
0167:00498353  CMP       EAX,000003E7  // 比较余数是否等于03E7
0167:00498358  JNZ       0049835E  // 不相等就跳(不能跳)
0167:0049835A  MOV       BYTE PTR [EBP-05],01  // 这里是关键,前面比较有错误将不经过这行,[EBP-05]=1
0167:0049835E  XOR       EAX,EAX  // EAX=0
0167:00498360  POP       EDX
0167:00498361  POP       ECX
0167:00498362  POP       ECX
0167:00498363  MOV       FS:[EAX],EDX
0167:00498366  JMP       00498372  // 这里跳转
0167:00498368  JMP       0040352C
0167:0049836D  CALL      00403888
0167:00498372  XOR       EAX,EAX  // 跳到这里,EAX=0
0167:00498374  POP       EDX
0167:00498375  POP       ECX
0167:00498376  POP       ECX
0167:00498377  MOV       FS:[EAX],EDX
0167:0049837A  PUSH      004983A9
0167:0049837F  LEA       EAX,[EBP-34]
0167:00498382  MOV       EDX,00000004
0167:00498387  CALL      00403E0C
0167:0049838C  LEA       EAX,[EBP-1C]
0167:0049838F  MOV       EDX,00000004
0167:00498394  CALL      00403E0C
0167:00498399  LEA       EAX,[EBP-04]
0167:0049839C  CALL      00403DE8
0167:004983A1  RET  // 按F10一下,跳到下面
0167:004983A2  JMP       004037E0
0167:004983A7  JMP       0049837F
0167:004983A9  MOV       AL,[EBP-05]  // 跳到这里,AL=[EBP-05],如经过了上面的关键行,那么EAX=1(注册成功),否则EAX=0(注册失败)。
0167:004983AC  POP       EDI
0167:004983AD  POP       ESI
0167:004983AE  POP       EBX
0167:004983AF  MOV       ESP,EBP
0167:004983B1  POP       EBP
0167:004983B2  RET

【算法总结】
1.注册码必须是16位,并且第五、第十位必须是“-”;
2.注册码不能与“003E-9124-7E3E39”相同;
3.去掉“-”后注册码的位数必须是14位,即注册码中除了第5,10位外,不能再出现“-”;
4.将去掉“-”后注册码的前13位字符的十六进制值相加,再除于“0A”后的余数加上30(十六进制)所得的十六进制值相对应的字符就是最后一位注册码;
5.将去掉“-”后注册码的前5位字符的十六进制值相加,再除于“0A”后的余数加上30所得的十六进制值相对应的字符就是最后第二位注册码;
6.去掉“-”后注册码的第6、7、8位注册码组成的字符,加上“8A59”后所得的值的十进制值要大于“35704”,但要小于“40179”;
7.“81FA”减去去掉“-”后注册码的第9、10、11、12位注册码组成的字符的差要大于或等于1,但小于2710;
8.将去掉“-”后注册码的前5位所组成的字符除于“03E8”,商要小于等于“45”,余数要么小于或等于“64”,要么等于“03E7”;
9.注册码与用户名、公司名无关。

   整理一下,我的注册码:
   用户名:Batman
   公司名:aaa
   注册码:03ED-0222-81AA41 或 007D-5434-81DA25或 003E-9129-7E3E34 或 0CF3-1434-7E0E54


    
    
     
    
    
     

相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么

文章评论
发表评论

热门文章 去除winrar注册框方法

最新文章 比特币病毒怎么破解 比去除winrar注册框方法 华为无线路由器HG522-C破解教程(附超级密码JEB格式文件京东电子书下载和阅读限制破解教UltraISO注册码全集(最新)通过Access破解MSSQL获得数据

人气排行 华为无线路由器HG522-C破解教程(附超级密码JEB格式文件京东电子书下载和阅读限制破解教UltraISO注册码全集(最新)qq相册密码破解方法去除winrar注册框方法(适应任何版本)怎么用手机破解收费游戏华为无线猫HG522破解如何给软件脱壳基础教程