加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

【原创】算法实例之:非明码中步步追真码

(2015-06-16 17:05:40)
标签:

privacy

eraser

算法

黄仁来

分类: 破文算法

算法实例之:非明码中步步追真码

【文章作者】: BeyondMe
【作者邮箱】: futuring@126.com
【作者主页】: 
http://blog.sina.com.cn/u/2295763487
【软件名称】: 1 Privacy Eraser 2.5
【下载地址】: http://www.1privacy.net/ 或 http://download.cnet.com/1-Priva ... 144_4-10298856.html
【编写语言】: Borland Delphi 6.0 - 7.0 [覆盖]
【软件介绍】: 每当你使用互联网,您的活动记录您自己的电脑程式如Internet Explorer ,Netscape , Firefox和其他许多人。 任何人都可以看到你已经在互联网上的图片,电影,你甚至都没有在您的电脑上会留下痕迹在您的计算机上。利用互联网隐私橡皮擦您可以轻松地保护您的隐私和让您的冲浪私营只需一次点击即可。
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  很久没有写教程了,今天有空就分析了一个非明码算法,想办法推算出真正注册码来。得到真正注册码不难,但写要写清楚整个流程不容易,本文写得比较乱,有兴趣的就凑合着看吧. http://www.unpack.cn/images/smilies/default/lol.gif 
  没有加壳,OD载入运行,主界面中有注册信息:
  
  机器码:706545925
  假码[1]:1234567890ABCDEF
  
  出现错误提示,但用 bp MessageBoxA/W 不能下断,但观察到点注册时,程序假死两秒,估计调用了 Sleep 函数。
  这是老外惯用的伎俩,方便我们下断 ^0^  ,于是 bp Sleep 下断成功。来到主算法过程。(当然也可以用 Dede分析得到)
  
  
