EASYACCESS6.5打狗记

uaEURESYS  EASYACCESS6.5

限制:采用软件狗,在easyAccesshelp里有个license manager

破解的关键是字符串

Dallas Semiconductor driver not found - Install it if you are using a Dallas Semiconductor dongle

MultiCam for Picolo driver not found or out-of-date - ( Re)install it if you are using MultiCam for Picolo with on-board licences

MultiCam driver not found or out-of-date - ( Re)install it if you are using a Picolo/Grablink/Quickpack/Domino/Multi with on-board licences

Sentinel dongle access problem - Contact Technical Support

Dallas Semiconductor driver not found - Install it if you are using a Dallas Semiconductor dongle

w32dasm可以看出,下面的位置都是字符串的位置。

 

: 0059896A 33D2                    xor edx, edx

: 0059896C 8A 9194995900            mov dl, byte ptr [ecx+00599994]

:00598972 FF2495D8985900          jmp dword ptr [4*edx+005998D8]

 

* Possible StringData Ref from Data Obj ->"The license for EasyGauge is not "

                                        ->"granted - Launch license manager"

                                  |

:00598979 B8D4867E00              mov eax, 007E86D4

:0059897E C3                      ret

 

 

 

* Possible StringData Ref from Data Obj ->"This feature is not available"

                                  |

: 0059897F B8B4867E00              mov eax, 007E86B4

: 00598984 C 3                      ret

 

 

 

l       Possible StringData Ref from Data Obj ->"The license for EasyBarCode is "

 

查找Dallas Semiconductor driver not found - Install it if you are using a Dallas Semiconductor dongle可以找到位置:

00555E37     E8 04A 40400      call EasyAcce .005A 0240

00555E 3C      85C 0             test eax,eax

00555E3E     74 4E            je short EasyAcce.00555E8E

00555E40     50               push eax

00555E41     E8 9A 250400      call EasyAcce.005983E0ß------这个call就出错了。

还有一个入口:如果什么都不输入,弹出出错对话框:An activation code must have following structure :

 XXXX XXXX XXXX XXXX"

 

005579C 8     68 40F 47C 00      push EasyAcce.007CF440             ; ASCII "An activation code must have following structure :

 XXXX XXXX XXXX XXXX"

005579CD     B9 60DA8000      mov ecx,EasyAcce.0080DA60

005579D 2      C 78424 98000000 >mov dword ptr ss:[esp+98],0

005579DD     E8 68791900      call EasyAcce.006EF 34A

005579E2     8B40 1C           mov eax,dword ptr ds:[eax+ 1C ]

005579E5     50               push eax

