【文章标题】: Windows Media Player 11 安装包破解
【文章作者】: DTFOX
【作者邮箱】: gankeyu@126.com
【作者主页】: http://www.scrpg.net
【作者QQ号】: 344827311
【软件名称】: Windows Media Player 11 安装包
【下载地址】: http://download.pchome.net/php/tdownload2.php?sid=12476&url=/multimedia/media/wmp11-windowsxp-x86-zh-cn.zip&svr=1&typ=0
【编写语言】: VC++
【使用工具】: OD, Winrar
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
某次想安装 Windows Media Player ,结果发现不让装,提示是盗版软件,使用WGA破解补丁无效,那就自己动手咯。
首先用 Winrar 将安装包解压,安装程序是 setup_wm.exe。
先用OD载入。起初并不知道断在哪里,于是开着OD点“验证”。
自然,安装没有停下来,但是OD的状态栏显示 线程0x00000AAC已退出。
于是我便猜想该验证过程是在一个新线程内执行的,于是我断下了CreateThread。
再次启动,点击“验证”,断了下来。
察看堆栈如下
……
0006E4E8 0103F7BB /CALL 到 CreateThread 来自 setup_wm.0103F7B5
0006E4EC 00000000 |pSecurity = NULL
0006E4F0 00000000 |StackSize = 0
0006E4F4 01033137 |ThreadFunction = setup_wm.01033137
0006E4F8 006704B2 |pThreadParm = 006704B2
0006E4FC 00000000 |CreationFlags = 0
0006E500 01081418 \pThreadId = setup_wm.01081418
……
猜的没错,的确是使用了新线程。那么 setup_wm.01033137 这个地址就一定是验证地址咯?跟下去。
01033137 8BFF mov edi, edi
01033139 /. 55 push ebp
0103313A |. 8BEC mov ebp, esp
0103313C |. 53 push ebx
0103313D |. 57 push edi
0103313E |. 33FF xor edi, edi
01033140 |. 57 push edi
01033141 |. FF15 14160001 call dword ptr [<&ole32.CoInitialize>>; ole32.CoInitialize
01033147 |. 393D D0130801 cmp dword ptr [10813D0], edi
0103314D |. 0F85 88000000 jnz 010331DB
01033153 |. 57 push edi ; /Arg4
01033154 |. 57 push edi ; |Arg3
01033155 |. 57 push edi ; |Arg2
01033156 |. 6A 06 push 6 ; |Arg1 = 00000006
01033158 |. E8 B6650200 call 01059713 ; \setup_wm.01059713 ; 用途不明
0103315D |. 85C0 test eax, eax
0103315F |. 75 7A jnz short 010331DB
01033161 |. 68 E8200001 push 010020E8 ; /FileName = "legitlibm.dll"
01033166 |. FF15 48120001 call dword ptr [<&KERNEL32.LoadLibrar>; \LoadLibraryW ; 装载验证DLL
0103316C |. 8BD8 mov ebx, eax
0103316E |. 3BDF cmp ebx, edi
01033170 |. 74 73 je short 010331E5
01033172 |. 56 push esi
01033173 |. 8B35 4C120001 mov esi, dword ptr [<&KERNEL32.GetPr>; kernel32.GetProcAddress
01033179 |. 68 D8200001 push 010020D8 ; /ProcNameOrOrdinal = "SetPartnerID"
0103317E |. 53 push ebx ; |hModule
0103317F |. FFD6 call esi ; \GetProcAddress
01033181 |. 3BC7 cmp eax, edi
01033183 |. 74 4C je short 010331D1
01033185 |. 68 C8000000 push 0C8 ; 获取SetPartnerID函数地址并调用
0103318A |. FFD0 call eax
0103318C |. 85C0 test eax, eax
0103318E |. 7C 37 jl short 010331C7
01033190 |. 68 CC200001 push 010020CC ; ASCII "LegitCheck"
01033195 |. 53 push ebx
01033196 |. FFD6 call esi
01033198 |. 3BC7 cmp eax, edi
0103319A |. 74 35 je short 010331D1
0103319C |. FFD0 call eax ; 获取LegitCheck函数地址并调用
0103319E |. 8BF0 mov esi, eax
010331A0 |. 3BF7 cmp esi, edi
010331A2 |. 74 23 je short 010331C7
010331A4 |. 83FE 06 cmp esi, 6
010331A7 |. 74 1E je short 010331C7 ; 关键就在这里,将je改为jmp就可以轻易的绕过验证。
010331A9 |. 56 push esi
010331AA |. 68 A4200001 push 010020A4 ; ASCII "WGA check failed with error code %d.",CR,LF
010331AF |. 6A 02 push 2
010331B1 |. E8 85B10200 call 0105E33B
010331B6 |. 83C4 0C add esp, 0C
010331B9 |. 893D 2C140801 mov dword ptr [108142C], edi
010331BF |. 8935 C8130801 mov dword ptr [10813C8], esi
010331C5 |. EB 0A jmp short 010331D1
010331C7 |> C705 2C140801>mov dword ptr [108142C], 1
010331D1 |> 53 push ebx ; /hLibModule
010331D2 |. FF15 50120001 call dword ptr [<&KERNEL32.FreeLibrar>; \FreeLibrary
010331D8 |. 5E pop esi
010331D9 |. EB 0A jmp short 010331E5
010331DB |> C705 2C140801>mov dword ptr [108142C], 1
010331E5 |> 68 88200001 push 01002088 ; /Arg2 = 01002088 ASCII " Validation completed.",CR,LF,""
010331EA |. 6A 04 push 4 ; |Arg1 = 00000004
010331EC |. E8 10B10200 call 0105E301 ; \setup_wm.0105E301
010331F1 |. 57 push edi ; /lParam
010331F2 |. 68 90990000 push 9990 ; |wParam = 9990
010331F7 |. 68 11010000 push 111 ; |Message = WM_COMMAND
010331FC |. FF75 08 push dword ptr [ebp+8] ; |hWnd
010331FF |. FF15 B8130001 call dword ptr [<&USER32.SendMessageW>; \SendMessageW
01033205 |. FF15 18160001 call dword ptr [<&ole32.CoUninitializ>; ole32.CoUninitialize
0103320B |. 5F pop edi
0103320C |. 33C0 xor eax, eax
0103320E |. 5B pop ebx
0103320F |. 5D pop ebp
01033210 \. C2 0400 retn 4
很明显可以发现是调用“legitlibm.dll”进行验证,并且只要跳到010331C7就算验证完成了。
那将010331A7处的je改jmp后保存为setup_wm2.exe,再执行发现验证成功。
OK, WGA就这样被pass了。
--------------------------------------------------------------------------------
【经验总结】
猜测和观察也是在不知所措的方法。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2007年09月09日 16:56:45
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!