004F808C    55            PUSH EBP                                  注册按钮事件开始
  004F808D    8BEC          MOV EBP,ESP
  004F808F    83C4 BC       ADD ESP,-44
  004F8092    53            PUSH EBX
  004F8093    56            PUSH ESI
  004F8094    57            PUSH EDI
  004F8095    33DB          XOR EBX,EBX
  004F8097    895D BC       MOV DWORD PTR SS:[EBP-44],EBX
  004F809A    895D C0       MOV DWORD PTR SS:[EBP-40],EBX
  004F809D    895D C4       MOV DWORD PTR SS:[EBP-3C],EBX
  004F80A0    895D C8       MOV DWORD PTR SS:[EBP-38],EBX
  004F80A3    895D DC       MOV DWORD PTR SS:[EBP-24],EBX
  004F80A6    895D F0       MOV DWORD PTR SS:[EBP-10],EBX
  004F80A9    895D EC       MOV DWORD PTR SS:[EBP-14],EBX
  004F80AC    895D E8       MOV DWORD PTR SS:[EBP-18],EBX
  004F80AF    894D F8       MOV DWORD PTR SS:[EBP-8],ECX
  004F80B2    8955 FC       MOV DWORD PTR SS:[EBP-4],EDX
  004F80B5    8BD8          MOV EBX,EAX
  004F80B7    8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  004F80BA    E8 55CBF0FF   CALL PrivacyE.00404C14
  004F80BF    8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
  004F80C2    E8 4DCBF0FF   CALL PrivacyE.00404C14
  004F80C7    8B45 0C       MOV EAX,DWORD PTR SS:[EBP+C]
  004F80CA    E8 45CBF0FF   CALL PrivacyE.00404C14
  004F80CF    8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
  004F80D2    E8 3DCBF0FF   CALL PrivacyE.00404C14
  004F80D7    33C0          XOR EAX,EAX
  004F80D9    55            PUSH EBP
  004F80DA    68 C4834F00   PUSH PrivacyE.004F83C4
  004F80DF    64:FF30       PUSH DWORD PTR FS:[EAX]
  004F80E2    64:8920       MOV DWORD PTR FS:[EAX],ESP
  004F80E5    E8 7AF0F0FF   CALL
  004F80EA    8BF0          MOV ESI,EAX
  004F80EC    68 D0070000   PUSH 7D0
  004F80F1    E8 C26CF1FF   CALL                 先睡2秒
  004F80F6    8B43 54       MOV EAX,DWORD PTR DS:[EBX+54]
  004F80F9    8078 04 00    CMP BYTE PTR DS:[EAX+4],0
  004F80FD    74 0A         JE SHORT PrivacyE.004F8109
  004F80FF    8D55 FC       LEA EDX,DWORD PTR SS:[EBP-4]
  004F8102    8BC3          MOV EAX,EBX
  004F8104    E8 8BFAFFFF   CALL PrivacyE.004F7B94
  004F8109    E8 56F0F0FF   CALL
  004F810E    81C6 CF070000 ADD ESI,7CF
  004F8114    3BC6          CMP EAX,ESI
  004F8116   .^ 72 CD         JB SHORT PrivacyE.004F80E5
  004F8118    8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]             机器码
  004F811B    E8 04C9F0FF   CALL PrivacyE.00404A24                   机器码长度,以下N次调用它
  004F8120    3B43 58       CMP EAX,DWORD PTR DS:[EBX+58]
  004F8123    7F 19         JG SHORT PrivacyE.004F813E
  004F8125    8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  004F8128    E8 F7C8F0FF   CALL PrivacyE.00404A24
  004F812D    3B43 5C       CMP EAX,DWORD PTR DS:[EBX+5C]
  004F8130    7C 0C         JL SHORT PrivacyE.004F813E
  004F8132    8B45 0C       MOV EAX,DWORD PTR SS:[EBP+C]             假码
  004F8135    E8 EAC8F0FF   CALL PrivacyE.00404A24                   假码长度
  004F813A    85C0          TEST EAX,EAX
  004F813C    75 09         JNZ SHORT PrivacyE.004F8147               不能为0
  004F813E    C645 F7 00    MOV BYTE PTR SS:[EBP-9],0
  004F8142    E9 33020000   JMP PrivacyE.004F837A
  004F8147    8D55 DC       LEA EDX,DWORD PTR SS:[EBP-24]
  004F814A    8B45 0C       MOV EAX,DWORD PTR SS:[EBP+C]
  004F814D    E8 860DF1FF   CALL PrivacyE.00408ED8                   变大写
  004F8152    8B55 DC       MOV EDX,DWORD PTR SS:[EBP-24]
  004F8155    8D45 0C       LEA EAX,DWORD PTR SS:[EBP+C]
  004F8158    E8 9FC6F0FF   CALL PrivacyE.004047FC
  004F815D    C645 F7 00    MOV BYTE PTR SS:[EBP-9],0
  004F8161    B1 01         MOV CL,1
  004F8163    8B55 0C       MOV EDX,DWORD PTR SS:[EBP+C]
  004F8166    8BC3          MOV EAX,EBX
  004F8168    E8 03FBFFFF   CALL PrivacyE.004F7C70
  004F816D    84C0          TEST AL,AL
  004F816F    0F85 05020000 JNZ PrivacyE.004F837A
  004F8175    33C9          XOR ECX,ECX
  004F8177    55            PUSH EBP
  004F8178    68 00834F00   PUSH PrivacyE.004F8300
  004F817D    64:FF31       PUSH DWORD PTR FS:[ECX]
  004F8180    64:8921       MOV DWORD PTR FS:[ECX],ESP
  004F8183    8D45 F0       LEA EAX,DWORD PTR SS:[EBP-10]
  004F8186    8B55 0C       MOV EDX,DWORD PTR SS:[EBP+C]
  004F8189    8A52 01       MOV DL,BYTE PTR DS:[EDX+1]                假码第2位
  004F818C    E8 BBC7F0FF   CALL PrivacyE.0040494C
  004F8191    8D45 D8       LEA EAX,DWORD PTR SS:[EBP-28]
  004F8194    8B55 0C       MOV EDX,DWORD PTR SS:[EBP+C]
  004F8197    8A52 09       MOV DL,BYTE PTR DS:[EDX+9]                假码第10位
  004F819A    8850 01       MOV BYTE PTR DS:[EAX+1],DL
  004F819D    C600 01       MOV BYTE PTR DS:[EAX],1
  004F81A0    8D55 D8       LEA EDX,DWORD PTR SS:[EBP-28]
  004F81A3    8D45 D4       LEA EAX,DWORD PTR SS:[EBP-2C]
  004F81A6    E8 61AFF0FF   CALL PrivacyE.0040310C
  004F81AB    8D45 D0       LEA EAX,DWORD PTR SS:[EBP-30]
  004F81AE    8B55 0C       MOV EDX,DWORD PTR SS:[EBP+C]
  004F81B1    8A52 07       MOV DL,BYTE PTR DS:[EDX+7]                假码第8位
  004F81B4    8850 01       MOV BYTE PTR DS:[EAX+1],DL
  004F81B7    C600 01       MOV BYTE PTR DS:[EAX],1
  004F81BA    8D55 D0       LEA EDX,DWORD PTR SS:[EBP-30]
  004F81BD    8D45 D4       LEA EAX,DWORD PTR SS:[EBP-2C]
  004F81C0    B1 02         MOV CL,2
  004F81C2    E8 15AFF0FF   CALL PrivacyE.004030DC                   合并第8和第10位字符串 [08]
  004F81C7    8D55 D4       LEA EDX,DWORD PTR SS:[EBP-2C]
  004F81CA    8D45 EC       LEA EAX,DWORD PTR SS:[EBP-14]
  004F81CD    E8 F6C7F0FF   CALL PrivacyE.004049C8
  004F81D2    8D45 D8       LEA EAX,DWORD PTR SS:[EBP-28]
  004F81D5    8B55 0C       MOV EDX,DWORD PTR SS:[EBP+C]
  004F81D8    8A52 03       MOV DL,BYTE PTR DS:[EDX+3]                假码第4位
  004F81DB    8850 01       MOV BYTE PTR DS:[EAX+1],DL
  004F81DE    C600 01       MOV BYTE PTR DS:[EAX],1
  004F81E1    8D55 D8       LEA EDX,DWORD PTR SS:[EBP-28]
  004F81E4    8D45 D4       LEA EAX,DWORD PTR SS:[EBP-2C]
  004F81E7    E8 20AFF0FF   CALL PrivacyE.0040310C
  004F81EC    8D45 D0       LEA EAX,DWORD PTR SS:[EBP-30]
  004F81EF    8B55 0C       MOV EDX,DWORD PTR SS:[EBP+C]
  004F81F2    8A52 05       MOV DL,BYTE PTR DS:[EDX+5]                假码第6位
  004F81F5    8850 01       MOV BYTE PTR DS:[EAX+1],DL
  004F81F8    C600 01       MOV BYTE PTR DS:[EAX],1
  004F81FB    8D55 D0       LEA EDX,DWORD PTR SS:[EBP-30]
  004F81FE    8D45 D4       LEA EAX,DWORD PTR SS:[EBP-2C]
  004F8201    B1 02         MOV CL,2
  004F8203    E8 D4AEF0FF   CALL PrivacyE.004030DC                   合并第4和第6位字符串 [46]
  004F8208    8D55 D4       LEA EDX,DWORD PTR SS:[EBP-2C]
  004F820B    8D45 CC       LEA EAX,DWORD PTR SS:[EBP-34]
  004F820E    E8 F9AEF0FF   CALL PrivacyE.0040310C
  004F8213    8D45 D0       LEA EAX,DWORD PTR SS:[EBP-30]
  004F8216    8B55 0C       MOV EDX,DWORD PTR SS:[EBP+C]
  004F8219    8A52 0B       MOV DL,BYTE PTR DS:[EDX+B]                假码第12位
  004F821C    8850 01       MOV BYTE PTR DS:[EAX+1],DL
  004F821F    C600 01       MOV BYTE PTR DS:[EAX],1
  004F8222    8D55 D0       LEA EDX,DWORD PTR SS:[EBP-30]
  004F8225    8D45 CC       LEA EAX,DWORD PTR SS:[EBP-34]
  004F8228    B1 03         MOV CL,3
  004F822A    E8 ADAEF0FF   CALL PrivacyE.004030DC                   合并第4,第6和第12位字符串 [46B]
  004F822F    8D55 CC       LEA EDX,DWORD PTR SS:[EBP-34]
  004F8232    8D45 E8       LEA EAX,DWORD PTR SS:[EBP-18]
  004F8235    E8 8EC7F0FF   CALL PrivacyE.004049C8
  004F823A    8D45 C8       LEA EAX,DWORD PTR SS:[EBP-38]
  004F823D    8B4D F0       MOV ECX,DWORD PTR SS:[EBP-10]
  004F8240    BA E0834F00   MOV EDX,PrivacyE.004F83E0
  004F8245    E8 26C8F0FF   CALL PrivacyE.00404A70                   假码第2位前加$,变成 $2, 记为N1.
  004F824A    8B45 C8       MOV EAX,DWORD PTR SS:[EBP-38]
  004F824D    BA FFFF0000   MOV EDX,0FFFF
  004F8252    E8 5113F1FF   CALL PrivacyE.004095A8                    $2 字符串转换成十六进制数值
  004F8257    8BF0          MOV ESI,EAX
  004F8259    8D45 C4       LEA EAX,DWORD PTR SS:[EBP-3C]
  004F825C    8B4D EC       MOV ECX,DWORD PTR SS:[EBP-14]
  004F825F    BA E0834F00   MOV EDX,PrivacyE.004F83E0
  004F8264    E8 07C8F0FF   CALL PrivacyE.00404A70                   第8和第10位合并后前面$号,变成  $08 ,, 记为N2
  004F8269    8B45 C4       MOV EAX,DWORD PTR SS:[EBP-3C]
  004F826C    BA FFFF0000   MOV EDX,0FFFF
  004F8271    E8 3213F1FF   CALL PrivacyE.004095A8                    $08 字符串转换成十六进制数值
  004F8276    8BF8          MOV EDI,EAX
  004F8278    8D45 C0       LEA EAX,DWORD PTR SS:[EBP-40]
  004F827B    8B4D E8       MOV ECX,DWORD PTR SS:[EBP-18]
  004F827E    BA E0834F00   MOV EDX,PrivacyE.004F83E0
  004F8283    E8 E8C7F0FF   CALL PrivacyE.00404A70                   第4,第6和第12位字符串 前加 $ 变成 $46B
  004F8288    8B45 C0       MOV EAX,DWORD PTR SS:[EBP-40]
  004F828B    BA FFFF0000   MOV EDX,0FFFF
  004F8290    E8 1313F1FF   CALL PrivacyE.004095A8                   $46B 字符串转换成十六进制数值,, 记为N3
  004F8295    8BD7          MOV EDX,EDI
  004F8297    0BD6          OR EDX,ESI
  004F8299    0BD0          OR EDX,EAX
  004F829B    81FA FFFF0000 CMP EDX,0FFFF
  004F82A1    75 0F         JNZ SHORT PrivacyE.004F82B2               N1 or N2 or N3 结果不能=$0FFFF
  004F82A3    64:8F05 00000>POP DWORD PTR FS:[0]
  004F82AA    83C4 08       ADD ESP,8
  004F82AD    E9 C8000000   JMP PrivacyE.004F837A
  004F82B2    8BD6          MOV EDX,ESI
  004F82B4    66:83F2 07    XOR DX,7                                  DX = N1 xor 7 [月份]
  004F82B8    8BF7          MOV ESI,EDI
  004F82BA    66:81F6 B700  XOR SI,0B7                               SI = N2 xor $B7 [日期]
  004F82BF    66:35 B705    XOR AX,5B7                               AX = N3 xor $5B7 [年份]
  004F82C3    8BCE          MOV ECX,ESI
  004F82C5    E8 6232F1FF   CALL PrivacyE.0040B52C                   关键算法:进行日期格式检测及日期计算,F7进入

  
  =================== 主算法中断一下 ====================================
  当假码[1]时:
  小结:
  1. 取假码第2位转换成十六进制数值, 记为 N1. [这里是 2,]
  2. 取假码第8和第10位转换成十六进制数值, 记为 N2. [这里是 08,]
  3. 取假码第4,第6和第12位转换成十六进制数值, 记为 N3. [这里是 $46B]
  4. N1 or N2 or N3 不能等于 $FFFF
  5. DX = N1 xor 7 =5 [月份]
     SI = N2 xor $B7 = $BF [日期] , 显然这个日期有点不正常,看继续计算
     AX = N3 xor $5B7 = $1DC [年份] , 显然这个年份也有点不正常,看继续计算
  
  =================== 进入CALL PrivacyE.0040B52C  ======================
