萧萧黄叶 发表于 2009-4-26 00:04

东方法律宝典 2009注册算法分析

本帖最后由 wgz001 于 2009-4-26 00:14 编辑

【破文标题】东方法律宝典 2009注册算法分析
【破文作者】萧萧黄叶
【作者邮箱】
【作者主页】
【破解工具】OllyICE,PEiD v0.94
【破解平台】WinXP
【软件名称】东方法律宝典 2009
【软件大小】
【原版下载】
【保护方式】UPX 0.89.6 - 1.02 / 1.05 - 1.24 (Delphi) stub -> Markus & Laszlo
【软件简介】  东方法律宝典是由东方法眼网站推出的实用法律法规软件,每年推出一个版本,2009版收录1000余部常用法律法规。

  建国以来,我国颁布的法律、法规、行政规章、地方法规达几万部,但在互联网上搜索的90%以上都是常用法规。本软件由法律专业人编辑制作,收录了大量实用的国家法律、行政法规、司法解释,及部分常用法律文书,是一部真正的法律大全。

  新版东方法律宝典在保持精选常用法律法规、法规内部超链接(如公务员法中有涉及婚姻法和民事诉讼法的内容,则自动加上这两部法律的链接 )等诸多优势的基础上,具有以下新特点:

  内容新鲜。面对新的法律法规不断出台的情况,2009版法律宝典收录了最新修正的中华人民共和国刑法完整条文(包含了七次修正的内容,而网上一般都是分别分布,不利于查找使用。),新增加法规300余部,新收录大量行政法规,收录法规截止时间为2009年3月15日。法律宝典收录的法规突出有效性,删除失效法律法规,修正个别法律错误。在2008版的基础上,增加了所有新颁布、新修订的重要法规。

  实用性强。新版软件包括了国家司法考试法律法规目录中的所有法规,方便各位司法考试的考生。新版软件中的法规数量大幅度增加在法规的收集上,强化了刑事法律、司法解释、行政法规的内容,软件容量提升50%。

  使用方便。绿色软件,软件无需安装,可以在U盘中使用,卸载直接将文件删除即可。既具有通过关键字在软件中搜索所有法规功能,又具有在当前页面搜索的功能,方便查找所需内容。电子书版面增大,法规文字字体调大,适应电脑屏幕分辨率调高的要求。

【破解声明】我是一只小小鸟,只想努力做得更好,飞得更高。
------------------------------------------------------------------------
【破解过程】程序是免安装的,其实就是一本电子书,解压出来,运行看看了,用123注册看看,当然出错了:请到下列网址了解正式版信息。
PEiD v0.94:UPX 0.89.6 - 1.02 / 1.05 - 1.24 (Delphi) stub -> Markus & Laszlo ,是用UPX压缩壳保护的。
OD载入了,这里是入口:
004C96A0 >60            PUSHAD
004C96A1    BE 00404800   MOV ESI,东方法律.00484000
004C96A6    8DBE 00D0F7FF   LEA EDI,DWORD PTR DS:

此时可以进行脱壳了,麻烦,直接运行了,用123注册,确定之前下万能断点,确定后被断在下面了:
77D33566    F3:A5         REP MOVS DWORD PTR ES:,DWORD PTR DS>
77D33568    8BC8            MOV ECX,EAX
77D3356A    83E1 03         AND ECX,3

注意寄存器ESI出现了假码。清除断点,运行返回到主线程:
0045C6DC    8943 0C         MOV DWORD PTR DS:,EAX
0045C6DF    8B03            MOV EAX,DWORD PTR DS:
0045C6E1    83F8 0C         CMP EAX,0C

继续往回走,一直到这里:
0049882E    8B15 ACFF4900   MOV EDX,DWORD PTR DS:            ; 东方法律.004A1D60
00498834    8802            MOV BYTE PTR DS:,AL
00498836    A1 ACFF4900   MOV EAX,DWORD PTR DS:

继续向下走的时候在这里跳出了注册失败的对话框:
00498852    E8 EDA4F9FF   CALL 东方法律.00432D44

