本帖最后由 helloxaj 于 2010-11-10 14:25 编辑
酷我音乐盒,仅限版本:v3.2.0.2,发布日期:2010.9,即金秋版,目前最新版
打算编个完美的酷我MV下载器,正在进行内存地址的查找。
数据正在更新中,如果有兴趣大家帮忙一块找找,以下是测试平台的源码,适合winxp、 win7操作系统,适合x86、x64平台。
最后,说明一下,这个下载器会永远开源,直到酷我音乐盒软件自身开启了MV的多线程下载的功能。
类型 基址 一级偏移 二级偏移
playercore.dll 0x007DBBD0 0x00000014 -0x000156A8
播放中媒体已下载百分比 playercore.dll 0x000157B0 NULL
播放中媒体已下载字节数 playercore.dll 0x00015720 NULL
播放中媒体文件大小总字节数 playercore.dll 0x0001571C NULL
MV播放状态 0x00821598 0x0000000C NULL
(停止:0 缓冲:1 播放:2 暂停:3)
音量百分数 0x007DE754 0x000002B4 NULL
启动静音 0x007DE754 0x000002B0 NULL
(未启动:0 启动:1)
窗口状态 0x7C2206DC NULL NULL
(普通:15 迷你模式:7(不定) 最小化:135(不定))#RequireAdmin
Opt("WinTitleMatchMode",2)
$pid=WinGetProcess("酷我音乐盒","")
$handle=_MemoryOpen($pid)
$a=0x05c3574c ;<======基址
$a=_MemoryRead("0x"&Hex($a),$handle)
$a+=0x00000008 ;<======一级偏移
$a=_MemoryRead("0x"&Hex($a),$handle)
$a+=0x00000104 ;<======二级偏移
$a=_MemoryRead("0x"&Hex($a),$handle)
MsgBox(0,"output:",$a)
Func _MemoryOpen($iv_Pid, $iv_DesiredAccess = 0x1F0FFF, $if_InheritHandle = 1)
If Not ProcessExists($iv_Pid) Then
SetError(1)
Return 0
EndIf
Local $ah_Handle[2] = [DllOpen("kernel32.dll")]
If @Error Then
SetError(2)
Return 0
EndIf
Local $av_OpenProcess = DllCall($ah_Handle[0], "int", "OpenProcess", "int", $iv_DesiredAccess, "int", $if_InheritHandle, "int", $iv_Pid)
If @Error Then
DllClose($ah_Handle[0])
SetError(3)
Return 0
EndIf
$ah_Handle[1] = $av_OpenProcess[0]
Return $ah_Handle
EndFunc
;=================================================================================================
Func _MemoryRead($iv_Address, $ah_Handle, $sv_Type = "dword")
If Not IsArray($ah_Handle) Then
SetError(1)
Return 0
EndIf
Local $v_Buffer = DllStructCreate($sv_Type)
If @Error Then
SetError(@Error + 1)
Return 0
EndIf
DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
If Not @Error Then
Local $v_Value = DllStructGetData($v_Buffer, 1)
Return $v_Value
Else
SetError(6)
Return 0
EndIf
EndFunc
;=================================================================================================
Func _MemoryClose($ah_Handle)
If Not IsArray($ah_Handle) Then
SetError(1)
Return 0
EndIf
DllCall($ah_Handle[0], "int", "CloseHandle", "int", $ah_Handle[1])
If Not @Error Then
DllClose($ah_Handle[0])
Return 1
Else
DllClose($ah_Handle[0])
SetError(2)
Return 0
EndIf
EndFunc
|