0040B52C  /$  53            PUSH EBX
  0040B52D  |.  56            PUSH ESI
  0040B52E  |.  57            PUSH EDI
  0040B52F  |.  83C4 F8       ADD ESP,-8
  0040B532  |.  8BF9          MOV EDI,ECX
  0040B534  |.  8BF2          MOV ESI,EDX
  0040B536  |.  8BD8          MOV EBX,EAX
  0040B538  |.  54            PUSH ESP
  0040B539  |.  8BCF          MOV ECX,EDI
  0040B53B  |.  8BD6          MOV EDX,ESI
  0040B53D  |.  8BC3          MOV EAX,EBX
  0040B53F  |.  E8 18FFFFFF   CALL PrivacyE.0040B45C                   关键算法:进行日期格式检测及日期计算,F7进入
  0040B544  |.  84C0          TEST AL,AL
  0040B546  |.  75 0A         JNZ SHORT PrivacyE.0040B552               这里必须要跳走
  0040B548  |.  A1 08B55000   MOV EAX,DWORD PTR DS:[50B508]
  0040B54D  |.  E8 B6D8FFFF   CALL PrivacyE.00408E08                   抛出异常
  0040B552  |>  DD0424        FLD QWORD PTR SS:[ESP]
  0040B555  |.  59            POP ECX
  0040B556  |.  5A            POP EDX
  0040B557  |.  5F            POP EDI
  0040B558  |.  5E            POP ESI
  0040B559  |.  5B            POP EBX
  0040B55A  \.  C3            RETN

  发现没有什么,关键算法还在里面,进入
  
  =================== 进入CALL PrivacyE.0040B45C  ======================
  
  0040B45C  /$  55            PUSH EBP                                  关键算法:进行日期格式检测及日期计算
  0040B45D  |.  8BEC          MOV EBP,ESP
  0040B45F  |.  83C4 F4       ADD ESP,-0C
  0040B462  |.  53            PUSH EBX
  0040B463  |.  56            PUSH ESI
  0040B464  |.  57            PUSH EDI
  0040B465  |.  8BD9          MOV EBX,ECX
  0040B467  |.  8BFA          MOV EDI,EDX
  0040B469  |.  8BF0          MOV ESI,EAX
  0040B46B  |.  C645 FF 00    MOV BYTE PTR SS:[EBP-1],0
  0040B46F  |.  8BC6          MOV EAX,ESI
  0040B471  |.  E8 AAFFFFFF   CALL PrivacyE.0040B420
  0040B476  |.  83E0 7F       AND EAX,7F
  0040B479  |.  8D0440        LEA EAX,DWORD PTR DS:[EAX+EAX*2]
  0040B47C  |.  8D04C5 E09050>LEA EAX,DWORD PTR DS:[EAX*8+5090E0]
  0040B483  |.  8945 F8       MOV DWORD PTR SS:[EBP-8],EAX
  0040B486  |.  66:83FE 01    CMP SI,1
  0040B48A  |.  0F82 8E000000 JB PrivacyE.0040B51E
  0040B490  |.  66:81FE 0F27  CMP SI,270F                               年份必须是1-9999
  0040B495  |.  0F87 83000000 JA PrivacyE.0040B51E                      否则出现异常
  0040B49B  |.  66:83FF 01    CMP DI,1
  0040B49F  |.  72 7D         JB SHORT PrivacyE.0040B51E
  0040B4A1  |.  66:83FF 0C    CMP DI,0C
  0040B4A5  |.  77 77         JA SHORT PrivacyE.0040B51E                月份必须是1-12
  0040B4A7  |.  66:83FB 01    CMP BX,1                                  否则出现异常
  0040B4AB  |.  72 71         JB SHORT PrivacyE.0040B51E
  0040B4AD  |.  0FB7C7        MOVZX EAX,DI
  0040B4B0  |.  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
  0040B4B3  |.  66:3B5C42 FE  CMP BX,WORD PTR DS:[EDX+EAX*2-2]          日期必须是 1-31
  0040B4B8  |.  77 64         JA SHORT PrivacyE.0040B51E                否则出现异常, 假码[1] 时这里跳走出错,因此必须要修改
  .......

  =================== 中断一下 CALL PrivacyE.0040B45C ====================
  
  这里开始对年月日进行检测,
  查检到日期 CMP BX,WORD PTR DS:[EDX+EAX*2-2] 时, 由于 BX=$BF,因此跳走失败.
  逆向:
  由于 BX的值是 N2 xor $B7 得出,要使结果在 1-31 之间,因此可以反向推算一个N2值 ,比如 N2= $B1, 这样 N2 xor $B7 = 6 ,符合要求,
  于是推算得真正注册码第10和是B ,第8位是1.
  
  把假码[1]修正为 123456719BABCDEF,记为假码[2]
  
  再次调试到
  0040B4B8  |.  77 64         JA SHORT PrivacyE.0040B51E
  没有跳走.
  
  =================== 继续 CALL PrivacyE.0040B45C ====================
  
