q16351334 发表于 2010-7-4 22:39

天狼星加密又更新了,6月底的视频无法去除黑屏问题了

分析-去除天狼星视频加密系统的各种限制 转自天草

此帖售价 30 铜币,已有 4 人购买
大家好,最近看到去除天狼星加密系统的各种限制炒得比较火爆,那个 混蛋论坛 居然还要公开对外出售。觉得好奇,于是就拿来分析了一下,还算收获不少,把分析过程贴出来,希望高手别见笑。^言归正传,限制主要有 智能防翻录(抓屏)、防止屏幕录像软件翻录,用户名(水印)、3389检测、断网限制。那就下面就逐一来分析一下吧。

                           一、智能防翻录(抓屏)
这个就是用一些冷门的翻录软件、或者截屏时,虽然不被发现,但是录出来却是黑屏的。原理是:软件调用了Direct3D加速,普通的录像软件自然黑屏了。解决方法:自然是不让他启用Direct3D加速了。用OD载入我们的录像文件,在字符串里找到DirectDrawCreate,然后双击,跳转到相应的汇编代码处。如下:


复制代码 [*]00413B35    8B85 FCFEFFFF      mov   eax, dword ptr [*]00413B3B    F680 27060000 02   test    byte ptr , 0x2[*]00413B42    74 10            je      short 00413B54[*]00413B44    8B15 E8844B00      mov   edx, dword ptr [*]00413B4A    C782 6C020000 0200>mov   dword ptr , 0x2[*]00413B54    8B0D E8844B00      mov   ecx, dword ptr [*]00413B5A    83B9 6C020000 00   cmp   dword ptr , 0x0[*]00413B61    0F8E CC040000      jle   00414033[*]00413B67    68 43964B00      push    004B9643                         ; ddraw.dll[*]00413B6C    E8 9D2E0A00      call    <jmp.&KERNEL32.LoadLibraryA> //加载ddraw.dll[*]00413B71    8B15 E8844B00      mov   edx, dword ptr [*]00413B77    8982 EC010000      mov   dword ptr , eax[*]00413B7D    A1 E8844B00      mov   eax, dword ptr [*]00413B82    83B8 EC010000 00   cmp   dword ptr , 0x0[*]00413B89    75 05            jnz   short 00413B90[*]00413B8B    83C9 FF            or      ecx, -0x1[*]00413B8E    EB 78            jmp   short 00413C08[*]00413B90    68 4D964B00      push    004B964D                         ; directdrawcreate[*]00413B95    A1 E8844B00      mov   eax, dword ptr [*]00413B9A    8B90 EC010000      mov   edx, dword ptr [*]00413BA0    52               push    edx[*]00413BA1    E8 A22D0A00      call    <jmp.&KERNEL32.GetProcAddress> // 初始化directdraw[*]00413BA6    8985 B4FEFFFF      mov   dword ptr , eax[*]00413BAC    83BD B4FEFFFF 00   cmp   dword ptr , 0x0[*]00413BB3    75 07            jnz   short 00413BBC[*]00413BB5    B9 FEFFFFFF      mov   ecx, -0x2



我们的目的是直接不让程序加载Direct,那么可以看出


复制代码 [*]00413B61    0F8E CC040000      jle   00414033

可以完全跳过direct加载,那就改成jmp了。 这样改了之后,就不黑屏了。但是会弹出一个错误框,提示)directx错误2,请关闭后重新运行试试。错误代码找到相应的代码:


复制代码 [*]0041C490   /75 67            jnz   short 0041C4F9[*]0041C492   |66:C785 58FFFFFF E>mov   word ptr , 0xE0[*]0041C49B   |8D45 B0            lea   eax, dword ptr [*]0041C49E   |8B95 0CFFFFFF      mov   edx, dword ptr [*]0041C4A4   |E8 DF5A0800      call    004A1F88[*]0041C4A9   |FF85 64FFFFFF      inc   dword ptr [*]0041C4AF   |8BD0               mov   edx, eax[*]0041C4B1   |33C0               xor   eax, eax[*]0041C4B3   |8D4D AC            lea   ecx, dword ptr [*]0041C4B6   |8945 AC            mov   dword ptr , eax[*]0041C4B9   |B8 489A4B00      mov   eax, 004B9A48                  ; directx错误2,请关闭后重新运行试试。错误代码:[*]0041C4BE   |FF85 64FFFFFF      inc   dword ptr [*]0041C4C4   |E8 AB5F0800      call    004A2474


这句
0041C490   /75 67            jnz   short 0041C4F9//改为jmp就行了
复制代码
这样经过测试,就完美解决智能防翻录问题了。此时用不知名的录像软件录就不黑屏了,抓屏自然也没问题。

                                                             二、防止屏幕录像软件翻录
            防止屏幕录像软件翻录,这里主要就是指的屏幕录像专家。这里下断GetWindowTextA,载入教程,运行断下后,取消断点,alt+F9返回,


