转自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。