0040B4B8  |. /77 64         JA SHORT PrivacyE.0040B51E          否则出现异常, 假码[2]时,这里不跳了.
  0040B4BA  |. |0FB7C7        MOVZX EAX,DI
  0040B4BD  |. |48            DEC EAX
  0040B4BE  |. |85C0          TEST EAX,EAX
  0040B4C0  |. |7E 11         JLE SHORT PrivacyE.0040B4D3
  0040B4C2  |. |B9 01000000   MOV ECX,1
  0040B4C7  |> |8B55 F8       /MOV EDX,DWORD PTR SS:[EBP-8]
  0040B4CA  |. |66:035C4A FE  |ADD BX,WORD PTR DS:[EDX+ECX*2-2]    结果保存在BX ([EDX+ECX*2-2] 存放月份天数表)
  0040B4CF  |. |41            |INC ECX
  0040B4D0  |. |48            |DEC EAX
  0040B4D1  |.^|75 F4         \JNZ SHORT PrivacyE.0040B4C7         循环计算该日期总共的天数
  0040B4D3  |> |0FB7CE        MOVZX ECX,SI
  0040B4D6  |. |49            DEC ECX
  0040B4D7  |. |8BC1          MOV EAX,ECX
  0040B4D9  |. |BE 64000000   MOV ESI,64
  0040B4DE  |. |99            CDQ
  0040B4DF  |. |F7FE          IDIV ESI
  0040B4E1  |. |69F1 6D010000 IMUL ESI,ECX,16D                     年数*365
  0040B4E7  |. |8BD1          MOV EDX,ECX
  0040B4E9  |. |85D2          TEST EDX,EDX
  0040B4EB  |. |79 03         JNS SHORT PrivacyE.0040B4F0
  0040B4ED  |. |83C2 03       ADD EDX,3
  0040B4F0  |> |C1FA 02       SAR EDX,2
  0040B4F3  |. |03F2          ADD ESI,EDX
  0040B4F5  |. |2BF0          SUB ESI,EAX
  0040B4F7  |. |8BC1          MOV EAX,ECX
  0040B4F9  |. |B9 90010000   MOV ECX,190
  0040B4FE  |. |99            CDQ
  0040B4FF  |. |F7F9          IDIV ECX                            年数 mod 400
  0040B501  |. |03F0          ADD ESI,EAX
  0040B503  |. |0FB7C3        MOVZX EAX,BX
  0040B506  |. |03F0          ADD ESI,EAX
  0040B508  |. |81EE 5A950A00 SUB ESI,0A955A                      貌似1900年1月1日的总天数
  0040B50E  |. |8975 F4       MOV DWORD PTR SS:[EBP-C],ESI         ESI返回从1900年1月1日到当前日期所经过的总天数.
  0040B511  |. |DB45 F4       FILD DWORD PTR SS:[EBP-C]            把结果浮点,假码[2]时的结果是 ST = -519977.00000000000000
  0040B514  |. |8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
  0040B517  |. |DD18          FSTP QWORD PTR DS:[EAX]
  0040B519  |. |9B            WAIT
  0040B51A  |. |C645 FF 01    MOV BYTE PTR SS:[EBP-1],1
  0040B51E  |> \8A45 FF       MOV AL,BYTE PTR SS:[EBP-1]
  0040B521  |.  5F            POP EDI
  0040B522  |.  5E            POP ESI
  0040B523  |.  5B            POP EBX
  0040B524  |.  8BE5          MOV ESP,EBP
  0040B526  |.  5D            POP EBP
  0040B527  \.  C2 0400       RETN 4
  

  
  ===================CALL PrivacyE.0040B45C 结束 ====================
  
  小结一下 =CALL PrivacyE.0040B45C 的内容
  1. 把传递入该 CALL 的三个参数[年月日]进行范围检测,超范围就完蛋.
  2. 通过检测后,就计算从 1900年1月1日到当前传递的参数日期进行总天数计算,
  这个CALL最后返回这个总天数的 Float型值.
  
  由于假码[2]中的经计算得到的年份是 $1DC ,即公元476年 ,函数返回结果自然就是个负值 ,我的妈.是 ST = -519977.00000000000000
  后面肯定有问题.先不理.
  
  返回到主算法过程,
  
  =================== 返回到主算法过程,继续 ============================
  
004F82C5    E8 6232F1FF   CALL PrivacyE.0040B52C               关键算法:进行日期格式检测及日期计算,F7进入
  004F82CA    DD5D E0       FSTP QWORD PTR SS:[EBP-20]          返回从1900年1月1日到当前日期所经过的总天数,记为T1
  004F82CD    9B            WAIT
  004F82CE    E8 D134F1FF   CALL PrivacyE.0040B7A4               计算从1900年1月1日到今天经过的总天数,返回结果记为 T2
  

  ....... 中断一下 ........
  
  =================== 进入 CALL PrivacyE.0040B7A4 ========================
  
  0040B7A4  /$  83C4 E8       ADD ESP,-18                         返回从1900年1月1日到当前日期所经过的总天数
  0040B7A7  |.  8D4424 08     LEA EAX,DWORD PTR SS:[ESP+8]
  0040B7AB  |.  50            PUSH EAX
  0040B7AC  |.  E8 43B9FFFF   CALL     获得当前日期
  0040B7B1  |.  66:8B4C24 0E  MOV CX,WORD PTR SS:[ESP+E]          CX=日期
  0040B7B6  |.  66:8B5424 0A  MOV DX,WORD PTR SS:[ESP+A]          DX=月份
  0040B7BB  |.  66:8B4424 08  MOV AX,WORD PTR SS:[ESP+8]          AX=年份
  0040B7C0  |.  E8 67FDFFFF   CALL PrivacyE.0040B52C               关键算法:进行日期格式检测及日期计算,F7进入
  0040B7C5  |.  DD1C24        FSTP QWORD PTR SS:[ESP]             返回计算结果,浮点型
  0040B7C8  |.  9B            WAIT
  0040B7C9  |.  DD0424        FLD QWORD PTR SS:[ESP]
  0040B7CC  |.  83C4 18       ADD ESP,18
  0040B7CF  \.  C3            RETN

  
  由于今天是今天是2009-08-16,从1900-01-01到今天共经过 ST=40044.000000000000000 天.为函数计算结果.
  
  
  ===================关键CALL PrivacyE.0040B7A4 结束,退出到主算法过程  ========================
  
  
004F82CE    E8 D134F1FF   CALL PrivacyE.0040B7A4               计算从1900年1月1日到今天经过的总天数,返回结果记为 T2
  004F82D3    DC5D E0       FCOMP QWORD PTR SS:[EBP-20]          T1 和 T2 比较
  004F82D6    DFE0          FSTSW AX
  004F82D8    9E            SAHF
  004F82D9    76 1B         JBE SHORT PrivacyE.004F82F6          如果 T1 大于 T2 则跳走, 否则 完蛋.,假码[2]时这里跳走完蛋了.

  
  ...... 中断一下.....
  
  很明显,前面的判断是正常的, 这里程序通过检测1900-01-01到  假码[2]中得到的日期年月日之间的天数总数
  和 1900-01-01到 今天 之间的天数总数 相比, 必须是后者大于前者才能注册成功.
  逆向推算 假码[2]中  N3 xor $5B7 的结果必须是在 今年之后至9999年,比如我想结果= 2088年, 则有 2088 xor $5B7 = $D9F = N3
  由于 N3 是第4,第6和第12位字符串 合并成的,于是, 第4位 = D 第6位=9, 第12位=F,
  这样,更新假码为 123D59719BFBCDEF ,记为 假码[3] ,再进行测试,看 
  
  =============  继续 主算法过程 =====================================
  