复制代码 [*]00411482|.68 549B4B00   push    004B9B54                         ; /pmlxzj[*]00411487|.6A 00         push    0x0                              ; |Inheritable = FALSE[*]00411489|.68 01001F00   push    0x1F0001                         ; |Access = 1F0001[*]0041148E|.E8 B1550A00   call    <jmp.&KERNEL32.OpenMutexA>       ; \OpenMutexA[*]00411493|.85C0          test    eax, eax[*]00411495|.74 2C         je      short 004114C3[*]00411497|.50            push    eax                              ; /hObject[*]00411498|.E8 BB530A00   call    <jmp.&KERNEL32.CloseHandle>      ; \CloseHandle[*]0041149D|.B8 01000000   mov   eax, 0x1[*]004114A2|.BA 02000000   mov   edx, 0x2[*]00411482|.68 549B4B00   push    004B9B54                         ; /pmlxzj[*]00411487|.6A 00         push    0x0                              ; |Inheritable = FALSE[*]00411489|.68 01001F00   push    0x1F0001                         ; |Access = 1F0001[*]0041148E|.E8 B1550A00   call    <jmp.&KERNEL32.OpenMutexA>       ; \OpenMutexA[*]00411493|.85C0          test    eax, eax[*]00411495|.74 2C         je      short 004114C3[*]00411497|.50            push    eax                              ; /hObject[*]00411498|.E8 BB530A00   call    <jmp.&KERNEL32.CloseHandle>      ; \CloseHandle[*]0041149D|.B8 01000000   mov   eax, 0x1[*]004114A2|.BA 02000000   mov   edx, 0x2[*]004114A7|.50            push    eax[*]004114A8|.8D45 FC       lea   eax, dword ptr [*]004114AB|.FF4D EC       dec   dword ptr [*]004114AE|.E8 5D0B0900   call    004A2010[*]004114B3|.58            pop   eax[*]004114B4|.8B55 D0       mov   edx, dword ptr [*]004114B7|.64:8915 00000>mov   dword ptr fs:, edx[*]004114BE|.E9 B1010000   jmp   00411674[*]004114C3|>33F6          xor   esi, esi[*]004114C5|.85DB          test    ebx, ebx[*]004114C7|.0F84 4E010000 je      0041161B[*]004114CD|>68 00040000   /push    0x400                           ; /Arg3 = 00000400[*]004114D2|.6A 00         |push    0x0                           ; |Arg2 = 00000000[*]004114D4|.8D85 C8F7FFFF |lea   eax, dword ptr       ; |[*]004114DA|.50            |push    eax                           ; |Arg1[*]004114DB|.E8 A4290800   |call    00493E84                        ; \第十八讲.00493E84[*]004114E0|.83C4 0C       |add   esp, 0xC[*]004114E3|.8D95 C8F7FFFF |lea   edx, dword ptr [*]004114E9|.68 00040000   |push    0x400                           ; /Count = 400 (1024.)[*]004114EE|.52            |push    edx                           ; |Buffer[*]004114EF|.53            |push    ebx                           ; |hWnd[*]004114F0|.E8 E55A0A00   |call    <jmp.&USER32.GetWindowTextA>    ; \GetWindowTextA[*]004114F5|.66:C745 E0 20>|mov   word ptr , 0x20 //返回到这里[*]; 004114FB|.8D95 C8F7FFFF |lea   edx, dword ptr [*][*]向上看还发现[*]00411482|.68 549B4B00   push    004B9B54                         ; /pmlxzj[*]00411487|.6A 00         push    0x0                              ; |Inheritable = FALSE[*]00411489|.68 01001F00   push    0x1F0001                         ; |Access = 1F0001[*]0041148E|.E8 B1550A00   call    <jmp.&KERNEL32.OpenMutexA>       ; \OpenMutexA[*][*]这个地方OpenMutexA一般用来进程互斥,看到pmlxzj,很明显是 屏幕录像专家的缩写吧。哈哈F8F8F8">/ e6 \* a6 y+ I: w# E那就修改这里,[*]00411493|.85C0          test    eax, eax[*]00411495|.74 2C         je      short 004114C3[*][*]改为[*]00411493      33C0          xor   eax, eax[*]00411495      EB 2C         jmp   short 004114C3[*][*]还有这里[*]004114C3|> \33F6          xor   esi, esi[*]004114C5|.85DB          test    ebx, ebx[*]004114C7|.0F84 4E010000 je      0041161B[*][*]改为[*]004114C3|> \33F6          xor   esi, esi[*]004114C5|.85DB          test    ebx, ebx[*]004114C7      90            nop[*]004114C8      E9 4E010000   jmp   0041161B[*][*]这样就修改好了。顺便在这个程序的断尾下段,看看这个call的上一层是什么。[*]00411677|.8BE5          mov   esp, ebp[*]00411679|.5D            pop   ebp[*]0041167A\.C3            retn//在这里F2,断下后F8来到下面[*]复制代码[*]00414A3F   .50            push    eax                              ; /Arg1[*]00414A40   .E8 DBC9FFFF   call    00411420                         ; \第十八讲.00411420//刚才的那个call[*]00414A45   .59            pop   ecx   //来到这里。                         ;00B12724[*]00414A46   .48            dec   eax[*]00414A47   .0F85 98000000 jnz   00414AE5//有个跳转,不跳就检测到非法软件[*]00414A4D   .66:C785 10FFF>mov   word ptr , 0x1DC[*]00414A56   .8B95 FCFEFFFF mov   edx, dword ptr [*]00414A5C   .33C0          xor   eax, eax[*]00414A5E   .8B8A 401B0000 mov   ecx, dword ptr [*]00414A64   .8D95 40FFFFFF lea   edx, dword ptr [*]00414A6A   .51            push    ecx[*]00414A6B   .8985 40FFFFFF mov   dword ptr , eax[*]00414A71   .52            push    edx[*]00414A72   .FF85 1CFFFFFF inc   dword ptr [*]00414A78   .E8 E34D0200   call    00439860[*]00414A7D   .33C0          xor   eax, eax[*]00414A7F   .83C4 08       add   esp, 0x8[*]00414A82   .8985 3CFFFFFF mov   dword ptr , eax[*]00414A88   .B8 45994B00   mov   eax, 004B9945                  ;播放时请关闭其它不相关软件:[*]00414A8D   .FF85 1CFFFFFF inc   dword ptr

