欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

公路坐标计算系统 1.0

公路坐标计算系统 <SPAN CLASS="pediy"> &nbsp;1.0</SPAN>

【软件名称】:公路坐标计算系统
【整理日期】: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加密,我的功力还不够,只能尽我的能力,把我所知道的写出来与大家一起分享,研究。有谁能真正分析出完整的加密算法的话,希望能加以补充,大家一起进步!!!

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功