004F82D9   . /76 1B         JBE SHORT PrivacyE.004F82F6          把假码更新为 假码[3]时,这里跳走了.
  004F82DB   . |DD45 E0       FLD QWORD PTR SS:[EBP-20]            因此逆向推算年份必须是在今年以后.
  004F82DE   . |D81D E4834F00 FCOMP DWORD PTR DS:[4F83E4]
  004F82E4   . |DFE0          FSTSW AX
  004F82E6   . |9E            SAHF
  004F82E7   . |74 0D         JE SHORT PrivacyE.004F82F6
  004F82E9   . |33C0          XOR EAX,EAX
  004F82EB   . |5A            POP EDX
  004F82EC   . |59            POP ECX
  004F82ED   . |59            POP ECX
  004F82EE   . |64:8910       MOV DWORD PTR FS:[EAX],EDX
  004F82F1   . |E9 84000000   JMP PrivacyE.004F837A
  004F82F6   > \33C0          XOR EAX,EAX                         正常, 跳到这里.
  004F82F8    5A            POP EDX
  004F82F9    59            POP ECX
  004F82FA    59            POP ECX
  004F82FB    64:8910       MOV DWORD PTR FS:[EAX],EDX
  004F82FE    EB 11         JMP SHORT PrivacyE.004F8311
  004F8300   .^ E9 23BAF0FF   JMP PrivacyE.00403D28
  004F8305    E8 4ABEF0FF   CALL PrivacyE.00404154
  004F830A    EB 6E         JMP SHORT PrivacyE.004F837A
  004F830C    E8 43BEF0FF   CALL PrivacyE.00404154
  004F8311    8D45 BC       LEA EAX,DWORD PTR SS:[EBP-44]
  004F8314    50            PUSH EAX
  004F8315    8B4D 0C       MOV ECX,DWORD PTR SS:[EBP+C]
  004F8318    8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]
  004F831B    8BC3          MOV EAX,EBX
  004F831D    E8 2EF4FFFF   CALL PrivacyE.004F7750               关键算法 2 ,F7进入

  
  ...... 中断一下主算法 .....
  
  ====================== 进入关键算法 2 CALL PrivacyE.004F7750 ======================
  
  
  004F7750  /$  55            PUSH EBP                         关键算法 2
  004F7751  |.  8BEC          MOV EBP,ESP
  004F7753  |.  83C4 C4       ADD ESP,-3C
  004F7756  |.  53            PUSH EBX
  004F7757  |.  56            PUSH ESI
  004F7758  |.  57            PUSH EDI
  004F7759  |.  33DB          XOR EBX,EBX
  004F775B  |.  895D C4       MOV DWORD PTR SS:[EBP-3C],EBX
  004F775E  |.  895D C8       MOV DWORD PTR SS:[EBP-38],EBX
  004F7761  |.  895D CC       MOV DWORD PTR SS:[EBP-34],EBX
  004F7764  |.  895D D0       MOV DWORD PTR SS:[EBP-30],EBX
  004F7767  |.  895D F0       MOV DWORD PTR SS:[EBP-10],EBX
  004F776A  |.  895D EC       MOV DWORD PTR SS:[EBP-14],EBX
  004F776D  |.  894D F4       MOV DWORD PTR SS:[EBP-C],ECX
  004F7770  |.  8955 F8       MOV DWORD PTR SS:[EBP-8],EDX
  004F7773  |.  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX
  004F7776  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]      机器码
  004F7779  |.  E8 96D4F0FF   CALL PrivacyE.00404C14
  004F777E  |.  8B45 F4       MOV EAX,DWORD PTR SS:[EBP-C]      假码[3] (第3次更新的假码)
  004F7781  |.  E8 8ED4F0FF   CALL PrivacyE.00404C14
  004F7786  |.  33C0          XOR EAX,EAX
  004F7788  |.  55            PUSH EBP
  004F7789  |.  68 F47A4F00   PUSH PrivacyE.004F7AF4
  004F778E  |.  64:FF30       PUSH DWORD PTR FS:[EAX]
  004F7791  |.  64:8920       MOV DWORD PTR FS:[EAX],ESP
  004F7794  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]      先初始化一个错误返回值以下一串数字,别以为它是正在注册码了
  004F7797  |.  BA 0C7B4F00   MOV EDX,PrivacyE.004F7B0C         ASCII "542264156124568746123"
  004F779C  |.  E8 17D0F0FF   CALL PrivacyE.004047B8            读取机器码 这里是 "706545925"
  004F77A1  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
  004F77A4  |.  E8 7BD2F0FF   CALL PrivacyE.00404A24            机器码长度
  004F77A9  |.  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]
  004F77AC  |.  3B42 58       CMP EAX,DWORD PTR DS:[EDX+58]    和50比较,不可能JG
  004F77AF  |.  0F8F 17030000 JG PrivacyE.004F7ACC
  004F77B5  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
  004F77B8  |.  E8 67D2F0FF   CALL PrivacyE.00404A24            机器码长度
  004F77BD  |.  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]
  004F77C0  |.  3B42 5C       CMP EAX,DWORD PTR DS:[EDX+5C]    小于5 ???
  004F77C3  |.  0F8C 03030000 JL PrivacyE.004F7ACC             小于5 跳走. 我这里长度是9,不跳
  004F77C9  |.  8D45 E0       LEA EAX,DWORD PTR SS:[EBP-20]
  004F77CC  |.  8B55 F4       MOV EDX,DWORD PTR SS:[EBP-C]
  004F77CF  |.  8A12          MOV DL,BYTE PTR DS:[EDX]          假码[3] 第1位
  004F77D1  |.  8850 01       MOV BYTE PTR DS:[EAX+1],DL
  004F77D4  |.  C600 01       MOV BYTE PTR DS:[EAX],1
  004F77D7  |.  8D55 E0       LEA EDX,DWORD PTR SS:[EBP-20]
  004F77DA  |.  8D45 DC       LEA EAX,DWORD PTR SS:[EBP-24]
  004F77DD  |.  E8 2AB9F0FF   CALL PrivacyE.0040310C
  004F77E2  |.  8D45 D8       LEA EAX,DWORD PTR SS:[EBP-28]
  004F77E5  |.  8B55 F4       MOV EDX,DWORD PTR SS:[EBP-C]
  004F77E8  |.  8A52 02       MOV DL,BYTE PTR DS:[EDX+2]       假码[3] 第3位
  004F77EB  |.  8850 01       MOV BYTE PTR DS:[EAX+1],DL
  004F77EE  |.  C600 01       MOV BYTE PTR DS:[EAX],1
  004F77F1  |.  8D55 D8       LEA EDX,DWORD PTR SS:[EBP-28]
  004F77F4  |.  8D45 DC       LEA EAX,DWORD PTR SS:[EBP-24]
  004F77F7  |.  B1 02         MOV CL,2
  004F77F9  |.  E8 DEB8F0FF   CALL PrivacyE.004030DC            把第1,3位合并 [13], 记为 M1
  004F77FE  |.  8D55 DC       LEA EDX,DWORD PTR SS:[EBP-24]
  004F7801  |.  8D45 F0       LEA EAX,DWORD PTR SS:[EBP-10]
  004F7804  |.  E8 BFD1F0FF   CALL PrivacyE.004049C8
  004F7809  |.  8D45 EC       LEA EAX,DWORD PTR SS:[EBP-14]
  004F780C  |.  8B55 F4       MOV EDX,DWORD PTR SS:[EBP-C]
  004F780F  |.  8A52 04       MOV DL,BYTE PTR DS:[EDX+4]       假码[3] 第5位
  004F7812  |.  E8 35D1F0FF   CALL PrivacyE.0040494C
  004F7817  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]      机器码
  004F781A  |.  E8 05D2F0FF   CALL PrivacyE.00404A24            机器码长度,记为 Len
  004F781F  |.  8BF0          MOV ESI,EAX
  004F7821  |.  8975 D4       MOV DWORD PTR SS:[EBP-2C],ESI
  004F7824  |.  DB45 D4       FILD DWORD PTR SS:[EBP-2C]       机器码长度浮点
  004F7827  |.  D835 247B4F00 FDIV DWORD PTR DS:[4F7B24]       Len / 2.5
  004F782D  |.  E8 BEB7F0FF   CALL PrivacyE.00402FF0            Trunc 函数,去掉小数部分取整,结果记为 A1 [A1=4]
  004F7832  |.  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
  004F7835  |.  0FB64402 FF   MOVZX EAX,BYTE PTR DS:[EDX+EAX-1>;  EAX = ord(机器码[A1]);
  004F783A  |.  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
  004F783D  |.  0FB612        MOVZX EDX,BYTE PTR DS:[EDX]       EDX = ord(机器码[1]);
  004F7840  |.  8B4D F8       MOV ECX,DWORD PTR SS:[EBP-8]
  004F7843  |.  0FB649 01     MOVZX ECX,BYTE PTR DS:[ECX+1]    ECX = ord(机器码[2]);
  004F7847  |.  03D1          ADD EDX,ECX
  004F7849  |.  03C2          ADD EAX,EDX
  004F784B  |.  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
  004F784E  |.  0FB65432 FF   MOVZX EDX,BYTE PTR DS:[EDX+ESI-1>;  EDX = ord(机器码[Len]);
  004F7853  |.  03C2          ADD EAX,EDX
  004F7855  |.  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
  004F7858  |.  0FB65432 FE   MOVZX EDX,BYTE PTR DS:[EDX+ESI-2>;  EDX = ord(机器码[Len-1]);
  004F785D  |.  03C2          ADD EAX,EDX
  004F785F  |.  8945 E8       MOV DWORD PTR SS:[EBP-18],EAX    结果以个ASCII码相加,结果记为 A2 [这里 =$103]
  004F7862  |.  8D45 D0       LEA EAX,DWORD PTR SS:[EBP-30]
  004F7865  |.  8B4D F0       MOV ECX,DWORD PTR SS:[EBP-10]    M1
  004F7868  |.  BA 307B4F00   MOV EDX,PrivacyE.004F7B30
  004F786D  |.  E8 FED1F0FF   CALL PrivacyE.00404A70
  004F7872  |.  8B45 D0       MOV EAX,DWORD PTR SS:[EBP-30]
  004F7875  |.  BA FFFF0000   MOV EDX,0FFFF
  004F787A  |.  E8 291DF1FF   CALL PrivacyE.004095A8            把 M1 转换成十六进制数值,记为 P1 [P1=$13]
  004F787F  |.  8BF0          MOV ESI,EAX
  004F7881  |.  81FE FFFF0000 CMP ESI,0FFFF                     P1 不能= $FFFF
  004F7887  |.  0F84 3F020000 JE PrivacyE.004F7ACC
  004F788D  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  004F7890  |.  8B40 70       MOV EAX,DWORD PTR DS:[EAX+70]    [EAX+70]这个神秘值在程序运行后就生成了,这里 =$0BDE14F3
  004F7893  |.  99            CDQ
  004F7894  |.  F77D E8       IDIV DWORD PTR SS:[EBP-18]
  004F7897  |.  81E2 FF000000 AND EDX,0FF                      $0BDE14F3 mod A2 and $0FF = $47
  004F789D  |.  3BF2          CMP ESI,EDX
  004F789F  |.  0F85 27020000 JNZ PrivacyE.004F7ACC             结果必须等于M1,否则完蛋. 这里可以反向推算了.
  

  .... 中断一下,准备调整新假码了....
  
  由于$0BDE14F3 mod A2 and $0FF = $47 ,而 M1=$13, 因此假码[3]时 跳走失败. 
  可反向推算假码第1,3位分别是 4和7.
  于是调理假码为  427D59719BFBCDEF ,记为 假码[4] ,再进行测试,看 
  
  ================继续 关键算法 2 CALL PrivacyE.004F7750 ======================
  
004F789F  |. /0F85 27020000 JNZ PrivacyE.004F7ACC                  修改为假码[4]时,这里通过了..
  004F78A5  |. |8D45 CC       LEA EAX,DWORD PTR SS:[EBP-34]
  004F78A8  |. |8B4D EC       MOV ECX,DWORD PTR SS:[EBP-14]
  004F78AB  |. |BA 307B4F00   MOV EDX,PrivacyE.004F7B30
  004F78B0  |. |E8 BBD1F0FF   CALL PrivacyE.00404A70
  004F78B5  |. |8B45 CC       MOV EAX,DWORD PTR SS:[EBP-34]
  004F78B8  |. |BA FFFF0000   MOV EDX,0FFFF
  004F78BD  |. |E8 E61CF1FF   CALL PrivacyE.004095A8                假码第5位转换成十六进制, 记为M2
  004F78C2  |. |8BF0          MOV ESI,EAX
  004F78C4  |. |81FE FFFF0000 CMP ESI,0FFFF                         M2不能= $FFFF
  004F78CA  |. |0F84 FC010000 JE PrivacyE.004F7ACC
  004F78D0  |. |8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
  004F78D3  |. |E8 4CD1F0FF   CALL PrivacyE.00404A24
  004F78D8  |. |3BF0          CMP ESI,EAX                            M2 和 Len 比较
  004F78DA  |. |74 15         JE SHORT PrivacyE.004F78F1             如果相等跳走,这里不相等,不跳
  004F78DC  |. |8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
  004F78DF  |. |E8 40D1F0FF   CALL PrivacyE.00404A24
  004F78E4  |. |83F8 10       CMP EAX,10                            机器码长度和16比较
  004F78E7  |. |7E 08         JLE SHORT PrivacyE.004F78F1            小于跳走,这里跳
  004F78E9  |. |85F6          TEST ESI,ESI
  004F78EB  |. |0F85 DB010000 JNZ PrivacyE.004F7ACC
  004F78F1  |> |8D45 E0       LEA EAX,DWORD PTR SS:[EBP-20]
  004F78F4  |. |8B55 F4       MOV EDX,DWORD PTR SS:[EBP-C]          假码[4] =427D59719BFBCDEF
  004F78F7  |. |8A52 06       MOV DL,BYTE PTR DS:[EDX+6]             DL = 假码[4] 第7位
  004F78FA  |. |8850 01       MOV BYTE PTR DS:[EAX+1],DL
  004F78FD  |. |C600 01       MOV BYTE PTR DS:[EAX],1
  004F7900  |. |8D55 E0       LEA EDX,DWORD PTR SS:[EBP-20]
  004F7903  |. |8D45 DC       LEA EAX,DWORD PTR SS:[EBP-24]
  004F7906  |. |E8 01B8F0FF   CALL PrivacyE.0040310C
  004F790B  |. |8D45 D8       LEA EAX,DWORD PTR SS:[EBP-28]
  004F790E  |. |8B55 F4       MOV EDX,DWORD PTR SS:[EBP-C]
  004F7911  |. |8A52 08       MOV DL,BYTE PTR DS:[EDX+8]             DL = 假码[4] 第9位
  004F7914  |. |8850 01       MOV BYTE PTR DS:[EAX+1],DL
  004F7917  |. |C600 01       MOV BYTE PTR DS:[EAX],1
  004F791A  |. |8D55 D8       LEA EDX,DWORD PTR SS:[EBP-28]
  004F791D  |. |8D45 DC       LEA EAX,DWORD PTR SS:[EBP-24]
  004F7920  |. |B1 02         MOV CL,2
  004F7922  |. |E8 B5B7F0FF   CALL PrivacyE.004030DC                假码[4]第7, 9 位合并
  004F7927  |. |8D55 DC       LEA EDX,DWORD PTR SS:[EBP-24]
  004F792A  |. |8D45 D4       LEA EAX,DWORD PTR SS:[EBP-2C]
  004F792D  |. |E8 DAB7F0FF   CALL PrivacyE.0040310C
  004F7932  |. |8D45 D8       LEA EAX,DWORD PTR SS:[EBP-28]
  004F7935  |. |8B55 F4       MOV EDX,DWORD PTR SS:[EBP-C]
  004F7938  |. |8A52 0A       MOV DL,BYTE PTR DS:[EDX+A]             DL = 假码[4] 第11位
  004F793B  |. |8850 01       MOV BYTE PTR DS:[EAX+1],DL
  004F793E  |. |C600 01       MOV BYTE PTR DS:[EAX],1
  004F7941  |. |8D55 D8       LEA EDX,DWORD PTR SS:[EBP-28]
  004F7944  |. |8D45 D4       LEA EAX,DWORD PTR SS:[EBP-2C]
  004F7947  |. |B1 03         MOV CL,3
  004F7949  |. |E8 8EB7F0FF   CALL PrivacyE.004030DC                假码[4]第7, 9,11 位合并
  004F794E  |. |8D55 D4       LEA EDX,DWORD PTR SS:[EBP-2C]
  004F7951  |. |8D45 F0       LEA EAX,DWORD PTR SS:[EBP-10]
  004F7954  |. |E8 6FD0F0FF   CALL PrivacyE.004049C8
  004F7959  |. |8D45 C8       LEA EAX,DWORD PTR SS:[EBP-38]
  004F795C  |. |8B4D F0       MOV ECX,DWORD PTR SS:[EBP-10]
  004F795F  |. |BA 307B4F00   MOV EDX,PrivacyE.004F7B30
  004F7964  |. |E8 07D1F0FF   CALL PrivacyE.00404A70                前面再添加 $ 号
  004F7969  |. |8B45 C8       MOV EAX,DWORD PTR SS:[EBP-38]
  004F796C  |. |BA FFFF0000   MOV EDX,0FFFF
  004F7971  |. |E8 321CF1FF   CALL PrivacyE.004095A8                假码[4]第7, 9,11 转换成十六进制数值,记为 M3
  004F7976  |. |8945 E8       MOV DWORD PTR SS:[EBP-18],EAX
  004F7979  |. |817D E8 FFFF0>CMP DWORD PTR SS:[EBP-18],0FFFF
  004F7980  |. |0F84 46010000 JE PrivacyE.004F7ACC                   M3 不能=$0FFFF
  004F7986  |. |33F6          XOR ESI,ESI
  004F7988  |. |8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
  004F798B  |. |E8 94D0F0FF   CALL PrivacyE.00404A24                机器码长度
  004F7990  |. |85C0          TEST EAX,EAX
  004F7992  |. |7E 13         JLE SHORT PrivacyE.004F79A7
  004F7994  |. |BB 01000000   MOV EBX,1
  004F7999  |> |8B55 F8       /MOV EDX,DWORD PTR SS:[EBP-8]
  004F799C  |. |0FB6541A FF   |MOVZX EDX,BYTE PTR DS:[EDX+EBX-1]
  004F79A1  |. |03F2          |ADD ESI,EDX                           ESI 累计机器码每一位的ASCII和
  004F79A3  |. |43            |INC EBX
  004F79A4  |. |48            |DEC EAX
  004F79A5  |.^|75 F2         \JNZ SHORT PrivacyE.004F7999          循环结果记为 K
  004F79A7  |> |C1E6 04       SHL ESI,4                              ESI = K shl 4  [=$1DB0]
  004F79AA  |. |8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  004F79AD  |. |3370 74       XOR ESI,DWORD PTR DS:[EAX+74]          神秘值[EAX+74]=$03C9642B xor K
  004F79B0  |. |81E6 FF0F0000 AND ESI,0FFF                           结果再 and $0FFF , [这里结果是 $99B] , 记为 K1
  004F79B6  |. |8975 E4       MOV DWORD PTR SS:[EBP-1C],ESI
  004F79B9  |. |8B45 E4       MOV EAX,DWORD PTR SS:[EBP-1C]
  004F79BC  |. |3B45 E8       CMP EAX,DWORD PTR SS:[EBP-18]          K1必须等于 M3 ,否则完蛋, 假码[4]时这里就跳走完蛋了.
  004F79BF  |. |0F85 07010000 JNZ PrivacyE.004F7ACC

  
  =============..... 中断一下,准备修改假码了....================
  
  很明显,这里K1的值[=$99B]非常重要,它决定了M3的值 ,即决定了真正注册码 第7, 9,11 位分别是 9 ,9 ,B .
  于是修改假码为 427D59919BBBCDEF ,记为假码[5]]
  重新验证一次.
  
  
  ================继续 关键算法 2 CALL PrivacyE.004F7750 ======================
  
004F79BC  |.  3B45 E8       CMP EAX,DWORD PTR SS:[EBP-18]          K1必须等于 M3 ,否则完蛋, 假码[4]时这里就跳走完蛋了.
  004F79BF  |.  0F85 07010000 JNZ PrivacyE.004F7ACC                  假码为假码[5]后,通过验证
  004F79C5  |.  8B45 F4       MOV EAX,DWORD PTR SS:[EBP-C]          假码[5] = 427D59919BBBCDEF
  004F79C8  |.  E8 57D0F0FF   CALL PrivacyE.00404A24                长度
  004F79CD  |.  83F8 0C       CMP EAX,0C                            小于等于12位跳死
  004F79D0  |.  0F8E E9000000 JLE PrivacyE.004F7ABF                  这里不跳
  004F79D6  |.  8D45 EC       LEA EAX,DWORD PTR SS:[EBP-14]
  004F79D9  |.  E8 86CDF0FF   CALL PrivacyE.00404764
  004F79DE  |.  33C0          XOR EAX,EAX
  004F79E0  |.  8945 E4       MOV DWORD PTR SS:[EBP-1C],EAX
  004F79E3  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
  004F79E6  |.  E8 39D0F0FF   CALL PrivacyE.00404A24                机器码长度 Len
  004F79EB  |.  85C0          TEST EAX,EAX
  004F79ED  |.  7E 14         JLE SHORT PrivacyE.004F7A03
  004F79EF  |.  BB 01000000   MOV EBX,1
  004F79F4  |>  8B55 F8       /MOV EDX,DWORD PTR SS:[EBP-8]
  004F79F7  |.  0FB6541A FF   |MOVZX EDX,BYTE PTR DS:[EDX+EBX-1]
  004F79FC  |.  0155 E4       |ADD DWORD PTR SS:[EBP-1C],EDX         又一次累加机器码每一位的ASCII之和
  004F79FF  |.  43            |INC EBX
  004F7A00  |.  48            |DEC EAX
  004F7A01  |.^ 75 F1         \JNZ SHORT PrivacyE.004F79F4          返回结果记为 K [K =$1DB]
  004F7A03  |>  B8 FFFFFF07   MOV EAX,7FFFFFF                        EAX = $7FFFFFF
  004F7A08  |.  99            CDQ
  004F7A09  |.  F77D E4       IDIV DWORD PTR SS:[EBP-1C]
  004F7A0C  |.  F76D E4       IMUL DWORD PTR SS:[EBP-1C]              $7FFFFFF div K * K =$07FFFED1
  004F7A0F  |.  8945 E4       MOV DWORD PTR SS:[EBP-1C],EAX
  004F7A12  |.  8B45 F4       MOV EAX,DWORD PTR SS:[EBP-C]
  004F7A15  |.  E8 0AD0F0FF   CALL PrivacyE.00404A24                假码长度
  004F7A1A  |.  83E8 0C       SUB EAX,0C                            减去12
  004F7A1D  |.  8945 E8       MOV DWORD PTR SS:[EBP-18],EAX
  004F7A20  |.  8D45 F0       LEA EAX,DWORD PTR SS:[EBP-10]
  004F7A23  |.  50            PUSH EAX
  004F7A24  |.  8B4D E8       MOV ECX,DWORD PTR SS:[EBP-18]
  004F7A27  |.  BA 0D000000   MOV EDX,0D
  004F7A2C  |.  8B45 F4       MOV EAX,DWORD PTR SS:[EBP-C]
  004F7A2F  |.  E8 50D2F0FF   CALL PrivacyE.00404C84
  004F7A34  |.  BF 1F000000   MOV EDI,1F                            EDI = $1F
  004F7A39  |.  BB 01000000   MOV EBX,1                              EBX =1
  004F7A3E  |>  8BCB          /MOV ECX,EBX
  004F7A40  |.  8B45 FC       |MOV EAX,DWORD PTR SS:[EBP-4]
  004F7A43  |.  8B40 78       |MOV EAX,DWORD PTR DS:[EAX+78]         [EAX+78]神秘值 = $005E4175
  004F7A46  |.  8BF0          |MOV ESI,EAX
  004F7A48  |.  D3E6          |SHL ESI,CL
  004F7A4A  |.  8BCF          |MOV ECX,EDI
  004F7A4C  |.  D3E8          |SHR EAX,CL
  004F7A4E  |.  0BF0          |OR ESI,EAX
  004F7A50  |.  8BC6          |MOV EAX,ESI
  004F7A52  |.  99            |CDQ
  004F7A53  |.  33C2          |XOR EAX,EDX
  004F7A55  |.  2BC2          |SUB EAX,EDX
  004F7A57  |.  8BF0          |MOV ESI,EAX
  004F7A59  |.  3B75 E4       |CMP ESI,DWORD PTR SS:[EBP-1C]
  004F7A5C  |.  7E 0A         |JLE SHORT PrivacyE.004F7A68
  004F7A5E  |.  8BC6          |MOV EAX,ESI
  004F7A60  |.  99            |CDQ
  004F7A61  |.  F77D E4       |IDIV DWORD PTR SS:[EBP-1C]
  004F7A64  |.  8BF2          |MOV ESI,EDX
  004F7A66  |.  EB 08         |JMP SHORT PrivacyE.004F7A70
  004F7A68  |>  8B45 E4       |MOV EAX,DWORD PTR SS:[EBP-1C]
  004F7A6B  |.  99            |CDQ
  004F7A6C  |.  F7FE          |IDIV ESI
  004F7A6E  |.  8BF2          |MOV ESI,EDX
  004F7A70  |>  8D4D C4       |LEA ECX,DWORD PTR SS:[EBP-3C]
  004F7A73  |.  8BC6          |MOV EAX,ESI
  004F7A75  |.  25 FF0F0000   |AND EAX,0FFF                         EAX and $0FFF
  004F7A7A  |.  BA 03000000   |MOV EDX,3
  004F7A7F  |.  E8 C01AF1FF   |CALL PrivacyE.00409544                inttoHex(EAX,3), 结果记为 S
  004F7A84  |.  8B55 C4       |MOV EDX,DWORD PTR SS:[EBP-3C]
  004F7A87  |.  8D45 EC       |LEA EAX,DWORD PTR SS:[EBP-14]
  004F7A8A  |.  E8 9DCFF0FF   |CALL PrivacyE.00404A2C                累加S, 最终结果记为 Str
  004F7A8F  |.  4F            |DEC EDI
  004F7A90  |.  43            |INC EBX
  004F7A91  |.  83FB 21       |CMP EBX,21                            循环 $21 次
  004F7A94  |.^ 75 A8         \JNZ SHORT PrivacyE.004F7A3E
  004F7A96  |.  8D45 EC       LEA EAX,DWORD PTR SS:[EBP-14]          返回结果 0012FCD4   00BFE6D4  ASCII "1AD1AD781781FCFF9E06B205F785C292D38870FF4C4EB9D6105D584218421B3495A58ED35DCCE69CBFED4D79D5107038"
  004F7A99  |.  50            PUSH EAX
  004F7A9A  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  004F7A9D  |.  8B48 6C       MOV ECX,DWORD PTR DS:[EAX+6C]
  004F7AA0  |.  83E9 0C       SUB ECX,0C
  004F7AA3  |.  BA 01000000   MOV EDX,1
  004F7AA8  |.  8B45 EC       MOV EAX,DWORD PTR SS:[EBP-14]
  004F7AAB  |.  E8 D4D1F0FF   CALL PrivacyE.00404C84                截取Str 前8位, 结果记为 K3
  004F7AB0  |.  8B55 EC       MOV EDX,DWORD PTR SS:[EBP-14]
  004F7AB3  |.  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]          EAX = 假码第12位以后的字符串
  004F7AB6  |.  E8 0D15F1FF   CALL PrivacyE.00408FC8                K3 和 EAX 两进行比较
  004F7ABB  |.  85C0          TEST EAX,EAX
  004F7ABD  |. /75 0D         JNZ SHORT PrivacyE.004F7ACC            如果不相等则跳死, 这里可以逆向得到第12位以后是K3的值
  004F7ABF  |> |8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]          把函数返回值赋值为以下一串数字,这是成功的标志
  004F7AC2  |. |BA 3C7B4F00   MOV EDX,PrivacyE.004F7B3C             ASCII "645364631365423154824"
  004F7AC7  |. |E8 ECCCF0FF   CALL PrivacyE.004047B8
  004F7ACC  |> \33C0          XOR EAX,EAX
  004F7ACE  |.  5A            POP EDX
  004F7ACF  |.  59            POP ECX
  004F7AD0  |.  59            POP ECX
  004F7AD1  |.  64:8910       MOV DWORD PTR FS:[EAX],EDX
  004F7AD4  |.  68 FB7A4F00   PUSH PrivacyE.004F7AFB
  004F7AD9  |>  8D45 C4       LEA EAX,DWORD PTR SS:[EBP-3C]
  004F7ADC  |.  BA 04000000   MOV EDX,4
  004F7AE1  |.  E8 A2CCF0FF   CALL PrivacyE.00404788
  004F7AE6  |.  8D45 EC       LEA EAX,DWORD PTR SS:[EBP-14]
  004F7AE9  |.  BA 04000000   MOV EDX,4
  004F7AEE  |.  E8 95CCF0FF   CALL PrivacyE.00404788
  004F7AF3  \.  C3            RETN

  
  
  ================关键算法 2 CALL PrivacyE.004F7750 结束 ======================
  
  程序通过一个大循环计算出一串长字符串 Str, 并截取前8位作为真正注册码的第12位以后的字符串.
  至于这个循环的具体过程,这里不想再细说了.有兴趣的网友自己分析一下.写到这里已经够累的了. ....
  在假码[5]的计算下, Str的值 是 "1AD1AD78"
  
  到此为止,逆向得真正注册码是 427D59919BBB1AD1AD78 ,把所有断点清除,用这个注册码测试一下, 终于盼得期望已久的成功提示.
   
  至于有没有暗桩,破友们不妨再进行重启验证时测试一下,这里我不再哆嗦``` 可以收工了吧???
  
  =================
  机器码:706545925
  注册码:427D59919BBB1AD1AD78

  
--------------------------------------------------------------------------------
【经验总结】
  说实在,写破文比破解辛苦得多
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于http://www.unpack.cn, 转载请注明作者并保持文章的完整, 谢谢!

                                                       20090819 22:45:37

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有