天狼星加密系统各种限制破解

Eddy 发布于2010-7-30 17:57:13 分类: 加密解密 已浏览loading 网友评论0条 我要评论

转自UPK-by zbzb97。

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

00413B35    8B85 FCFEFFFF      mov     eax, dword ptr [ebp-0x104]
00413B3B    F680 27060000 02   test    byte ptr [eax+0x627], 0x2
00413B42    74 10              je      short 00413B54
00413B44    8B15 E8844B00      mov     edx, dword ptr [0x4B84E8]
00413B4A    C782 6C020000 0200>mov     dword ptr [edx+0x26C], 0x2
00413B54    8B0D E8844B00      mov     ecx, dword ptr [0x4B84E8]
00413B5A    83B9 6C020000 00   cmp     dword ptr [ecx+0x26C], 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 [0x4B84E8]
00413B77    8982 EC010000      mov     dword ptr [edx+0x1EC], eax
00413B7D    A1 E8844B00        mov     eax, dword ptr [0x4B84E8]
00413B82    83B8 EC010000 00   cmp     dword ptr [eax+0x1EC], 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 [0x4B84E8]
00413B9A    8B90 EC010000      mov     edx, dword ptr [eax+0x1EC]
00413BA0    52                 push    edx
00413BA1    E8 A22D0A00        call    <jmp.&KERNEL32.GetProcAddress> // 初始化directdraw
00413BA6    8985 B4FEFFFF      mov     dword ptr [ebp-0x14C], eax
00413BAC    83BD B4FEFFFF 00   cmp     dword ptr [ebp-0x14C], 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 [ebp-0xA8], 0xE0
0041C49B   |8D45 B0            lea     eax, dword ptr [ebp-0x50]
0041C49E   |8B95 0CFFFFFF      mov     edx, dword ptr [ebp-0xF4]
0041C4A4   |E8 DF5A0800        call    004A1F88
0041C4A9   |FF85 64FFFFFF      inc     dword ptr [ebp-0x9C]
0041C4AF   |8BD0               mov     edx, eax
0041C4B1   |33C0               xor     eax, eax
0041C4B3   |8D4D AC            lea     ecx, dword ptr [ebp-0x54]
0041C4B6   |8945 AC            mov     dword ptr [ebp-0x54], eax
0041C4B9   |B8 489A4B00        mov     eax, 004B9A48                    ; directx错误2,请关闭后重新运行试试。错误代码:
0041C4BE   |FF85 64FFFFFF      inc     dword ptr [ebp-0x9C]
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 [ebp-0x4]
004114AB  |.  FF4D EC       dec     dword ptr [ebp-0x14]
004114AE  |.  E8 5D0B0900   call    004A2010
004114B3  |.  58            pop     eax
004114B4  |.  8B55 D0       mov     edx, dword ptr [ebp-0x30]
004114B7  |.  64:8915 00000>mov     dword ptr fs:[0], 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 [ebp-0x838]      ; |
004114DA  |.  50            |push    eax                             ; |Arg1
004114DB  |.  E8 A4290800   |call    00493E84                        ; \第十八讲.00493E84
004114E0  |.  83C4 0C       |add     esp, 0xC
004114E3  |.  8D95 C8F7FFFF |lea     edx, dword ptr [ebp-0x838]
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 [ebp-0x20], 0x20 //返回到这里
; 004114FB  |.  8D95 C8F7FFFF |lea     edx, dword ptr [ebp-0x838]

向上看还发现
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,很明显是 屏幕录像专家的缩写吧。哈哈,那就修改这里,
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 [ebp-0xF0], 0x1DC
00414A56   .  8B95 FCFEFFFF mov     edx, dword ptr [ebp-0x104]
00414A5C   .  33C0          xor     eax, eax
00414A5E   .  8B8A 401B0000 mov     ecx, dword ptr [edx+0x1B40]
00414A64   .  8D95 40FFFFFF lea     edx, dword ptr [ebp-0xC0]
00414A6A   .  51            push    ecx
00414A6B   .  8985 40FFFFFF mov     dword ptr [ebp-0xC0], eax
00414A71   .  52            push    edx
00414A72   .  FF85 1CFFFFFF inc     dword ptr [ebp-0xE4]
00414A78   .  E8 E34D0200   call    00439860
00414A7D   .  33C0          xor     eax, eax
00414A7F   .  83C4 08       add     esp, 0x8
00414A82   .  8985 3CFFFFFF mov     dword ptr [ebp-0xC4], eax
00414A88   .  B8 45994B00   mov     eax, 004B9945                    ;  播放时请关闭其它不相关软件:
00414A8D   .  FF85 1CFFFFFF inc     dword ptr [ebp-0xE4]


从上面的代码,可以看出下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,"?
XXXXXXXX"
0012F2F8   00000016  |StringSize = 16 (22.)
0012F2FC   00000000  \pSpacing = NULL




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

四、3389检测

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

00412F5D   . /74 21         je      short 00412F80
00412F5F   . |66:C785 10FFF>mov     word ptr [ebp-0xF0], 0x50
00412F68   . |8B55 E0       mov     edx, dword ptr [ebp-0x20]
00412F6B   . |52            push    edx                              ; /Arg1
00412F6C   . |E8 677F0200   call    0043AED8                         ; \第十八讲.0043AED8
00412F71   . |59            pop     ecx
00412F72   . |66:C785 10FFF>mov     word ptr [ebp-0xF0], 0x44
00412F7B   . |8B5D E0       mov     ebx, dword ptr [ebp-0x20]
00412F7E   . |EB 03         jmp     short 00412F83
00412F80   > \8B5D E0       mov     ebx, dword ptr [ebp-0x20]
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 [ebp-0xF0], 0x5C
00412F96   .  BA C3954B00   mov     edx, 004B95C3                    ;  请断开远程终端后再播放
00412F9B   .  8D45 DC       lea     eax, dword ptr [ebp-0x24]
00412F9E   .  E8 71EF0800   call    004A1F14
00412FA3   .  FF85 1CFFFFFF inc     dword ptr [ebp-0xE4]
00412FA9   .  8B00          mov     eax, dword ptr [eax]
00412FAB   .  E8 7C120500   call    0046422C
00412FB0   .  FF8D 1CFFFFFF dec     dword ptr [ebp-0xE4]
00412FB6   .  8D45 DC       lea     eax, dword ptr [ebp-0x24]
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 [ebp+0x10]
0040185F  |.  8B5D 08       mov     ebx, dword ptr [ebp+0x8]
00401862  |.  8D04B3        lea     eax, dword ptr [ebx+esi*4]
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 [0x4B84EC]
00401889  |.  8955 FC       mov     dword ptr [ebp-0x4], edx

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

改为
0040187A      90            nop
0040187B      90            nop

即可这样,就去掉了断网限制。

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

Eddy: 懂得原理才能一击致命^_

已经有(0)位网友发表了评论,你也评一评吧!
原创文章如转载,请注明:转载自Eddy Blog
原文地址:http://www.rrgod.com/decryption/471.html     欢迎订阅Eddy Blog

记住我的信息,下次不用再输入 欢迎给Eddy Blog留言