提示这一部分是算法、比较的中心,在上面下断重新来过:
0049880C    55            PUSH EBP
0049880D    8BEC            MOV EBP,ESP
0049880F    6A 00         PUSH 0
00498811    6A 00         PUSH 0
00498813    53            PUSH EBX
00498814    8BD8            MOV EBX,EAX
00498816    33C0            XOR EAX,EAX
00498818    55            PUSH EBP
00498819    68 B2884900   PUSH 东方法律.004988B2
0049881E    64:FF30         PUSH DWORD PTR FS:
00498821    64:8920         MOV DWORD PTR FS:,ESP
00498824    8BC3            MOV EAX,EBX
00498826    8B10            MOV EDX,DWORD PTR DS:
00498828    FF92 04010000   CALL DWORD PTR DS:
0049882E    8B15 ACFF4900   MOV EDX,DWORD PTR DS:            ; 东方法律.004A1D60
00498834    8802            MOV BYTE PTR DS:,AL
00498836    A1 ACFF4900   MOV EAX,DWORD PTR DS:
0049883B    8038 00         CMP BYTE PTR DS:,0
0049883E    75 19         JNZ SHORT 东方法律.00498859
00498840    6A 00         PUSH 0
00498842    A1 00044A00   MOV EAX,DWORD PTR DS:
00498847    8B00            MOV EAX,DWORD PTR DS:
00498849    66:8B0D C088490>MOV CX,WORD PTR DS:
00498850    B2 01         MOV DL,1
00498852    E8 EDA4F9FF   CALL 东方法律.00432D44
00498857    EB 3E         JMP SHORT 东方法律.00498897

刚才就是最下面这个CALL出错的,跳过它也许就注册成功了。一看就知道就是要0049883E    75 19         JNZ SHORT 东方法律.00498859跳转成功,决定它跳与不跳在于00498828    FF92 04010000   CALL DWORD PTR DS:,所以一定要跟进:
00498754    55            PUSH EBP
00498755    8BEC            MOV EBP,ESP
00498757    6A 00         PUSH 0
00498759    6A 00         PUSH 0
0049875B    53            PUSH EBX
0049875C    8BD8            MOV EBX,EAX
0049875E    33C0            XOR EAX,EAX
00498760    55            PUSH EBP
00498761    68 B6874900   PUSH 东方法律.004987B6
00498766    64:FF30         PUSH DWORD PTR FS:
00498769    64:8920         MOV DWORD PTR FS:,ESP
0049876C    8D55 FC         LEA EDX,DWORD PTR SS:
0049876F    8BC3            MOV EAX,EBX
00498771    8B08            MOV ECX,DWORD PTR DS:
00498773    FF91 F4000000   CALL DWORD PTR DS:
00498779    8B45 FC         MOV EAX,DWORD PTR SS:             ; 运行到这里时,假码出现在堆栈中。
0049877C    50            PUSH EAX
0049877D    8D55 F8         LEA EDX,DWORD PTR SS:
00498780    8BC3            MOV EAX,EBX
00498782    8B08            MOV ECX,DWORD PTR DS:
00498784    FF91 F8000000   CALL DWORD PTR DS:
0049878A    8B45 F8         MOV EAX,DWORD PTR SS:             ; 机器码出现在堆栈中
0049878D    8B8B 20030000   MOV ECX,DWORD PTR DS:         ;"lawbookfzzg@2009"这个字符串出现在堆栈中
00498793    5A            POP EDX
00498794    E8 B7ECFFFF   CALL 东方法律.00497450                     ; 注意看寄存器,EAX是机器码,ECX是刚才出现的一个字符串,EDX是假码,什么意思?,当然是要进入这个CALL比较运算了,跟进了。
00498799    8BD8            MOV EBX,EAX

0498794的CALL跟进:
00497450    55            PUSH EBP
00497451    8BEC            MOV EBP,ESP
00497453    81C4 FCFEFFFF   ADD ESP,-104
00497459    53            PUSH EBX
0049745A    56            PUSH ESI
0049745B    57            PUSH EDI
0049745C    33DB            XOR EBX,EBX
0049745E    895D FC         MOV DWORD PTR SS:,EBX
00497461    8BF9            MOV EDI,ECX
00497463    8BF2            MOV ESI,EDX
00497465    8BD8            MOV EBX,EAX
00497467    33C0            XOR EAX,EAX
00497469    55            PUSH EBP
0049746A    68 B7744900   PUSH 东方法律.004974B7
0049746F    64:FF30         PUSH DWORD PTR FS:
00497472    64:8920         MOV DWORD PTR FS:,ESP
00497475    8D8D FCFEFFFF   LEA ECX,DWORD PTR SS:
0049747B    8BD7            MOV EDX,EDI
0049747D    8BC3            MOV EAX,EBX
0049747F    E8 64FEFFFF   CALL 东方法律.004972E8                     ; 这里继续跟进
00497484    8D95 FCFEFFFF   LEA EDX,DWORD PTR SS:

