• 标 题:SentinelLM加密分析及破解方法 (3千字)
  • 作 者:听天由命 
  • 时 间:2003-12-27 07:16:55
  • 链 接:http://bbs.pediy.com

SentinelLM加密分析及破解方法
 
 SentinelLM就Sentinel License Manager的缩写,该软件的功能和FLEXLM很像,都是通过网卡加密的,
服务器端安装SERVER,客户机不用安装其它软件,使用时SERVER端启动并打开一个合法的License文件,
这个License文件是软件开发商提供的。启动后客户机才能正常运行软件,否则一运行就提示No License,
Can't not run.而且客户机上的很多程序都有这个限制,即使暴破能够成功也要改不少文件,这样的话就
很麻烦了。先不管这么多,也许比我想像相的会好的多。

017F:022116D4  MOV      [EBP+04],AL
017F:022116D7  CALL     02213C47  //从这里CALL里返回的EAX为12,而从这个段里返回的值是02。
017F:022116DC  ADD      ESP,BYTE +20 //经分析发现如果返回值为0则不会弹出提示窗口。
017F:022116DF  CMP      EAX,BYTE +1A
017F:022116E2  MOV      [EBP+74],EAX  ********
017F:022116E5  JA       NEAR 0221176D
017F:022116EB  CMP      EAX,BYTE +19
017F:022116EE  JNC      NEAR 022119A6
017F:022116F4  CMP      EAX,BYTE +18
017F:022116F7  JA       NEAR 022117A8
017F:022116FD  XOR      EDX,EDX
017F:022116FF  MOV      DL,[EAX+022119C4]
017F:02211705  JMP      NEAR [EDX*4+022119B8]
017F:0221170C  LEA      EAX,[EBP+68]
017F:0221170F  MOV      BYTE [EBP+04],01

以上段里返回的值是02则会出错,改成0后不弹出提示窗口,程序可以继续运行下去,但运行到一半后就
出错了,“c800001 error!”这种提示不是程序事先做好的窗口,而是真正的系统出错。难道有非法地
址或数据?不会吧,先下BPX LOCKMYTASK,可以跟到出错地方,但是看起来是在读取EXE文件时出错?
因为有exeshell的字样,大部分软件都是用这个API来打开外部EXE文件的。我想EXE应该不会出错,很可
能是在前面读狗后在一个地址里放入了标志,而在程序运行之前检查了这个标志,然后转入出错部分。
我注意到上面代码中打*号的地方,因为它是把从那个CALL里返回的12放入了[EAX+47],因为12是错误的
值,会使返回的值为02,而02也是错误的。所以[EAX+47]里的值是错误的,如果程序拿来校验一定会被
查出来,下BPM XXXXXX看看程序在后面是怎么对它操作的?果然被拦下来,先看下面代码:

017F:02211AB2  PUSH     BYTE +00
017F:02211AB4  CALL     02214DB2 //从这里返回的EAX=1,  @@@@@@
017F:02211AB9  MOV      ESI,[ESP+10]
017F:02211ABD  ADD      ESP,BYTE +04
017F:02211AC0  TEST     EAX,EAX     
017F:02211AC2  MOV      [ESI+74],EAX //又把EAX放入[ESI+74],因为EAX=0才能使程序走到2211ACF
017F:02211AC5  JZ       02211ACF //这里不会跳,从而这段最后的值为02,上段程序返回02是错的。
017F:02211AC7  MOV      EAX,02 //所以这里也是错的。改成xor eax,eax
017F:02211ACC  POP      ESI
017F:02211ACD  POP      ECX
017F:02211ACE  RET     
017F:02211ACF  MOV      EAX,[ESI+70] //这里有一个表,可能会返回0。
017F:02211AD2  PUSH     EBX
017F:02211AD3  PUSH     EDI
017F:02211AD4  PUSH     BYTE +00

在@@@@@处按F8进入下面段,看看哪里会使返回值为1。

017F:02215108  CALL     02214E52
017F:0221510D  CALL     02216787
017F:02215112  PUSH     EAX
017F:02215113  PUSH     DWORD [0225BFB4]
017F:02215119  CALL     02214E12
017F:0221511E  ADD      ESP,BYTE +08
017F:02215121  TEST     EAX,EAX
017F:02215123  JNZ      0221512C             (JUMP)
017F:02215125  MOV      EAX,01     //在这里,EAX=1
017F:0221512A  JMP      SHORT 0221512F
017F:0221512C  MOV      EAX,[EAX+38]
017F:0221512F  RET     
017F:02215130  CALL     02214E52
017F:02215135  CALL     02216787


圣天诺的加密做的真的很好,从这个程序中我又学到了不少东西,一是出错值与程序的关系,比如12被
应用到后的校验,如果你仅仅改后面的跳转就不行了,因为错误的值被做成标志,在后面只要拿来校验就
麻烦了。所以必须分析出程序对它的操作,是比较还是拿来计算?二是系统出错不一定是程序本身的问题。
加密公司完全有能力把系统出错和加密代码返回的值结何起来,从而让系统出错,这样做的目的是让破解
者把注意力放到调试系统出错的问题上,而忽略了程序本身。

                       听天由命
                       2003-12-25
                       my qq:69883609