[原创]易语言桃木剑系列软件之――乾坤六十四卦 V2.01算法分析
【破文标题】易语言桃木剑系列软件之――乾坤六十四卦 V2.01算法分析
【破文作者】CDboy
【作者邮箱】cdboy_cn@yahoo.com.cn
【使用工具】二哥修改版OD,PEiD
【软件名称】桃木剑系列软件之――乾坤六十四卦 V2.01
【下载地址】http://www.skycn.com/soft/14810.html
【保护方式】功能限制
【软件语言】易语言
【软件简介】算卦
【破解声明】菜鸟学习技术,仅此而已
【破解过程】
应二哥要求,特找了个易的东东,正在想哪里有易的,刚好就有个送上门了,呵呵^_^
用PEID检测无法识别,在安装目录下找到文件krnln.fnr
用OD加载
00401000 >/$ E8 06000000 CALL tmjqk64g.0040100B
00401005 |. 50 PUSH EAX ; /ExitCode
00401006 \. E8 BB010000 CALL <JMP.&KERNEL32.ExitProcess> ; \ExitProcess
0040100B /$ 55 PUSH EBP
0040100C |. 8BEC MOV EBP,ESP
0040100E |. 81C4 F0FEFFFF ADD ESP,-110
00401014 |. E9 83000000 JMP tmjqk64g.0040109C
00401019 |. 6B 72 6E 6C 6>ASCII "krnln.fnr",0
00401023 |. 6B 72 6E 6C 6>ASCII "krnln.fne",0
0040102D |. 47 65 74 4E 6>ASCII "GetNewSock",0
00401038 |. 53 6F 66 74 7>ASCII "Software\FlySky\"
00401048 |. 45 5C 49 6E 7>ASCII "E\Install",0
00401052 |. 50 61 74 68 0>ASCII "Path",0
00401057 |. 4E 6F 74 20 6>ASCII "Not found the ke"
00401067 |. 72 6E 65 6C 2>ASCII "rnel library or "
00401077 |. 74 68 65 20 6>ASCII "the kernel libra"
00401087 |. 72 79 20 69 7>ASCII "ry is invalid!",0
00401096 |. 45 72 72 6F 7>ASCII "Error",0
典型的易入口代码,综上判断就是易的东东(其实看安装界面就可以猜到是易的)
F9运行 点注册,机器码2244616410 注册码123456
Alt+M打开内存镜象
内存镜像,项目 36
地址=00403000
大小=00080000 (524288.)
Owner=tmjqk64g 00400000
区段=.ecode //这里F2下断点 一会儿直接中断在其核心代码处
类型=Imag 01001002
访问=R
初始访问=RWE
立刻断在
00481882 55 PUSH EBP //音乐还蛮好听的
00481883 8BEC MOV EBP,ESP
00481885 81EC 30000000 SUB ESP,30
0048188B 68 04000080 PUSH 80000004
00481890 6A 00 PUSH 0
00481892 68 5E754100 PUSH tmjqk64g.0041755E
00481897 68 01000000 PUSH 1
0048189C BB 58050000 MOV EBX,558
004818A1 E8 120B0000 CALL tmjqk64g.004823B8
004818A6 83C4 10 ADD ESP,10
004818A9 68 00000000 PUSH 0
004818AE BB 40060000 MOV EBX,640
004818B3 E8 000B0000 CALL tmjqk64g.004823B8
004818B8 83C4 04 ADD ESP,4
004818BB 68 01030080 PUSH 80000301
004818C0 6A 00 PUSH 0
004818C2 68 01000000 PUSH 1
004818C7 68 01000000 PUSH 1
004818CC BB 20060000 MOV EBX,620
004818D1 E8 E20A0000 CALL tmjqk64g.004823B8 //取机器码前5位的16进制
004818D6 83C4 10 ADD ESP,10 //EAX=机器码前5位的16进制=57A1
004818D9 8945 F4 MOV DWORD PTR SS:[EBP-C],EAX
004818DC 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX
004818DF 894D FC MOV DWORD PTR SS:[EBP-4],ECX //ECX=8000401 是个剧机器码的常数
004818E2 6A FF PUSH -1
004818E4 6A 08 PUSH 8
004818E6 68 A8000116 PUSH 160100A8
004818EB 68 01000152 PUSH 52010001
004818F0 E8 CF0A0000 CALL tmjqk64g.004823C4 //取假码
004818F5 83C4 10 ADD ESP,10
004818F8 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX //假码保存到[EBP-10]即12F738
004818FB 68 01030080 PUSH 80000301
00481900 6A 00 PUSH 0
00481902 68 06000000 PUSH 6
00481907 68 04000080 PUSH 80000004
0048190C 6A 00 PUSH 0
0048190E 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10] //[EBP-10]移入EAX
00481911 85C0 TEST EAX,EAX
00481913 75 05 JNZ SHORT tmjqk64g.0048191A
00481915 B8 E44E4000 MOV EAX,tmjqk64g.00404EE4
0048191A 50 PUSH EAX //假码入栈
0048191B 68 02000000 PUSH 2
00481920 BB 34010000 MOV EBX,134
00481925 E8 8E0A0000 CALL tmjqk64g.004823B8 //取假码前6位
0048192A 83C4 1C ADD ESP,1C
0048192D 8945 EC MOV DWORD PTR SS:[EBP-14],EAX //假码前6位移入[EBP-14]
00481930 8B5D F0 MOV EBX,DWORD PTR SS:[EBP-10] //原假码再移入EBX
00481933 85DB TEST EBX,EBX
00481935 74 09 JE SHORT tmjqk64g.00481940
00481937 53 PUSH EBX
00481938 E8 6F0A0000 CALL tmjqk64g.004823AC
0048193D 83C4 04 ADD ESP,4
00481940 68 04000080 PUSH 80000004
00481945 6A 00 PUSH 0
00481947 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14] //[EBP-14]=假码=EAX
0048194A 85C0 TEST EAX,EAX
0048194C 75 05 JNZ SHORT tmjqk64g.00481953
0048194E B8 E44E4000 MOV EAX,tmjqk64g.00404EE4
00481953 50 PUSH EAX
00481954 68 01000000 PUSH 1
00481959 BB 64010000 MOV EBX,164
0048195E E8 550A0000 CALL tmjqk64g.004823B8
00481963 83C4 10 ADD ESP,10
00481966 8945 E4 MOV DWORD PTR SS:[EBP-1C],EAX
00481969 8955 E8 MOV DWORD PTR SS:[EBP-18],EDX
0048196C 8B5D EC MOV EBX,DWORD PTR SS:[EBP-14]
0048196F 85DB TEST EBX,EBX
00481971 74 09 JE SHORT tmjqk64g.0048197C
00481973 53 PUSH EBX
00481974 E8 330A0000 CALL tmjqk64g.004823AC //下面有大量的浮点运算
00481979 83C4 04 ADD ESP,4
0048197C DD45 E4 FLD QWORD PTR SS:[EBP-1C] //假码存入[EBP-1C]
0048197F DC35 15764100 FDIV QWORD PTR DS:[417615] //假码除以5
00481985 DD5D DC FSTP QWORD PTR SS:[EBP-24] //结果出栈[EBP-24]
00481988 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
0048198B 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
0048198E 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] //[EBP-C]=57AE=EAX
00481991 81F9 01010080 CMP ECX,80000101 //ECX与80000101比较
00481997 75 07 JNZ SHORT tmjqk64g.004819A0 //跳
00481999 25 FF000000 AND EAX,0FF
0048199E EB 26 JMP SHORT tmjqk64g.004819C6
004819A0 81F9 01020080 CMP ECX,80000201 //ECX与80000201比较
004819A6 75 03 JNZ SHORT tmjqk64g.004819AB //跳
004819A8 98 CWDE
004819A9 EB 1B JMP SHORT tmjqk64g.004819C6
004819AB 8945 D4 MOV DWORD PTR SS:[EBP-2C],EAX
004819AE 81F9 01030080 CMP ECX,80000301 //ECX与80000201比较
004819B4 74 13 JE SHORT tmjqk64g.004819C9 //没跳
004819B6 81F9 01040080 CMP ECX,80000401 //ECX与80000201比较
004819BC 75 10 JNZ SHORT tmjqk64g.004819CE //没跳
004819BE 8955 D8 MOV DWORD PTR SS:[EBP-28],EDX
004819C1 DF6D D4 FILD QWORD PTR SS:[EBP-2C] //57AE存入
004819C4 EB 2A JMP SHORT tmjqk64g.004819F0 //跳
004819C6 8945 D4 MOV DWORD PTR SS:[EBP-2C],EAX
004819C9 DB45 D4 FILD DWORD PTR SS:[EBP-2C]
004819CC EB 22 JMP SHORT tmjqk64g.004819F0
004819CE 81F9 01050080 CMP ECX,80000501
004819D4 75 05 JNZ SHORT tmjqk64g.004819DB
004819D6 D945 D4 FLD DWORD PTR SS:[EBP-2C]
004819D9 EB 15 JMP SHORT tmjqk64g.004819F0
004819DB 81F9 01060080 CMP ECX,80000601
004819E1 74 16 JE SHORT tmjqk64g.004819F9
004819E3 68 02000000 PUSH 2
004819E8 E8 DD090000 CALL tmjqk64g.004823CA
004819ED 83C4 04 ADD ESP,4
004819F0 DD5D D4 FSTP QWORD PTR SS:[EBP-2C] //57AE的十进制22446出栈
004819F3 8B45 D4 MOV EAX,DWORD PTR SS:[EBP-2C]
004819F6 8B55 D8 MOV EDX,DWORD PTR SS:[EBP-28]
004819F9 8945 D4 MOV DWORD PTR SS:[EBP-2C],EAX
004819FC 8955 D8 MOV DWORD PTR SS:[EBP-28],EDX
004819FF DD45 D4 FLD QWORD PTR SS:[EBP-2C] //机器码前5位22446存入
00481A02 DC65 DC FSUB QWORD PTR SS:[EBP-24] //减去[EBP-24]里的数 就是减去假码除以5的商
00481A05 D9E4 FTST //与零比较
00481A07 DFE0 FSTSW AX //存入AX
00481A09 F6C4 01 TEST AH,1 //AH和1比较
00481A0C 74 02 JE SHORT tmjqk64g.00481A10 //等跳 这里要跳才行
00481A0E D9E0 FCHS //改变符号
00481A10 DC1D 05764100 FCOMP QWORD PTR DS:[417605] //与[417605]里面的浮点数比较
00481A16 DFE0 FSTSW AX
00481A18 F6C4 41 TEST AH,41
00481A1B B8 00000000 MOV EAX,0 //EAX=0
00481A20 0F95C0 SETNE AL //条件为假时置0 为真(ZF=0)置1
这部分就是说注册码左边6位除以5再减机器码前5位必须等于零
00481A23 8945 D0 MOV DWORD PTR SS:[EBP-30],EAX //EAX=[EBP-30]
00481A26 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4] //[EBP-4]=80000401
00481A29 81F9 04000080 CMP ECX,80000004
00481A2F 74 0C JE SHORT tmjqk64g.00481A3D
00481A31 81F9 05000080 CMP ECX,80000005
00481A37 0F85 10000000 JNZ tmjqk64g.00481A4D
00481A3D 8B5D F4 MOV EBX,DWORD PTR SS:[EBP-C]
00481A40 85DB TEST EBX,EBX
00481A42 74 09 JE SHORT tmjqk64g.00481A4D
00481A44 53 PUSH EBX
00481A45 E8 62090000 CALL tmjqk64g.004823AC
00481A4A 83C4 04 ADD ESP,4
00481A4D 837D D0 00 CMP DWORD PTR SS:[EBP-30],0 //[EBP-30]不是零则注册成功
00481A51 0F84 86030000 JE tmjqk64g.00481DDD //关键跳1是0跳则over
00481A57 68 01030080 PUSH 80000301
00481A5C 6A 00 PUSH 0
00481A5E 68 04000000 PUSH 4
00481A63 68 01000000 PUSH 1
00481A68 BB 20060000 MOV EBX,620
00481A6D E8 46090000 CALL tmjqk64g.004823B8 //取机器码后5位的16进制401A
00481A72 83C4 10 ADD ESP,10
00481A75 8945 F4 MOV DWORD PTR SS:[EBP-C],EAX //移入[EBP-C]
00481A78 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX
00481A7B 894D FC MOV DWORD PTR SS:[EBP-4],ECX //ECX=[EBP-4]前面的常数
00481A7E 6A FF PUSH -1
00481A80 6A 08 PUSH 8
00481A82 68 A8000116 PUSH 160100A8
00481A87 68 01000152 PUSH 52010001
00481A8C E8 33090000 CALL tmjqk64g.004823C4 //取注册码
00481A91 83C4 10 ADD ESP,10
00481A94 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX //注册码移入[EBP-10]
00481A97 68 01030080 PUSH 80000301
00481A9C 6A 00 PUSH 0
00481A9E 68 06000000 PUSH 6
00481AA3 68 04000080 PUSH 80000004
00481AA8 6A 00 PUSH 0
00481AAA 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
00481AAD 85C0 TEST EAX,EAX
00481AAF 75 05 JNZ SHORT tmjqk64g.00481AB6
00481AB1 B8 E44E4000 MOV EAX,tmjqk64g.00404EE4
00481AB6 50 PUSH EAX
00481AB7 68 02000000 PUSH 2
00481ABC BB 38010000 MOV EBX,138
00481AC1 E8 F2080000 CALL tmjqk64g.004823B8 //取注册码右边6位
00481AC6 83C4 1C ADD ESP,1C
00481AC9 8945 EC MOV DWORD PTR SS:[EBP-14],EAX //移入[EBP-14]
00481ACC 8B5D F0 MOV EBX,DWORD PTR SS:[EBP-10]
00481ACF 85DB TEST EBX,EBX
00481AD1 74 09 JE SHORT tmjqk64g.00481ADC
00481AD3 53 PUSH EBX
00481AD4 E8 D3080000 CALL tmjqk64g.004823AC
00481AD9 83C4 04 ADD ESP,4
00481ADC 68 04000080 PUSH 80000004
00481AE1 6A 00 PUSH 0
00481AE3 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14] //[EBP-14]=EAX
00481AE6 85C0 TEST EAX,EAX
00481AE8 75 05 JNZ SHORT tmjqk64g.00481AEF
00481AEA B8 E44E4000 MOV EAX,tmjqk64g.00404EE4
00481AEF 50 PUSH EAX
00481AF0 68 01000000 PUSH 1
00481AF5 BB 64010000 MOV EBX,164
00481AFA E8 B9080000 CALL tmjqk64g.004823B8
00481AFF 83C4 10 ADD ESP,10
00481B02 8945 E4 MOV DWORD PTR SS:[EBP-1C],EAX
00481B05 8955 E8 MOV DWORD PTR SS:[EBP-18],EDX
00481B08 8B5D EC MOV EBX,DWORD PTR SS:[EBP-14] //[EBP-14]=EBX
00481B0B 85DB TEST EBX,EBX
00481B0D 74 09 JE SHORT tmjqk64g.00481B18
00481B0F 53 PUSH EBX //保存
00481B10 E8 97080000 CALL tmjqk64g.004823AC
00481B15 83C4 04 ADD ESP,4
00481B18 DD45 E4 FLD QWORD PTR SS:[EBP-1C] //保存假码右边6位
00481B1B DC35 15764100 FDIV QWORD PTR DS:[417615] //除以5
00481B21 DD5D DC FSTP QWORD PTR SS:[EBP-24] //结果出栈
00481B24 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
00481B27 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
00481B2A 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] //[EBP-C]=EAX=401A
00481B2D 81F9 01010080 CMP ECX,80000101 //比较ECX
00481B33 75 07 JNZ SHORT tmjqk64g.00481B3C //跳
00481B35 25 FF000000 AND EAX,0FF
00481B3A EB 26 JMP SHORT tmjqk64g.00481B62
00481B3C 81F9 01020080 CMP ECX,80000201 //比较ECX
00481B42 75 03 JNZ SHORT tmjqk64g.00481B47 //跳
00481B44 98 CWDE
00481B45 EB 1B JMP SHORT tmjqk64g.00481B62
00481B47 8945 D4 MOV DWORD PTR SS:[EBP-2C],EAX //EAX=[EBP-2C]=401A
00481B4A 81F9 01030080 CMP ECX,80000301 //比较ECX
00481B50 74 13 JE SHORT tmjqk64g.00481B65 //不跳
00481B52 81F9 01040080 CMP ECX,80000401 //比较ECX
00481B58 75 10 JNZ SHORT tmjqk64g.00481B6A //不跳
00481B5A 8955 D8 MOV DWORD PTR SS:[EBP-28],EDX
00481B5D DF6D D4 FILD QWORD PTR SS:[EBP-2C] //[EBP-2C]=401A存入
00481B60 EB 2A JMP SHORT tmjqk64g.00481B8C //跳
00481B62 8945 D4 MOV DWORD PTR SS:[EBP-2C],EAX
00481B65 DB45 D4 FILD DWORD PTR SS:[EBP-2C]
00481B68 EB 22 JMP SHORT tmjqk64g.00481B8C
00481B6A 81F9 01050080 CMP ECX,80000501
00481B70 75 05 JNZ SHORT tmjqk64g.00481B77
00481B72 D945 D4 FLD DWORD PTR SS:[EBP-2C]
00481B75 EB 15 JMP SHORT tmjqk64g.00481B8C
00481B77 81F9 01060080 CMP ECX,80000601
00481B7D 74 16 JE SHORT tmjqk64g.00481B95
00481B7F 68 02000000 PUSH 2
00481B84 E8 41080000 CALL tmjqk64g.004823CA
00481B89 83C4 04 ADD ESP,4
00481B8C DD5D D4 FSTP QWORD PTR SS:[EBP-2C] //[EBP-2C]的10进制16410出栈
00481B8F 8B45 D4 MOV EAX,DWORD PTR SS:[EBP-2C]
00481B92 8B55 D8 MOV EDX,DWORD PTR SS:[EBP-28]
00481B95 8945 D4 MOV DWORD PTR SS:[EBP-2C],EAX
00481B98 8955 D8 MOV DWORD PTR SS:[EBP-28],EDX
00481B9B DD45 D4 FLD QWORD PTR SS:[EBP-2C]
00481B9E DC65 DC FSUB QWORD PTR SS:[EBP-24] //16410减[EBP-24]里的数,也就是机器码后5位减假码右边6位
00481BA1 D9E4 FTST //与0比较
00481BA3 DFE0 FSTSW AX //存入
00481BA5 F6C4 01 TEST AH,1
00481BA8 74 02 JE SHORT tmjqk64g.00481BAC
00481BAA D9E0 FCHS
00481BAC DC1D 05764100 FCOMP QWORD PTR DS:[417605]
00481BB2 DFE0 FSTSW AX
00481BB4 F6C4 41 TEST AH,41 //AH和41比较
00481BB7 B8 00000000 MOV EAX,0 //EAX=0
00481BBC 0F95C0 SETNE AL //条件为假时置0 为真(ZF=0)置1
走到这里我们看到这部分的比较方法和上面的一样,也是注册码右边6位除以5再减机器码后5位必须等于零 那么算法就出来了^_^
00481BBF 8945 D0 MOV DWORD PTR SS:[EBP-30],EAX //[EBP-30]=EAX
00481BC2 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
00481BC5 81F9 04000080 CMP ECX,80000004
00481BCB 74 0C JE SHORT tmjqk64g.00481BD9
00481BCD 81F9 05000080 CMP ECX,80000005
00481BD3 0F85 10000000 JNZ tmjqk64g.00481BE9
00481BD9 8B5D F4 MOV EBX,DWORD PTR SS:[EBP-C]
00481BDC 85DB TEST EBX,EBX
00481BDE 74 09 JE SHORT tmjqk64g.00481BE9
00481BE0 53 PUSH EBX
00481BE1 E8 C6070000 CALL tmjqk64g.004823AC
00481BE6 83C4 04 ADD ESP,4
00481BE9 837D D0 00 CMP DWORD PTR SS:[EBP-30],0
00481BED 0F84 71010000 JE tmjqk64g.00481D64 //跳则over
......省略部分代码
00481C6B BB 24060000 MOV EBX,624
00481C70 E8 43070000 CALL tmjqk64g.004823B8
00481C75 83C4 1C ADD ESP,1C
00481C78 68 04000080 PUSH 80000004
00481C7D 6A 00 PUSH 0
00481C7F 68 1D764100 PUSH tmjqk64g.0041761D
00481C84 68 01030080 PUSH 80000301
00481C89 6A 00 PUSH 0
00481C8B 68 00000000 PUSH 0
00481C90 68 04000080 PUSH 80000004
00481C95 6A 00 PUSH 0
00481C97 68 28764100 PUSH tmjqk64g.00417628
00481C9C 68 03000000 PUSH 3
00481CA1 BB 00030000 MOV EBX,300
00481CA6 E8 0D070000 CALL tmjqk64g.004823B8 //这里弹出成功提示
......省略部分代码
00481DDD 68 04000080 PUSH 80000004 //跳到这里
00481DE2 6A 00 PUSH 0
00481DE4 68 BE764100 PUSH tmjqk64g.004176BE
00481DE9 68 01030080 PUSH 80000301
00481DEE 6A 00 PUSH 0
00481DF0 68 00000000 PUSH 0
00481DF5 68 04000080 PUSH 80000004
00481DFA 6A 00 PUSH 0
00481DFC 68 C9764100 PUSH tmjqk64g.004176C9
00481E01 68 03000000 PUSH 3
00481E06 BB 00030000 MOV EBX,300
00481E0B E8 A8050000 CALL tmjqk64g.004823B8 //这里弹出错误消息匡
算法总结:
注册码左边6位除以5再减机器码前5位必须等于零且
注册码右边6位除以5再减机器码后5位必须等于零
str=2244616410
Code=Left(str,5)*5+Right(str,5)*5
所以
22446*5=112230
16410*5=82050
机器码=2244616410
注册码=11223082050
注册成功后写入安装目录下的reg.edb set.edb两个文件
恢复这两个文件又可以再玩一次
菜鸟写破文,感谢大家看完
==================================================================================
【工程声明】本过程只供内部学习之用!如要转载请保持过程完整!
==================================================================================
[注意]看雪招聘,专注安全领域的专业人才平台!