0049747F的CALL跟进:
004972E8    55            PUSH EBP
004972E9    8BEC            MOV EBP,ESP
004972EB    83C4 E0         ADD ESP,-20
004972EE    53            PUSH EBX
004972EF    56            PUSH ESI
004972F0    57            PUSH EDI
004972F1    33DB            XOR EBX,EBX
004972F3    895D E0         MOV DWORD PTR SS:,EBX
004972F6    895D E4         MOV DWORD PTR SS:,EBX
004972F9    895D E8         MOV DWORD PTR SS:,EBX
004972FC    8BF9            MOV EDI,ECX
004972FE    8955 F8         MOV DWORD PTR SS:,EDX
00497301    8945 FC         MOV DWORD PTR SS:,EAX
00497304    8B45 FC         MOV EAX,DWORD PTR SS:
00497307    E8 1CD3F6FF   CALL 东方法律.00404628                     ; 检查机器码否为空
0049730C    8B45 F8         MOV EAX,DWORD PTR SS:
0049730F    E8 14D3F6FF   CALL 东方法律.00404628                     ; 检查刚才的字符串是否为空‘
00497314    33C0            XOR EAX,EAX
00497316    55            PUSH EBP
00497317    68 41744900   PUSH 东方法律.00497441
0049731C    64:FF30         PUSH DWORD PTR FS:
0049731F    64:8920         MOV DWORD PTR FS:,ESP
00497322    837D FC 00      CMP DWORD PTR SS:,0
00497326    74 6F         JE SHORT 东方法律.00497397                   ; 机器码若为空就跳走不参加运算了。
00497328    BB 01000000   MOV EBX,1
0049732D    8D75 EF         LEA ESI,DWORD PTR SS:
00497330    8B45 FC         MOV EAX,DWORD PTR SS:             ; 开始第一个循环
00497333    E8 00D1F6FF   CALL 东方法律.00404438
00497338    50            PUSH EAX
00497339    8BC3            MOV EAX,EBX
0049733B    48            DEC EAX
0049733C    5A            POP EDX
0049733D    8BCA            MOV ECX,EDX
0049733F    99            CDQ
00497340    F7F9            IDIV ECX
00497342    8B45 FC         MOV EAX,DWORD PTR SS:
00497345    8A0410          MOV AL,BYTE PTR DS:             ; 依次取机器码的各位ASCII码。
00497348    50            PUSH EAX
00497349    8B45 FC         MOV EAX,DWORD PTR SS:
0049734C    E8 E7D0F6FF   CALL 东方法律.00404438
00497351    5A            POP EDX
00497352    32D0            XOR DL,AL                              ; ASCII码与机器码的个数作异或运算
00497354    32D3            XOR DL,BL                              ; 上面的结果再与BL作异或运算,BL起始值为1,逐个循环递增。
00497356    8816            MOV BYTE PTR DS:,DL               ; 将运算结果保存,设为X(10)
00497358    43            INC EBX
00497359    46            INC ESI
0049735A    83FB 0A         CMP EBX,0A
0049735D^ 75 D1         JNZ SHORT 东方法律.00497330                  ; 如果EBX不等于A次就继续运算。
0049735F    8B45 FC         MOV EAX,DWORD PTR SS:
00497362    E8 D1D0F6FF   CALL 东方法律.00404438
00497367    8BF0            MOV ESI,EAX
00497369    85F6            TEST ESI,ESI
0049736B    7E 2A         JLE SHORT 东方法律.00497397
0049736D    BB 01000000   MOV EBX,1
00497372    8B45 FC         MOV EAX,DWORD PTR SS:             ; 开始第二个循环
00497375    E8 BED0F6FF   CALL 东方法律.00404438
0049737A    2BC3            SUB EAX,EBX
0049737C    8B55 FC         MOV EDX,DWORD PTR SS:
0049737F    8A0C02          MOV CL,BYTE PTR DS:             ; 倒序取机器码各位的ASCII码
00497382    8BC3            MOV EAX,EBX
00497384    48            DEC EAX
00497385    51            PUSH ECX
00497386    B9 09000000   MOV ECX,9
0049738B    99            CDQ
0049738C    F7F9            IDIV ECX
0049738E    59            POP ECX
0049738F    304C15 EF       XOR BYTE PTR SS:,CL          ; 第一次循环时是用机器码最后一个的ASCII码与上面的结果的第一个进行异或运算。并将结果放在原处。依次类推。
00497393    43            INC EBX
00497394    4E            DEC ESI
00497395^ 75 DB         JNZ SHORT 东方法律.00497372
00497397    837D F8 00      CMP DWORD PTR SS:,0
0049739B    74 39         JE SHORT 东方法律.004973D6                   ; 如果特殊字符串为空就跳走不进行下面的运算了
0049739D    BB 01000000   MOV EBX,1
004973A2    8D75 EF         LEA ESI,DWORD PTR SS:
004973A5    8B45 F8         MOV EAX,DWORD PTR SS:             ; 第三次循环开始
004973A8    E8 8BD0F6FF   CALL 东方法律.00404438
004973AD    50            PUSH EAX
004973AE    8BC3            MOV EAX,EBX
004973B0    48            DEC EAX
004973B1    5A            POP EDX
004973B2    8BCA            MOV ECX,EDX
004973B4    99            CDQ
004973B5    F7F9            IDIV ECX
004973B7    8B45 F8         MOV EAX,DWORD PTR SS:
004973BA    8A0410          MOV AL,BYTE PTR DS:             ; 取各执一份字符串的第一位的ASCII码,设为Y(1)
004973BD    3206            XOR AL,BYTE PTR DS:               ; Y(1)=Y(1) XOR X(1)
004973BF    50            PUSH EAX
004973C0    8B45 F8         MOV EAX,DWORD PTR SS:
004973C3    E8 70D0F6FF   CALL 东方法律.00404438
004973C8    5A            POP EDX
004973C9    32D0            XOR DL,AL                              ; AL为特殊字符串的个数。Y(1)=Y(1) XOR LEN(字符)
004973CB    32D3            XOR DL,BL                              ; BL初始值为1,循环一次自加1.Y(1)=Y(1) XOR
004973CD    8816            MOV BYTE PTR DS:,DL               ; 结果保存起来
004973CF    43            INC EBX
004973D0    46            INC ESI
004973D1    83FB 0A         CMP EBX,0A                               ; 循环九次
004973D4^ 75 CF         JNZ SHORT 东方法律.004973A5
004973D6    8D45 E8         LEA EAX,DWORD PTR SS:
004973D9    E8 9ACDF6FF   CALL 东方法律.00404178
004973DE    BB 09000000   MOV EBX,9
004973E3    8D75 EF         LEA ESI,DWORD PTR SS:
004973E6    8D45 E4         LEA EAX,DWORD PTR SS:
004973E9    8A16            MOV DL,BYTE PTR DS:
004973EB    E8 70CFF6FF   CALL 东方法律.00404360
004973F0    8B55 E4         MOV EDX,DWORD PTR SS:
004973F3    8D45 E8         LEA EAX,DWORD PTR SS:
004973F6    E8 45D0F6FF   CALL 东方法律.00404440
004973FB    46            INC ESI
004973FC    4B            DEC EBX
004973FD^ 75 E7         JNZ SHORT 东方法律.004973E6
004973FF    8D55 E0         LEA EDX,DWORD PTR SS:
00497402    8B45 E8         MOV EAX,DWORD PTR SS:
00497405    E8 9AFDFFFF   CALL 东方法律.004971A4                     ; 这里是将刚才计算出来的值再进行一次运算后查表得到注册码
0049740A    8B55 E0         MOV EDX,DWORD PTR SS:

