【软件名称】:公路坐标计算系统
【整理日期】:2003.4.24
【最新版本】:1.0 Build
418
【文件大小】:179KB
【软件授权】:共享软件
【使用平台】:Win9x/Me/NT/2000/XP
【下载地址】:http://www.onlinedown.net/measure.htm
【软件简介】:包括直线,圆曲线坐标,缓和曲线中桩计算,任意长度的边桩的坐标计算,任一点或任一桩号的坐标计算(包括边桩),并有测边交会,单三角形,前方交会,后方交会,侧方交会,坐标正反算,计算器等工具。并新增任意角度的边桩计算。
【作 者】:风雨无阻
【声
明】:纯技术交流,无任何商业目的
【破解工具】:fi2.5, Ollydbg1.09 中文版,AspackDie 1.41
汉化版,TRW2000娃娃汉化版,win98系统
【破解过程】
第一步:用fi探测一下,是Aspack2.11
的壳,使用AspackDie 1.41 汉化版脱壳成功。
第二步:填写注册信息,启动TRW2000娃娃汉化版,下万能断点bpx hmemcpy 回到程序点击注册,程序被TRW拦截,pmodule
回到程序领空发现在00417801处,关闭TRW 使用Ollydbg1.09 中文版载入程序,在00417801处下断点:分析如下
00417801
|. E8 941D0000 CALL <JMP.&MFC42.#3097>
--->读入假码 "87654321"
00417806
|. 8B4D F0 MOV ECX,DWORD PTR SS:[EBP-10]
00417809
|. 8B41 F8 MOV EAX,DWORD PTR DS:[ECX-8]
0041780C
|. 83F8 08 CMP EAX,8
0041780F |. 75
19 JNZ SHORT UNPACKED.0041782A
--->比较位数是否是8位,如果不是则跳转
00417811 |. 8D55 F0 LEA
EDX,DWORD PTR SS:[EBP-10]
00417814 |. 8BCF
MOV ECX,EDI
00417816 |. 52
PUSH EDX
--->此时EDX所指向的内存单元保存的是假码的地址
00417817
|. 68 1E040000 PUSH 41E
0041781C |. E8 791D0000
CALL <JMP.&MFC42.#3097>
--->读入假码 abcdefgh
00417821
|. 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
00417824
|. 8378 F8 08 CMP DWORD PTR DS:[EAX-8],8
00417828 |.
74 1F JE SHORT UNPACKED.00417849
--->比较位数是否是8位,如果是则跳转
0041782A
|> 8D4D E8 LEA ECX,DWORD PTR SS:[EBP-18]
0041782D
|. C645 FC 01 MOV BYTE PTR SS:[EBP-4],1
00417831 |.
E8 7E1B0000 CALL <JMP.&MFC42.#800>
00417836 |.
8D4D E4 LEA ECX,DWORD PTR SS:[EBP-1C]
00417839 |.
885D FC MOV BYTE PTR SS:[EBP-4],BL
0041783C |.
E8 731B0000 CALL <JMP.&MFC42.#800>
00417841 |.
8975 FC MOV DWORD PTR SS:[EBP-4],ESI
00417844 |.
E9 3E060000 JMP UNPACKED.00417E87
00417849
|> 8D4D F0 LEA ECX,DWORD PTR SS:[EBP-10]
0041784C
|. 51 PUSH ECX
0041784D |.
68 1C040000 PUSH 41C
00417852 |. 8BCF
MOV ECX,EDI
00417854 |. E8 411D0000 CALL <JMP.&MFC42.#3097>
--->读入机器码共8位我的是"40019524"
00417859
|. 8B75 F0 MOV ESI,DWORD PTR SS:[EBP-10]
0041785C
|. 8D55 D4 LEA EDX,DWORD PTR SS:[EBP-2C]
0041785F
|. 2BF2 SUB ESI,EDX
00417861 |.
8D45 D4 LEA EAX,DWORD PTR SS:[EBP-2C]
00417864 |.
BA 08000000 MOV EDX,8
--->EDX = 8
00417869
|> 8A0C06 /MOV CL,BYTE PTR DS:[ESI+EAX]
--->依次将机器码40019524送入CL
0041786C
|. 8808 |MOV BYTE PTR DS:[EAX],CL
--->将CL内容送入DS:[EAX]保存
0041786E
|. 40 |INC EAX
--->EAX = EAX + 1
0041786F
|. 4A |DEC EDX
--->EDX = EDX - 1
00417870
|.^75 F7 \JNZ SHORT UNPACKED.00417869
--->总共循环8次
00417872
|. 8D85 30FFFFFF LEA EAX,DWORD PTR SS:[EBP-D0]
--->此时EAX
= 0069EF94
而69EF94内容是一字符串“WL750415”
00417878
|. 8D4D D4 LEA ECX,DWORD PTR SS:[EBP-2C]
--->机器码地址送入ECX
0041787B
|. 50 PUSH EAX
0041787C |.
51 PUSH ECX
--->将机器码和“WL750415”入栈
0041787D
|. 885D DC MOV BYTE PTR SS:[EBP-24],BL
00417880
|. E8 BBFCFFFF CALL UNPACKED.00417540
--->跳转到下面继续执行
---------------------------------------
00417540
/$ 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
--->EAX指向机器码
00417544
|. 56 PUSH ESI
00417545 |.
8B7424 0C MOV ESI,DWORD PTR SS:[ESP+C]
00417549 |.
8A08 MOV CL,BYTE PTR DS:[EAX]
--->将机器码的第一位4送入CL = 34H
0041754B |. D0E1
SHL CL,1
--->CL左移一位也就是CL = CL * 2 = 68H
0041754D |. 880E MOV
BYTE PTR DS:[ESI],CL
--->将计算结果保存
0041754F
|. 8A10 MOV DL,BYTE PTR DS:[EAX]
--->将机器码的第一位4送入DL = 34H
00417551
|. 8A48 01 MOV CL,BYTE PTR DS:[EAX+1]
--->将机器码的第二位0送入CL = 30H
00417554
|. C0EA 06 SHR DL,6
--->DL右移6位,DL
= 00H
00417557 |.
80E2 02 AND DL,2
--->与2进行"与"运算后
DL = 00H
0041755A |.
C0E1 02 SHL CL,2
--->CL左移两位 CL
= CL * 4 = C0H
0041755D
|. 0AD1 OR DL,CL
--->或运算DL
= C0H
0041755F |.
8856 01 MOV BYTE PTR DS:[ESI+1],DL
--->将计算结果保存
00417562
|. 8A50 01 MOV DL,BYTE PTR DS:[EAX+1]
--->送入机器码的第二位0
00417565 |. 8A48 02 MOV
CL,BYTE PTR DS:[EAX+2]
--->送入机器码的第三位0
00417568 |.
C0EA 05 SHR DL,5
0041756B |. 80E2 06
AND DL,6
0041756E |. C0E1 03
SHL CL,3
00417571 |. 0AD1 OR
DL,CL
00417573 |. 8856 02 MOV BYTE PTR DS:[ESI+2],DL
--->将计算结果保存
00417576
|. 8A50 02 MOV DL,BYTE PTR DS:[EAX+2]
00417579
|. 8A48 03 MOV CL,BYTE PTR DS:[EAX+3]
--->送入机器码的第3,4 位"0,1"进行计算
0041757C |. C0EA 04
SHR DL,4
0041757F |. 80E2 0E
AND DL,0E
00417582 |. C0E1 04 SHL CL,4
00417585
|. 0AD1 OR DL,CL
00417587 |.
8856 03 MOV BYTE PTR DS:[ESI+3],DL
0041758A |.
8A50 03 MOV DL,BYTE PTR DS:[EAX+3]
0041758D |.
8A48 04 MOV CL,BYTE PTR DS:[EAX+4]
--->送入机器码的第4,5位"1,9"进行计算
00417590 |. C0EA 03
SHR DL,3
00417593 |. 80E2 1E AND
DL,1E
00417596 |. C0E1 05 SHL CL,5
00417599
|. 0AD1 OR DL,CL
0041759B |.
8856 04 MOV BYTE PTR DS:[ESI+4],DL
0041759E |.
8A50 04 MOV DL,BYTE PTR DS:[EAX+4]
004175A1 |.
8A48 05 MOV CL,BYTE PTR DS:[EAX+5]
--->送入机器码的第5,6 位"9,5"进行计算
004175A4 |. C0EA 02
SHR DL,2
004175A7 |. 80E2 3E AND
DL,3E
004175AA |. C0E1 06 SHL CL,6
004175AD
|. 0AD1 OR DL,CL
004175AF |.
8856 05 MOV BYTE PTR DS:[ESI+5],DL
004175B2 |.
8A50 05 MOV DL,BYTE PTR DS:[EAX+5]
004175B5 |.
8A48 06 MOV CL,BYTE PTR DS:[EAX+6]
--->送入机器码的第6,7 位"5,2"进行计算
004175B8 |. D0EA
SHR DL,1
004175BA |. 80E2 7E
AND DL,7E
004175BD |. C0E1 07 SHL CL,7
004175C0
|. 0AD1 OR DL,CL
004175C2 |.
8856 06 MOV BYTE PTR DS:[ESI+6],DL
004175C5 |.
8A50 06 MOV DL,BYTE PTR DS:[EAX+6]
--->送入机器码的第7,8 位"2,4"进行计算
004175C8 |. 80E2 FE
AND DL,0FE
004175CB |. 8856 07 MOV
BYTE PTR DS:[ESI+7],DL
004175CE |. 5E
POP ESI
004175CF \. C3
RETN
--->此处返回继续
--->最后的计算结果
DS:[ESI] = 68 C0 80 12 26 4E 1A 32
----------------------------------------
00417885
|. 8D95 30FFFFFF LEA EDX,DWORD PTR SS:[EBP-D0]
0041788B |.
8D85 30FEFFFF LEA EAX,DWORD PTR SS:[EBP-1D0]
--->此时EAX指向
0069EE94 B6 EE 69 00 AA 7E 00 00
00417891 |. 52
PUSH EDX
--->将刚刚计算的结果地址入栈
00417892
|. 50 PUSH EAX
00417893 |.
E8 C8FBFFFF CALL UNPACKED.00417460
--->???????这个地方我跟进过,不过没有搞懂,好像是
DES加密算法,总共加密了四次
还请各位密界高手指点??????????
00417898 |. 8D4D D4 LEA ECX,DWORD PTR SS:[EBP-2C]
0041789B
|. 6A 01 PUSH 1
0041789D |. 8D95
30FEFFFF LEA EDX,DWORD PTR SS:[EBP-1D0]
004178A3 |. 51
PUSH ECX
--->机器码入栈
004178A4
|. 52 PUSH EDX
--->将00417893处的计算结果入栈
004178A5
|. E8 F6FBFFFF CALL UNPACKED.004174A0
--->此CALL对机器码进行了变换得到以下结果
由于过于复杂,就不列出来了。
004178AA |. 8B45 D7
MOV EAX,DWORD PTR SS:[EBP-29]
--->EAX = BB3373CB
004178AD
|. 8B4D D6 MOV ECX,DWORD PTR SS:[EBP-2A]
--->ECX = 3373CB30
004178B0
|. 8B55 D5 MOV EDX,DWORD PTR SS:[EBP-2B]
--->EDX = 73CB3010
004178B3
|. 25 FF000000 AND EAX,0FF
004178B8 |. 83F0 04
XOR EAX,4
004178BB |. 81E1 FF000000 AND ECX,0FF
--->ECX = 00000030
004178C1
|. 50 PUSH EAX
--->EAX = 000000CF 注册码前半部分最后两位是"CF"
004178C2
|. 8B45 D4 MOV EAX,DWORD PTR SS:[EBP-2C]
--->EAX = CB301038
004178C5
|. 81E2 FF000000 AND EDX,0FF
004178CB |. 83F1 0A
XOR ECX,0A
004178CE |. 25 FF000000 AND EAX,0FF
004178D3
|. 83F2 08 XOR EDX,8
004178D6 |. 51
PUSH ECX
--->ECX
= 0000003A 注册码前半部分5,6两位是"3A"
004178D7
|. 83F0 06 XOR EAX,6
004178DA |. 52
PUSH EDX
--->ECX
= 00000018 注册码前半部分3,4两位是"18"
004178DB
|. 50 PUSH EAX
--->ECX = 0000003E 注册码前半部分1,2两位是"3E"
至此注册码的前半部分已经完成"3E183ACF"
004178DC
|. 8D4D E4 LEA ECX,DWORD PTR SS:[EBP-1C]
004178DF
|. 68 28104200 PUSH UNPACKED.00421028
; ASCII "%02X%02X%02X%02X"
004178E4
|. 51 PUSH ECX
004178E5 |.
E8 741C0000 CALL <JMP.&MFC42.#2818>
--->将前面计算的两位两位的注册码组合
004178EA
|. 83C4 34 ADD ESP,34
004178ED |. 8D55
E8 LEA EDX,DWORD PTR SS:[EBP-18]
004178F0 |.
8BCF MOV ECX,EDI
004178F2 |. 52
PUSH EDX
004178F3 |. 68 1E040000
PUSH 41E
004178F8 |. E8 9D1C0000 CALL <JMP.&MFC42.#3097>
004178FD
|. 8D4D E8 LEA ECX,DWORD PTR SS:[EBP-18]
00417900
|. E8 8F1C0000 CALL <JMP.&MFC42.#4204>
--->将假码的小写字母转换为大写字母
00417905
|. 8B45 E4 MOV EAX,DWORD PTR SS:[EBP-1C]
--->EAX = 真码,在这设断点,就可得到真码前半部分,也可作成内存注册机
00417908
|. 8B4D E8 MOV ECX,DWORD PTR SS:[EBP-18]
--->ECX = 假码
0041790B
|. 8B35 38B44100 MOV ESI,DWORD PTR DS:[<&MSVCRT._mbscmp>]
; MSVCRT._mbscmp
00417911 |. 50
PUSH EAX
; /s2
00417912
|. 51 PUSH ECX
; |s1
00417913 |. FFD6
CALL ESI
; \_mbscmp
00417915 |.
83C4 08 ADD ESP,8
00417918 |. 85C0
TEST EAX,EAX
0041791A |. 0F85 49050000 JNZ
UNPACKED.00417E69
--->测试跳转,可以在此爆破,注意后面还有一处。
00417920
|. 8B55 DB MOV EDX,DWORD PTR SS:[EBP-25]
00417923
|. 8B45 DA MOV EAX,DWORD PTR SS:[EBP-26]
00417926
|. 8B4D D9 MOV ECX,DWORD PTR SS:[EBP-27]
00417929
|. 81E2 FF000000 AND EDX,0FF
0041792F |. 83F2 06
XOR EDX,6
00417932 |. 25 FF000000 AND EAX,0FF
00417937
|. 52 PUSH EDX
--->EDX = 0000007E 注册码前后部分7,8两位是7E
00417938
|. 8B55 D8 MOV EDX,DWORD PTR SS:[EBP-28]
0041793B
|. 81E1 FF000000 AND ECX,0FF
00417941 |. 83F0 03
XOR EAX,3
00417944 |. 81E2 FF000000 AND EDX,0FF
0041794A
|. 83F1 0B XOR ECX,0B
0041794D |. 50
PUSH EAX
--->EAX
= 000000B8 注册码前后部分5,6两位是B8
0041794E
|. 83F2 0C XOR EDX,0C
00417951 |. 51
PUSH ECX
--->ECX
= 00000038 注册码前后部分3,4两位是38
00417952
|. 52 PUSH EDX
--->EDX = 0000007F 注册码前后部分1,2两位是7F
00417953
|. 8D45 E4 LEA EAX,DWORD PTR SS:[EBP-1C]
00417956
|. 68 28104200 PUSH UNPACKED.00421028
; ASCII "%02X%02X%02X%02X"
0041795B
|. 50 PUSH EAX
0041795C |.
E8 FD1B0000 CALL <JMP.&MFC42.#2818>
--->将前面计算的两位两位的注册码组合
00417961
|. 83C4 18 ADD ESP,18
00417964 |. 8D4D
E8 LEA ECX,DWORD PTR SS:[EBP-18]
00417967 |.
51 PUSH ECX
00417968 |. 68
1F040000 PUSH 41F
0041796D |. 8BCF
MOV ECX,EDI
0041796F |. E8 261C0000 CALL <JMP.&MFC42.#3097>
00417974
|. 8D4D E8 LEA ECX,DWORD PTR SS:[EBP-18]
00417977
|. E8 181C0000 CALL <JMP.&MFC42.#4204>
--->将假码的小写字母转换为大写字母
0041797C
|. 8B55 E4 MOV EDX,DWORD PTR SS:[EBP-1C]
--->真码的后半部分
0041797F
|. 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
00417982
|. 52 PUSH EDX
00417983 |.
50 PUSH EAX
00417984 |. FFD6
CALL ESI
00417986 |. 83C4 08
ADD ESP,8
00417989 |. 85C0
TEST EAX,EAX
0041798B |. 0F85 D8040000 JNZ UNPACKED.00417E69
--->测试跳转,可以在此爆破。
【总 结】注册成功后会在 C 盘建立一名为measure.dll的文件,将其删除就会又成为未注册版。此次并未能完全透彻的分析处他的加密算法,因为软件作者使用了DES加密,我的功力还不够,只能尽我的能力,把我所知道的写出来与大家一起分享,研究。有谁能真正分析出完整的加密算法的话,希望能加以补充,大家一起进步!!!