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