00497405的 CALL跟进:
004971A4    55            PUSH EBP
004971A5    8BEC            MOV EBP,ESP
004971A7    83C4 F0         ADD ESP,-10
004971AA    53            PUSH EBX
004971AB    56            PUSH ESI
004971AC    57            PUSH EDI
004971AD    33C9            XOR ECX,ECX
004971AF    894D F0         MOV DWORD PTR SS:,ECX
004971B2    8BFA            MOV EDI,EDX
004971B4    8945 FC         MOV DWORD PTR SS:,EAX
004971B7    8B45 FC         MOV EAX,DWORD PTR SS:
004971BA    E8 69D4F6FF   CALL 东方法律.00404628
004971BF    33C0            XOR EAX,EAX
004971C1    55            PUSH EBP
004971C2    68 D8724900   PUSH 东方法律.004972D8
004971C7    64:FF30         PUSH DWORD PTR FS:
004971CA    64:8920         MOV DWORD PTR FS:,ESP
004971CD    8BC7            MOV EAX,EDI
004971CF    E8 A4CFF6FF   CALL 东方法律.00404178
004971D4    E9 D7000000   JMP 东方法律.004972B0
004971D9    8B45 FC         MOV EAX,DWORD PTR SS:
004971DC    E8 57D2F6FF   CALL 东方法律.00404438
004971E1    8BC8            MOV ECX,EAX
004971E3    8BC1            MOV EAX,ECX
004971E5    BB 03000000   MOV EBX,3
004971EA    99            CDQ
004971EB    F7FB            IDIV EBX
004971ED    85C0            TEST EAX,EAX
004971EF    7E 07         JLE SHORT 东方法律.004971F8
004971F1    BB 03000000   MOV EBX,3
004971F6    EB 02         JMP SHORT 东方法律.004971FA
004971F8    8BD9            MOV EBX,ECX
004971FA    8D45 F9         LEA EAX,DWORD PTR SS:
004971FD    33C9            XOR ECX,ECX
004971FF    BA 03000000   MOV EDX,3
00497204    E8 9BBBF6FF   CALL 东方法律.00402DA4
00497209    8D45 F5         LEA EAX,DWORD PTR SS:
0049720C    B9 40000000   MOV ECX,40
00497211    BA 04000000   MOV EDX,4
00497216    E8 89BBF6FF   CALL 东方法律.00402DA4
0049721B    8D45 FC         LEA EAX,DWORD PTR SS:
0049721E    E8 6DD4F6FF   CALL 东方法律.00404690
00497223    8D55 F9         LEA EDX,DWORD PTR SS:
00497226    8BCB            MOV ECX,EBX
00497228    E8 5FB7F6FF   CALL 东方法律.0040298C                     ; 将Y()每三个一组进行运算。
0049722D    83FB 03         CMP EBX,3
00497230    7C 08         JL SHORT 东方法律.0049723A
00497232    8A45 FB         MOV AL,BYTE PTR SS:               ; 取第一组字符的第三位,即Y(3)
00497235    24 3F         AND AL,3F                              ; Y(3)=Y(3) AND 3F
00497237    8845 F8         MOV BYTE PTR SS:,AL               ; 保存数值,设为a4
0049723A    83FB 02         CMP EBX,2
0049723D    7C 15         JL SHORT 东方法律.00497254
0049723F    8A45 FA         MOV AL,BYTE PTR SS:               ; 第一组字符的第二位,Y(2)
00497242    C1E0 02         SHL EAX,2                              ; 向左位移
00497245    33D2            XOR EDX,EDX
00497247    8A55 FB         MOV DL,BYTE PTR SS:
0049724A    C1EA 06         SHR EDX,6                              ; 各右位移
0049724D    0AC2            OR AL,DL                                 ; 两者作或运算
0049724F    24 3F         AND AL,3F                              ; 再与3F作and 运算
00497251    8845 F7         MOV BYTE PTR SS:,AL               ; 保存数值,设为a3
00497254    8A45 F9         MOV AL,BYTE PTR SS:               ; 取第一组字符的第一位,Y(1)
00497257    8BD0            MOV EDX,EAX
00497259    C1E2 04         SHL EDX,4                              ; 向左位移
0049725C    33C9            XOR ECX,ECX
0049725E    8A4D FA         MOV CL,BYTE PTR SS:
00497261    C1E9 04         SHR ECX,4                              ; Y(2)向右位移
00497264    0AD1            OR DL,CL                                 ; 两者作或运算
00497266    80E2 3F         AND DL,3F                              ; 再与3F作and 运算
00497269    8855 F6         MOV BYTE PTR SS:,DL               ; 保存数值,设为a2
0049726C    25 FF000000   AND EAX,0FF
00497271    C1E8 02         SHR EAX,2                              ; Y(1)向右位移
00497274    24 3F         AND AL,3F                              ; 再与3F作and 运算
00497276    8845 F5         MOV BYTE PTR SS:,AL               ; 保存数值,设为a1
00497279    8D45 FC         LEA EAX,DWORD PTR SS:
0049727C    8BCB            MOV ECX,EBX
0049727E    BA 01000000   MOV EDX,1
00497283    E8 50D4F6FF   CALL 东方法律.004046D8
00497288    BE 04000000   MOV ESI,4
0049728D    8D5D F5         LEA EBX,DWORD PTR SS:
00497290    8D45 F0         LEA EAX,DWORD PTR SS:
00497293    33D2            XOR EDX,EDX
00497295    8A13            MOV DL,BYTE PTR DS:
00497297    8A92 2DFD4900   MOV DL,BYTE PTR DS:          ; EDX=a1~4,到处查表得到字符。
0049729D    E8 BED0F6FF   CALL 东方法律.00404360
004972A2    8B55 F0         MOV EDX,DWORD PTR SS:
004972A5    8BC7            MOV EAX,EDI
004972A7    E8 94D1F6FF   CALL 东方法律.00404440
004972AC    43            INC EBX
004972AD    4E            DEC ESI
004972AE^ 75 E0         JNZ SHORT 东方法律.00497290                  ; 依次取四个字符
004972B0    837D FC 00      CMP DWORD PTR SS:,0
004972B4^ 0F85 1FFFFFFF   JNZ 东方法律.004971D9                        ; 所有的字符连接起来就是正确的注册码
004972BA    33C0            XOR EAX,EAX