从上面的代码,可以看出下GetWindowTextA 还是比较准确的。至于
00414A47   .0F85 98000000 jnz   00414AE5

这里就没有必要修改了,因为我们已经在关键call里面改动了相关的代码了,这样 防止屏幕录像软件翻录的限制 就去除了,现在可以使用屏幕录像专家或者其他知名录像软件来翻录了。
                                       


                                                       用户名(水印)

这个所谓的水印就是指跳动的用户名、屏幕上固定不动的字符`原理应该是:视频解码之后,然后在临时电脑屏幕上绘上去的吧。, i那就下bp GDI32.ExtTextOutA 这个断点既然是视频解码之后,然后在临时电脑屏幕上绘上去的,那我们就等录像显示正在打开那个进度条时,再下段吧。一开始就下断点,可能断的次数太多。重新载入教程,bp GDI32.ExtTextOutA,断下之后,看堆栈:


复制代码 [*]0012F2DC   0044D30E/CALL to ExtTextOutA from 第十八讲.0044D309[*]0012F2E0   E6011DDD|hDC = E6011DDD[*]0012F2E4   00000000|X = 0[*]0012F2E8   00000000|Y = 0[*]0012F2EC   00000000|Options = 0[*]0012F2F0   00000000|pRect = NULL[*]0012F2F4   00B4F3BC|String = "用",BB,"?wWw.Begin09.COM"[*]0012F2F8   00000016|StringSize = 16 (22.)[*]0012F2FC   00000000\pSpacing = NULL



很明显,"用",BB,"?http://www.begin09.com/" ,这个就是漂浮着的那个水印。那我们可以修改成任意的名字,这也就是传说中的替换水印。注意:(不能把这个内容清空,因为程序会校验,清空了,播放一段时间,就出错)。
0012F2F8   00000016|StringSize = 16 (22.)指的就是水印的大小,我们改为1(注意不能改为0,因为程序会校验,改为0,播放一段时间,就出错b|! D) w. w- N2 B# t0 J- L结合上面的分析,我们这样修改:修改水印大小为1,把用户名变为“-”,很小的字符,占两个像素,几乎看不出来了。




                                             四、3389检测
这个的话,也非常容易。查找字符串“请断开远程终端后再播放”


复制代码 [*]00412F5D   . /74 21         je      short 00412F80[*]00412F5F   . |66:C785 10FFF>mov   word ptr , 0x50[*]00412F68   . |8B55 E0       mov   edx, dword ptr [*]00412F6B   . |52            push    edx                              ; /Arg1[*]00412F6C   . |E8 677F0200   call    0043AED8                         ; \第十八讲.0043AED8[*]00412F71   . |59            pop   ecx[*]00412F72   . |66:C785 10FFF>mov   word ptr , 0x44[*]00412F7B   . |8B5D E0       mov   ebx, dword ptr [*]00412F7E   . |EB 03         jmp   short 00412F83[*]00412F80   > \8B5D E0       mov   ebx, dword ptr [*]00412F83   >53            push    ebx                              ; /Arg1[*]00412F84   .E8 EF800200   call    0043B078                         ; \第十八讲.0043B078[*]00412F89   .59            pop   ecx[*]00412F8A   .48            dec   eax[*]00412F8B   .75 3E         jnz   short 00412FCB[*]00412F8D   .66:C785 10FFF>mov   word ptr , 0x5C[*]00412F96   .BA C3954B00   mov   edx, 004B95C3                  ;请断开远程终端后再播放[*]00412F9B   .8D45 DC       lea   eax, dword ptr [*]00412F9E   .E8 71EF0800   call    004A1F14[*]00412FA3   .FF85 1CFFFFFF inc   dword ptr [*]00412FA9   .8B00          mov   eax, dword ptr [*]00412FAB   .E8 7C120500   call    0046422C[*]00412FB0   .FF8D 1CFFFFFF dec   dword ptr [*]00412FB6   .8D45 DC       lea   eax, dword ptr [*]00412FB9   .BA 02000000   mov   edx, 0x2[*]00412FBE   .E8 4DF00800   call    004A2010[*]00412FC3   .6A 00         push    0x0[*]00412FC5   .E8 C69F0800   call    0049CF90[*]00412FCA   .59            pop   ecx[*]00412FCB   >6A 03         push    0x3                              ; /Arg2 = 00000003[*]00412FCD   .53            push    ebx                              ; |Arg1

复制代码
直接修改这个就行吧
00412F8B   .75 3E         jnz   short 00412FCB// jnz改jmp即可

不过,我更喜欢进上面的关键call里改。
00412F84   .E8 EF800200   call    0043B078
F7进到这里面,现在本机没有开3389,那就在OD里走一遍,把发生跳转的都改jmp,没跳的都nop,就行了。这里就不演示了。这样,就去除了3389检测 的限制。

                                       
                                             五、断网限制
断网限制,下断IPHLPAPI.PfCreateInterface,断下之后alt+F9返回


复制代码 [*]00401854/$55            push    ebp[*]00401855|.8BEC          mov   ebp, esp[*]00401857|.83C4 D0       add   esp, -0x30[*]0040185A|.53            push    ebx[*]0040185B|.56            push    esi[*]0040185C|.8B75 10       mov   esi, dword ptr [*]0040185F|.8B5D 08       mov   ebx, dword ptr [*]00401862|.8D04B3      lea   eax, dword ptr [*]00401865|.83C0 50       add   eax, 0x50[*]00401868|.50            push    eax[*]00401869|.6A 01         push    0x1[*]0040186B|.6A 00         push    0x0[*]0040186D|.6A 01         push    0x1[*]0040186F|.6A 01         push    0x1[*]00401871|.6A 00         push    0x0[*]00401873|.E8 804F0B00   call    <jmp.&IPHLPAPI.PHLPAPI._PfCreate>[*]00401878|.85C0          test    eax, eax[*]0040187A|.74 07         je      short 00401883[*]0040187C|.33C0          xor   eax, eax[*]0040187E|.E9 8C000000   jmp   0040190F[*]00401883|>8B15 EC844B00 mov   edx, dword ptr [*]00401889|.8955 FC       mov   dword ptr , edx


很明显把
0040187A|.74 07         je      short 00401883

改为
0040187A      90            nop
0040187B      90            nop

即可这样,就去掉了断网限制。; 总结一下,以上分析,就完美去掉了 天狼系加密系统的所有限制,经测试,对于不同的录像文件,这个限制部分的程序的代码结构是一模一样的。感兴趣的朋友可以做一个 通用的去限制补丁。附上我刚才分析的那个录像文件,供大家分析。

[PS:衷心祝愿混蛋的那个去限制工具一件也卖不出去。哈哈。


                                                                                                         转载请注明出处,谢谢
                                                                                                                              by zbzb97.

mantoou 发表于 2010-7-4 22:49

的确不错,很多断点第一次见

不舍远走 发表于 2010-7-4 23:00

好文章!!

ms2008 发表于 2010-7-4 23:21

哈哈,精品文章呀……

2750156 发表于 2010-7-5 00:39

q493632284 发表于 2010-7-5 18:25

学习中

小寳 发表于 2010-7-5 20:26

老万 发表于 2010-7-5 22:21

这个得好好学习,谢谢楼主分享

神龙书生 发表于 2010-7-6 00:25

貌似很强大。补丁怎么写

clide2000 发表于 2010-7-6 07:39

怎么没有看到文中提到的练习文件?
页: [1] 2 3 4 5
查看完整版本: 天狼星加密又更新了,6月底的视频无法去除黑屏问题了