首页
社区
课程
招聘
[旧帖] [原创]Windows Media Player 11 安装包破解 0.00雪花
发表于: 2007-9-9 17:00 5856

[旧帖] [原创]Windows Media Player 11 安装包破解 0.00雪花

2007-9-9 17:00
5856
【文章标题】: 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

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 4441
活跃值: (805)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
学到了一个对付新建线程的方法,谢谢楼主分享。如果能把CreateThread 这个API介绍补上,对我等菜鸟就更有意义了。
2007-9-9 17:29
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
呵呵。。。。。。。
2007-9-9 20:45
0
雪    币: 623
活跃值: (10)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
4
学习一下,楼主如果能具体分析出如何判断就更好了
2007-9-9 22:31
0
雪    币: 144
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
来学习,不错的资料
2007-9-10 12:38
0
雪    币: 264
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
学习,不错的文章
2007-9-10 12:45
0
雪    币: 141
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我也想试试,无奈XP是正版。
2007-9-10 15:52
0
游客
登录 | 注册 方可回帖
返回
//