注册表:
0049FD2C41 49 59 41 47 50 58 44 4A 51 57 4D 48 56 43 4EAIYAGPXDJQWMHVCN
0049FD3C46 55 5A 52 42 4B 45 53 4F 4C 54 74 66 6B 79 73FUZRBKESOLTtfkys
0049FD4C62 6F 68 6C 75 6A 77 65 63 70 6D 69 61 71 6E 64bohlujwecpmiaqnd
0049FD5C78 7A 76 67 72 34 36 2B 30 32 35 37 33 2F 38 31xzvgr46+02573/81
0049FD6C3D 39                                          =9

------------------------------------------------------------------------
【破解总结】1、先将机器码与某一特殊字符串进行变形,依次取其ASCII码与自身的长度进行异或运算,与一自加数进行异或运算,结果分别设为X()和Y()。
2、倒序取机器码各位的ASCII码与X()的各位进行异或运算。结果为X()。
3、Y()=Y() XOR X()
4、Y()继续运算Y()=Y()XOR LEN(特殊字符),Y()=Y() XOR BL++
5、再将Y()进行一次运算,每三个一组,进行运算得到四个数再去查表,得到正确的注册码。
【补充说明】实际上使用这种软件做的电子书算法都是一样的,而且如果你下载了这个制作电子书的软件你就会得到一个注册机,唯一的区别就是你不知道其他人做电子书时使用的密钥,就是那个特殊字符,有了它就不必自己做注册机了。
------------------------------------------------------------------------
【版权声明】1、本注册机仅限用于学习和研究目的;
2、不得将注册内容用于商业或者非法用途,否则,一切后果请用户自负。
3、您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。
4、如果您喜欢该程序,得到更好的正版服务,请支持国软、注册购买。

china-ice 发表于 2009-4-26 23:12

经典啊~~学习中~~~~

751101 发表于 2009-4-27 11:08

怎么没源程序?我去下载个看看

落雪飞花 发表于 2011-2-9 19:54

喜欢看这些文章!非常有意义

落雪飞花 发表于 2011-2-25 23:31

看看怎么样啊!收藏下
页: [1]
查看完整版本: 东方法律宝典 2009注册算法分析