|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2003-12-12, 03:32 AM | #1 |
榮譽會員
|
一個老MP3 Streaming Audio Player播放器的修改
Streaming Audio Player (SAP) v0.9是一個較老的MP3播放器,2000年7月份發佈的。但其中的DJ功能我確非常喜歡,並且佔用資源小,界面也非常漂亮,而且支持動畫。不過在使用的時候發現幾個不方便的地方,就修改了一下:
1. 當設定成DJ模式的時候,如果停止播放,在按Play,系統不會 繼續播放。 解決方法: 用Ollydbg開啟SAP.EXE,搜尋ShuffleMaster,經過分析後發現 ShuffleMaster為[436488],當該值為1時就是ShuffleMaster模式。 設定在該位址讀時中斷,並且在DJ模式下按Play,程式碼如下: 0040F945 |> 8B0D 88644300 MOV ECX, [436488] 0040F94B |. 85C9 TEST ECX, ECX 0040F94D |. 7E 0B JLE SHORT sap.0040F95A ; 如果不是DJ模式跳轉 0040F94F |. 51 PUSH ECX 0040F950 |. E8 6BAB0000 CALL sap.0041A4C0 0040F955 |. 83C4 04 ADD ESP, 4 0040F958 |. 5E POP ESI ; USER32.77D43FBE 0040F959 |. C3 RETN 0040F95A |> 8B0D 8C644300 MOV ECX, [43648C] 0040F960 |. 83F9 01 CMP ECX, 1 0040F963 |. 75 0A JNZ SHORT sap.0040F96F 0040F965 |. 8A88 68030000 MOV CL, [EAX+368] 0040F96B |. 84C9 TEST CL, CL 0040F96D |. 74 15 JE SHORT sap.0040F984 0040F96F |> 8B0D 8C644300 MOV ECX, [43648C] 在位址0040F94D處判斷如果不是DJ模式則跳轉,是DJ模式就使用 41A4C0,然後返回。檢視41A4C0的程式碼發現是新增一個新的線程, 顯然這個線程是用於DJ的,而40F95A以下的程式碼則是來開始播放 的,因而很簡單,將40F958和40F959的程式碼NOP掉即可。 2. 系統在最小化到SysTray的時候顯示ICON不對 解決方法: 用Ollydbg開啟SAP.EXE,搜尋函數Shell_NotifyIconA的使用,到如下 程式碼: 0040A500 /$ 8B4424 04 MOV EAX, [ESP+4] ; sap.004107E4 0040A504 |. 83EC 58 SUB ESP, 58 0040A507 |. 8B4C24 64 MOV ECX, [ESP+64] ; ntdll.77F8CF62 0040A50B |. 53 PUSH EBX ; USER32.GetMessageA 0040A50C |. 894424 08 MOV [ESP+8], EAX 0040A510 |. 56 PUSH ESI ; USER32.WaitMessage 0040A511 |. 894C24 10 MOV [ESP+10], ECX 0040A515 |. 57 PUSH EDI ; USER32.PeekMessageA 0040A516 |. 8B7424 74 MOV ESI, [ESP+74] 0040A51A |. 8B4424 78 MOV EAX, [ESP+78] 0040A51E |. 897424 20 MOV [ESP+20], ESI ; USER32.WaitMessage 0040A522 |. 85C0 TEST EAX, EAX 0040A524 |. C74424 0C 58000>MOV DWORD PTR [ESP+C], 58 0040A52C |. C74424 18 07000>MOV DWORD PTR [ESP+18], 7 0040A534 |. C74424 1C 64800>MOV DWORD PTR [ESP+1C], 8064 0040A53C |. 74 10 JE SHORT sap.0040A54E 0040A53E |. 6A 40 PUSH 40 ; /n = 40 (64.) 0040A540 |. 50 PUSH EAX ; |String2 = "H" 0040A541 |. 8D4424 2C LEA EAX, [ESP+2C] ; | 0040A545 |. 50 PUSH EAX ; |String1 = 003C53E0 0040A546 |. FF15 18254500 CALL [<&KERNEL32.lstrcpynA>] ; \lstrcpynA 0040A54C |. EB 05 JMP SHORT sap.0040A553 0040A54E |> C64424 24 00 MOV BYTE PTR [ESP+24], 0 0040A553 |> 8D4424 0C LEA EAX, [ESP+C] 0040A557 |. 8B4C24 6C MOV ECX, [ESP+6C] 0040A55B |. 50 PUSH EAX 0040A55C |. 51 PUSH ECX 0040A55D |. FF15 1C264500 CALL [<&SHELL32.Shell_NotifyIconA>] ; SHELL32.Shell_NotifyIconA 0040A563 |. 8BF8 MOV EDI, EAX 0040A565 |. 85F6 TEST ESI, ESI ; USER32.WaitMessage 0040A567 |. 74 07 JE SHORT sap.0040A570 0040A569 |. 56 PUSH ESI ; /hIcon = 77D43FB2 0040A56A |. FF15 A0264500 CALL [<&USER32.DestroyIcon>] ; \DestroyIcon 0040A570 |> 8BC7 MOV EAX, EDI ; USER32.PeekMessageA 0040A572 |. 5F POP EDI ; USER32.77D43FBE 0040A573 |. 5E POP ESI ; USER32.77D43FBE 0040A574 |. 5B POP EBX ; USER32.77D43FBE 0040A575 |. 83C4 58 ADD ESP, 58 0040A578 \. C3 RETN 經查,該函數在下面的程式碼中被使用: 0040A580 /$ 53 PUSH EBX 0040A581 |. A1 B0604300 MOV EAX, [4360B0] 0040A586 |. 56 PUSH ESI 0040A587 |. 57 PUSH EDI 0040A588 |. 8B78 0C MOV EDI, [EAX+C] 0040A58B |. 6A FA PUSH -6 ; /Index = GWL_HINSTANCE 0040A58D |. 57 PUSH EDI ; |hWnd = NULL 0040A58E |. FF15 64264500 CALL [<&USER32.GetWindowLongA>] ; \GetWindowLongA 0040A594 |. 8BF0 MOV ESI, EAX 0040A596 |. 6A 00 PUSH 0 0040A598 |. 6A 00 PUSH 0 0040A59A |. 68 57040000 PUSH 457 0040A59F |. 6A 00 PUSH 0 0040A5A1 |. 57 PUSH EDI 0040A5A2 |. E8 59FFFFFF CALL SAP.0040A500 0040A5A7 |. 83C4 14 ADD ESP, 14 0040A5AA |. 68 4C504300 PUSH SAP.0043504C ; ASCII "SAP" 0040A5AF |. 6A 65 PUSH 65 ; /RsrcName = 101. 0040A5B1 |. 56 PUSH ESI ; |hInst = 00000024 0040A5B2 |. FF15 88264500 CALL [<&USER32.LoadIconA>] ; \LoadIconA 0040A5B8 |. 50 PUSH EAX 0040A5B9 |. 68 57040000 PUSH 457 0040A5BE |. 6A 01 PUSH 1 0040A5C0 |. 57 PUSH EDI 0040A5C1 |. E8 3AFFFFFF CALL SAP.0040A500 0040A5C6 |. 83C4 14 ADD ESP, 14 0040A5C9 |. 5F POP EDI ; kernel32.77E7EB69 0040A5CA |. 5E POP ESI ; kernel32.77E7EB69 0040A5CB |. 5B POP EBX ; kernel32.77E7EB69 0040A5CC \. C3 RETN 經過跟蹤後發現使用GetWindowLongA返回的hInstance為0,而不是 正在的句柄,所以將該程式碼改成如下: 0040A58B |. 6A 00 PUSH 0 ; /pModule = NULL 0040A58D |. 90 NOP ; | 0040A58E |. FF15 C8254500 CALL [<&KERNEL32.GetModuleHandleA>] ; \GetModuleHandleA 通過GetModuleHandle來獲取句柄就可以了。 3. 還有,在設定成Auto Hide模式時,當滑鼠移到各個角落的時候,會自動顯示, 這些功能很煩,所以需要把它去掉。搜尋Auto Hide的程式碼發現是通過SetTimer 實現的,程式碼如下: 0041C86F |. 6A 00 PUSH 0 0041C871 |. 6A FF PUSH -1 0041C873 |. 51 PUSH ECX 0041C874 |. FFD6 CALL ESI ; USER32.SetWindowPos 0041C876 |. 6A 00 PUSH 0 ; /Timerproc = NULL 0041C878 |. 8B0D B0604300 MOV ECX, [4360B0] ; | 0041C87E |. 68 2C010000 PUSH 12C ; |Timeout = 300. ms 0041C883 |. 6A 00 PUSH 0 ; |TimerID = 0 0041C885 |. 8B51 0C MOV EDX, [ECX+C] ; | 0041C888 |. 52 PUSH EDX ; |hWnd = 7FFE0304 0041C889 |. FF15 B0264500 CALL [<&USER32.SetTimer>] ; \SetTimer 0041C88F |> A1 BC604300 MOV EAX, [4360BC] 為簡單起見,直接將程式碼41C876跳轉到41C88F如下: 0041C876 /EB 17 JMP SHORT sap.0041C88F 0041C878 |. |8B0D B0604300 MOV ECX, [4360B0] ; | 0041C87E |. |68 2C010000 PUSH 12C ; |Timeout = 300. ms 0041C883 |. |6A 00 PUSH 0 ; |TimerID = 0 0041C885 |. |8B51 0C MOV EDX, [ECX+C] ; | 0041C888 |. |52 PUSH EDX ; |hWnd = 7FFE0304 0041C889 |. |FF15 B0264500 CALL [<&USER32.SetTimer>] ; \SetTimer 0041C88F |> \A1 BC604300 MOV EAX, [4360BC] |
送花文章: 3,
|
|
|
相似的主題 | ||||
主題 | 主題作者 | 討論區 | 回覆 | 最後發表 |
聆聽天籟之音──DVD-AUDIO全接觸 | psac | 多媒體影音轉檔燒錄技術文件 | 1 | 2005-04-17 01:37 PM |
Cubase SX 2.0 的52條實用功能提示! | psac | 系統 & 硬體安裝及故障判斷技術文件 | 2 | 2004-01-22 04:13 PM |
Helix Producer 9.2指令式命令執行 | psac | 多媒體影音轉檔燒錄技術文件 | 1 | 2003-08-02 05:15 AM |