005579E6     FF15 24187500    call dword ptr ds:[<&USER32.Messag>; USER32.MessageBoxA

005579EC     8D 4C 24 14        lea ecx,dword ptr ss:[esp+14]

 

 

00557964     52               push edx

00557965     50               push eax

00557966     57               push edi

00557967     E8 24850400      call EasyAcce.0059FE90

0055796C      8D 4C 24 78        lea ecx,dword ptr ss:[esp+78] ß-这里出现字符串:堆栈地址= 0012F 890, (ASCII "0740624154")

00557970     51               push ecx

 

//关键的算法,

00557986     50               push eax                                   ; "1111222233334444"

00557987     8D5424 64        lea edx,dword ptr ss:[esp+64]

0055798B     51               push ecx

0055798C      52               push edx                                   ; ASCII "0740624154"

0055798D     E8 AE850400      call EasyAcce.0059FF40; 这个call里面判断注册码

00557992     8B4424 1C         mov eax,dword ptr ss:[esp+ 1C ]; 校验注册码的结果:esp+ 1c =0ffffff

00557996     85C 0             test eax,eax    ; 判断是否等于0

00557998   ^ 0F 84 45FFFFFF    je EasyAcce.005578E3

0055799E     A9 00000080      test eax,80000000   ; 判断是否等于80000000

005579A 3   ^ 0F 84 2DFFFFFF    je EasyAcce.005578D6

005579A 9     8D4424 48        lea eax,dword ptr ss:[esp+48]

005579AD     6A 01            push 1

005579AF     50               push eax    ; 我输入的注册码:"1111222233334444"

005579B0   ^ E9 28FFFFFF      jmp EasyAcce.005578DD

005579B5     68 37020000      push 237

 

 

0059FF40     8B 4C 24 0C         mov ecx,dword ptr ss:[esp+C]; "1111222233334444"

0059FF44     83EC 08          sub esp,8

0059FF47     8D4424 00        lea eax,dword ptr ss:[esp]

0059FF4B     6A 00            push 0

0059FF4D     50               push eax

0059FF4E     51               push ecx    ; 我输入的key

0059FF 4F      E 8 AC 130000      call EasyAcce .005A 1300

0059FF54     8B5424 0C         mov edx,dword ptr ss:[esp+C]               ; 22221111

0059FF58     8B4424 10        mov eax,dword ptr ss:[esp+10]              ; 44443333

0059FF 5C      8B 4C 24 1C         mov ecx,dword ptr ss:[esp+ 1C ]

0059FF60     8915 FC1D8100    mov dword ptr ds:[811DFC],edx   ; 22221111

0059FF 66      A 3 F 81D8100      mov dword ptr ds:[811DF8],eax ; 44443333

0059FF6B     8B4424 18        mov eax,dword ptr ss:[esp+18]; ASCII "0740624154"

0059FF 6F      8B11             mov edx,dword ptr ds:[ecx] ; 1C

0059FF71     52               push edx     ; 1C

0059FF72     50               push eax  ; ASCII "0740624154"

0059FF73     E 8 F 8FDFFFF      call EasyAcce.0059FD70

0059FF78     50               push eax    ; EAX= 2C 25071A

0059FF79     E 8 A 2FDFFFF      call EasyAcce.0059FD20; 这个call里面判断输入的key,保存结果影响eax[811DFC]

0059FF7E     E8 3DFDFFFF      call EasyAcce.0059FCC0  ; 判断[811DFC]的值。

0059FF83     8B 4C 24 30        mov ecx,dword ptr ss:[esp+30]

0059FF87     8B15 FC1D8100    mov edx,dword ptr ds:[811DFC]; 注册码校验的结果。

0059FF8D     8911             mov dword ptr ds:[ecx],edx

0059FF 8F      83C 4 20          add esp,20

0059FF 92      C 2 1000          retn 10

 

跟进59FF79处的call EasyAcce.0059FD20 里面比较注册码

0059FD 20      A 1 FC1D8100      mov eax,dword ptr ds:[811DFC]              ; 22221111

0059FD25     8B 15 F 81D8100    mov edx,dword ptr ds:[811DF8] ; 44443333

0059FD2B     69C 0 3BA 71F 01    imul eax,eax,11FA73B; eax = eax * 11FA73B= 265a 7d 390b05eb

0059FD31     69D2 3BA 71F 01    imul edx,edx,11FA73B; edx := edx * 11fa73b

0059FD37     B9 550C 7F 72      mov ecx, 727F 0C 55

0059FD 3C      2BC8             sub ecx,eax   ; 727f 0c 55-390b05eb= 3974066A

0059FD3E     B8 550C 7F 72      mov eax, 727F 0C 55

0059FD43     2BC2             sub eax,edx ; eax-edx= 727f 0c 55 -9F 4B 11C 1=D333FA94

0059FD45     8B5424 04        mov edx,dword ptr ss:[esp+4]; 上面一个call得到的eax= 2C 25071A

0059FD 49      A 3 F 81D8100      mov dword ptr ds:[811DF8],eax; 59fd43出计算得到的值,放到内存某处

0059FD4E     2BC1             sub eax,ecx   ; 8位和后8位计算得到的值进行减法运算 D333FA94 -3974066A =99BFF 42A

0059FD50     3BC2             cmp eax,edx  ; if 99BFF 42A = 2C 25071A

0059FD52     74 0D            je short EasyAcce.0059FD61

0059FD 54      C 705 FC1D8100 00>mov dword ptr ds:[811DFC],0

0059FD5E     33C 0             xor eax,eax

0059FD 60      C 3               retn

0059FD61     2BCA             sub ecx,edx; 3974066A -edx

0059FD63     B8 01000000      mov eax,1

0059FD68     890D FC1D8100    mov dword ptr ds:[811DFC],ecx; ecx=4EFF50,这里也很重要,

0059FD6E     C3               retn

00555E 3C    |.  85C 0           test eax,eax

00555E3E   |.  74 4E          je short EasyAcce.00555E8E

00555E40   |>  50             /push eax

00555E41   |.  E8 9A 250400    |call EasyAcce.005983E0  ;  这个call里查表的到错误字符串

00555E46   |.  50             |push eax                                  ;  EasyAcce.007E 7F 34

 

 

 

破解狗的话,插入狗,出现如下提示:

看来事件是在formOnCreate事件里,用mfcspy查看,可以看到Create:006EB122

Listview: 00020358(SysListView32,id=076d)

OnNotify: notifycode=fffe id=076d,func=00557540(EasyAccess.exe+157540)

OnNotify: notifycode=ff65 id=076d,func=00557560(EasyAccess.exe+157560)

0055698E  |.  6A 02         push 2        ; /lParam = 2

00556990  |.  6A FF         push -1    ; |wParam = FFFFFFFF

00556992  |.  68 0C 100000   push 100C   ; |Message = MSG( 100C )

00556997  |.  50            push eax    ; |hWnd = 20358

00556998  |.  FFD7          call edi    ; /SendMessageA

发送消息,是发给谁呢?什么消息呢? 100c 是个自定义消息

0059FEFA  |.  50            push eax

0059FEFB  |.  57     push edi  ;  出现狗里的key, (ASCII "6600:0000:223E:3182")

0059FEFC  |.  E8 6FFEFFFF   call EasyAcce.0059FD70

0059FF01  |.  50            push eax

0059FF02  |.  E8 19FEFFFF   call EasyAcce.0059FD20

0059FF07  |.  83C 4 20       add esp,20

0059FF 0A   |.  E8 B1FDFFFF   call EasyAcce.0059FCC0

 

0059FD20 >/$  A1 FC1D8100   mov eax,dword ptr ds:[811DFC]                ;  22221111

0059FD25  |.  8B 15 F 81D8100 mov edx,dword ptr ds:[811DF8]                ;  44443333

0059FD2B  |.  69C 0 3BA 71F 01 imul eax,eax,11FA73B                         ;  eax = eax * 11FA73B= 265a 7d 390b05eb

0059FD31  |.  69D2 3BA 71F 01 imul edx,edx,11FA73B                         ;  edx := edx * 11fa73b

0059FD37  |.  B9 550C 7F 72   mov ecx, 727F 0C 55

0059FD 3C   |.  2BC8          sub ecx,eax                                  ;  727f 0c 55-390b05eb= 3974066A

下面这个函数校验用户输入的key,并且根据0059FD61处的值判断外面的checkbox

0059FD3E  |.  B8 550C 7F 72   mov eax, 727F 0C 55

0059FD43  |.  2BC2          sub eax,edx                                  ;  eax-edx= 727f 0c 55 -9F 4B 11C 1=D333FA94

0059FD45  |.  8B5424 04     mov edx,dword ptr ss:[esp+4]                 ;  上面一个call得到的eax= 2C 25071A

0059FD49  |.  A 3 F 81D8100   mov dword ptr ds:[811DF8],eax                ;  59fd43出计算得到的值,放到内存某处

0059FD4E  |.  2BC1          sub eax,ecx                                  ;  8位和后8位计算得到的值进行减法运算 D333FA94 -3974066A =99BFF 42A

0059FD50  |.  3BC2          cmp eax,edx                                  ;  if 99BFF 42A = 2C 25071A

0059FD52  |.  74 0D         je short EasyAcce.0059FD61

0059FD54  |.  C705 FC1D8100>mov dword ptr ds:[811DFC],0

0059FD5E  |.  33C 0          xor eax,eax

0059FD60  |.  C3            retn

0059FD61  |>  2BCA          sub ecx,edx                                  ;  3974066A -edx

0059FD63  |.  B8 01000000   mov eax,1

0059FD68  |.  890D FC1D8100 mov dword ptr ds:[811DFC],ecx                ;  ecx=4EFF50,这里也很重要,

0059FD6E  /.  C3            retn

 

狗里面的数据经过verifykey2后,得到的值进行移位,

Shr 1, 2, 3, 4, 6, 0E, 0F , 9, a, 10, 0B, 0D, 0F

然后and 1 判断是否为1=1check=0uncheck,在这个里面有个地方需要注意,就是有个地方有判断kind=0E,等于就继续检查几个

00556AD1  |.  68 6F 070000   push 76F

00556AD6  |.  D1EB          shr ebx,1

00556AD8  |.  8BCE          mov ecx,esi

00556ADA      83C 3 01       add ebx,1

00556ADD  |.  E8 6B6E1900   call <EasyAcce.SetCheckBox>

00556AE2  |.  8B50 1C        mov edx,dword ptr ds:[eax+ 1C ]

00556AE5  |.  6A 00         push 0

00556AE7  |.  53            push ebx

00556AE8  |.  68 F 1000000   push 0F 1

00556AED  |.  52            push edx

00556AEE  |.  FFD7          call edi   这里给checkbox赋值

 

00556A 26  |.  E8 65940400   call <EasyAcce.VerifyDogSN>

00556A 2B  |.  8D5424 3C      lea edx,dword ptr ss:[esp+ 3C ]

00556A 2F   |.  52            push edx                ;  key

00556A 30  |.  E8 33591700   call EasyAcce.006CC368  ;  这个call里得到kind=2,checkbox根据这个判断

00556A 35  |.  8B5424 38     mov edx,dword ptr ss:[esp+38]

 

下面破解狗,因为在打开license manager窗体的时候有读狗,所以下断点 deviceIoControl

005A 8F 97  |.  52            |push edx

005A 8F 98  |.  50            |push eax

005A 8F 99  |.  C74424 28 100>|mov dword ptr ss:[esp+28],10

005A 8FA1  |.  E8 3A 000000   |call <EasyAcce.ReadDogData>

005A 8FA6  |.  83C 4 0C        |add esp, 0C

deviceIoControl后,得到如下数据:

0013DD 0C   00 11 25 42 25 8B 00 00  .%B%?.

 

并且把地址给 esi

0059F 9E6  |.  E8 8589FFFF   |call EasyAcce.00598370

0059F 9EB  |.  85C 0          |test eax,eax

0059F 9ED  |.  0F 85 AC 000000 |jnz EasyAcce.0059FA 9F

0059F 9F 3  |.  8B5424 08     |mov edx,dword ptr ss:[esp+8]

0059F 9F 7  |.  8B 4C 24 04     |mov ecx,dword ptr ss:[esp+4]

0059F 9FB  |.  8B4424 0C      |mov eax,dword ptr ss:[esp+C]

0059F 9FF  |.  8915 FC1D8100 |mov dword ptr ds:[811DFC],edx

0059FA05  |.  8D5424 10     |lea edx,dword ptr ss:[esp+10] 这里出现了序列号

0059FA09  |.  51            |push ecx

0059FA 0A   |.  52            |push edx

0059FA0B  |.  A 3 F 81D8100   |mov dword ptr ds:[811DF8],eax

这里应该是给checkbox赋值

006ED954  |.  FF7424 04     push dword ptr ss:[esp+4]                    ; /ControlID

006ED958  |.  FF71 1C        push dword ptr ds:[ecx+ 1C ]    ; |hWnd = 000302F 4 ('eVision Licenses',class='#32770',parent=000102AA)

006ED95B  |.  FF15 04177500 call dword ptr ds:[<&USER32.GetDlgItem>]     ; /GetDlgItem

 

 

 

破解mchMatch.exe 点击菜单上的

45c 810

 

第一处不同的地方:

第一处不同的地方: 68044C 2F EasyMs60

68044C 19   /74 06           je short EasyMs 60.68044C 21

68044C 1B   |FF05 BC 920A 68   inc dword ptr ds:[ 680A 92BC]

68044C 21   /A 1 A 4920A 68     mov eax,dword ptr ds:[ 680A 92A 4]

68044C 26    BA 01000000     mov edx,1

68044C 2B    D3E2            shl edx,cl

68044C 2D    85D0            test eax,edx

68044C 2F     74 11           je short EasyMs 60.68044C 42  关键的跳转

68044C 31    0B048D 28320A 68 or eax,dword ptr ds:[ecx*4+ 680A 3228]

68044C 38    A 3 A 4920A 68     mov dword ptr ds:[ 680A 92A 4],eax

68044C 3D  ^ E9 FEFCFEFF     jmp EasyMs60.EOk

68044C 42    83F 9 11         cmp ecx,11

68044C 45    0F 87 D9000000   ja EasyMs60.68044D24

68044C 4B    FF248D 304D0468 jmp dword ptr ds:[ecx*4+68044D30]

 

 

总结:这次破解也花费了几天的工夫,主要是破解思路有些零乱,开始是去跟踪EasyAccess.exelicense Manager,也成功跟出了狗里的注册码和CheckBox对应的功能项的关系。可是EA.exe里的读狗代码似乎是在exe里。但是我们需要破解的最终产品是ocx,

于是用delphi加载ocx,编译一个exe,出错弹出license not grant的对话框,是个很好的入口,另外delphi写的程序,菜单事件的入口也可以从delphi里得到,所以代码就限制在这两者之间。因为有狗,所以使用ollydbgtrace运行跟踪功能,分别用狗和不用狗,自动单步。很快发现 68044C 2F (EasyMs60.dll)这个地方不同。(前面还有一处不同的,不过那是第一次运行和第二次运行导致的不同)。修改之!!!搞定之!!!

狗里的注册机制是得到狗里的序列号,然后进两次运算,第一次运算很简单,把6600:0000:223E:3182这样的狗里的sn进行变形,变成0x66000000, 0000223E, 00003182等三个数。然后第一个数和第三个数and,然后再和第二个数and,得到的结果在第二个函数VerifyKey2里运算和校验,得到的数据后进行移位然后判断是否给checkbox打勾。00556AD1附近的代码。

分析一下,这个软件是个OCX,其中EasyMs60.dll负责其中的注册控制。里面有个ELincese类,这次我破解的基本就是里面的License.Get

Function VerifyKey2

0059FD 20      A 1 FC1D8100      mov eax,dword ptr ds:[811DFC]              ; 22221111

0059FD25     8B 15 F 81D8100    mov edx,dword ptr ds:[811DF8] ; 44443333

0059FD2B     69C 0 3BA 71F 01    imul eax,eax,11FA73B; eax = eax * 11FA73B= 265a 7d 390b05eb

0059FD31     69D2 3BA 71F 01    imul edx,edx,11FA73B; edx := edx * 11fa73b

0059FD37     B9 550C 7F 72      mov ecx, 727F 0C 55

0059FD 3C      2BC8             sub ecx,eax   ; 727f 0c 55-390b05eb= 3974066A

0059FD3E     B8 550C 7F 72      mov eax, 727F 0C 55

0059FD43     2BC2             sub eax,edx ; eax-edx= 727f 0c 55 -9F 4B 11C 1=D333FA94

0059FD45     8B5424 04        mov edx,dword ptr ss:[esp+4]; 上面一个call得到的eax= 2C 25071A

0059FD 49      A 3 F 81D8100      mov dword ptr ds:[811DF8],eax; 59fd43出计算得到的值,放到内存某处

0059FD4E     2BC1             sub eax,ecx   ; 8位和后8位计算得到的值进行减法运算 D333FA94 -3974066A =99BFF 42A

0059FD50     3BC2             cmp eax,edx  ; if 99BFF 42A = 2C 25071A

0059FD52     74 0D            je short EasyAcce.0059FD61

0059FD 54      C 705 FC1D8100 00>mov dword ptr ds:[811DFC],0

0059FD5E     33C 0             xor eax,eax

0059FD 60      C 3               retn

0059FD61     2BCA             sub ecx,edx; 3974066A -edx

0059FD63     B8 01000000      mov eax,1

0059FD68     890D FC1D8100    mov dword ptr ds:[811DFC],ecx; ecx=4EFF50,这里也很重要,

0059FD6E     C3               retn

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值